Nucleo-transfer

Dependencies:   ADS1015 MPU6050 PixelArray PixelArray-Nucleo mbed WS2813

Fork of Nucleo-transfer by Momo Medical

Committer:
Ishy
Date:
Mon Jan 22 12:03:22 2018 +0000
Revision:
54:a65b6fa447b0
Parent:
46:a0e6e088a50a
Added logging for the lock button;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ricardo_95 36:d10f368d037b 1 /********************* CODE INFORMATON ******************************
ricardo_95 34:1614f4f2b841 2 Date of creation: 30-09-2017
ricardo_95 34:1614f4f2b841 3 Authors: Danny Eldering & Ricardo Molenaar
ricardo_95 33:df21cb8dc5c7 4 co-authors: Menno Gravemaker
ricardo_95 34:1614f4f2b841 5 (c) Copyright by Momo Medical BV.
ricardo_95 34:1614f4f2b841 6
ricardo_95 45:7ebe860702b4 7 Current version name: 2.1.4
ricardo_95 45:7ebe860702b4 8 Date of modification: 8-1-2018
ricardo_95 36:d10f368d037b 9 Purpose of this file: Code for LPC1768 microcontroller for controlling buttons, LED's and communicate to PI
ricardo_95 45:7ebe860702b4 10 Update ‘what’s new in this version?’: Sensorplate connection test changed from software to hardware check.
ricardo_95 45:7ebe860702b4 11 ADC readout for accu deleted.
ricardo_95 36:d10f368d037b 12 Todo: -> Fix LED issue (yellow and red flashes at random moments);
deldering95 43:d09814c177a0 13 -> Optimize functions / improve readability;
ricardo_95 36:d10f368d037b 14 -> Split functions in seperate files?;
ricardo_95 36:d10f368d037b 15 -> Fix when sensorplate is not connected;
ricardo_95 36:d10f368d037b 16 -> Rule 570: if statement change to turn off LED's when power is plugged out (also related to rule 106).
ricardo_95 36:d10f368d037b 17 -> For the speaker two outputs of the uC are used. Add MOSFET with external supply and control these by uC?
ricardo_95 36:d10f368d037b 18 Source file: http://mbed.com/
ricardo_95 33:df21cb8dc5c7 19
ricardo_95 36:d10f368d037b 20 Information files:
deldering95 43:d09814c177a0 21 (1) Flowchart:
ricardo_95 36:d10f368d037b 22 (2) Table serial communication: https://docs.google.com/spreadsheets/d/1kHlithHxtoMDGvbcdH8vwSw5W5ArxlwDPsyfra1dtQM/edit?usp=drive_web
deldering95 43:d09814c177a0 23 (3) Technical manual CU-/software:
ricardo_95 12:7b3a5940f911 24 */
ricardo_95 12:7b3a5940f911 25
ricardo_95 21:13e4824bc364 26 /************************ CONFIG ***********************************/
ricardo_95 21:13e4824bc364 27
ricardo_95 36:d10f368d037b 28 #include "mbed.h" // Include files and define parameters.
DEldering 0:c0e44c46c573 29 #include "Adafruit_ADS1015.h"
DEldering 0:c0e44c46c573 30 #include "MPU6050.h"
ricardo_95 33:df21cb8dc5c7 31 #include "MPU6050_belt.h"
deldering95 43:d09814c177a0 32 #include "PixelArray.h"
deldering95 43:d09814c177a0 33 #include "WS2812.h"
ricardo_95 37:d8f7b2b5719a 34
deldering95 43:d09814c177a0 35 #define WS2812_BUF 3
deldering95 43:d09814c177a0 36 #define NUM_COLORS 5
deldering95 43:d09814c177a0 37 #define NUM_LEDS_PER_COLOR 3
ricardo_95 45:7ebe860702b4 38 #define NUMBER_LED_FRONT (3)
ricardo_95 7:dba5091c8b7d 39 #define ONE_COLOR
ricardo_95 7:dba5091c8b7d 40
ricardo_95 46:a0e6e088a50a 41 InterruptIn button_lock(PC_1); // Input on intterupt base decleration.
ricardo_95 46:a0e6e088a50a 42 InterruptIn button_reposition(PC_3);
Ishy 41:5380ada94ec6 43 InterruptIn button_mute(PC_2);
ricardo_95 46:a0e6e088a50a 44 InterruptIn button_new_patient(PC_0);
ricardo_95 7:dba5091c8b7d 45
deldering95 43:d09814c177a0 46 DigitalIn intensity_code(PA_12);
deldering95 43:d09814c177a0 47 DigitalIn colour_code_1(PA_11);
deldering95 43:d09814c177a0 48 DigitalIn colour_code_0(PB_12);
ricardo_95 46:a0e6e088a50a 49 DigitalIn testpin_sensorplate(PC_6);
deldering95 43:d09814c177a0 50
deldering95 43:d09814c177a0 51 DigitalOut LED_on_dev_board1(LED1); // Decleration of digital outputs.
ricardo_95 36:d10f368d037b 52 DigitalOut LED_on_dev_board2(LED2);
ricardo_95 36:d10f368d037b 53 DigitalOut LED_on_dev_board3(LED3);
ricardo_95 36:d10f368d037b 54 DigitalOut LED_on_dev_board4(LED4);
deldering95 43:d09814c177a0 55 DigitalOut speaker1(PC_12); // relatie aangeven!
deldering95 43:d09814c177a0 56 //neopixel::PixelArray indicator_LEDs(PA_7);
deldering95 43:d09814c177a0 57 PixelArray px(WS2812_BUF);
deldering95 43:d09814c177a0 58 WS2812 ws(PA_7, WS2812_BUF, 3, 9, 9, 6);
ricardo_95 36:d10f368d037b 59
deldering95 43:d09814c177a0 60
ricardo_95 46:a0e6e088a50a 61 PwmOut lock_feedback_LED(PB_1); // Declaration of pulse with modulation outputs.
ricardo_95 46:a0e6e088a50a 62 PwmOut mute_feedback_LED(PB_15);
Ishy 41:5380ada94ec6 63 PwmOut new_patient_feedback_LED(PB_14);
ricardo_95 46:a0e6e088a50a 64 PwmOut reposition_feedback_LED(PB_13);
ricardo_95 36:d10f368d037b 65
ricardo_95 37:d8f7b2b5719a 66 Timer button_lock_hold_timer; // Timer for time lock button should be pressed.
ricardo_95 36:d10f368d037b 67 Timer button_calibration_hold_timer; // Timer for calibration function (new patient holding 5 seconds).
deldering95 43:d09814c177a0 68 Timer delay_between_button_pressed; // Timer for time between two buttons (to prevent pressing buttons simultaneously).
ricardo_95 36:d10f368d037b 69 Timer speaker_timer; // Timer for speaker activation.
ricardo_95 36:d10f368d037b 70 Timer piezo_electric_sample_timer; // Timer for equally time-spaced samples.
ricardo_95 8:bf0f7a6fb1fd 71
deldering95 43:d09814c177a0 72 /*
ricardo_95 36:d10f368d037b 73 The code underneath this commentbox has some fixed parameters for serial/ADC reading:
ricardo_95 36:d10f368d037b 74 -> The address for the angle_device_reference_belt is set to 0x68 in the file MPU6050_belt (rule number: 19);
ricardo_95 36:d10f368d037b 75 -> The adress for the angle_device_sensorplate is set to 0x69 in the file MPU6050.h (rule number: 19);
ricardo_95 36:d10f368d037b 76 -> This is because of using the same I2C line;
ricardo_95 36:d10f368d037b 77 -> For detailed information/questions about this item, please read the technical manual or contact: Ricardo Molenaar | ricardo.molenaar@gmail.com
ricardo_95 36:d10f368d037b 78 */
Ishy 41:5380ada94ec6 79 I2C i2c_sensorplate_adc(PB_9, PB_8); // I2C for sensorplate.
ricardo_95 45:7ebe860702b4 80 //I2C i2c_power_adc(PB_11, PB_10); // I2C for accupack.
ricardo_95 46:a0e6e088a50a 81 MPU6050_belt angle_device_sensorplate(PB_9, PB_8); // i2c pins // i2c address hardcoded 0x68.
Ishy 41:5380ada94ec6 82 MPU6050_belt angle_device_reference_belt(PB_9, PB_8); // i2c pins // i2c address hardcoded 0x69.
ricardo_95 36:d10f368d037b 83 Adafruit_ADS1115 piezo_resistive_adc1(&i2c_sensorplate_adc, 0x48); // i2c pins, i2c address.
ricardo_95 36:d10f368d037b 84 Adafruit_ADS1115 piezo_resistive_adc2(&i2c_sensorplate_adc, 0x49); // i2c pins, i2c address.
ricardo_95 36:d10f368d037b 85 Adafruit_ADS1115 piezo_electric_adc(&i2c_sensorplate_adc, 0x4B); // i2c pins, i2c address.
ricardo_95 45:7ebe860702b4 86 //Adafruit_ADS1115 adsAccu(&i2c_power_adc, 0x48); // i2c pins, i2c address.
deldering95 43:d09814c177a0 87 Serial usb_serial(SERIAL_TX, SERIAL_RX); // tx, rx
deldering95 43:d09814c177a0 88 Serial pi_serial(PC_10, PC_11); // tx, rx
ricardo_95 36:d10f368d037b 89 Ticker total_readout_cycle; // Polling cycle.
deldering95 43:d09814c177a0 90 // End of commentbox related to the serial configuration/ADC reading components.
ricardo_95 34:1614f4f2b841 91
ricardo_95 12:7b3a5940f911 92 int boot_delay_ms = 500;
Ishy 42:673ddef4cfa4 93 int total_readout_cycle_time_us = 100000; // Cycle time in us.
ricardo_95 39:cff99a9b7237 94 int i2c__frequency = 400000; // I2C Frequency.
ricardo_95 36:d10f368d037b 95 int baud_rate = 115200; // Baud rate.
ricardo_95 36:d10f368d037b 96 short piezo_resistive_array[8] = {0,0,0,0,0,0,0,0}; // 8 PR sensors 1 time per cycle.
ricardo_95 36:d10f368d037b 97 short piezo_electric_array[5] = {0,0,0,0,0}; // 1 PE sensor 5 times per cycle.
ricardo_95 36:d10f368d037b 98 int angle = 0; // Accelerometer Z-axis.
ricardo_95 37:d8f7b2b5719a 99 float accelerometer_sensorplate[3] = {0.0, 0.0, 0.0}; // Raw accelerometer data.
ricardo_95 36:d10f368d037b 100 float gyroscope_sensorplate[3]; // Raw gyroscope data.
ricardo_95 36:d10f368d037b 101 float accelerometer_reference_belt[3]; // Raw accelerometer data from belt.
ricardo_95 36:d10f368d037b 102 float gyroscope_reference_belt[3]; // Raw gyroscope data from belt.
deldering95 43:d09814c177a0 103 int colourbuf[NUM_COLORS] = {0xff0000,0x00ff00,0x0000ff,0xffff00,0xffffff}; // hex codes for the different colours
deldering95 44:dcbde3175a37 104 char LED_colour = 'w'; // Variable to set LED colour (standard set to green, untill PI sends other character). Other possible colours: red ('r') & yellow ('y').
ricardo_95 37:d8f7b2b5719a 105 bool lock_state = false, lock_flag = 0, mute_state = 0, alarm = 0, calibration_flag = 0, intensity_select = 1; // Boolean variables for logging states.
ricardo_95 36:d10f368d037b 106 bool mute_flag = 0, new_patient_flag = 0, reposition_flag = 0; // Flag variables.
ricardo_95 21:13e4824bc364 107 bool speaker_state = 0, LED_red_state = 0, LED_yellow_state = 0, LED_green_state = 0, power_plug_state = 0;
ricardo_95 37:d8f7b2b5719a 108 bool speaker_logged = 0, LED_red_logged = 0, LED_yellow_logged = 0, LED_green_logged = 0, power_plug_logged = 0; // is toevoegen
ricardo_95 36:d10f368d037b 109 int locktime_ms = 2000; // Waittime for lock user interface in ms.
ricardo_95 36:d10f368d037b 110 int calibrationtime_ms = 5000; // Time to press new_patient button for calibration system.
ricardo_95 37:d8f7b2b5719a 111 int calibration_flash = 0; // Variable for flash LED's to indicate calibration.
ricardo_95 36:d10f368d037b 112 int buttondelay_ms = 750; // Button delay in ms.
ricardo_95 36:d10f368d037b 113 int delay_lock_interface = 3000*60; // Delay for non using interface locktime.
ricardo_95 36:d10f368d037b 114 int speaker_active_ms = 750; // Time to iterate speaker on and off when alarm occurs.
ricardo_95 38:764847892afc 115 int alarm_voltage = 2400; // Needed voltage for alarm expressed as a digital 15 bit value (= 20% of max battery voltage).
ricardo_95 37:d8f7b2b5719a 116 int LED_red_intensity = 0, LED_blue_intensity = 0, LED_green_intensity = 0; // Variables to set LED intensity.
ricardo_95 45:7ebe860702b4 117 //short batteryvoltage_current = 0, batteryvoltage_last = 0, powervoltage_current, powervoltage_last; // Variables to manage batteryvoltage. Maybe change current to other?
ricardo_95 45:7ebe860702b4 118 //const int digital_value_ADC_powervoltage_unplugged = 15000; // Digital value to set the indicating LEDs to wall blue (should be set off later). const in hoofdletters
ricardo_95 36:d10f368d037b 119 int intensity_day = 40, intensity_night = 10; // Intensity settings for LED's to wall.
ricardo_95 38:764847892afc 120 double intensity = 0.0, control_LED_intensity = 0.0; // Variable between 0 and 1 to set the intensity of the LED's above the buttons. Intensity change to smart name!
deldering95 44:dcbde3175a37 121 int colour_code = 0b00;
deldering95 44:dcbde3175a37 122 bool pi_active = false;
ricardo_95 33:df21cb8dc5c7 123 /*************************** TEST ********************************/
ricardo_95 36:d10f368d037b 124 // Verify algoritm function: for belt activation, set test_belt 1 (connect pin p20 to 3.3V).
deldering95 43:d09814c177a0 125 Timer test_timer;
Ishy 41:5380ada94ec6 126 DigitalIn test_pin(PA_11, PullDown);
ricardo_95 33:df21cb8dc5c7 127
deldering95 43:d09814c177a0 128 // Variable to set if belt is used to test algorithm:
deldering95 43:d09814c177a0 129 bool test_belt = 0;
ricardo_95 33:df21cb8dc5c7 130
deldering95 43:d09814c177a0 131 // Set test mode on (log functions to pc serial: interrupts, LED intensity and serial messages):
Ishy 42:673ddef4cfa4 132 bool test_mode = 0;
ricardo_95 34:1614f4f2b841 133
ricardo_95 36:d10f368d037b 134 // Variable for connection test (should be changed):
ricardo_95 46:a0e6e088a50a 135 bool connection_test_sensorplate;
ricardo_95 33:df21cb8dc5c7 136
ricardo_95 21:13e4824bc364 137 /*************************** CODE ********************************/
ricardo_95 7:dba5091c8b7d 138
ricardo_95 36:d10f368d037b 139 void set_intensity_LEDs() // Function to set the intensity for the LED's.
ricardo_95 7:dba5091c8b7d 140 {
ricardo_95 11:73c6def38fbd 141 if (intensity_select == 1) {
ricardo_95 12:7b3a5940f911 142 intensity = intensity_day;
ricardo_95 12:7b3a5940f911 143 } else {
ricardo_95 12:7b3a5940f911 144 intensity = intensity_night;
ricardo_95 7:dba5091c8b7d 145 }
ricardo_95 21:13e4824bc364 146 control_LED_intensity = (intensity/100);
ricardo_95 34:1614f4f2b841 147
ricardo_95 37:d8f7b2b5719a 148 if (test_mode == 1) { // If statement for test purposal LED_intensity values. if def gebruiken voor testmode
ricardo_95 36:d10f368d037b 149 usb_serial.printf("Intensity LED's shines to wall = %f\n", intensity);
ricardo_95 36:d10f368d037b 150 usb_serial.printf("Intensity LED's above buttons = %f\n", control_LED_intensity);
ricardo_95 33:df21cb8dc5c7 151 }
ricardo_95 7:dba5091c8b7d 152 }
ricardo_95 7:dba5091c8b7d 153
ricardo_95 36:d10f368d037b 154 void serial_read() // Function for serial read for select LED intensity and colour.
ricardo_95 12:7b3a5940f911 155 {
deldering95 43:d09814c177a0 156 intensity_select = intensity_code;
deldering95 43:d09814c177a0 157 colour_code = (colour_code_1 << 1 | colour_code_0);
deldering95 44:dcbde3175a37 158 if(colour_code != 0b00 && pi_active == false){pi_active = true;}
deldering95 44:dcbde3175a37 159 if(pi_active){
deldering95 43:d09814c177a0 160 switch(colour_code){
deldering95 43:d09814c177a0 161 case 0b11 :
deldering95 43:d09814c177a0 162 LED_colour = 'y';
deldering95 43:d09814c177a0 163 break;
deldering95 43:d09814c177a0 164 case 0b10 :
deldering95 43:d09814c177a0 165 LED_colour = 'b';
deldering95 43:d09814c177a0 166 break;
deldering95 43:d09814c177a0 167 case 0b01 :
deldering95 43:d09814c177a0 168 LED_colour = 'g';
deldering95 43:d09814c177a0 169 break;
deldering95 43:d09814c177a0 170 case 0b00 :
deldering95 43:d09814c177a0 171 LED_colour = 'r';
deldering95 43:d09814c177a0 172 break;
deldering95 44:dcbde3175a37 173 default :
deldering95 44:dcbde3175a37 174 LED_colour = 'w';
deldering95 44:dcbde3175a37 175 break;
deldering95 44:dcbde3175a37 176 }}
deldering95 43:d09814c177a0 177 //bool read = pi_serial.readable();
deldering95 43:d09814c177a0 178 //usb_serial.printf("Readable = %d\n", read);
deldering95 43:d09814c177a0 179 // if (read_done) { // Function to check if pi is readable.
deldering95 43:d09814c177a0 180 //
deldering95 43:d09814c177a0 181 // pi_serial.scanf("%s", message);
deldering95 43:d09814c177a0 182 //
ricardo_95 34:1614f4f2b841 183
deldering95 43:d09814c177a0 184 if (test_mode == 1) { // If statement for test purposal.
deldering95 43:d09814c177a0 185 usb_serial.printf("Intensity_select = %d en LED_colour = %d\n", intensity_select, LED_colour);
deldering95 43:d09814c177a0 186 }
ricardo_95 34:1614f4f2b841 187
deldering95 43:d09814c177a0 188 if (test_mode == 0) {
deldering95 43:d09814c177a0 189 //usb_serial.printf("Message: %s\n", message);
deldering95 43:d09814c177a0 190 usb_serial.printf("Intensity_select = %d en LED_colour = %d\n", intensity_select, LED_colour);
deldering95 43:d09814c177a0 191
ricardo_95 11:73c6def38fbd 192 }
ricardo_95 11:73c6def38fbd 193 }
ricardo_95 11:73c6def38fbd 194
ricardo_95 36:d10f368d037b 195 void serial_log() // Function for serial logging. See link to table with code declarations above in code.
ricardo_95 7:dba5091c8b7d 196 {
deldering95 43:d09814c177a0 197 if (mute_flag == 1) { // If statement to control logging for mute button.
ricardo_95 36:d10f368d037b 198 pi_serial.printf(">01\n");
ricardo_95 34:1614f4f2b841 199
deldering95 43:d09814c177a0 200 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 201 usb_serial.printf(">01\n");
ricardo_95 33:df21cb8dc5c7 202 }
ricardo_95 34:1614f4f2b841 203
ricardo_95 7:dba5091c8b7d 204 mute_flag = 0;
ricardo_95 19:3b5999fa7b7e 205 }
Ishy 54:a65b6fa447b0 206
Ishy 54:a65b6fa447b0 207 if (lock_flag == 1) { // If statement to control logging for mute button.
Ishy 54:a65b6fa447b0 208 pi_serial.printf(">00\n");
Ishy 54:a65b6fa447b0 209
Ishy 54:a65b6fa447b0 210 if (test_mode == 1) { // If statement for test purposal.
Ishy 54:a65b6fa447b0 211 usb_serial.printf(">00\n");
Ishy 54:a65b6fa447b0 212 }
Ishy 54:a65b6fa447b0 213
Ishy 54:a65b6fa447b0 214 lock_flag = 0;
Ishy 54:a65b6fa447b0 215 }
ricardo_95 12:7b3a5940f911 216
ricardo_95 36:d10f368d037b 217 if (new_patient_flag == 1) { // If statement to control logging for new patient button.
ricardo_95 36:d10f368d037b 218 pi_serial.printf(">03\n");
ricardo_95 34:1614f4f2b841 219
deldering95 43:d09814c177a0 220 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 221 usb_serial.printf(">03\n");
ricardo_95 33:df21cb8dc5c7 222 }
ricardo_95 34:1614f4f2b841 223
ricardo_95 7:dba5091c8b7d 224 new_patient_flag = 0;
ricardo_95 7:dba5091c8b7d 225 }
ricardo_95 12:7b3a5940f911 226
deldering95 43:d09814c177a0 227 if (reposition_flag == 1) { // If statement to control logging for reposition button.
ricardo_95 36:d10f368d037b 228 pi_serial.printf(">02\n");
ricardo_95 34:1614f4f2b841 229
deldering95 43:d09814c177a0 230 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 231 usb_serial.printf(">02\n");
ricardo_95 33:df21cb8dc5c7 232 }
ricardo_95 34:1614f4f2b841 233
ricardo_95 7:dba5091c8b7d 234 reposition_flag = 0;
ricardo_95 7:dba5091c8b7d 235 }
ricardo_95 12:7b3a5940f911 236
ricardo_95 46:a0e6e088a50a 237 /*if (batteryvoltage_current != batteryvoltage_last) { // If statement to control logging for batteryvoltage.
ricardo_95 36:d10f368d037b 238 pi_serial.printf("%%" "%d\n", batteryvoltage_current);
ricardo_95 34:1614f4f2b841 239
deldering95 43:d09814c177a0 240 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 241 usb_serial.printf("%%" "%d\n", batteryvoltage_current);
ricardo_95 33:df21cb8dc5c7 242 }
ricardo_95 34:1614f4f2b841 243
ricardo_95 16:adbbac0c79f9 244 batteryvoltage_last = batteryvoltage_current;
ricardo_95 46:a0e6e088a50a 245 }*/
ricardo_95 12:7b3a5940f911 246
ricardo_95 36:d10f368d037b 247 if (LED_red_logged != LED_red_state) { // If statement to control logging for LED_red.
ricardo_95 12:7b3a5940f911 248 if (LED_red_state == 1) {
ricardo_95 36:d10f368d037b 249 pi_serial.printf("&04\n");
ricardo_95 9:514a44bf510f 250 LED_red_logged = LED_red_state;
ricardo_95 34:1614f4f2b841 251 if (test_mode == 1) {
ricardo_95 36:d10f368d037b 252 usb_serial.printf("&04\n");
ricardo_95 34:1614f4f2b841 253 }
ricardo_95 12:7b3a5940f911 254 }
deldering95 43:d09814c177a0 255
ricardo_95 9:514a44bf510f 256 if (LED_red_state == 0) {
ricardo_95 36:d10f368d037b 257 pi_serial.printf("&40\n");
ricardo_95 12:7b3a5940f911 258 LED_red_logged = LED_red_state;
ricardo_95 34:1614f4f2b841 259 if (test_mode == 1) {
ricardo_95 36:d10f368d037b 260 usb_serial.printf("&40\n");
ricardo_95 34:1614f4f2b841 261 }
ricardo_95 9:514a44bf510f 262 }
ricardo_95 8:bf0f7a6fb1fd 263 }
ricardo_95 12:7b3a5940f911 264
ricardo_95 36:d10f368d037b 265 if (LED_yellow_logged != LED_yellow_state) { // If statement to control logging for LED_yellow.
deldering95 43:d09814c177a0 266 if (LED_yellow_state == 1) {
ricardo_95 36:d10f368d037b 267 pi_serial.printf("&06\n");
ricardo_95 9:514a44bf510f 268 LED_yellow_logged = LED_yellow_state;
ricardo_95 34:1614f4f2b841 269 if (test_mode == 1) {
ricardo_95 36:d10f368d037b 270 usb_serial.printf("&06\n");
ricardo_95 34:1614f4f2b841 271 }
ricardo_95 12:7b3a5940f911 272 }
ricardo_95 9:514a44bf510f 273 if (LED_yellow_state == 0) {
ricardo_95 36:d10f368d037b 274 pi_serial.printf("&60\n");
ricardo_95 12:7b3a5940f911 275 LED_yellow_logged = LED_yellow_state;
ricardo_95 34:1614f4f2b841 276 if (test_mode == 1) {
ricardo_95 36:d10f368d037b 277 usb_serial.printf("&60\n");
ricardo_95 34:1614f4f2b841 278 }
ricardo_95 9:514a44bf510f 279 }
ricardo_95 7:dba5091c8b7d 280 }
ricardo_95 12:7b3a5940f911 281
ricardo_95 36:d10f368d037b 282 if (LED_green_logged != LED_green_state) { // If statement to control logging for LED_green.
ricardo_95 12:7b3a5940f911 283 if (LED_green_state == 1) {
ricardo_95 36:d10f368d037b 284 pi_serial.printf("&05\n");
ricardo_95 9:514a44bf510f 285 LED_green_logged = LED_green_state;
deldering95 43:d09814c177a0 286
ricardo_95 34:1614f4f2b841 287 if (test_mode == 1) {
ricardo_95 36:d10f368d037b 288 usb_serial.printf("&05\n");
ricardo_95 34:1614f4f2b841 289 }
ricardo_95 12:7b3a5940f911 290 }
deldering95 43:d09814c177a0 291
ricardo_95 9:514a44bf510f 292 if (LED_green_state == 0) {
ricardo_95 36:d10f368d037b 293 pi_serial.printf("&50\n");
ricardo_95 12:7b3a5940f911 294 LED_green_logged = LED_green_state;
deldering95 43:d09814c177a0 295
ricardo_95 34:1614f4f2b841 296 if (test_mode == 1) {
ricardo_95 36:d10f368d037b 297 usb_serial.printf("&50\n");
ricardo_95 34:1614f4f2b841 298 }
ricardo_95 9:514a44bf510f 299 }
ricardo_95 7:dba5091c8b7d 300 }
ricardo_95 12:7b3a5940f911 301
deldering95 43:d09814c177a0 302 if (speaker_logged != speaker_state) { // If statement to control logging for speaker.
ricardo_95 12:7b3a5940f911 303 if (speaker_state == 1) {
ricardo_95 36:d10f368d037b 304 pi_serial.printf("&07\n");
ricardo_95 9:514a44bf510f 305 speaker_logged = speaker_state;
deldering95 43:d09814c177a0 306
ricardo_95 36:d10f368d037b 307 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 308 usb_serial.printf("&07\n");
ricardo_95 34:1614f4f2b841 309 }
ricardo_95 12:7b3a5940f911 310 }
deldering95 43:d09814c177a0 311
ricardo_95 9:514a44bf510f 312 if (speaker_state == 0) {
ricardo_95 36:d10f368d037b 313 pi_serial.printf("&70\n");
ricardo_95 12:7b3a5940f911 314 speaker_logged = speaker_state;
deldering95 43:d09814c177a0 315
ricardo_95 36:d10f368d037b 316 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 317 usb_serial.printf("&70\n");
ricardo_95 34:1614f4f2b841 318 }
ricardo_95 9:514a44bf510f 319 }
ricardo_95 8:bf0f7a6fb1fd 320 }
ricardo_95 9:514a44bf510f 321
ricardo_95 36:d10f368d037b 322 if (power_plug_logged != power_plug_state) { // If statement to control the logging for the state of the power plug.
ricardo_95 12:7b3a5940f911 323 if (power_plug_state == 1) {
ricardo_95 36:d10f368d037b 324 pi_serial.printf("#08\n");
deldering95 43:d09814c177a0 325
ricardo_95 36:d10f368d037b 326 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 327 usb_serial.printf("#08\n");
ricardo_95 34:1614f4f2b841 328 }
ricardo_95 9:514a44bf510f 329 power_plug_logged = power_plug_state;
ricardo_95 12:7b3a5940f911 330 }
deldering95 43:d09814c177a0 331
ricardo_95 9:514a44bf510f 332 if (power_plug_state == 0) {
ricardo_95 36:d10f368d037b 333 pi_serial.printf("#80\n");
deldering95 43:d09814c177a0 334
ricardo_95 36:d10f368d037b 335 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 336 usb_serial.printf("#80\n");
ricardo_95 34:1614f4f2b841 337 }
ricardo_95 12:7b3a5940f911 338 power_plug_logged = power_plug_state;
ricardo_95 9:514a44bf510f 339 }
ricardo_95 9:514a44bf510f 340 }
deldering95 43:d09814c177a0 341
deldering95 43:d09814c177a0 342 if (connection_test_sensorplate == 1) { // If statement for sending serial information sensorplate data when connection test is active.
deldering95 43:d09814c177a0 343 // Receiving order sensor information: 8 resistive sensors, 5 electric readings. Is splitted in two parts - part 1/2.
ricardo_95 39:cff99a9b7237 344 pi_serial.printf("!,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\n", piezo_resistive_array[0], piezo_resistive_array[1], piezo_resistive_array[2], piezo_resistive_array[3], piezo_resistive_array[4], piezo_resistive_array[5], piezo_resistive_array[6], piezo_resistive_array[7], piezo_electric_array[0], piezo_electric_array[1], piezo_electric_array[2], piezo_electric_array[3], piezo_electric_array[4]); // print all to serial port
deldering95 43:d09814c177a0 345
ricardo_95 34:1614f4f2b841 346 if (test_mode == 1) {
ricardo_95 39:cff99a9b7237 347 usb_serial.printf("!,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\n", piezo_resistive_array[0], piezo_resistive_array[1], piezo_resistive_array[2], piezo_resistive_array[3], piezo_resistive_array[4], piezo_resistive_array[5], piezo_resistive_array[6], piezo_resistive_array[7], piezo_electric_array[0], piezo_electric_array[1], piezo_electric_array[2], piezo_electric_array[3], piezo_electric_array[4]); // print all to serial port
ricardo_95 34:1614f4f2b841 348 }
ricardo_95 28:b4bee068780d 349 }
ricardo_95 34:1614f4f2b841 350
DEldering 0:c0e44c46c573 351 }
DEldering 0:c0e44c46c573 352
deldering95 43:d09814c177a0 353 void colour_select_indicating_LED_wall(char nLED_colour) // Function to select the colour for LED's to wall (values comes from algorithm).
ricardo_95 21:13e4824bc364 354 {
ricardo_95 36:d10f368d037b 355 set_intensity_LEDs(); // Call function set_intensity_LEDs to set the intensity for LED's to wall and above buttons.
deldering95 43:d09814c177a0 356 ws.setII(2.55*intensity);
deldering95 43:d09814c177a0 357 switch(nLED_colour) {
deldering95 43:d09814c177a0 358 case 'r' :
deldering95 43:d09814c177a0 359 px.SetAll(colourbuf[0]);
deldering95 43:d09814c177a0 360 break;
deldering95 43:d09814c177a0 361 case 'g' :
deldering95 43:d09814c177a0 362 px.SetAll(colourbuf[1]);
deldering95 43:d09814c177a0 363 break;
deldering95 43:d09814c177a0 364 case 'b' :
deldering95 43:d09814c177a0 365 px.SetAll(colourbuf[2]);
deldering95 43:d09814c177a0 366 break;
deldering95 43:d09814c177a0 367 case 'y' :
deldering95 43:d09814c177a0 368 px.SetAll(colourbuf[3]);
deldering95 43:d09814c177a0 369 break;
deldering95 43:d09814c177a0 370 default :
deldering95 43:d09814c177a0 371 px.SetAll(colourbuf[4]);
deldering95 43:d09814c177a0 372 }
deldering95 43:d09814c177a0 373
deldering95 43:d09814c177a0 374 if (calibration_flash >= 1) {
deldering95 43:d09814c177a0 375 if ((calibration_flash % 2) == 0) {
deldering95 43:d09814c177a0 376 px.SetAll(colourbuf[4]);
deldering95 43:d09814c177a0 377 } else {
deldering95 43:d09814c177a0 378 ws.setII(0);
deldering95 43:d09814c177a0 379 }
deldering95 43:d09814c177a0 380 calibration_flash--;
deldering95 43:d09814c177a0 381 }
deldering95 43:d09814c177a0 382 for (int z=WS2812_BUF; z >= 0 ; z--) {
deldering95 43:d09814c177a0 383 ws.write_offsets(px.getBuf(),0,0,0);
deldering95 43:d09814c177a0 384 }
deldering95 43:d09814c177a0 385 /*
ricardo_95 36:d10f368d037b 386 if ((LED_colour == 'r') || (LED_colour == 'g') || (LED_colour == 'b') || (LED_colour == 'y')) { // If statement to prevent potential errors in communication.
deldering95 43:d09814c177a0 387 LED_red_intensity = 0; // Reset
ricardo_95 36:d10f368d037b 388 LED_green_intensity = 0;
ricardo_95 36:d10f368d037b 389 LED_blue_intensity = 0;
deldering95 43:d09814c177a0 390
ricardo_95 36:d10f368d037b 391 if (LED_colour == 'r') { // Set LED_colour to red.
deldering95 43:d09814c177a0 392 LED_red_intensity = (2.55*intensity); // 255 / 100 = 2.55 (8 - bit digital value; 0-255 = 256 steps); intensity is a value between 0 and 100.
ricardo_95 36:d10f368d037b 393 LED_green_intensity = 0;
ricardo_95 36:d10f368d037b 394 LED_blue_intensity = 0;
ricardo_95 34:1614f4f2b841 395 LED_red_state = 1;
ricardo_95 34:1614f4f2b841 396 } else {
ricardo_95 34:1614f4f2b841 397 LED_red_state = 0;
ricardo_95 34:1614f4f2b841 398 }
deldering95 43:d09814c177a0 399
ricardo_95 36:d10f368d037b 400 if (LED_colour == 'y') { // Set LED_colour to yellow.
ricardo_95 36:d10f368d037b 401 LED_red_intensity = (2.55*intensity);
ricardo_95 36:d10f368d037b 402 LED_green_intensity = (2.55*intensity);
ricardo_95 36:d10f368d037b 403 LED_blue_intensity = 0;
ricardo_95 34:1614f4f2b841 404 LED_yellow_state = 1;
ricardo_95 34:1614f4f2b841 405 } else {
ricardo_95 34:1614f4f2b841 406 LED_green_state = 0;
ricardo_95 34:1614f4f2b841 407 }
deldering95 43:d09814c177a0 408
ricardo_95 36:d10f368d037b 409 if (LED_colour == 'g') { // Set LED_colour to green.
ricardo_95 36:d10f368d037b 410 LED_red_intensity = 0;
ricardo_95 36:d10f368d037b 411 LED_green_intensity = (2.55*intensity);
ricardo_95 36:d10f368d037b 412 LED_blue_intensity = 0;
ricardo_95 34:1614f4f2b841 413 LED_green_state = 1;
ricardo_95 34:1614f4f2b841 414 } else {
ricardo_95 34:1614f4f2b841 415 LED_green_state = 0;
ricardo_95 34:1614f4f2b841 416 }
deldering95 43:d09814c177a0 417
ricardo_95 36:d10f368d037b 418 if (LED_colour == 'b') { // Set LED_colour to blue.
ricardo_95 36:d10f368d037b 419 LED_red_intensity = 0;
ricardo_95 36:d10f368d037b 420 LED_green_intensity = 0;
ricardo_95 36:d10f368d037b 421 LED_blue_intensity = (2.55*intensity);
ricardo_95 34:1614f4f2b841 422 }
ricardo_95 28:b4bee068780d 423 }
ricardo_95 28:b4bee068780d 424
deldering95 43:d09814c177a0 425 if (calibration_flash >= 1) { // If statement for flashing LED's (colour = white) when calibration is active.
ricardo_95 36:d10f368d037b 426 if ((calibration_flash % 2) == 0) { // If value can not be devided by two, set LED's on.
ricardo_95 36:d10f368d037b 427 LED_red_intensity = 255;
ricardo_95 36:d10f368d037b 428 LED_green_intensity = 255;
ricardo_95 36:d10f368d037b 429 LED_blue_intensity = 255;
ricardo_95 36:d10f368d037b 430 LED_on_dev_board4 = 1;
ricardo_95 36:d10f368d037b 431 } else { // Else set LED's off.
ricardo_95 36:d10f368d037b 432 LED_red_intensity = 0;
ricardo_95 36:d10f368d037b 433 LED_green_intensity = 0;
ricardo_95 36:d10f368d037b 434 LED_blue_intensity = 0;
ricardo_95 36:d10f368d037b 435 LED_on_dev_board4 = 0;
ricardo_95 21:13e4824bc364 436 }
ricardo_95 21:13e4824bc364 437 calibration_flash--;
ricardo_95 21:13e4824bc364 438 }
deldering95 43:d09814c177a0 439 */
ricardo_95 21:13e4824bc364 440 }
ricardo_95 21:13e4824bc364 441
ricardo_95 36:d10f368d037b 442 void trigger_lock() // If rising edge lock button is detected start locktimer.
ricardo_95 21:13e4824bc364 443 {
ricardo_95 34:1614f4f2b841 444 if (test_mode == 1) {
ricardo_95 36:d10f368d037b 445 usb_serial.printf("Lock triggered.\n");
ricardo_95 34:1614f4f2b841 446 }
deldering95 43:d09814c177a0 447
ricardo_95 36:d10f368d037b 448 button_lock_hold_timer.reset();
ricardo_95 36:d10f368d037b 449 button_lock_hold_timer.start();
ricardo_95 36:d10f368d037b 450 delay_between_button_pressed.reset();
ricardo_95 36:d10f368d037b 451 delay_between_button_pressed.start();
ricardo_95 21:13e4824bc364 452 }
ricardo_95 21:13e4824bc364 453
ricardo_95 36:d10f368d037b 454 void end_timer_lock_button() // End timer lock.
ricardo_95 21:13e4824bc364 455 {
deldering95 43:d09814c177a0 456 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 457 usb_serial.printf("Lock released.\n");
ricardo_95 36:d10f368d037b 458 }
ricardo_95 36:d10f368d037b 459 lock_flag = 0; // Set lock_flag off.
ricardo_95 36:d10f368d037b 460 button_lock_hold_timer.stop(); // Stop and reset holdtimer
ricardo_95 36:d10f368d037b 461 button_lock_hold_timer.reset();
ricardo_95 36:d10f368d037b 462 }
ricardo_95 36:d10f368d037b 463
ricardo_95 36:d10f368d037b 464 void reposition_button_triggered()
ricardo_95 36:d10f368d037b 465 {
ricardo_95 36:d10f368d037b 466 if (lock_state == 1 | (delay_between_button_pressed.read_ms() < buttondelay_ms)) { // Control statement for lock interface and delay for non using buttons at the same time.
ricardo_95 21:13e4824bc364 467 } else {
ricardo_95 36:d10f368d037b 468 delay_between_button_pressed.reset();
ricardo_95 36:d10f368d037b 469 delay_between_button_pressed.start();
deldering95 43:d09814c177a0 470 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 471 usb_serial.printf("Reposition triggered.\n");
ricardo_95 36:d10f368d037b 472 LED_on_dev_board1 = !LED_on_dev_board1;
ricardo_95 21:13e4824bc364 473 }
ricardo_95 21:13e4824bc364 474 reposition_flag = 1;
ricardo_95 21:13e4824bc364 475
ricardo_95 36:d10f368d037b 476 reposition_feedback_LED = control_LED_intensity;
ricardo_95 21:13e4824bc364 477 }
ricardo_95 21:13e4824bc364 478 }
ricardo_95 21:13e4824bc364 479
deldering95 43:d09814c177a0 480 void rise_reposition() // Interrupt for rising edge reposition function (deactivation; active low).
ricardo_95 21:13e4824bc364 481 {
deldering95 43:d09814c177a0 482 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 483 usb_serial.printf("Reposition released.\n");
ricardo_95 34:1614f4f2b841 484 }
ricardo_95 36:d10f368d037b 485 reposition_feedback_LED = 0;
ricardo_95 34:1614f4f2b841 486
ricardo_95 21:13e4824bc364 487 }
ricardo_95 21:13e4824bc364 488
ricardo_95 36:d10f368d037b 489 void mute_button_triggered()
ricardo_95 21:13e4824bc364 490 {
ricardo_95 21:13e4824bc364 491
ricardo_95 36:d10f368d037b 492 if (lock_state == 1 | (delay_between_button_pressed.read_ms() < buttondelay_ms)) { // Control statement for lock interface and delay for non using buttons at the same time.
ricardo_95 21:13e4824bc364 493 } else {
ricardo_95 36:d10f368d037b 494 delay_between_button_pressed.reset();
ricardo_95 36:d10f368d037b 495 delay_between_button_pressed.start();
ricardo_95 21:13e4824bc364 496 mute_state = !mute_state;
deldering95 43:d09814c177a0 497
ricardo_95 36:d10f368d037b 498 if (mute_state == 1) { // If statement for if mute_state is active, set mute feedback LED active.
ricardo_95 36:d10f368d037b 499 mute_feedback_LED = control_LED_intensity;
ricardo_95 21:13e4824bc364 500 } else {
ricardo_95 36:d10f368d037b 501 mute_feedback_LED = 0;
ricardo_95 21:13e4824bc364 502 }
deldering95 43:d09814c177a0 503
deldering95 43:d09814c177a0 504 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 505 usb_serial.printf("Mute triggered %d.\n",mute_state);
ricardo_95 36:d10f368d037b 506 LED_on_dev_board1 = !LED_on_dev_board1;
ricardo_95 21:13e4824bc364 507 }
ricardo_95 21:13e4824bc364 508
ricardo_95 21:13e4824bc364 509 mute_flag = 1;
ricardo_95 21:13e4824bc364 510 }
ricardo_95 21:13e4824bc364 511 }
ricardo_95 21:13e4824bc364 512
ricardo_95 36:d10f368d037b 513 void trigger_new_patient() // Function to trigger hold timer for new patient and calibration function.
ricardo_95 21:13e4824bc364 514 {
ricardo_95 21:13e4824bc364 515
ricardo_95 36:d10f368d037b 516 if (lock_state == 1 | (delay_between_button_pressed.read_ms() < buttondelay_ms)) {
ricardo_95 21:13e4824bc364 517 } else {
ricardo_95 37:d8f7b2b5719a 518 button_calibration_hold_timer.reset(); // inline ?
ricardo_95 36:d10f368d037b 519 button_calibration_hold_timer.start();
ricardo_95 36:d10f368d037b 520 new_patient_feedback_LED = control_LED_intensity;;
deldering95 43:d09814c177a0 521
deldering95 43:d09814c177a0 522 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 523 usb_serial.printf("New patient triggered.\n");
ricardo_95 34:1614f4f2b841 524 }
ricardo_95 21:13e4824bc364 525 }
ricardo_95 21:13e4824bc364 526 }
ricardo_95 21:13e4824bc364 527
ricardo_95 36:d10f368d037b 528 void activate_new_patient_function() // Timer calibration function.
ricardo_95 21:13e4824bc364 529 {
deldering95 43:d09814c177a0 530 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 531 usb_serial.printf("New patient released.\n");
ricardo_95 34:1614f4f2b841 532 }
ricardo_95 36:d10f368d037b 533 new_patient_feedback_LED = 0;
ricardo_95 21:13e4824bc364 534
ricardo_95 37:d8f7b2b5719a 535 if (0 < button_calibration_hold_timer.read_ms() < calibrationtime_ms) { // If statement for new_patient function: holdtime for calibration is les then set time to calibrate algorithm. && toevoegen? -. als mogelijk mailtje naar Bart: bart@straightupalgorithms.com
ricardo_95 21:13e4824bc364 536 new_patient_flag = 1;
ricardo_95 21:13e4824bc364 537 }
ricardo_95 21:13e4824bc364 538
deldering95 43:d09814c177a0 539 button_calibration_hold_timer.stop(); // Timer reset for calibration function of new patient button.
ricardo_95 36:d10f368d037b 540 button_calibration_hold_timer.reset();
ricardo_95 21:13e4824bc364 541
ricardo_95 36:d10f368d037b 542 if (lock_state == 1 | (delay_between_button_pressed.read_ms() < buttondelay_ms)) { // Control statement for lock interface and delay for non using buttons at the same time.
ricardo_95 21:13e4824bc364 543 } else {
ricardo_95 21:13e4824bc364 544 if (calibration_flag == 0) {
ricardo_95 21:13e4824bc364 545
deldering95 43:d09814c177a0 546 if (LED_on_dev_board1 == 0) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 547 LED_on_dev_board1 = 1;
ricardo_95 21:13e4824bc364 548 } else {
ricardo_95 36:d10f368d037b 549 LED_on_dev_board1 = 0;
ricardo_95 21:13e4824bc364 550 }
ricardo_95 21:13e4824bc364 551
ricardo_95 21:13e4824bc364 552 } else {
ricardo_95 21:13e4824bc364 553 calibration_flag = 0;
ricardo_95 21:13e4824bc364 554 }
ricardo_95 21:13e4824bc364 555 }
ricardo_95 21:13e4824bc364 556 }
ricardo_95 21:13e4824bc364 557
deldering95 43:d09814c177a0 558 void timer_functions() // Function which contains statements using timers.
ricardo_95 21:13e4824bc364 559 {
deldering95 44:dcbde3175a37 560 if (button_lock == 1){
deldering95 44:dcbde3175a37 561 button_lock_hold_timer.stop();
deldering95 44:dcbde3175a37 562 button_lock_hold_timer.reset();
deldering95 44:dcbde3175a37 563 }
ricardo_95 36:d10f368d037b 564 if ((button_lock_hold_timer.read_ms() > locktime_ms) && lock_flag == 0 && button_lock == 0) { // If statement for lock function.
ricardo_95 21:13e4824bc364 565 lock_flag = 1;
ricardo_95 36:d10f368d037b 566 LED_on_dev_board2 = !LED_on_dev_board2;
ricardo_95 21:13e4824bc364 567 lock_state = !lock_state;
deldering95 43:d09814c177a0 568
deldering95 43:d09814c177a0 569 if (lock_state == 0) { // If statement to control lock feedback LED above button.
ricardo_95 36:d10f368d037b 570 lock_feedback_LED = control_LED_intensity;
ricardo_95 21:13e4824bc364 571 } else {
ricardo_95 36:d10f368d037b 572 lock_feedback_LED = 0;
ricardo_95 21:13e4824bc364 573 }
ricardo_95 21:13e4824bc364 574 }
ricardo_95 21:13e4824bc364 575
deldering95 44:dcbde3175a37 576 if (button_new_patient == 1){
deldering95 44:dcbde3175a37 577 button_calibration_hold_timer.stop();
deldering95 44:dcbde3175a37 578 button_calibration_hold_timer.reset();
deldering95 44:dcbde3175a37 579 }
deldering95 44:dcbde3175a37 580
ricardo_95 36:d10f368d037b 581 if ((button_calibration_hold_timer.read_ms() > calibrationtime_ms) && calibration_flag == 0 && button_new_patient == 0 && lock_state == 0) { // If statement for calibration algorithm.
ricardo_95 21:13e4824bc364 582 calibration_flag = 1;
ricardo_95 21:13e4824bc364 583 calibration_flash = 11;
deldering95 43:d09814c177a0 584
deldering95 43:d09814c177a0 585 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 586 usb_serial.printf("Calibrate triggered.\n");
ricardo_95 34:1614f4f2b841 587 }
deldering95 43:d09814c177a0 588
ricardo_95 36:d10f368d037b 589 pi_serial.printf(">30\n"); // Print statement for serial communication to inform algorithm to calibrate.
ricardo_95 21:13e4824bc364 590 }
ricardo_95 21:13e4824bc364 591
ricardo_95 36:d10f368d037b 592 if (delay_between_button_pressed.read_ms() > delay_lock_interface) { // If buttons are not pressed for 3 minutes, set lock active.
ricardo_95 21:13e4824bc364 593 lock_state = 1;
ricardo_95 36:d10f368d037b 594 LED_on_dev_board2 = 1;
ricardo_95 36:d10f368d037b 595 lock_feedback_LED = 0;
ricardo_95 21:13e4824bc364 596 }
ricardo_95 21:13e4824bc364 597 }
ricardo_95 21:13e4824bc364 598
deldering95 43:d09814c177a0 599 //void generate(neopixel::Pixel * out, uint32_t index, uintptr_t val) // Generate LED colour function (library function PixelArray is used for this item).
deldering95 43:d09814c177a0 600 //{
deldering95 43:d09814c177a0 601 // out->red = LED_red_intensity;
deldering95 43:d09814c177a0 602 // out->green = LED_green_intensity;
deldering95 43:d09814c177a0 603 // out->blue = LED_blue_intensity;
deldering95 43:d09814c177a0 604 //}
ricardo_95 21:13e4824bc364 605
ricardo_95 36:d10f368d037b 606 void set_userinterface_LED() // Control functions for LED above buttons (added because of failures).
ricardo_95 21:13e4824bc364 607 {
ricardo_95 21:13e4824bc364 608 if (lock_state == 1) {
ricardo_95 21:13e4824bc364 609 } else {
ricardo_95 36:d10f368d037b 610 if (button_reposition == 0) {
ricardo_95 36:d10f368d037b 611 reposition_feedback_LED = control_LED_intensity;
ricardo_95 21:13e4824bc364 612 } else {
ricardo_95 36:d10f368d037b 613 reposition_feedback_LED = 0;
ricardo_95 21:13e4824bc364 614 }
ricardo_95 21:13e4824bc364 615
ricardo_95 36:d10f368d037b 616 if (button_new_patient == 0) {
ricardo_95 36:d10f368d037b 617 new_patient_feedback_LED = control_LED_intensity;
ricardo_95 21:13e4824bc364 618 } else {
ricardo_95 36:d10f368d037b 619 new_patient_feedback_LED = 0;
ricardo_95 21:13e4824bc364 620 }
ricardo_95 21:13e4824bc364 621 }
ricardo_95 21:13e4824bc364 622 }
ricardo_95 21:13e4824bc364 623
ricardo_95 45:7ebe860702b4 624 /*void read_voltage() // Function for reading voltages from power and battery.
ricardo_95 21:13e4824bc364 625 {
ricardo_95 36:d10f368d037b 626 if (power_plug_state == 1) { // If supplyvoltage (readed from input) is greater then the setted alarmvoltage.
ricardo_95 36:d10f368d037b 627 alarm = 0; // Alarm is off.
ricardo_95 21:13e4824bc364 628 speaker_state = 0;
ricardo_95 21:13e4824bc364 629 } else {
ricardo_95 36:d10f368d037b 630 alarm = 1; // Else alarm is on.
ricardo_95 21:13e4824bc364 631 speaker_state = 1;
ricardo_95 21:13e4824bc364 632 }
ricardo_95 26:9e130f7ee829 633
ricardo_95 26:9e130f7ee829 634
deldering95 43:d09814c177a0 635 if (alarm == 1 && mute_state == 1 && (batteryvoltage_current > alarm_voltage)) {// Set speaker on for 750 ms. Use PWM? => Split in more functions.
ricardo_95 36:d10f368d037b 636 speaker1 = 0; // Set speaker.
ricardo_95 21:13e4824bc364 637 }
ricardo_95 21:13e4824bc364 638
ricardo_95 24:782c4dc4a3ff 639 if ((alarm == 1 && mute_state == 0 && (speaker_timer.read_ms() < speaker_active_ms)) || ((batteryvoltage_current < alarm_voltage) && (speaker_timer.read_ms() < speaker_active_ms) && power_plug_state == 0)) { // Set speaker on for 750 ms.
ricardo_95 36:d10f368d037b 640 speaker1 = 1; // Set speaker.
ricardo_95 36:d10f368d037b 641 speaker_timer.start(); // Set timer for speaker to iterate on and off.
ricardo_95 21:13e4824bc364 642 }
ricardo_95 21:13e4824bc364 643
ricardo_95 21:13e4824bc364 644 if ((speaker_timer.read_ms() > speaker_active_ms) && (speaker_timer.read_ms() < (speaker_active_ms*2))) {
ricardo_95 36:d10f368d037b 645 speaker1 = 0; // Turn off speaker (use two outputs because of currentlimiting of one).
ricardo_95 21:13e4824bc364 646 }
ricardo_95 21:13e4824bc364 647
ricardo_95 37:d8f7b2b5719a 648 if (speaker_timer.read_ms() > (speaker_active_ms*2)) { //
ricardo_95 36:d10f368d037b 649 speaker_timer.stop(); // Stop speaker timer.
ricardo_95 21:13e4824bc364 650 speaker_timer.reset();
ricardo_95 21:13e4824bc364 651 }
deldering95 43:d09814c177a0 652 // Read channel 0 from external ADC (batteryvoltage); voltagedeviders are used,
ricardo_95 36:d10f368d037b 653 batteryvoltage_current = adsAccu.readADC_SingleEnded(0); // because of higher voltage then Vcc of ADC (5.3 V (= Vcc + 0.3 V) max possible at each analog input).
ricardo_95 36:d10f368d037b 654 powervoltage_current = adsAccu.readADC_SingleEnded(1); // Read channel 1 from external ADC (powervoltage).
ricardo_95 21:13e4824bc364 655
deldering95 43:d09814c177a0 656 if (powervoltage_current < digital_value_ADC_powervoltage_unplugged) { // If statement to set LED's to blue.
ricardo_95 21:13e4824bc364 657 power_plug_state = 0;
deldering95 43:d09814c177a0 658 //LED_colour = 'b';
ricardo_95 21:13e4824bc364 659 } else {
ricardo_95 21:13e4824bc364 660 power_plug_state = 1;
ricardo_95 21:13e4824bc364 661 }
ricardo_95 45:7ebe860702b4 662 }*/
ricardo_95 21:13e4824bc364 663
deldering95 43:d09814c177a0 664 void read_adc()
deldering95 43:d09814c177a0 665 {
Ishy 42:673ddef4cfa4 666 return;
ricardo_95 40:a5614befa65f 667 piezo_electric_sample_timer.reset(); // Clock gebruiken o.i.d.?
ricardo_95 36:d10f368d037b 668 piezo_electric_sample_timer.start();
ricardo_95 46:a0e6e088a50a 669 connection_test_sensorplate = !testpin_sensorplate;
deldering95 43:d09814c177a0 670
ricardo_95 36:d10f368d037b 671 if (test_mode == 1) {
ricardo_95 36:d10f368d037b 672 usb_serial.printf("Connection test sensorplate = %d\n", connection_test_sensorplate);
ricardo_95 36:d10f368d037b 673 }
deldering95 43:d09814c177a0 674
ricardo_95 36:d10f368d037b 675 /*
ricardo_95 36:d10f368d037b 676 if (connection_test_sensorplate == 0) {
ricardo_95 28:b4bee068780d 677 lock_state = 1;
ricardo_95 36:d10f368d037b 678 LED_on_dev_board2 = 1;
ricardo_95 36:d10f368d037b 679 lock_feedback_LED = 0;
ricardo_95 36:d10f368d037b 680 }*/
deldering95 43:d09814c177a0 681
ricardo_95 36:d10f368d037b 682 if (connection_test_sensorplate == 1) {
ricardo_95 36:d10f368d037b 683 piezo_electric_array[0] = piezo_electric_adc.readADC_SingleEnded(0); // First PE readout.
ricardo_95 21:13e4824bc364 684
ricardo_95 37:d8f7b2b5719a 685 for (uint8_t k = 0; k < 4; ++k) {
ricardo_95 36:d10f368d037b 686 piezo_resistive_array[k] = piezo_resistive_adc1.readADC_SingleEnded(k); // First 4 PR readout.
ricardo_95 21:13e4824bc364 687 }
ricardo_95 21:13e4824bc364 688
ricardo_95 37:d8f7b2b5719a 689 while(piezo_electric_sample_timer.read_us()<(1*(total_readout_cycle_time_us/5))) {} // Wait untill 20% of cycle. Energy efficiency is not fine in this situation, correct if low energy is needed.
ricardo_95 36:d10f368d037b 690
ricardo_95 36:d10f368d037b 691 piezo_electric_array[1] = piezo_electric_adc.readADC_SingleEnded(0); // Second PE readout.
ricardo_95 21:13e4824bc364 692
ricardo_95 37:d8f7b2b5719a 693 for (uint8_t k = 0; k < 4; ++k) {
ricardo_95 36:d10f368d037b 694 piezo_resistive_array[k+4] = piezo_resistive_adc2.readADC_SingleEnded(k); // Last 4 PR readout.
ricardo_95 21:13e4824bc364 695 }
ricardo_95 21:13e4824bc364 696
ricardo_95 37:d8f7b2b5719a 697 while(piezo_electric_sample_timer.read_us()<(2*(total_readout_cycle_time_us/5))) {} // Wait untill 40% of cycle. Energy efficiency is not fine in this situation, correct if low energy is needed.
ricardo_95 36:d10f368d037b 698
ricardo_95 36:d10f368d037b 699 piezo_electric_array[2] = piezo_electric_adc.readADC_SingleEnded(0); // Third PE readout.
ricardo_95 21:13e4824bc364 700
ricardo_95 36:d10f368d037b 701 angle_device_sensorplate.getAccelero(accelerometer_sensorplate); // Get accelerometer data.
ricardo_95 36:d10f368d037b 702 angle = accelerometer_sensorplate[2]*100;
ricardo_95 26:9e130f7ee829 703 if(angle == 0) {
Ishy 41:5380ada94ec6 704 MPU6050 angle_device_sensorplate(PB_9, PB_8);
ricardo_95 36:d10f368d037b 705 angle_device_sensorplate.getAccelero(accelerometer_sensorplate);
ricardo_95 36:d10f368d037b 706 angle = accelerometer_sensorplate[2]*100;
ricardo_95 26:9e130f7ee829 707 }
ricardo_95 36:d10f368d037b 708 angle_device_sensorplate.getGyro(gyroscope_sensorplate); // Get gyroscope data.
ricardo_95 34:1614f4f2b841 709
ricardo_95 33:df21cb8dc5c7 710 if (test_belt == 1) {
ricardo_95 36:d10f368d037b 711 angle_device_reference_belt.getGyro(gyroscope_reference_belt); // Get gyroscope data from Belt.
ricardo_95 36:d10f368d037b 712 angle_device_reference_belt.getAccelero(accelerometer_reference_belt); // Get accelerometer data from belt.
ricardo_95 33:df21cb8dc5c7 713 }
deldering95 43:d09814c177a0 714
deldering95 43:d09814c177a0 715 if (connection_test_sensorplate == 1) { // If statement for sending serial information sensorplate data when connection test is active.
deldering95 43:d09814c177a0 716 // Receiving order sensor information: 3 accelero sensors & 3 gyroscope sensors from sensorplate; 3 accelero sensors & 3 gyroscope sensors from belt. Is splitted in two parts - part 2/2.
ricardo_95 36:d10f368d037b 717 pi_serial.printf("?,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,\n", accelerometer_sensorplate[0], accelerometer_sensorplate[1], accelerometer_sensorplate[2], gyroscope_sensorplate[0], gyroscope_sensorplate[1], gyroscope_sensorplate[2], accelerometer_reference_belt[0], accelerometer_reference_belt[1], accelerometer_reference_belt[2], gyroscope_reference_belt[0], gyroscope_reference_belt[1], gyroscope_reference_belt[2]);
ricardo_95 37:d8f7b2b5719a 718 } // binair print and convert in pi
deldering95 43:d09814c177a0 719
ricardo_95 37:d8f7b2b5719a 720 while(piezo_electric_sample_timer.read_us()<(3*(total_readout_cycle_time_us/5))) {} // Wait untill 60% of cycle. Energy efficiency is not fine in this situation, correct if low energy is needed.
ricardo_95 34:1614f4f2b841 721
ricardo_95 36:d10f368d037b 722 piezo_electric_array[3] = piezo_electric_adc.readADC_SingleEnded(0); // Fourth PE readout.
ricardo_95 21:13e4824bc364 723 }
ricardo_95 21:13e4824bc364 724
ricardo_95 21:13e4824bc364 725 timer_functions();
ricardo_95 21:13e4824bc364 726
ricardo_95 46:a0e6e088a50a 727 /*batteryvoltage_current = batteryvoltage_last;
ricardo_95 21:13e4824bc364 728 powervoltage_current = powervoltage_last;
ricardo_95 46:a0e6e088a50a 729 read_voltage();*/ // Read_voltage function to control alarm.
deldering95 43:d09814c177a0 730
ricardo_95 46:a0e6e088a50a 731 /*if (test_mode == 1) {
ricardo_95 36:d10f368d037b 732 usb_serial.printf("Voltage = %d , %d\n", batteryvoltage_current, powervoltage_current);
ricardo_95 46:a0e6e088a50a 733 }*/
deldering95 43:d09814c177a0 734
ricardo_95 21:13e4824bc364 735 uint32_t val = 0;
deldering95 43:d09814c177a0 736 colour_select_indicating_LED_wall(LED_colour); // Function to select colour.
Ishy 42:673ddef4cfa4 737 // indicator_LEDs.update(generate, NUMBER_LED_FRONT, val); // Function to set the LED's which shines to the wall (indicating change patient position).
ricardo_95 39:cff99a9b7237 738 set_userinterface_LED(); // Set LED's of user interface (LED's above buttons).
ricardo_95 36:d10f368d037b 739
ricardo_95 37:d8f7b2b5719a 740 while(piezo_electric_sample_timer.read_us()<(4*(total_readout_cycle_time_us/5))) {} // Wait untill 80% of cycle. Energy efficiency is not fine in this situation, correct if low energy is needed.
ricardo_95 21:13e4824bc364 741
deldering95 43:d09814c177a0 742 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 743 usb_serial.printf("Angle device sensorplate = %d\n",angle_device_sensorplate.testConnection());
ricardo_95 36:d10f368d037b 744 }
deldering95 43:d09814c177a0 745
ricardo_95 36:d10f368d037b 746 if (connection_test_sensorplate == 1) {
ricardo_95 36:d10f368d037b 747 piezo_electric_array[4] = piezo_electric_adc.readADC_SingleEnded(0); // Fifth PE readout.
ricardo_95 21:13e4824bc364 748 }
ricardo_95 21:13e4824bc364 749
ricardo_95 37:d8f7b2b5719a 750 while(piezo_electric_sample_timer.read_us()<(4.25*(total_readout_cycle_time_us/5))) {} // Wait untill 85% of cycle. Energy efficiency is not fine in this situation, correct if low energy is needed.
deldering95 43:d09814c177a0 751
deldering95 43:d09814c177a0 752 serial_read(); // Call function for reading information from PI by serial connection.
deldering95 43:d09814c177a0 753 serial_log(); // Call function for logging information to PI by serial connection.
deldering95 43:d09814c177a0 754
ricardo_95 36:d10f368d037b 755 if (test_mode == 1) { // If statements for test purposal (untill * mark).
ricardo_95 36:d10f368d037b 756 usb_serial.printf("Loop time: %d ms\n",piezo_electric_sample_timer.read_ms());
ricardo_95 34:1614f4f2b841 757 }
ricardo_95 34:1614f4f2b841 758 if (test_pin == 1) {
ricardo_95 34:1614f4f2b841 759 test_mode = 1;
ricardo_95 36:d10f368d037b 760 usb_serial.printf("%d\n",test_mode);
ricardo_95 34:1614f4f2b841 761 }
ricardo_95 34:1614f4f2b841 762 if (test_pin == 0) {
ricardo_95 34:1614f4f2b841 763 test_mode = 0;
ricardo_95 36:d10f368d037b 764 usb_serial.printf("%d\n",test_mode);
ricardo_95 34:1614f4f2b841 765 }
ricardo_95 36:d10f368d037b 766
ricardo_95 34:1614f4f2b841 767 if (test_mode == 1) {
Ishy 42:673ddef4cfa4 768 usb_serial.printf("Loop time: %d ms\n", piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 769 }
deldering95 43:d09814c177a0 770 // * End of if statements for test purposal.
ricardo_95 21:13e4824bc364 771 }
ricardo_95 21:13e4824bc364 772
deldering95 43:d09814c177a0 773 int main() // Main function. inline function "Momo Init" bijvoorbeeld
deldering95 43:d09814c177a0 774 {
ricardo_95 36:d10f368d037b 775 wait_ms(boot_delay_ms); // Wait to boot sensorplate first.
ricardo_95 39:cff99a9b7237 776 i2c_sensorplate_adc.frequency(i2c__frequency); // Set frequency for i2c connection to sensorplate (variable is declared in config part).
ricardo_95 46:a0e6e088a50a 777 //i2c_power_adc.frequency(i2c__frequency); // Same as line 695, but now for ADC to read battery- en powervoltage.
ricardo_95 36:d10f368d037b 778 usb_serial.baud(baud_rate); // Set serial USB connection baud rate (variable is declared in config part).
ricardo_95 36:d10f368d037b 779 pi_serial.baud(baud_rate); // Same as line 697, but now for serial PI connection.
ricardo_95 36:d10f368d037b 780 piezo_resistive_adc1.setGain(GAIN_TWOTHIRDS); // Set ranges of ADC to +/-6.144V (end is marked with #):
deldering95 43:d09814c177a0 781 piezo_resistive_adc2.setGain(GAIN_TWOTHIRDS);
deldering95 43:d09814c177a0 782 piezo_electric_adc.setGain(GAIN_TWOTHIRDS);
ricardo_95 46:a0e6e088a50a 783 //adsAccu.setGain(GAIN_TWOTHIRDS); // #) End of configuration ADC ranges.
deldering95 43:d09814c177a0 784 pi_serial.format(8, SerialBase::None, 1); // Set serial communication line with PI.
ricardo_95 7:dba5091c8b7d 785
deldering95 43:d09814c177a0 786 button_lock.mode(PullUp);
deldering95 43:d09814c177a0 787 button_reposition.mode(PullUp);
deldering95 43:d09814c177a0 788 button_mute.mode(PullUp);
deldering95 43:d09814c177a0 789 button_new_patient.mode(PullUp);
deldering95 43:d09814c177a0 790
ricardo_95 36:d10f368d037b 791 button_lock.fall(&trigger_lock); // Interrupt for rising edge lock button.
ricardo_95 36:d10f368d037b 792 button_lock.rise(&end_timer_lock_button);
ricardo_95 36:d10f368d037b 793 button_reposition.fall(&reposition_button_triggered);
ricardo_95 36:d10f368d037b 794 button_reposition.rise(&rise_reposition);
ricardo_95 36:d10f368d037b 795 button_mute.fall(&mute_button_triggered);
ricardo_95 36:d10f368d037b 796 button_new_patient.fall(&trigger_new_patient); // New patient/calibration button rising event.
deldering95 43:d09814c177a0 797 button_new_patient.rise(&activate_new_patient_function); // Falling edge for calibration algorithm option.
ricardo_95 36:d10f368d037b 798 delay_between_button_pressed.reset(); // Delaytimer reset en start.
ricardo_95 36:d10f368d037b 799 delay_between_button_pressed.start();
ricardo_95 26:9e130f7ee829 800
deldering95 43:d09814c177a0 801 ws.useII(WS2812::GLOBAL); // use global intensity scaling
deldering95 43:d09814c177a0 802 set_intensity_LEDs(); // Initialize intensity for user interface LED's and LED's shines to wall.
ricardo_95 36:d10f368d037b 803 lock_feedback_LED = control_LED_intensity; // Lock LED initialization.
ricardo_95 21:13e4824bc364 804
deldering95 43:d09814c177a0 805 // pi_serial.attach(&serial_read);
deldering95 43:d09814c177a0 806 // total_readout_cycle.attach_us(&read_adc, total_readout_cycle_time_us); // Call function to start reading sensorplate and other functionalities.
ricardo_95 19:3b5999fa7b7e 807
DEldering 0:c0e44c46c573 808 while (1) {
Ishy 42:673ddef4cfa4 809 // wait_us(total_readout_cycle_time_us+1); // Wait indefinitely.
Ishy 42:673ddef4cfa4 810 piezo_electric_sample_timer.reset(); // Clock gebruiken o.i.d.?
Ishy 42:673ddef4cfa4 811 piezo_electric_sample_timer.start();
ricardo_95 46:a0e6e088a50a 812 connection_test_sensorplate = !testpin_sensorplate && pi_active;
deldering95 43:d09814c177a0 813
Ishy 42:673ddef4cfa4 814 if (test_mode == 1) {
Ishy 42:673ddef4cfa4 815 usb_serial.printf("Connection test sensorplate = %d\n", connection_test_sensorplate);
Ishy 42:673ddef4cfa4 816 }
deldering95 43:d09814c177a0 817 if (test_mode == 1) {
Ishy 42:673ddef4cfa4 818 usb_serial.printf("Loop time: %d ms\n",piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 819 }
Ishy 42:673ddef4cfa4 820 /*
Ishy 42:673ddef4cfa4 821 if (connection_test_sensorplate == 0) {
Ishy 42:673ddef4cfa4 822 lock_state = 1;
Ishy 42:673ddef4cfa4 823 LED_on_dev_board2 = 1;
Ishy 42:673ddef4cfa4 824 lock_feedback_LED = 0;
Ishy 42:673ddef4cfa4 825 }*/
deldering95 43:d09814c177a0 826
Ishy 42:673ddef4cfa4 827 if (connection_test_sensorplate == 1) {
Ishy 42:673ddef4cfa4 828 piezo_electric_array[0] = piezo_electric_adc.readADC_SingleEnded(0); // First PE readout.
deldering95 43:d09814c177a0 829
Ishy 42:673ddef4cfa4 830 for (uint8_t k = 0; k < 4; ++k) {
Ishy 42:673ddef4cfa4 831 piezo_resistive_array[k] = piezo_resistive_adc1.readADC_SingleEnded(k); // First 4 PR readout.
Ishy 42:673ddef4cfa4 832 }
deldering95 43:d09814c177a0 833 if (test_mode == 1) {
Ishy 42:673ddef4cfa4 834 usb_serial.printf("Loop time: %d ms\n",piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 835 }
Ishy 42:673ddef4cfa4 836 while(piezo_electric_sample_timer.read_us()<(1*(total_readout_cycle_time_us/5))) {} // Wait untill 20% of cycle. Energy efficiency is not fine in this situation, correct if low energy is needed.
deldering95 43:d09814c177a0 837
Ishy 42:673ddef4cfa4 838 piezo_electric_array[1] = piezo_electric_adc.readADC_SingleEnded(0); // Second PE readout.
deldering95 43:d09814c177a0 839
Ishy 42:673ddef4cfa4 840 for (uint8_t k = 0; k < 4; ++k) {
Ishy 42:673ddef4cfa4 841 piezo_resistive_array[k+4] = piezo_resistive_adc2.readADC_SingleEnded(k); // Last 4 PR readout.
Ishy 42:673ddef4cfa4 842 }
deldering95 43:d09814c177a0 843 if (test_mode == 1) {
Ishy 42:673ddef4cfa4 844 usb_serial.printf("Loop time: %d ms\n",piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 845 }
deldering95 43:d09814c177a0 846
Ishy 42:673ddef4cfa4 847 while(piezo_electric_sample_timer.read_us()<(2*(total_readout_cycle_time_us/5))) {} // Wait untill 40% of cycle. Energy efficiency is not fine in this situation, correct if low energy is needed.
deldering95 43:d09814c177a0 848
Ishy 42:673ddef4cfa4 849 piezo_electric_array[2] = piezo_electric_adc.readADC_SingleEnded(0); // Third PE readout.
deldering95 43:d09814c177a0 850
Ishy 42:673ddef4cfa4 851 angle_device_sensorplate.getAccelero(accelerometer_sensorplate); // Get accelerometer data.
Ishy 42:673ddef4cfa4 852 angle = accelerometer_sensorplate[2]*100;
Ishy 42:673ddef4cfa4 853 if(angle == 0) {
Ishy 42:673ddef4cfa4 854 MPU6050 angle_device_sensorplate(PB_9, PB_8);
Ishy 42:673ddef4cfa4 855 angle_device_sensorplate.getAccelero(accelerometer_sensorplate);
Ishy 42:673ddef4cfa4 856 angle = accelerometer_sensorplate[2]*100;
Ishy 42:673ddef4cfa4 857 }
Ishy 42:673ddef4cfa4 858 angle_device_sensorplate.getGyro(gyroscope_sensorplate); // Get gyroscope data.
deldering95 43:d09814c177a0 859 if (test_mode == 1) {
Ishy 42:673ddef4cfa4 860 usb_serial.printf("Loop time: %d ms\n",piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 861 }
Ishy 42:673ddef4cfa4 862 //if (test_belt == 1) {
Ishy 42:673ddef4cfa4 863 // angle_device_reference_belt.getGyro(gyroscope_reference_belt); // Get gyroscope data from Belt.
Ishy 42:673ddef4cfa4 864 // angle_device_reference_belt.getAccelero(accelerometer_reference_belt); // Get accelerometer data from belt.
Ishy 42:673ddef4cfa4 865 // }
deldering95 43:d09814c177a0 866
deldering95 44:dcbde3175a37 867 if (connection_test_sensorplate == 1) {
deldering95 44:dcbde3175a37 868 if (test_belt == 0) { // If statement for sending serial information sensorplate data when connection test is active.
deldering95 44:dcbde3175a37 869 pi_serial.printf("?,%f,%f,%f,%f,%f,%f,0,0,0,0,0,0,\n", accelerometer_sensorplate[0], accelerometer_sensorplate[1], accelerometer_sensorplate[2], gyroscope_sensorplate[0], gyroscope_sensorplate[1], gyroscope_sensorplate[2]);
deldering95 44:dcbde3175a37 870 } else{
deldering95 43:d09814c177a0 871 // Receiving order sensor information: 3 accelero sensors & 3 gyroscope sensors from sensorplate; 3 accelero sensors & 3 gyroscope sensors from belt. Is splitted in two parts - part 2/2.
Ishy 42:673ddef4cfa4 872 pi_serial.printf("?,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,\n", accelerometer_sensorplate[0], accelerometer_sensorplate[1], accelerometer_sensorplate[2], gyroscope_sensorplate[0], gyroscope_sensorplate[1], gyroscope_sensorplate[2], accelerometer_reference_belt[0], accelerometer_reference_belt[1], accelerometer_reference_belt[2], gyroscope_reference_belt[0], gyroscope_reference_belt[1], gyroscope_reference_belt[2]);
deldering95 44:dcbde3175a37 873 }
Ishy 42:673ddef4cfa4 874 } // binair print and convert in pi
deldering95 43:d09814c177a0 875
Ishy 42:673ddef4cfa4 876 while(piezo_electric_sample_timer.read_us()<(3*(total_readout_cycle_time_us/5))) {} // Wait untill 60% of cycle. Energy efficiency is not fine in this situation, correct if low energy is needed.
deldering95 43:d09814c177a0 877
Ishy 42:673ddef4cfa4 878 piezo_electric_array[3] = piezo_electric_adc.readADC_SingleEnded(0); // Fourth PE readout.
Ishy 42:673ddef4cfa4 879 }
deldering95 43:d09814c177a0 880 if (test_mode == 1) {
Ishy 42:673ddef4cfa4 881 usb_serial.printf("Loop time: %d ms\n",piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 882 }
Ishy 42:673ddef4cfa4 883 timer_functions();
deldering95 43:d09814c177a0 884 if (test_mode == 1) {
deldering95 43:d09814c177a0 885 usb_serial.printf("Loop time after timer_functions: %d ms\n",piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 886 }
ricardo_95 46:a0e6e088a50a 887 /*batteryvoltage_current = batteryvoltage_last;
Ishy 42:673ddef4cfa4 888 powervoltage_current = powervoltage_last;
ricardo_95 46:a0e6e088a50a 889 read_voltage();*/ // Read_voltage function to control alarm.
deldering95 43:d09814c177a0 890 if (test_mode == 1) {
deldering95 43:d09814c177a0 891 usb_serial.printf("Loop time after read_voltage: %d ms\n",piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 892 }
ricardo_95 46:a0e6e088a50a 893 /*if (test_mode == 1) {
Ishy 42:673ddef4cfa4 894 usb_serial.printf("Voltage = %d , %d\n", batteryvoltage_current, powervoltage_current);
ricardo_95 46:a0e6e088a50a 895 }*/
deldering95 43:d09814c177a0 896
Ishy 42:673ddef4cfa4 897 uint32_t val = 0;
deldering95 43:d09814c177a0 898 colour_select_indicating_LED_wall(LED_colour); // Function to select colour.
Ishy 42:673ddef4cfa4 899 // indicator_LEDs.update(generate, NUMBER_LED_FRONT, val); // Function to set the LED's which shines to the wall (indicating change patient position).
Ishy 42:673ddef4cfa4 900 set_userinterface_LED(); // Set LED's of user interface (LED's above buttons).
deldering95 43:d09814c177a0 901
Ishy 42:673ddef4cfa4 902 while(piezo_electric_sample_timer.read_us()<(4*(total_readout_cycle_time_us/5))) {} // Wait untill 80% of cycle. Energy efficiency is not fine in this situation, correct if low energy is needed.
deldering95 43:d09814c177a0 903
deldering95 43:d09814c177a0 904 if (test_mode == 1) { // If statement for test purposal.
Ishy 42:673ddef4cfa4 905 usb_serial.printf("Angle device sensorplate = %d\n",angle_device_sensorplate.testConnection());
Ishy 42:673ddef4cfa4 906 }
deldering95 43:d09814c177a0 907
Ishy 42:673ddef4cfa4 908 if (connection_test_sensorplate == 1) {
Ishy 42:673ddef4cfa4 909 piezo_electric_array[4] = piezo_electric_adc.readADC_SingleEnded(0); // Fifth PE readout.
Ishy 42:673ddef4cfa4 910 }
deldering95 43:d09814c177a0 911
Ishy 42:673ddef4cfa4 912 while(piezo_electric_sample_timer.read_us()<(4.25*(total_readout_cycle_time_us/5))) {} // Wait untill 85% of cycle. Energy efficiency is not fine in this situation, correct if low energy is needed.
Ishy 42:673ddef4cfa4 913
deldering95 43:d09814c177a0 914 if (test_mode == 1) {
Ishy 42:673ddef4cfa4 915 usb_serial.printf("Loop time: %d ms\n",piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 916 }
deldering95 43:d09814c177a0 917
deldering95 43:d09814c177a0 918 if (test_mode == 0) { // If statements for test purposal (untill * mark).
deldering95 43:d09814c177a0 919 usb_serial.printf("Loop time pre serial: %d ms\n",piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 920 }
deldering95 43:d09814c177a0 921 serial_read(); // Call function for reading information from PI by serial connection.
deldering95 43:d09814c177a0 922 serial_log(); // Call function for logging information to PI by serial connection.
deldering95 43:d09814c177a0 923
deldering95 43:d09814c177a0 924 if (test_mode == 0) { // If statements for test purposal (untill * mark).
Ishy 42:673ddef4cfa4 925 usb_serial.printf("Loop time: %d ms\n",piezo_electric_sample_timer.read_ms());
Ishy 42:673ddef4cfa4 926 }
Ishy 42:673ddef4cfa4 927 //if (test_pin == 1) {
Ishy 42:673ddef4cfa4 928 // test_mode = 1;
Ishy 42:673ddef4cfa4 929 // usb_serial.printf("%d\n",test_mode);
Ishy 42:673ddef4cfa4 930 // }
Ishy 42:673ddef4cfa4 931 // if (test_pin == 0) {
Ishy 42:673ddef4cfa4 932 // test_mode = 0;
Ishy 42:673ddef4cfa4 933 // usb_serial.printf("%d\n",test_mode);
Ishy 42:673ddef4cfa4 934 // }
DEldering 0:c0e44c46c573 935 }
ricardo_95 12:7b3a5940f911 936 }