Nucleo-transfer

Dependencies:   ADS1015 MPU6050 PixelArray-Nucleo mbed

Fork of Nucleo-transfer by I L

Committer:
ricardo_95
Date:
Thu Sep 28 14:07:12 2017 +0000
Revision:
12:7b3a5940f911
Parent:
11:73c6def38fbd
Child:
13:b85f41d6fe6f
Child:
15:635303444c81
Pilot 1.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ricardo_95 12:7b3a5940f911 1 /*
ricardo_95 12:7b3a5940f911 2 Author : Danny Eldering & Ricardo Molenaar
ricardo_95 12:7b3a5940f911 3 Company : Momo Medical
ricardo_95 12:7b3a5940f911 4 Source : developer.mbed.org
ricardo_95 12:7b3a5940f911 5 File : main.cpp
ricardo_95 12:7b3a5940f911 6 Version | -date : 1.0 | 28-9-2017
ricardo_95 12:7b3a5940f911 7 */
ricardo_95 12:7b3a5940f911 8
DEldering 0:c0e44c46c573 9 #include "mbed.h"
DEldering 0:c0e44c46c573 10 #include "Adafruit_ADS1015.h"
DEldering 0:c0e44c46c573 11 #include "MPU6050.h"
ricardo_95 7:dba5091c8b7d 12 #include "neopixel.h"
ricardo_95 12:7b3a5940f911 13 #define NLED (3)
ricardo_95 7:dba5091c8b7d 14 #define ONE_COLOR
ricardo_95 7:dba5091c8b7d 15
ricardo_95 7:dba5091c8b7d 16 InterruptIn lock(p16); // Interrupts for buttons.
ricardo_95 7:dba5091c8b7d 17 InterruptIn reposition(p17);
ricardo_95 7:dba5091c8b7d 18 InterruptIn mute(p15);
ricardo_95 7:dba5091c8b7d 19 InterruptIn new_patient(p14);
ricardo_95 12:7b3a5940f911 20 AnalogIn batteryvoltage(p18); // Analog input between 0 and 1 (0 and 100 %) for reading batteryvoltage from accupack.
ricardo_95 12:7b3a5940f911 21 DigitalIn supplyvoltage(p20); // Analog input between 0 and 1 for reading supplyvoltage from measuringpoint before power supply.
ricardo_95 7:dba5091c8b7d 22
ricardo_95 12:7b3a5940f911 23 PwmOut LED_intern1(LED1);
ricardo_95 12:7b3a5940f911 24 DigitalOut LED_intern2(LED2);
ricardo_95 12:7b3a5940f911 25 DigitalOut LED_intern3(LED3);
ricardo_95 12:7b3a5940f911 26 DigitalOut LED_intern4(LED4);
ricardo_95 7:dba5091c8b7d 27 neopixel::PixelArray array(p11);
ricardo_95 7:dba5091c8b7d 28
ricardo_95 7:dba5091c8b7d 29 Timer hold_timer;
ricardo_95 7:dba5091c8b7d 30 Timer delay;
ricardo_95 7:dba5091c8b7d 31 Timer speaker_timer;
ricardo_95 7:dba5091c8b7d 32
ricardo_95 7:dba5091c8b7d 33 DigitalOut speaker1(p21);
ricardo_95 7:dba5091c8b7d 34 DigitalOut speaker2(p22);
DEldering 0:c0e44c46c573 35
DEldering 1:a8e61f3910ad 36 I2C i2c(p28, p27); // I2C
DEldering 1:a8e61f3910ad 37 MPU6050 agu(p28,p27); // Accelerometer/Gyroscope Unit
DEldering 1:a8e61f3910ad 38 Adafruit_ADS1115 pr1(&i2c, 0x48); // first PiëzoResistive ADC
DEldering 1:a8e61f3910ad 39 Adafruit_ADS1115 pr2(&i2c, 0x49); // second PiëzoResistive ADC
DEldering 1:a8e61f3910ad 40 Adafruit_ADS1115 pel(&i2c, 0x4B); // PiëzoElectric ADC
DEldering 1:a8e61f3910ad 41 Serial pc(USBTX, USBRX); // tx, rx // Serial USB connection
ricardo_95 12:7b3a5940f911 42 Serial pi(p9, p10); // tx, rx // Setup serial communication for pi.
DEldering 1:a8e61f3910ad 43 Timer t; // Timer for equally time-spaced samples
DEldering 1:a8e61f3910ad 44 Ticker sample_cycle; // Polling cycle
ricardo_95 8:bf0f7a6fb1fd 45
ricardo_95 12:7b3a5940f911 46 int boot_delay_ms = 500;
DEldering 1:a8e61f3910ad 47 int cycle_time = 100000; // Cycle time in us
DEldering 1:a8e61f3910ad 48 int i2c_freq = 400000; // I2C Frequency
ricardo_95 12:7b3a5940f911 49 int baud = 115200; // Baud rate
DEldering 1:a8e61f3910ad 50 short res[8] = {0,0,0,0,0,0,0,0}; // 8 PR sensors 1 time per cycle
DEldering 1:a8e61f3910ad 51 short elec[5] = {0,0,0,0,0}; // 1 PE sensor 5 times per cycle
DEldering 1:a8e61f3910ad 52 int angle = 0; // Accelerometer Z-axis
DEldering 1:a8e61f3910ad 53 int k = 0;
DEldering 1:a8e61f3910ad 54 float acce[3]; // Raw accelerometer data
DEldering 1:a8e61f3910ad 55 float gyro[3]; // Raw gyroscope data
ricardo_95 7:dba5091c8b7d 56 char LED_colour; // Variable to set LED colour.
ricardo_95 12:7b3a5940f911 57 bool lock_state, lock_flag, mute_state, alarm, calibration_flag, intensity_select; // Boolean variables for states logging.
ricardo_95 8:bf0f7a6fb1fd 58 bool mute_flag, new_patient_flag, reposition_flag;
ricardo_95 8:bf0f7a6fb1fd 59 bool speaker_state, LED_red_state, LED_yellow_state, LED_green_state, power_plug_state;
ricardo_95 12:7b3a5940f911 60 bool speaker_logged, LED_red_logged, LED_yellow_logged, LED_green_logged, power_plug_logged;
ricardo_95 11:73c6def38fbd 61 int locktime_ms = 2000; // Waittime for lock user interface in ms.
ricardo_95 12:7b3a5940f911 62 int calibrationtime_ms = 5000; // Time to press new_patient button for calibration system.
ricardo_95 12:7b3a5940f911 63 int calibration_flash; // Variable for flash LED's to indicate calibration.
ricardo_95 7:dba5091c8b7d 64 int buttondelay_ms = 750; // Button delay in ms.
ricardo_95 7:dba5091c8b7d 65 int delay_lock_interface = 3000*60; // Delay for non using interface locktime.
ricardo_95 12:7b3a5940f911 66 int speaker_active_ms = 750; // Time to iterate speaker on and off when alarm occurs.
ricardo_95 7:dba5091c8b7d 67 double alarm_voltage = 0.2; // Needed voltage for alarm expressed as a percentage (0 - 100 % => 0 - 3.3 V).
ricardo_95 12:7b3a5940f911 68 int red_var, green_var, blue_var, intensity; // Variables to set LED intensity.
ricardo_95 8:bf0f7a6fb1fd 69 int batteryvoltage_current = 0, batteryvoltage_last = 0;
ricardo_95 12:7b3a5940f911 70 int intensity_day = 50, intensity_night = 25; // Intensity settings for LED's to wall.
ricardo_95 7:dba5091c8b7d 71
ricardo_95 11:73c6def38fbd 72 void set_intensity() // Function to set the intensity for the LED's.
ricardo_95 7:dba5091c8b7d 73 {
ricardo_95 11:73c6def38fbd 74 if (intensity_select == 1) {
ricardo_95 12:7b3a5940f911 75 intensity = intensity_day;
ricardo_95 12:7b3a5940f911 76 } else {
ricardo_95 12:7b3a5940f911 77 intensity = intensity_night;
ricardo_95 7:dba5091c8b7d 78 }
ricardo_95 7:dba5091c8b7d 79 }
ricardo_95 7:dba5091c8b7d 80
ricardo_95 12:7b3a5940f911 81 void serial_read() // Serial read for select LED intensity and colour.
ricardo_95 12:7b3a5940f911 82 {
ricardo_95 12:7b3a5940f911 83 pc.printf("It works :)!");
ricardo_95 12:7b3a5940f911 84
ricardo_95 11:73c6def38fbd 85 if (pi.readable()) {
ricardo_95 11:73c6def38fbd 86 char message[3];
ricardo_95 11:73c6def38fbd 87 pi.scanf("%s",message);
ricardo_95 12:7b3a5940f911 88 pc.printf("%s", message);
ricardo_95 11:73c6def38fbd 89 message[strlen(message)] = '\n';
ricardo_95 12:7b3a5940f911 90
ricardo_95 11:73c6def38fbd 91 if (message[0] == '0') {
ricardo_95 11:73c6def38fbd 92 intensity_select = 0;
ricardo_95 12:7b3a5940f911 93 }
ricardo_95 12:7b3a5940f911 94
ricardo_95 12:7b3a5940f911 95 if (message[0] == '1') {
ricardo_95 12:7b3a5940f911 96 intensity_select = 1;
ricardo_95 12:7b3a5940f911 97 }
ricardo_95 12:7b3a5940f911 98
ricardo_95 11:73c6def38fbd 99 if (message[1] == 'g') {
ricardo_95 12:7b3a5940f911 100 LED_colour = 'g';
ricardo_95 11:73c6def38fbd 101 }
ricardo_95 11:73c6def38fbd 102
ricardo_95 11:73c6def38fbd 103 if (message[1] == 'y') {
ricardo_95 12:7b3a5940f911 104 LED_colour = 'y';
ricardo_95 11:73c6def38fbd 105 }
ricardo_95 12:7b3a5940f911 106
ricardo_95 11:73c6def38fbd 107 if (message[1] == 'r') {
ricardo_95 12:7b3a5940f911 108 LED_colour = 'r';
ricardo_95 11:73c6def38fbd 109 }
ricardo_95 11:73c6def38fbd 110 }
ricardo_95 11:73c6def38fbd 111 }
ricardo_95 11:73c6def38fbd 112
ricardo_95 7:dba5091c8b7d 113 void colour_select(char LED_colour) // Function to select the colour.
ricardo_95 7:dba5091c8b7d 114 {
ricardo_95 7:dba5091c8b7d 115 set_intensity(); // Call function set_intensity
ricardo_95 7:dba5091c8b7d 116
ricardo_95 7:dba5091c8b7d 117 if (LED_colour == 'r') {
ricardo_95 7:dba5091c8b7d 118 red_var = (2.55*intensity);
ricardo_95 7:dba5091c8b7d 119 green_var = 0;
ricardo_95 7:dba5091c8b7d 120 blue_var = 0;
ricardo_95 12:7b3a5940f911 121 LED_red_state = 1;
ricardo_95 8:bf0f7a6fb1fd 122 } else {
ricardo_95 12:7b3a5940f911 123 LED_red_state = 0;
ricardo_95 7:dba5091c8b7d 124 }
ricardo_95 7:dba5091c8b7d 125
ricardo_95 7:dba5091c8b7d 126 if (LED_colour == 'y') {
ricardo_95 7:dba5091c8b7d 127 red_var = (2.55*intensity);
ricardo_95 7:dba5091c8b7d 128 green_var = (2.55*intensity);
ricardo_95 12:7b3a5940f911 129 blue_var = 0;
ricardo_95 8:bf0f7a6fb1fd 130 LED_yellow_state = 1;
ricardo_95 8:bf0f7a6fb1fd 131 } else {
ricardo_95 8:bf0f7a6fb1fd 132 LED_green_state = 0;
ricardo_95 7:dba5091c8b7d 133 }
ricardo_95 7:dba5091c8b7d 134
ricardo_95 7:dba5091c8b7d 135 if (LED_colour == 'g') {
ricardo_95 7:dba5091c8b7d 136 red_var = 0;
ricardo_95 7:dba5091c8b7d 137 green_var = (2.55*intensity);
ricardo_95 7:dba5091c8b7d 138 blue_var = 0;
ricardo_95 12:7b3a5940f911 139 LED_green_state = 1;
ricardo_95 8:bf0f7a6fb1fd 140 } else {
ricardo_95 8:bf0f7a6fb1fd 141 LED_green_state = 0;
ricardo_95 7:dba5091c8b7d 142 }
ricardo_95 7:dba5091c8b7d 143
ricardo_95 7:dba5091c8b7d 144 if (calibration_flash >= 1) {
ricardo_95 7:dba5091c8b7d 145 if ((calibration_flash % 2) == 0) {
ricardo_95 7:dba5091c8b7d 146 red_var = 255;
ricardo_95 7:dba5091c8b7d 147 green_var = 255;
ricardo_95 7:dba5091c8b7d 148 blue_var = 255;
ricardo_95 7:dba5091c8b7d 149 } else {
ricardo_95 7:dba5091c8b7d 150 red_var = 0;
ricardo_95 7:dba5091c8b7d 151 green_var = 0;
ricardo_95 7:dba5091c8b7d 152 blue_var = 0;
ricardo_95 7:dba5091c8b7d 153 }
ricardo_95 7:dba5091c8b7d 154 calibration_flash--;
ricardo_95 7:dba5091c8b7d 155 }
ricardo_95 7:dba5091c8b7d 156 }
ricardo_95 7:dba5091c8b7d 157
ricardo_95 7:dba5091c8b7d 158 void trigger_lock() // If rising edge lock button is detected start locktimer.
ricardo_95 7:dba5091c8b7d 159 {
ricardo_95 7:dba5091c8b7d 160 hold_timer.start();
ricardo_95 7:dba5091c8b7d 161 delay.reset();
ricardo_95 7:dba5091c8b7d 162 delay.start();
ricardo_95 7:dba5091c8b7d 163 }
ricardo_95 7:dba5091c8b7d 164
ricardo_95 7:dba5091c8b7d 165 void timer_lock() // End timer lock.
ricardo_95 7:dba5091c8b7d 166 {
ricardo_95 7:dba5091c8b7d 167 lock_flag = 0; // Set lock_flag off.
ricardo_95 7:dba5091c8b7d 168 hold_timer.stop(); // Stop and reset holdtimer
ricardo_95 7:dba5091c8b7d 169 hold_timer.reset();
ricardo_95 7:dba5091c8b7d 170 }
ricardo_95 7:dba5091c8b7d 171
ricardo_95 7:dba5091c8b7d 172 void trigger_reposition()
ricardo_95 7:dba5091c8b7d 173 {
ricardo_95 7:dba5091c8b7d 174 if (lock_state == 1 | (delay.read_ms() < buttondelay_ms)) { // Control statement for lock interface and delay for non using buttons at the same time.
ricardo_95 7:dba5091c8b7d 175 } else {
ricardo_95 7:dba5091c8b7d 176 delay.reset();
ricardo_95 7:dba5091c8b7d 177 delay.start();
ricardo_95 7:dba5091c8b7d 178
ricardo_95 7:dba5091c8b7d 179 if (LED_intern1 == 0) {
ricardo_95 7:dba5091c8b7d 180 LED_intern1 = 1.0;
ricardo_95 7:dba5091c8b7d 181 } else {
ricardo_95 7:dba5091c8b7d 182 LED_intern1 = 0.0;
ricardo_95 7:dba5091c8b7d 183 }
ricardo_95 7:dba5091c8b7d 184
ricardo_95 8:bf0f7a6fb1fd 185 reposition_flag = 1;
ricardo_95 7:dba5091c8b7d 186 }
ricardo_95 7:dba5091c8b7d 187 }
ricardo_95 7:dba5091c8b7d 188
ricardo_95 7:dba5091c8b7d 189 void trigger_mute()
ricardo_95 7:dba5091c8b7d 190 {
ricardo_95 7:dba5091c8b7d 191 if (lock_state == 1 | (delay.read_ms() < buttondelay_ms)) { // Control statement for lock interface and delay for non using buttons at the same time.
ricardo_95 7:dba5091c8b7d 192 mute_state = 0;
ricardo_95 7:dba5091c8b7d 193 } else {
ricardo_95 7:dba5091c8b7d 194 delay.reset();
ricardo_95 7:dba5091c8b7d 195 delay.start();
ricardo_95 7:dba5091c8b7d 196 pi.printf("01\n");
ricardo_95 7:dba5091c8b7d 197 mute_state = !mute_state;
ricardo_95 7:dba5091c8b7d 198
ricardo_95 7:dba5091c8b7d 199 if (LED_intern1 == 0) {
ricardo_95 7:dba5091c8b7d 200 LED_intern1 = 1.0;
ricardo_95 7:dba5091c8b7d 201 } else {
ricardo_95 7:dba5091c8b7d 202 LED_intern1 = 0.0;
ricardo_95 7:dba5091c8b7d 203 }
ricardo_95 12:7b3a5940f911 204
ricardo_95 8:bf0f7a6fb1fd 205 mute_flag = 1;
ricardo_95 7:dba5091c8b7d 206 }
ricardo_95 7:dba5091c8b7d 207 }
ricardo_95 7:dba5091c8b7d 208
ricardo_95 7:dba5091c8b7d 209 void trigger_new_patient() // Function to trigger hold timer for new patient calibration function.
ricardo_95 7:dba5091c8b7d 210 {
ricardo_95 7:dba5091c8b7d 211 if (lock_state == 1) {
ricardo_95 7:dba5091c8b7d 212 } else {
ricardo_95 7:dba5091c8b7d 213 hold_timer.start();
ricardo_95 8:bf0f7a6fb1fd 214 new_patient_flag = 1;
ricardo_95 7:dba5091c8b7d 215 }
ricardo_95 7:dba5091c8b7d 216 }
ricardo_95 7:dba5091c8b7d 217
ricardo_95 7:dba5091c8b7d 218 void timer_calibration() // Timer calibration function.
ricardo_95 7:dba5091c8b7d 219 {
ricardo_95 7:dba5091c8b7d 220 hold_timer.stop();
ricardo_95 7:dba5091c8b7d 221 hold_timer.reset();
ricardo_95 12:7b3a5940f911 222
ricardo_95 7:dba5091c8b7d 223 if (lock_state == 1 | (delay.read_ms() < buttondelay_ms)) { // Control statement for lock interface and delay for non using buttons at the same time.
ricardo_95 7:dba5091c8b7d 224 } else {
ricardo_95 7:dba5091c8b7d 225 if (calibration_flag == 0) {
ricardo_95 12:7b3a5940f911 226
ricardo_95 7:dba5091c8b7d 227 if (LED_intern1 == 0) {
ricardo_95 7:dba5091c8b7d 228 LED_intern1 = 1.0;
ricardo_95 7:dba5091c8b7d 229 } else {
ricardo_95 7:dba5091c8b7d 230 LED_intern1 = 0.0;
ricardo_95 7:dba5091c8b7d 231 }
ricardo_95 12:7b3a5940f911 232
ricardo_95 7:dba5091c8b7d 233 } else {
ricardo_95 7:dba5091c8b7d 234 calibration_flag = 0;
ricardo_95 7:dba5091c8b7d 235 }
ricardo_95 7:dba5091c8b7d 236 }
ricardo_95 7:dba5091c8b7d 237 }
ricardo_95 7:dba5091c8b7d 238
ricardo_95 7:dba5091c8b7d 239 void generate(neopixel::Pixel * out, uint32_t index, uintptr_t val) // Generate LED colour.
ricardo_95 7:dba5091c8b7d 240 {
ricardo_95 7:dba5091c8b7d 241 out->red = red_var;
ricardo_95 7:dba5091c8b7d 242 out->green = green_var;
ricardo_95 7:dba5091c8b7d 243 out->blue = blue_var;
ricardo_95 7:dba5091c8b7d 244 }
ricardo_95 7:dba5091c8b7d 245
ricardo_95 7:dba5091c8b7d 246 void read_voltage()
ricardo_95 7:dba5091c8b7d 247 {
ricardo_95 7:dba5091c8b7d 248 LED_intern3 = 0;
ricardo_95 12:7b3a5940f911 249
ricardo_95 8:bf0f7a6fb1fd 250 if (batteryvoltage.read() > alarm_voltage) { // If supplyvoltage (readed from input) is greater then the setted alarmvoltage.
ricardo_95 7:dba5091c8b7d 251 alarm = 0; // Alarm is off.
ricardo_95 12:7b3a5940f911 252 speaker_state = 0;
ricardo_95 7:dba5091c8b7d 253 } else {
ricardo_95 7:dba5091c8b7d 254 alarm = 1; // Else alarm is on.
ricardo_95 12:7b3a5940f911 255 speaker_state = 1;
ricardo_95 7:dba5091c8b7d 256 }
ricardo_95 12:7b3a5940f911 257
ricardo_95 7:dba5091c8b7d 258 if (alarm == 1 && mute_state == 0 && (speaker_timer.read_ms() < speaker_active_ms)) { // Set speaker on for 750 ms.
ricardo_95 7:dba5091c8b7d 259 speaker1 = 1; // Set speaker.
ricardo_95 7:dba5091c8b7d 260 speaker2 = 1;
ricardo_95 7:dba5091c8b7d 261 speaker_timer.start(); // Set timer for speaker to iterate on and off.
ricardo_95 7:dba5091c8b7d 262 LED_intern3 = !LED_intern3;
ricardo_95 7:dba5091c8b7d 263 }
ricardo_95 7:dba5091c8b7d 264
ricardo_95 7:dba5091c8b7d 265 if (alarm == 1 && mute_state == 1 && (speaker_timer.read_ms() < speaker_active_ms)) { // Set speaker on for 750 ms.
ricardo_95 7:dba5091c8b7d 266 speaker1 = 0; // Set speaker.
ricardo_95 7:dba5091c8b7d 267 speaker2 = 0;
ricardo_95 7:dba5091c8b7d 268 speaker_timer.start(); // Set timer for speaker to iterate on and off.
ricardo_95 7:dba5091c8b7d 269 LED_intern3 = !LED_intern3;
ricardo_95 7:dba5091c8b7d 270 }
ricardo_95 7:dba5091c8b7d 271
ricardo_95 7:dba5091c8b7d 272 if ((speaker_timer.read_ms() > speaker_active_ms) && (speaker_timer.read_ms() < (speaker_active_ms*2))) {
ricardo_95 7:dba5091c8b7d 273 speaker1 = 0; // Turn off speaker (use two outputs because of currentlimiting of one).
ricardo_95 7:dba5091c8b7d 274 speaker2 = 0;
ricardo_95 7:dba5091c8b7d 275 }
ricardo_95 7:dba5091c8b7d 276
ricardo_95 7:dba5091c8b7d 277 if (speaker_timer.read_ms() > (speaker_active_ms*2)) {
ricardo_95 7:dba5091c8b7d 278 speaker_timer.stop(); // Stop speaker timer.
ricardo_95 7:dba5091c8b7d 279 speaker_timer.reset();
ricardo_95 7:dba5091c8b7d 280 }
ricardo_95 12:7b3a5940f911 281
ricardo_95 12:7b3a5940f911 282 batteryvoltage_current = batteryvoltage.read();
ricardo_95 12:7b3a5940f911 283
ricardo_95 8:bf0f7a6fb1fd 284 if (supplyvoltage.read() == 0) {
ricardo_95 12:7b3a5940f911 285 power_plug_state = 1;
ricardo_95 8:bf0f7a6fb1fd 286 } else {
ricardo_95 12:7b3a5940f911 287 power_plug_state = 0;
ricardo_95 8:bf0f7a6fb1fd 288 }
ricardo_95 7:dba5091c8b7d 289 }
DEldering 0:c0e44c46c573 290
DEldering 0:c0e44c46c573 291 void read_adc()
DEldering 0:c0e44c46c573 292 {
DEldering 1:a8e61f3910ad 293 t.reset();
DEldering 1:a8e61f3910ad 294 t.start();
DEldering 1:a8e61f3910ad 295
DEldering 4:367af005956b 296 elec[0] = pel.readADC_SingleEnded(0); //First PE readout
DEldering 1:a8e61f3910ad 297
DEldering 0:c0e44c46c573 298 for (k = 0; k < 4; k = k + 1) {
DEldering 4:367af005956b 299 res[k] = pr1.readADC_SingleEnded(k); //First 4 PR readout
DEldering 1:a8e61f3910ad 300 }
DEldering 4:367af005956b 301 while(t.read_us()<(1*(cycle_time/5))) {} //Wait untill 20% of cycle
DEldering 1:a8e61f3910ad 302
DEldering 4:367af005956b 303 elec[1] = pel.readADC_SingleEnded(0); //Second PE readout
DEldering 1:a8e61f3910ad 304
DEldering 1:a8e61f3910ad 305 for (k = 0; k < 4; k = k + 1) {
DEldering 4:367af005956b 306 res[k+4] = pr2.readADC_SingleEnded(k); //Last 4 PR readout
DEldering 0:c0e44c46c573 307 }
ricardo_95 7:dba5091c8b7d 308 while(t.read_us()<(2*(cycle_time/5))) {} //Wait untill 40% of cycle
DEldering 1:a8e61f3910ad 309
DEldering 4:367af005956b 310 elec[2] = pel.readADC_SingleEnded(0); //Third PE readout
DEldering 1:a8e61f3910ad 311
DEldering 4:367af005956b 312 agu.getAccelero(acce); //Get accelerometer data
DEldering 1:a8e61f3910ad 313 angle = acce[2]*10;
ricardo_95 7:dba5091c8b7d 314 agu.getGyro(gyro); //Get gyroscope data
ricardo_95 7:dba5091c8b7d 315
DEldering 4:367af005956b 316 while(t.read_us()<(3*(cycle_time/5))) {} //Wait untill 60% of cycle
DEldering 1:a8e61f3910ad 317
DEldering 4:367af005956b 318 elec[3] = pel.readADC_SingleEnded(0); //Fourth PE readout
DEldering 1:a8e61f3910ad 319
ricardo_95 7:dba5091c8b7d 320 if ((hold_timer.read_ms() > locktime_ms) && lock_flag == 0 && lock == 1) { // If statement for lock function.
ricardo_95 7:dba5091c8b7d 321 lock_flag = 1;
ricardo_95 7:dba5091c8b7d 322 LED_intern2 = !LED_intern2;
ricardo_95 7:dba5091c8b7d 323 lock_state = !lock_state;
ricardo_95 7:dba5091c8b7d 324 }
ricardo_95 7:dba5091c8b7d 325
ricardo_95 7:dba5091c8b7d 326 if ((hold_timer.read_ms() > calibrationtime_ms) && calibration_flag == 0 && new_patient == 1) { // If statement for calibration system.
ricardo_95 7:dba5091c8b7d 327 calibration_flag = 1;
ricardo_95 7:dba5091c8b7d 328 calibration_flash = 11;
ricardo_95 7:dba5091c8b7d 329 pi.printf("Calibration button is pressed."); // Print statement for serial communication to inform algorithm to calibrate.
ricardo_95 7:dba5091c8b7d 330 }
ricardo_95 12:7b3a5940f911 331
ricardo_95 7:dba5091c8b7d 332 if (delay.read_ms() > delay_lock_interface) { // If buttons are not pressed for 3 minutes, set lock active.
ricardo_95 7:dba5091c8b7d 333 lock_state = 1;
ricardo_95 7:dba5091c8b7d 334 LED_intern2 = 1;
ricardo_95 7:dba5091c8b7d 335 }
ricardo_95 7:dba5091c8b7d 336
ricardo_95 8:bf0f7a6fb1fd 337 batteryvoltage_current = batteryvoltage_current*100;
ricardo_95 8:bf0f7a6fb1fd 338 batteryvoltage_current = batteryvoltage_last;
ricardo_95 7:dba5091c8b7d 339 read_voltage(); // Supplyvoltage control for alarm.
ricardo_95 8:bf0f7a6fb1fd 340
ricardo_95 7:dba5091c8b7d 341 uint32_t val = 0;
ricardo_95 7:dba5091c8b7d 342 colour_select(LED_colour);
ricardo_95 7:dba5091c8b7d 343 array.update(generate, NLED, val);
ricardo_95 7:dba5091c8b7d 344
DEldering 4:367af005956b 345 while(t.read_us()<(4*(cycle_time/5))) {} //Wait untill 80% of cycle
DEldering 1:a8e61f3910ad 346
DEldering 4:367af005956b 347 elec[4] = pel.readADC_SingleEnded(0); //Fifth PE readout
DEldering 1:a8e61f3910ad 348
DEldering 4:367af005956b 349 while(t.read_us()<(4.5*(cycle_time/5))) {} //Wait untill 90% of cycle
ricardo_95 11:73c6def38fbd 350 pi.printf("!,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\n", res[4], res[7], res[6], res[5], res[1], res[0], res[2], res[3], elec[0], elec[1], elec[2], elec[3], elec[4], acce[0]*100, acce[1]*100, acce[2]*100, gyro[0]*100, gyro[1]*100, gyro[2]*100); // print all to serial port
DEldering 6:9c1944f3ebe5 351 //receiving order: 8 resistive sensors, 5 electric readings, 3 accelerometer axes, 3 gyroscope axes
ricardo_95 7:dba5091c8b7d 352
ricardo_95 12:7b3a5940f911 353 serial_read();
ricardo_95 12:7b3a5940f911 354
ricardo_95 7:dba5091c8b7d 355 if (mute_flag == 1) {
ricardo_95 7:dba5091c8b7d 356 pi.printf(">01\n");
ricardo_95 7:dba5091c8b7d 357 mute_flag = 0;
ricardo_95 12:7b3a5940f911 358 LED_intern4 = 1;
ricardo_95 11:73c6def38fbd 359 } else {
ricardo_95 11:73c6def38fbd 360 LED_intern4 = 0;
ricardo_95 7:dba5091c8b7d 361 }
ricardo_95 12:7b3a5940f911 362
ricardo_95 7:dba5091c8b7d 363 if (new_patient_flag == 1) {
ricardo_95 7:dba5091c8b7d 364 pi.printf(">02\n");
ricardo_95 7:dba5091c8b7d 365 new_patient_flag = 0;
ricardo_95 7:dba5091c8b7d 366 }
ricardo_95 12:7b3a5940f911 367
ricardo_95 7:dba5091c8b7d 368 if (reposition_flag == 1) {
ricardo_95 7:dba5091c8b7d 369 pi.printf(">03\n");
ricardo_95 7:dba5091c8b7d 370 reposition_flag = 0;
ricardo_95 7:dba5091c8b7d 371 }
ricardo_95 12:7b3a5940f911 372
ricardo_95 8:bf0f7a6fb1fd 373 if (batteryvoltage_current != batteryvoltage_last) {
ricardo_95 8:bf0f7a6fb1fd 374 pi.printf("%%d\n", batteryvoltage_current);
ricardo_95 12:7b3a5940f911 375 }
ricardo_95 12:7b3a5940f911 376
ricardo_95 9:514a44bf510f 377 if (LED_red_logged != LED_red_state) {
ricardo_95 12:7b3a5940f911 378 if (LED_red_state == 1) {
ricardo_95 9:514a44bf510f 379 pi.printf("&04\n");
ricardo_95 9:514a44bf510f 380 LED_red_logged = LED_red_state;
ricardo_95 12:7b3a5940f911 381 }
ricardo_95 9:514a44bf510f 382 if (LED_red_state == 0) {
ricardo_95 9:514a44bf510f 383 pi.printf("&40\n");
ricardo_95 12:7b3a5940f911 384 LED_red_logged = LED_red_state;
ricardo_95 9:514a44bf510f 385 }
ricardo_95 8:bf0f7a6fb1fd 386 }
ricardo_95 12:7b3a5940f911 387
ricardo_95 9:514a44bf510f 388 if (LED_yellow_logged != LED_yellow_state) {
ricardo_95 12:7b3a5940f911 389 if (LED_yellow_state == 1) {
ricardo_95 9:514a44bf510f 390 pi.printf("&06\n");
ricardo_95 9:514a44bf510f 391 LED_yellow_logged = LED_yellow_state;
ricardo_95 12:7b3a5940f911 392 }
ricardo_95 9:514a44bf510f 393 if (LED_yellow_state == 0) {
ricardo_95 9:514a44bf510f 394 pi.printf("&60\n");
ricardo_95 12:7b3a5940f911 395 LED_yellow_logged = LED_yellow_state;
ricardo_95 9:514a44bf510f 396 }
ricardo_95 7:dba5091c8b7d 397 }
ricardo_95 12:7b3a5940f911 398
ricardo_95 9:514a44bf510f 399 if (LED_green_logged != LED_green_state) {
ricardo_95 12:7b3a5940f911 400 if (LED_green_state == 1) {
ricardo_95 9:514a44bf510f 401 pi.printf("&05\n");
ricardo_95 9:514a44bf510f 402 LED_green_logged = LED_green_state;
ricardo_95 12:7b3a5940f911 403 }
ricardo_95 9:514a44bf510f 404 if (LED_green_state == 0) {
ricardo_95 9:514a44bf510f 405 pi.printf("&50\n");
ricardo_95 12:7b3a5940f911 406 LED_green_logged = LED_green_state;
ricardo_95 9:514a44bf510f 407 }
ricardo_95 7:dba5091c8b7d 408 }
ricardo_95 12:7b3a5940f911 409
ricardo_95 9:514a44bf510f 410 if (speaker_logged != speaker_state) {
ricardo_95 12:7b3a5940f911 411 if (speaker_state == 1) {
ricardo_95 9:514a44bf510f 412 pi.printf("&07\n");
ricardo_95 9:514a44bf510f 413 speaker_logged = speaker_state;
ricardo_95 12:7b3a5940f911 414 }
ricardo_95 9:514a44bf510f 415 if (speaker_state == 0) {
ricardo_95 9:514a44bf510f 416 pi.printf("&70\n");
ricardo_95 12:7b3a5940f911 417 speaker_logged = speaker_state;
ricardo_95 9:514a44bf510f 418 }
ricardo_95 8:bf0f7a6fb1fd 419 }
ricardo_95 9:514a44bf510f 420
ricardo_95 9:514a44bf510f 421 if (power_plug_logged != power_plug_state) {
ricardo_95 12:7b3a5940f911 422 if (power_plug_state == 1) {
ricardo_95 10:6b3034ec3c47 423 pi.printf("#08\n");
ricardo_95 9:514a44bf510f 424 power_plug_logged = power_plug_state;
ricardo_95 12:7b3a5940f911 425 }
ricardo_95 9:514a44bf510f 426 if (power_plug_state == 0) {
ricardo_95 10:6b3034ec3c47 427 pi.printf("#80\n");
ricardo_95 12:7b3a5940f911 428 power_plug_logged = power_plug_state;
ricardo_95 9:514a44bf510f 429 }
ricardo_95 9:514a44bf510f 430 }
DEldering 0:c0e44c46c573 431 }
DEldering 0:c0e44c46c573 432
DEldering 0:c0e44c46c573 433 int main()
DEldering 0:c0e44c46c573 434 {
ricardo_95 12:7b3a5940f911 435 wait_ms(boot_delay_ms); // Wait to boot sensorplate first
DEldering 1:a8e61f3910ad 436 i2c.frequency(i2c_freq);
ricardo_95 12:7b3a5940f911 437 pc.baud(baud);
ricardo_95 12:7b3a5940f911 438 pi.baud(baud);
DEldering 1:a8e61f3910ad 439 pr1.setGain(GAIN_TWOTHIRDS); // set range to +/-6.144V
DEldering 1:a8e61f3910ad 440 pr2.setGain(GAIN_TWOTHIRDS); // set range to +/-6.144V
DEldering 1:a8e61f3910ad 441 pel.setGain(GAIN_TWOTHIRDS); // set range to +/-6.144V
ricardo_95 7:dba5091c8b7d 442 pi.format(8, SerialBase::None, 1);
ricardo_95 7:dba5091c8b7d 443
ricardo_95 7:dba5091c8b7d 444 lock.rise(&trigger_lock); // Interrupt for rising edge lock button.
ricardo_95 7:dba5091c8b7d 445 lock.fall(&timer_lock);
ricardo_95 7:dba5091c8b7d 446 reposition.rise(&trigger_reposition);
ricardo_95 7:dba5091c8b7d 447 mute.rise(&trigger_mute);
ricardo_95 7:dba5091c8b7d 448 new_patient.rise(&trigger_new_patient); // New patient/calibration button rising event.
ricardo_95 7:dba5091c8b7d 449 new_patient.fall(&timer_calibration); // Falling edge for calibration algorithm option.
ricardo_95 7:dba5091c8b7d 450 delay.reset(); // Delaytimer reset en start.
ricardo_95 7:dba5091c8b7d 451 delay.start();
ricardo_95 7:dba5091c8b7d 452
DEldering 0:c0e44c46c573 453 while (1) {
DEldering 1:a8e61f3910ad 454 wait_us(cycle_time+1); // wait indefinitely because the ticker restarts every 50 ms
DEldering 0:c0e44c46c573 455 }
ricardo_95 12:7b3a5940f911 456 }