Momo-Medical / Nucleo-transfer

Dependencies:   ADS1015 MPU6050 PixelArray PixelArray-Nucleo mbed WS2813

Fork of Nucleo-transfer by Momo Medical

Committer:
deldering95
Date:
Tue May 29 09:38:01 2018 +0000
Revision:
67:1b300aa30923
Parent:
66:88c910cd4d9e
Child:
68:1663f305ac33
Circle completed except patient detect;

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
Ishy 60:2f7e82c6f916 4 co-authors: Menno Gravemaker & Ishvara Lalta
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.
deldering95 48:aca02ef5cd01 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 66:88c910cd4d9e 35 #define ALARMBUF 16
deldering95 66:88c910cd4d9e 36 #define NUM_COLORS 8
deldering95 66:88c910cd4d9e 37 #define YELLOW_TRANSITION 12
deldering95 66:88c910cd4d9e 38 #define RED_TRANSITION 15
deldering95 43:d09814c177a0 39 #define NUM_LEDS_PER_COLOR 3
deldering95 48:aca02ef5cd01 40 #define NUMBER_LED_FRONT (3)
ricardo_95 7:dba5091c8b7d 41 #define ONE_COLOR
deldering95 66:88c910cd4d9e 42 #define TAIL_LENGTH 6
deldering95 66:88c910cd4d9e 43 #define COMET_TAIL_END_INTENSITY 90
deldering95 66:88c910cd4d9e 44 #define FADE_STEPS 20
ricardo_95 7:dba5091c8b7d 45
deldering95 66:88c910cd4d9e 46 InterruptIn button_lock(PC_0); // Input on intterupt base decleration.
ricardo_95 46:a0e6e088a50a 47 InterruptIn button_reposition(PC_3);
Ishy 41:5380ada94ec6 48 InterruptIn button_mute(PC_2);
deldering95 66:88c910cd4d9e 49 InterruptIn button_new_patient(PC_1);
ricardo_95 7:dba5091c8b7d 50
deldering95 43:d09814c177a0 51 DigitalIn intensity_code(PA_12);
deldering95 43:d09814c177a0 52 DigitalIn colour_code_1(PA_11);
deldering95 43:d09814c177a0 53 DigitalIn colour_code_0(PB_12);
deldering95 57:fac732476810 54 InterruptIn testpin_sensorplate(PC_6);
deldering95 43:d09814c177a0 55
deldering95 43:d09814c177a0 56 DigitalOut LED_on_dev_board1(LED1); // Decleration of digital outputs.
ricardo_95 36:d10f368d037b 57 DigitalOut LED_on_dev_board2(LED2);
ricardo_95 36:d10f368d037b 58 DigitalOut LED_on_dev_board3(LED3);
ricardo_95 36:d10f368d037b 59 DigitalOut LED_on_dev_board4(LED4);
deldering95 43:d09814c177a0 60 DigitalOut speaker1(PC_12); // relatie aangeven!
deldering95 43:d09814c177a0 61 //neopixel::PixelArray indicator_LEDs(PA_7);
deldering95 66:88c910cd4d9e 62 PixelArray px(ALARMBUF);
deldering95 66:88c910cd4d9e 63 //WS2812 ws(PA_7, ALARMBUF, 3, 9, 9, 6);
deldering95 66:88c910cd4d9e 64 WS2812 ws(PA_7, ALARMBUF, 3, 12, 8, 12);
deldering95 43:d09814c177a0 65
deldering95 51:69087c44e8ac 66 PwmOut lock_feedback_LED(PB_13); //(PB_1); // Declaration of pulse with modulation outputs.
deldering95 51:69087c44e8ac 67 PwmOut mute_feedback_LED(PB_14); //(PB_15);
deldering95 51:69087c44e8ac 68 PwmOut new_patient_feedback_LED(PB_15); //(PB_14);
deldering95 51:69087c44e8ac 69 PwmOut reposition_feedback_LED(PB_1); //(PB_13);
ricardo_95 36:d10f368d037b 70
ricardo_95 37:d8f7b2b5719a 71 Timer button_lock_hold_timer; // Timer for time lock button should be pressed.
ricardo_95 36:d10f368d037b 72 Timer button_calibration_hold_timer; // Timer for calibration function (new patient holding 5 seconds).
deldering95 43:d09814c177a0 73 Timer delay_between_button_pressed; // Timer for time between two buttons (to prevent pressing buttons simultaneously).
ricardo_95 36:d10f368d037b 74 Timer speaker_timer; // Timer for speaker activation.
ricardo_95 36:d10f368d037b 75 Timer piezo_electric_sample_timer; // Timer for equally time-spaced samples.
deldering95 66:88c910cd4d9e 76 Timer comet_timer;
deldering95 66:88c910cd4d9e 77 Timer reposition_button_hold_timer;
deldering95 66:88c910cd4d9e 78 Timer new_patient_button_hold_timer;
deldering95 43:d09814c177a0 79 /*
ricardo_95 36:d10f368d037b 80 The code underneath this commentbox has some fixed parameters for serial/ADC reading:
ricardo_95 36:d10f368d037b 81 -> The address for the angle_device_reference_belt is set to 0x68 in the file MPU6050_belt (rule number: 19);
ricardo_95 36:d10f368d037b 82 -> The adress for the angle_device_sensorplate is set to 0x69 in the file MPU6050.h (rule number: 19);
ricardo_95 36:d10f368d037b 83 -> This is because of using the same I2C line;
ricardo_95 36:d10f368d037b 84 -> For detailed information/questions about this item, please read the technical manual or contact: Ricardo Molenaar | ricardo.molenaar@gmail.com
ricardo_95 36:d10f368d037b 85 */
Ishy 41:5380ada94ec6 86 I2C i2c_sensorplate_adc(PB_9, PB_8); // I2C for sensorplate.
ricardo_95 46:a0e6e088a50a 87 MPU6050_belt angle_device_sensorplate(PB_9, PB_8); // i2c pins // i2c address hardcoded 0x68.
Ishy 41:5380ada94ec6 88 MPU6050_belt angle_device_reference_belt(PB_9, PB_8); // i2c pins // i2c address hardcoded 0x69.
ricardo_95 36:d10f368d037b 89 Adafruit_ADS1115 piezo_resistive_adc1(&i2c_sensorplate_adc, 0x48); // i2c pins, i2c address.
ricardo_95 36:d10f368d037b 90 Adafruit_ADS1115 piezo_resistive_adc2(&i2c_sensorplate_adc, 0x49); // i2c pins, i2c address.
ricardo_95 36:d10f368d037b 91 Adafruit_ADS1115 piezo_electric_adc(&i2c_sensorplate_adc, 0x4B); // i2c pins, i2c address.
deldering95 66:88c910cd4d9e 92 RawSerial usb_serial(SERIAL_TX, SERIAL_RX); // tx, rx
deldering95 66:88c910cd4d9e 93 RawSerial pi_serial(PC_10, PC_11); // tx, rx
ricardo_95 36:d10f368d037b 94 Ticker total_readout_cycle; // Polling cycle.
deldering95 43:d09814c177a0 95 // End of commentbox related to the serial configuration/ADC reading components.
ricardo_95 34:1614f4f2b841 96
ricardo_95 12:7b3a5940f911 97 int boot_delay_ms = 500;
Ishy 42:673ddef4cfa4 98 int total_readout_cycle_time_us = 100000; // Cycle time in us.
deldering95 66:88c910cd4d9e 99 int total_comet_cycle_time_ms = 750/16;
ricardo_95 39:cff99a9b7237 100 int i2c__frequency = 400000; // I2C Frequency.
ricardo_95 36:d10f368d037b 101 int baud_rate = 115200; // Baud rate.
ricardo_95 36:d10f368d037b 102 short piezo_resistive_array[8] = {0,0,0,0,0,0,0,0}; // 8 PR sensors 1 time per cycle.
deldering95 58:8cfa736d8553 103 short piezo_electric_array[6] = {0,0,0,0,0,0}; // 1 PE sensor 5 times per cycle.
ricardo_95 36:d10f368d037b 104 int angle = 0; // Accelerometer Z-axis.
ricardo_95 37:d8f7b2b5719a 105 float accelerometer_sensorplate[3] = {0.0, 0.0, 0.0}; // Raw accelerometer data.
ricardo_95 36:d10f368d037b 106 float gyroscope_sensorplate[3]; // Raw gyroscope data.
ricardo_95 36:d10f368d037b 107 float accelerometer_reference_belt[3]; // Raw accelerometer data from belt.
ricardo_95 36:d10f368d037b 108 float gyroscope_reference_belt[3]; // Raw gyroscope data from belt.
deldering95 66:88c910cd4d9e 109 int colourbuf[NUM_COLORS] = {0xff0000,0x00ff00,0x0000ff,0xffa500,0x555555,0x800080,0x000000,0x8B4513}; // hex codes for the different colours
deldering95 44:dcbde3175a37 110 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 111 bool lock_state = false, lock_flag = 0, mute_state = 0, alarm = 0, calibration_flag = 0, intensity_select = 1; // Boolean variables for logging states.
Ishy 55:b74e7076d7a0 112 bool mute_flag = 0, new_patient_flag = 0, reposition_flag = 0, new_patient_lock_flag = 0, reposition_lock_flag = 0, mute_lock_flag; // Flag variables.
ricardo_95 21:13e4824bc364 113 bool speaker_state = 0, LED_red_state = 0, LED_yellow_state = 0, LED_green_state = 0, power_plug_state = 0;
Ishy 55:b74e7076d7a0 114 bool auto_lock_led_logged = 0, lock_is_logged = 0, 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 115 int locktime_ms = 2000; // Waittime for lock user interface in ms.
deldering95 48:aca02ef5cd01 116 int calibrationtime_ms = 2000; // Time to press new_patient button for calibration system.
ricardo_95 37:d8f7b2b5719a 117 int calibration_flash = 0; // Variable for flash LED's to indicate calibration.
deldering95 48:aca02ef5cd01 118 int lock_flash = 0;
Ishy 55:b74e7076d7a0 119 int buttondelay_ms = 250; // Button delay in ms. Default: 750
ricardo_95 36:d10f368d037b 120 int delay_lock_interface = 3000*60; // Delay for non using interface locktime.
ricardo_95 36:d10f368d037b 121 int speaker_active_ms = 750; // Time to iterate speaker on and off when alarm occurs.
ricardo_95 38:764847892afc 122 int alarm_voltage = 2400; // Needed voltage for alarm expressed as a digital 15 bit value (= 20% of max battery voltage).
ricardo_95 37:d8f7b2b5719a 123 int LED_red_intensity = 0, LED_blue_intensity = 0, LED_green_intensity = 0; // Variables to set LED intensity.
deldering95 66:88c910cd4d9e 124 int LED_colour_wheel_percentage=0;
deldering95 66:88c910cd4d9e 125 int ring_colour_old,mixer=0;
deldering95 66:88c910cd4d9e 126 int colour_wheel_filler = 5;
deldering95 67:1b300aa30923 127 bool patient_present=true;
deldering95 66:88c910cd4d9e 128 bool colour_wheel_drain_reposition = false;
deldering95 66:88c910cd4d9e 129 bool colour_wheel_drain_new_patient = false;
deldering95 66:88c910cd4d9e 130 bool circle_filling_reposition = false;
deldering95 66:88c910cd4d9e 131 bool circle_filling_new_patient = false;
deldering95 66:88c910cd4d9e 132 int circle_filled_reposition = 0;
deldering95 66:88c910cd4d9e 133 int circle_filled_new_patient = 0;
deldering95 66:88c910cd4d9e 134 int comet=0;
deldering95 66:88c910cd4d9e 135 int tail,tail_step;
ricardo_95 45:7ebe860702b4 136 //short batteryvoltage_current = 0, batteryvoltage_last = 0, powervoltage_current, powervoltage_last; // Variables to manage batteryvoltage. Maybe change current to other?
ricardo_95 45:7ebe860702b4 137 //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
deldering95 66:88c910cd4d9e 138 int intensity_day = 80, intensity_night = 50; // Intensity settings for LED's to wall.
ricardo_95 38:764847892afc 139 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 140 int colour_code = 0b00;
deldering95 44:dcbde3175a37 141 bool pi_active = false;
ricardo_95 33:df21cb8dc5c7 142 /*************************** TEST ********************************/
ricardo_95 36:d10f368d037b 143 // Verify algoritm function: for belt activation, set test_belt 1 (connect pin p20 to 3.3V).
deldering95 43:d09814c177a0 144 Timer test_timer;
Ishy 41:5380ada94ec6 145 DigitalIn test_pin(PA_11, PullDown);
ricardo_95 33:df21cb8dc5c7 146
deldering95 67:1b300aa30923 147 float percentage_tester=0;
deldering95 67:1b300aa30923 148
deldering95 43:d09814c177a0 149 // Variable to set if belt is used to test algorithm:
deldering95 43:d09814c177a0 150 bool test_belt = 0;
ricardo_95 33:df21cb8dc5c7 151
deldering95 43:d09814c177a0 152 // Set test mode on (log functions to pc serial: interrupts, LED intensity and serial messages):
Ishy 55:b74e7076d7a0 153 bool test_mode = 1;
ricardo_95 34:1614f4f2b841 154
ricardo_95 36:d10f368d037b 155 // Variable for connection test (should be changed):
ricardo_95 46:a0e6e088a50a 156 bool connection_test_sensorplate;
ricardo_95 33:df21cb8dc5c7 157
ricardo_95 21:13e4824bc364 158 /*************************** CODE ********************************/
ricardo_95 7:dba5091c8b7d 159
ricardo_95 36:d10f368d037b 160 void set_intensity_LEDs() // Function to set the intensity for the LED's.
ricardo_95 7:dba5091c8b7d 161 {
ricardo_95 11:73c6def38fbd 162 if (intensity_select == 1) {
ricardo_95 12:7b3a5940f911 163 intensity = intensity_day;
ricardo_95 12:7b3a5940f911 164 } else {
ricardo_95 12:7b3a5940f911 165 intensity = intensity_night;
ricardo_95 7:dba5091c8b7d 166 }
ricardo_95 21:13e4824bc364 167 control_LED_intensity = (intensity/100);
ricardo_95 34:1614f4f2b841 168
ricardo_95 37:d8f7b2b5719a 169 if (test_mode == 1) { // If statement for test purposal LED_intensity values. if def gebruiken voor testmode
Ishy 55:b74e7076d7a0 170 // usb_serial.printf("Intensity LED's shines to wall = %f\n", intensity);
Ishy 55:b74e7076d7a0 171 // usb_serial.printf("Intensity LED's above buttons = %f\n", control_LED_intensity);
ricardo_95 33:df21cb8dc5c7 172 }
ricardo_95 7:dba5091c8b7d 173 }
ricardo_95 7:dba5091c8b7d 174
ricardo_95 36:d10f368d037b 175 void serial_read() // Function for serial read for select LED intensity and colour.
ricardo_95 12:7b3a5940f911 176 {
deldering95 66:88c910cd4d9e 177 LED_colour_wheel_percentage = pi_serial.getc();
ricardo_95 11:73c6def38fbd 178 }
ricardo_95 11:73c6def38fbd 179
deldering95 58:8cfa736d8553 180 void serial_log() // Function for serial logging. See link to table with code declarations above in code.
deldering95 58:8cfa736d8553 181 {
Ishy 55:b74e7076d7a0 182
Ishy 55:b74e7076d7a0 183 if (reposition_flag == 1) { // If statement to control logging for reposition button.
ricardo_95 36:d10f368d037b 184 pi_serial.printf(">01\n");
ricardo_95 34:1614f4f2b841 185
deldering95 43:d09814c177a0 186 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 187 usb_serial.printf(">01\n");
ricardo_95 33:df21cb8dc5c7 188 }
ricardo_95 34:1614f4f2b841 189
Ishy 55:b74e7076d7a0 190 reposition_flag = 0;
Ishy 55:b74e7076d7a0 191 }
deldering95 58:8cfa736d8553 192
Ishy 55:b74e7076d7a0 193 if (reposition_lock_flag == 1) { // If statement to control logging for reposition button.
Ishy 55:b74e7076d7a0 194 pi_serial.printf(">10\n");
Ishy 55:b74e7076d7a0 195
Ishy 55:b74e7076d7a0 196 if (test_mode == 1) { // If statement for test purposal.
Ishy 55:b74e7076d7a0 197 usb_serial.printf(">10\n");
Ishy 55:b74e7076d7a0 198 }
Ishy 55:b74e7076d7a0 199
Ishy 55:b74e7076d7a0 200 reposition_lock_flag = 0;
ricardo_95 19:3b5999fa7b7e 201 }
ricardo_95 12:7b3a5940f911 202
ricardo_95 36:d10f368d037b 203 if (new_patient_flag == 1) { // If statement to control logging for new patient button.
Ishy 55:b74e7076d7a0 204 pi_serial.printf(">02\n");
Ishy 55:b74e7076d7a0 205
Ishy 55:b74e7076d7a0 206 if (test_mode == 1) { // If statement for test purposal.
Ishy 55:b74e7076d7a0 207 usb_serial.printf(">02\n");
Ishy 55:b74e7076d7a0 208 }
Ishy 55:b74e7076d7a0 209
Ishy 55:b74e7076d7a0 210 new_patient_flag = 0;
Ishy 55:b74e7076d7a0 211 }
deldering95 58:8cfa736d8553 212
Ishy 55:b74e7076d7a0 213 if (new_patient_lock_flag == 1) { // If statement to control logging for new patient button.
Ishy 55:b74e7076d7a0 214 pi_serial.printf(">20\n");
Ishy 55:b74e7076d7a0 215
Ishy 55:b74e7076d7a0 216 if (test_mode == 1) { // If statement for test purposal.
Ishy 55:b74e7076d7a0 217 usb_serial.printf(">20\n");
Ishy 55:b74e7076d7a0 218 }
Ishy 55:b74e7076d7a0 219
Ishy 55:b74e7076d7a0 220 new_patient_lock_flag = 0;
Ishy 55:b74e7076d7a0 221 }
Ishy 55:b74e7076d7a0 222 // The new calibration button trigger
Ishy 55:b74e7076d7a0 223 if (mute_flag == 1) { // If statement to control logging for new patient button.
ricardo_95 36:d10f368d037b 224 pi_serial.printf(">03\n");
ricardo_95 34:1614f4f2b841 225
deldering95 43:d09814c177a0 226 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 227 usb_serial.printf(">03\n");
ricardo_95 33:df21cb8dc5c7 228 }
ricardo_95 34:1614f4f2b841 229
Ishy 55:b74e7076d7a0 230 mute_flag = 0;
ricardo_95 7:dba5091c8b7d 231 }
Ishy 55:b74e7076d7a0 232 // The new calibration button trigger
Ishy 55:b74e7076d7a0 233 if (mute_lock_flag == 1) { // If statement to control logging for new patient button.
Ishy 55:b74e7076d7a0 234 pi_serial.printf(">30\n");
ricardo_95 34:1614f4f2b841 235
deldering95 43:d09814c177a0 236 if (test_mode == 1) { // If statement for test purposal.
Ishy 55:b74e7076d7a0 237 usb_serial.printf(">30\n");
ricardo_95 33:df21cb8dc5c7 238 }
ricardo_95 34:1614f4f2b841 239
Ishy 55:b74e7076d7a0 240 mute_lock_flag = 0;
Ishy 55:b74e7076d7a0 241 }
deldering95 58:8cfa736d8553 242
Ishy 55:b74e7076d7a0 243 if (lock_flag == 1 && !lock_is_logged) {
Ishy 55:b74e7076d7a0 244 if (lock_state == 0) // If statement to control logging for lock button.
Ishy 55:b74e7076d7a0 245 pi_serial.printf(">04\n");
Ishy 55:b74e7076d7a0 246 else if(lock_state == 1)
Ishy 55:b74e7076d7a0 247 pi_serial.printf(">40\n");
Ishy 55:b74e7076d7a0 248
Ishy 55:b74e7076d7a0 249 if (test_mode == 1) {
Ishy 55:b74e7076d7a0 250 if (lock_state == 0) // If statement to control logging for lock button.
Ishy 55:b74e7076d7a0 251 usb_serial.printf(">04\n");
Ishy 55:b74e7076d7a0 252 else if(lock_state == 1)
Ishy 55:b74e7076d7a0 253 usb_serial.printf(">40\n"); // If statement for test purposal.
Ishy 55:b74e7076d7a0 254 }
Ishy 55:b74e7076d7a0 255 lock_is_logged = 1;
ricardo_95 7:dba5091c8b7d 256 }
ricardo_95 12:7b3a5940f911 257
ricardo_95 36:d10f368d037b 258 if (LED_red_logged != LED_red_state) { // If statement to control logging for LED_red.
ricardo_95 12:7b3a5940f911 259 if (LED_red_state == 1) {
Ishy 55:b74e7076d7a0 260 pi_serial.printf("&01\n");
ricardo_95 9:514a44bf510f 261 LED_red_logged = LED_red_state;
ricardo_95 34:1614f4f2b841 262 if (test_mode == 1) {
Ishy 55:b74e7076d7a0 263 usb_serial.printf("&01\n");
ricardo_95 34:1614f4f2b841 264 }
ricardo_95 12:7b3a5940f911 265 }
deldering95 43:d09814c177a0 266
ricardo_95 9:514a44bf510f 267 if (LED_red_state == 0) {
Ishy 55:b74e7076d7a0 268 pi_serial.printf("&10\n");
ricardo_95 12:7b3a5940f911 269 LED_red_logged = LED_red_state;
ricardo_95 34:1614f4f2b841 270 if (test_mode == 1) {
Ishy 55:b74e7076d7a0 271 usb_serial.printf("&10\n");
ricardo_95 34:1614f4f2b841 272 }
ricardo_95 9:514a44bf510f 273 }
ricardo_95 8:bf0f7a6fb1fd 274 }
ricardo_95 12:7b3a5940f911 275
ricardo_95 36:d10f368d037b 276 if (LED_yellow_logged != LED_yellow_state) { // If statement to control logging for LED_yellow.
deldering95 43:d09814c177a0 277 if (LED_yellow_state == 1) {
Ishy 55:b74e7076d7a0 278 pi_serial.printf("&02\n");
ricardo_95 9:514a44bf510f 279 LED_yellow_logged = LED_yellow_state;
ricardo_95 34:1614f4f2b841 280 if (test_mode == 1) {
Ishy 55:b74e7076d7a0 281 usb_serial.printf("&02\n");
ricardo_95 34:1614f4f2b841 282 }
ricardo_95 12:7b3a5940f911 283 }
ricardo_95 9:514a44bf510f 284 if (LED_yellow_state == 0) {
Ishy 55:b74e7076d7a0 285 pi_serial.printf("&20\n");
ricardo_95 12:7b3a5940f911 286 LED_yellow_logged = LED_yellow_state;
ricardo_95 34:1614f4f2b841 287 if (test_mode == 1) {
Ishy 55:b74e7076d7a0 288 usb_serial.printf("&20\n");
ricardo_95 34:1614f4f2b841 289 }
ricardo_95 9:514a44bf510f 290 }
ricardo_95 7:dba5091c8b7d 291 }
ricardo_95 12:7b3a5940f911 292
ricardo_95 36:d10f368d037b 293 if (LED_green_logged != LED_green_state) { // If statement to control logging for LED_green.
ricardo_95 12:7b3a5940f911 294 if (LED_green_state == 1) {
Ishy 55:b74e7076d7a0 295 pi_serial.printf("&03\n");
ricardo_95 9:514a44bf510f 296 LED_green_logged = LED_green_state;
deldering95 43:d09814c177a0 297
ricardo_95 34:1614f4f2b841 298 if (test_mode == 1) {
Ishy 55:b74e7076d7a0 299 usb_serial.printf("&03\n");
ricardo_95 34:1614f4f2b841 300 }
ricardo_95 12:7b3a5940f911 301 }
deldering95 43:d09814c177a0 302
ricardo_95 9:514a44bf510f 303 if (LED_green_state == 0) {
Ishy 55:b74e7076d7a0 304 pi_serial.printf("&30\n");
ricardo_95 12:7b3a5940f911 305 LED_green_logged = LED_green_state;
deldering95 43:d09814c177a0 306
ricardo_95 34:1614f4f2b841 307 if (test_mode == 1) {
Ishy 55:b74e7076d7a0 308 usb_serial.printf("&30\n");
ricardo_95 34:1614f4f2b841 309 }
ricardo_95 9:514a44bf510f 310 }
ricardo_95 7:dba5091c8b7d 311 }
ricardo_95 12:7b3a5940f911 312
deldering95 43:d09814c177a0 313 if (speaker_logged != speaker_state) { // If statement to control logging for speaker.
ricardo_95 12:7b3a5940f911 314 if (speaker_state == 1) {
Ishy 55:b74e7076d7a0 315 pi_serial.printf("&04\n");
ricardo_95 9:514a44bf510f 316 speaker_logged = speaker_state;
deldering95 43:d09814c177a0 317
ricardo_95 36:d10f368d037b 318 if (test_mode == 1) { // If statement for test purposal.
Ishy 55:b74e7076d7a0 319 usb_serial.printf("&04\n");
ricardo_95 34:1614f4f2b841 320 }
ricardo_95 12:7b3a5940f911 321 }
deldering95 43:d09814c177a0 322
ricardo_95 9:514a44bf510f 323 if (speaker_state == 0) {
Ishy 55:b74e7076d7a0 324 pi_serial.printf("&40\n");
ricardo_95 12:7b3a5940f911 325 speaker_logged = speaker_state;
deldering95 43:d09814c177a0 326
ricardo_95 36:d10f368d037b 327 if (test_mode == 1) { // If statement for test purposal.
Ishy 55:b74e7076d7a0 328 usb_serial.printf("&40\n");
ricardo_95 34:1614f4f2b841 329 }
ricardo_95 9:514a44bf510f 330 }
ricardo_95 8:bf0f7a6fb1fd 331 }
ricardo_95 9:514a44bf510f 332
Ishy 55:b74e7076d7a0 333 // if (power_plug_logged != power_plug_state) { // If statement to control the logging for the state of the power plug.
Ishy 55:b74e7076d7a0 334 // if (power_plug_state == 1) {
Ishy 55:b74e7076d7a0 335 // pi_serial.printf("#08\n");
Ishy 55:b74e7076d7a0 336 //
Ishy 55:b74e7076d7a0 337 // if (test_mode == 1) { // If statement for test purposal.
Ishy 55:b74e7076d7a0 338 // usb_serial.printf("#08\n");
Ishy 55:b74e7076d7a0 339 // }
Ishy 55:b74e7076d7a0 340 // power_plug_logged = power_plug_state;
Ishy 55:b74e7076d7a0 341 // }
Ishy 55:b74e7076d7a0 342 //
Ishy 55:b74e7076d7a0 343 // if (power_plug_state == 0) {
Ishy 55:b74e7076d7a0 344 // pi_serial.printf("#80\n");
Ishy 55:b74e7076d7a0 345 //
Ishy 55:b74e7076d7a0 346 // if (test_mode == 1) { // If statement for test purposal.
Ishy 55:b74e7076d7a0 347 // usb_serial.printf("#80\n");
Ishy 55:b74e7076d7a0 348 // }
Ishy 55:b74e7076d7a0 349 // power_plug_logged = power_plug_state;
Ishy 55:b74e7076d7a0 350 // }
Ishy 55:b74e7076d7a0 351 // }
deldering95 58:8cfa736d8553 352
deldering95 43:d09814c177a0 353 if (connection_test_sensorplate == 1) { // If statement for sending serial information sensorplate data when connection test is active.
deldering95 43:d09814c177a0 354 // Receiving order sensor information: 8 resistive sensors, 5 electric readings. Is splitted in two parts - part 1/2.
deldering95 58:8cfa736d8553 355 pi_serial.printf("!,%d,%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], piezo_electric_array[5]); // print all to serial port
deldering95 43:d09814c177a0 356
ricardo_95 34:1614f4f2b841 357 if (test_mode == 1) {
deldering95 58:8cfa736d8553 358 usb_serial.printf("!,%d,%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],piezo_electric_array[5]); // print all to serial port
ricardo_95 34:1614f4f2b841 359 }
deldering95 53:54c882995514 360 } else {
deldering95 58:8cfa736d8553 361 pi_serial.printf("!,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\n",0,0,0,0,0,0,0,0,0,0,0,0,0,0);
Ishy 56:97dea631c5f2 362 if (test_mode == 1) {
deldering95 58:8cfa736d8553 363 usb_serial.printf("!,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\n",0,0,0,0,0,0,0,0,0,0,0,0,0,0); // print all to serial port
Ishy 56:97dea631c5f2 364 }
ricardo_95 28:b4bee068780d 365 }
ricardo_95 34:1614f4f2b841 366
DEldering 0:c0e44c46c573 367 }
DEldering 0:c0e44c46c573 368
deldering95 66:88c910cd4d9e 369 int minimum(int a,int b)
deldering95 66:88c910cd4d9e 370 {
deldering95 66:88c910cd4d9e 371 if(a>b)return b;
deldering95 66:88c910cd4d9e 372 else return a;
deldering95 66:88c910cd4d9e 373 }
deldering95 66:88c910cd4d9e 374
deldering95 66:88c910cd4d9e 375 int colour_fade(int colour_old,int colour_new,int colour_mix)
deldering95 66:88c910cd4d9e 376 {
deldering95 66:88c910cd4d9e 377 int old_r=(colour_old&0xff0000)>>16;
deldering95 66:88c910cd4d9e 378 int old_g=(colour_old&0x00ff00)>> 8;
deldering95 66:88c910cd4d9e 379 int old_b=(colour_old&0x0000ff)>> 0;
deldering95 66:88c910cd4d9e 380 int new_r=(colour_new&0xff0000)>>16;
deldering95 66:88c910cd4d9e 381 int new_g=(colour_new&0x00ff00)>> 8;
deldering95 66:88c910cd4d9e 382 int new_b=(colour_new&0x0000ff)>> 0;
deldering95 66:88c910cd4d9e 383 int mix = (100*colour_mix)/FADE_STEPS;
deldering95 66:88c910cd4d9e 384 int mix_r=((new_r-old_r)*mix/100)+old_r;
deldering95 66:88c910cd4d9e 385 int mix_g=((new_g-old_g)*mix/100)+old_g;
deldering95 66:88c910cd4d9e 386 int mix_b=((new_b-old_b)*mix/100)+old_b;
deldering95 66:88c910cd4d9e 387 return ((mix_r<<16)|(mix_g<<8)|(mix_b));
deldering95 66:88c910cd4d9e 388
deldering95 66:88c910cd4d9e 389 }
deldering95 66:88c910cd4d9e 390
deldering95 66:88c910cd4d9e 391
deldering95 66:88c910cd4d9e 392
deldering95 66:88c910cd4d9e 393 void colour_wheel(int percentage_in)
deldering95 66:88c910cd4d9e 394 {
deldering95 66:88c910cd4d9e 395 px.SetAllI(int(intensity*2.55));
deldering95 66:88c910cd4d9e 396 if(percentage_in>100)percentage_in=100;
deldering95 66:88c910cd4d9e 397 int ring_colour = colourbuf[2];
deldering95 66:88c910cd4d9e 398 px.SetAll(colourbuf[6]);
deldering95 66:88c910cd4d9e 399 int leds_on =(percentage_in*16)/100;
deldering95 66:88c910cd4d9e 400 float led_partly = ((percentage_in*16)%100);
deldering95 66:88c910cd4d9e 401 if(leds_on==YELLOW_TRANSITION) {
deldering95 66:88c910cd4d9e 402 if(mixer>20)mixer=20;
deldering95 66:88c910cd4d9e 403 ring_colour = colour_fade(colourbuf[2],colourbuf[3],mixer);
deldering95 66:88c910cd4d9e 404 mixer++;
deldering95 66:88c910cd4d9e 405 }
deldering95 66:88c910cd4d9e 406 if(leds_on>YELLOW_TRANSITION&&leds_on<RED_TRANSITION&&ring_colour_old==colourbuf[3]) {
deldering95 66:88c910cd4d9e 407 ring_colour=colourbuf[3];
deldering95 66:88c910cd4d9e 408 mixer=0;
deldering95 66:88c910cd4d9e 409 }
deldering95 66:88c910cd4d9e 410 if(leds_on==RED_TRANSITION) {
deldering95 66:88c910cd4d9e 411 if(mixer>20)mixer=20;
deldering95 66:88c910cd4d9e 412 usb_serial.printf("mixer:%d\n",mixer);
deldering95 66:88c910cd4d9e 413 ring_colour = colour_fade(colourbuf[3],colourbuf[0],mixer);
deldering95 66:88c910cd4d9e 414 mixer++;
deldering95 66:88c910cd4d9e 415 }
deldering95 66:88c910cd4d9e 416 if(leds_on>RED_TRANSITION&&ring_colour_old==colourbuf[0]) {
deldering95 66:88c910cd4d9e 417 ring_colour = colourbuf[0];
deldering95 66:88c910cd4d9e 418 mixer=0;
deldering95 66:88c910cd4d9e 419 }
deldering95 66:88c910cd4d9e 420 usb_serial.printf("on:%d,part:%f\n",leds_on,led_partly);
deldering95 66:88c910cd4d9e 421 for(int j = 0; j<=(leds_on); j++)px.Set(((16-j)%16),ring_colour);
deldering95 66:88c910cd4d9e 422 px.SetAllI(int(intensity*2.55));
deldering95 66:88c910cd4d9e 423 if((16-leds_on-1)>0) {
deldering95 66:88c910cd4d9e 424 px.Set(((16-leds_on-1)%16),ring_colour);
deldering95 66:88c910cd4d9e 425 px.SetI(((16-leds_on-1)%16),int(0.01*led_partly*intensity*2.55));
deldering95 66:88c910cd4d9e 426 }
deldering95 66:88c910cd4d9e 427 usb_serial.printf("percentage in %d,%d\n",percentage_in,leds_on);
deldering95 66:88c910cd4d9e 428
deldering95 67:1b300aa30923 429 if(!patient_present){
deldering95 67:1b300aa30923 430 px.SetAll(colourbuf[4]);
deldering95 67:1b300aa30923 431 px.SetAllI(int(2.55*intensity));
deldering95 67:1b300aa30923 432 }
deldering95 67:1b300aa30923 433
deldering95 67:1b300aa30923 434
deldering95 66:88c910cd4d9e 435 if(reposition_button_hold_timer.read_ms()) {
deldering95 66:88c910cd4d9e 436 usb_serial.printf("filling circle\n");
deldering95 66:88c910cd4d9e 437 circle_filling_reposition = true;
deldering95 66:88c910cd4d9e 438 colour_wheel_filler = reposition_button_hold_timer.read_ms()/250;
deldering95 66:88c910cd4d9e 439 if(colour_wheel_filler>=8) {
deldering95 66:88c910cd4d9e 440 colour_wheel_filler=8;
deldering95 66:88c910cd4d9e 441 circle_filled_reposition = 15;
deldering95 66:88c910cd4d9e 442 circle_filling_reposition = false;
deldering95 66:88c910cd4d9e 443 colour_wheel_drain_reposition = false;
deldering95 66:88c910cd4d9e 444 reposition_flag = 1;
deldering95 66:88c910cd4d9e 445 }
deldering95 66:88c910cd4d9e 446 px.SetAll(colourbuf[6]);
deldering95 66:88c910cd4d9e 447 for(int k =0; k<=colour_wheel_filler; k++) {
deldering95 66:88c910cd4d9e 448 px.Set(k,colourbuf[5]);
deldering95 66:88c910cd4d9e 449 px.Set(16-k,colourbuf[5]);
deldering95 66:88c910cd4d9e 450 }
deldering95 66:88c910cd4d9e 451 px.SetAllI(int(intensity*2.55));
deldering95 66:88c910cd4d9e 452 }
deldering95 66:88c910cd4d9e 453
deldering95 66:88c910cd4d9e 454 if(new_patient_button_hold_timer.read_ms()) {
deldering95 66:88c910cd4d9e 455 usb_serial.printf("filling circle\n");
deldering95 66:88c910cd4d9e 456 circle_filling_new_patient = true;
deldering95 66:88c910cd4d9e 457 colour_wheel_filler = new_patient_button_hold_timer.read_ms()/250;
deldering95 66:88c910cd4d9e 458 if(colour_wheel_filler>=8) {
deldering95 66:88c910cd4d9e 459 colour_wheel_filler=8;
deldering95 66:88c910cd4d9e 460 circle_filled_new_patient = 10;
deldering95 66:88c910cd4d9e 461 circle_filling_new_patient = false;
deldering95 66:88c910cd4d9e 462 colour_wheel_drain_new_patient = false;
deldering95 66:88c910cd4d9e 463 new_patient_flag = 1;
deldering95 66:88c910cd4d9e 464 }
deldering95 66:88c910cd4d9e 465 px.SetAll(colourbuf[6]);
deldering95 66:88c910cd4d9e 466 for(int k =0; k<=colour_wheel_filler; k++) {
deldering95 66:88c910cd4d9e 467 px.Set((k+8)%16,colourbuf[5]);
deldering95 66:88c910cd4d9e 468 px.Set((16-k+8)%16,colourbuf[5]);
deldering95 66:88c910cd4d9e 469 }
deldering95 66:88c910cd4d9e 470 px.SetAllI(int(intensity*2.55));
deldering95 66:88c910cd4d9e 471 }
deldering95 66:88c910cd4d9e 472
deldering95 66:88c910cd4d9e 473 if(!reposition_button_hold_timer.read_ms()&&circle_filling_reposition&&!colour_wheel_drain_reposition) {
deldering95 66:88c910cd4d9e 474 usb_serial.printf("Short hold\n");
deldering95 66:88c910cd4d9e 475 px.SetAll(colourbuf[6]);
deldering95 66:88c910cd4d9e 476 for(int k =0; k<=colour_wheel_filler; k++) {
deldering95 66:88c910cd4d9e 477 px.Set(k,colourbuf[5]);
deldering95 66:88c910cd4d9e 478 px.Set(16-k,colourbuf[5]);
deldering95 66:88c910cd4d9e 479 }
deldering95 66:88c910cd4d9e 480 px.SetAllI(int(intensity*2.55));
deldering95 66:88c910cd4d9e 481 colour_wheel_filler++;
deldering95 66:88c910cd4d9e 482 if(colour_wheel_filler>=5) {
deldering95 66:88c910cd4d9e 483 colour_wheel_drain_reposition=true;
deldering95 66:88c910cd4d9e 484 circle_filling_reposition=false;
deldering95 66:88c910cd4d9e 485 }
deldering95 66:88c910cd4d9e 486 }
deldering95 66:88c910cd4d9e 487
deldering95 66:88c910cd4d9e 488 if(!new_patient_button_hold_timer.read_ms()&&circle_filling_new_patient&&!colour_wheel_drain_new_patient) {
deldering95 66:88c910cd4d9e 489 usb_serial.printf("Short hold\n");
deldering95 66:88c910cd4d9e 490 px.SetAll(colourbuf[6]);
deldering95 66:88c910cd4d9e 491 for(int k =0; k<=colour_wheel_filler; k++) {
deldering95 66:88c910cd4d9e 492 px.Set((k+8)%16,colourbuf[5]);
deldering95 66:88c910cd4d9e 493 px.Set((16-k+8)%16,colourbuf[5]);
deldering95 66:88c910cd4d9e 494 }
deldering95 66:88c910cd4d9e 495 px.SetAllI(int(intensity*2.55));
deldering95 66:88c910cd4d9e 496 colour_wheel_filler++;
deldering95 66:88c910cd4d9e 497 if(colour_wheel_filler>=5) {
deldering95 66:88c910cd4d9e 498 colour_wheel_drain_new_patient=true;
deldering95 66:88c910cd4d9e 499 circle_filling_new_patient=false;
deldering95 66:88c910cd4d9e 500 }
deldering95 66:88c910cd4d9e 501 }
deldering95 66:88c910cd4d9e 502
deldering95 66:88c910cd4d9e 503 if(colour_wheel_drain_reposition) {
deldering95 66:88c910cd4d9e 504 usb_serial.printf("drain\n");
deldering95 66:88c910cd4d9e 505 px.SetAll(colourbuf[6]);
deldering95 66:88c910cd4d9e 506 for(int k =0; k<=colour_wheel_filler; k++) {
deldering95 66:88c910cd4d9e 507 px.Set(k,colourbuf[5]);
deldering95 66:88c910cd4d9e 508 px.Set(16-k,colourbuf[5]);
deldering95 66:88c910cd4d9e 509 }
deldering95 66:88c910cd4d9e 510 px.SetAllI(int(intensity*2.55));
deldering95 66:88c910cd4d9e 511 colour_wheel_filler--;
deldering95 66:88c910cd4d9e 512 if(!colour_wheel_filler)colour_wheel_drain_reposition=false;
deldering95 66:88c910cd4d9e 513 }
deldering95 66:88c910cd4d9e 514
deldering95 66:88c910cd4d9e 515 if(colour_wheel_drain_new_patient) {
deldering95 66:88c910cd4d9e 516 usb_serial.printf("drain\n");
deldering95 66:88c910cd4d9e 517 px.SetAll(colourbuf[6]);
deldering95 66:88c910cd4d9e 518 for(int k =0; k<=colour_wheel_filler; k++) {
deldering95 66:88c910cd4d9e 519 px.Set((k+8)%16,colourbuf[5]);
deldering95 66:88c910cd4d9e 520 px.Set((16-k+8)%16,colourbuf[5]);
deldering95 66:88c910cd4d9e 521 }
deldering95 66:88c910cd4d9e 522 px.SetAllI(int(intensity*2.55));
deldering95 66:88c910cd4d9e 523 colour_wheel_filler--;
deldering95 66:88c910cd4d9e 524 if(!colour_wheel_filler)colour_wheel_drain_new_patient=false;
deldering95 66:88c910cd4d9e 525 }
deldering95 66:88c910cd4d9e 526
deldering95 66:88c910cd4d9e 527 if(circle_filled_reposition) {
deldering95 66:88c910cd4d9e 528 usb_serial.printf("circle_filled_repo\n");
deldering95 66:88c910cd4d9e 529 px.SetAll(colourbuf[6]);
deldering95 66:88c910cd4d9e 530 for(int k =0; k<=circle_filled_reposition; k++) {
deldering95 66:88c910cd4d9e 531 px.Set((16-k)%16,colourbuf[5]);
deldering95 66:88c910cd4d9e 532 }
deldering95 66:88c910cd4d9e 533 px.Set((16-circle_filled_reposition)%16,colourbuf[4]);
deldering95 66:88c910cd4d9e 534 px.SetAllI(int(intensity*2.55));
deldering95 66:88c910cd4d9e 535 circle_filled_reposition--;
deldering95 67:1b300aa30923 536 percentage_tester=0;
deldering95 66:88c910cd4d9e 537 }
deldering95 66:88c910cd4d9e 538
deldering95 66:88c910cd4d9e 539 if(circle_filled_new_patient) {
deldering95 66:88c910cd4d9e 540 usb_serial.printf("circle_filled_new_patient\n");
deldering95 66:88c910cd4d9e 541 px.SetAll(colourbuf[5]);
deldering95 66:88c910cd4d9e 542 px.SetAllI(int(intensity*2.55*(7-(circle_filled_new_patient%5))/7));
deldering95 66:88c910cd4d9e 543 circle_filled_new_patient--;
deldering95 66:88c910cd4d9e 544 }
deldering95 67:1b300aa30923 545 if(!connection_test_sensorplate) {
deldering95 67:1b300aa30923 546 px.Set(6,colourbuf[0]);
deldering95 67:1b300aa30923 547 px.SetI(6,int(intensity*2.55));
deldering95 67:1b300aa30923 548 }
deldering95 66:88c910cd4d9e 549 ws.write_offsets(px.getBuf(),0,0,0);
deldering95 66:88c910cd4d9e 550 ring_colour_old=ring_colour;
deldering95 66:88c910cd4d9e 551 }
deldering95 66:88c910cd4d9e 552
deldering95 43:d09814c177a0 553 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 554 {
ricardo_95 36:d10f368d037b 555 set_intensity_LEDs(); // Call function set_intensity_LEDs to set the intensity for LED's to wall and above buttons.
deldering95 43:d09814c177a0 556 ws.setII(2.55*intensity);
deldering95 43:d09814c177a0 557 switch(nLED_colour) {
deldering95 43:d09814c177a0 558 case 'r' :
deldering95 43:d09814c177a0 559 px.SetAll(colourbuf[0]);
Ishy 55:b74e7076d7a0 560 LED_red_state = 1;
Ishy 55:b74e7076d7a0 561 LED_yellow_state = 0;
deldering95 43:d09814c177a0 562 break;
deldering95 43:d09814c177a0 563 case 'g' :
deldering95 43:d09814c177a0 564 px.SetAll(colourbuf[1]);
Ishy 55:b74e7076d7a0 565 LED_green_state = 1;
Ishy 55:b74e7076d7a0 566 LED_red_state = 0;
deldering95 43:d09814c177a0 567 break;
deldering95 43:d09814c177a0 568 case 'b' :
deldering95 43:d09814c177a0 569 px.SetAll(colourbuf[2]);
deldering95 43:d09814c177a0 570 break;
deldering95 43:d09814c177a0 571 case 'y' :
deldering95 43:d09814c177a0 572 px.SetAll(colourbuf[3]);
Ishy 55:b74e7076d7a0 573 LED_yellow_state = 1;
Ishy 55:b74e7076d7a0 574 LED_green_state = 0;
deldering95 43:d09814c177a0 575 break;
deldering95 43:d09814c177a0 576 default :
deldering95 43:d09814c177a0 577 px.SetAll(colourbuf[4]);
deldering95 43:d09814c177a0 578 }
deldering95 43:d09814c177a0 579
deldering95 43:d09814c177a0 580 if (calibration_flash >= 1) {
deldering95 43:d09814c177a0 581 if ((calibration_flash % 2) == 0) {
deldering95 48:aca02ef5cd01 582 px.SetAll(colourbuf[2]);
deldering95 43:d09814c177a0 583 } else {
deldering95 43:d09814c177a0 584 ws.setII(0);
deldering95 43:d09814c177a0 585 }
deldering95 43:d09814c177a0 586 calibration_flash--;
deldering95 43:d09814c177a0 587 }
deldering95 51:69087c44e8ac 588 //for (int z=WS2812_BUF; z >= 0 ; z--) {
deldering95 53:54c882995514 589 ws.write_offsets(px.getBuf(),0,0,0);
deldering95 51:69087c44e8ac 590 //}
ricardo_95 21:13e4824bc364 591 }
ricardo_95 21:13e4824bc364 592
ricardo_95 36:d10f368d037b 593 void trigger_lock() // If rising edge lock button is detected start locktimer.
ricardo_95 21:13e4824bc364 594 {
ricardo_95 34:1614f4f2b841 595 if (test_mode == 1) {
ricardo_95 36:d10f368d037b 596 usb_serial.printf("Lock triggered.\n");
ricardo_95 34:1614f4f2b841 597 }
Ishy 55:b74e7076d7a0 598 if (lock_state == 0) pi_serial.printf(">44\n");
Ishy 55:b74e7076d7a0 599 else if (lock_state == 1) pi_serial.printf(">00\n");
ricardo_95 36:d10f368d037b 600 button_lock_hold_timer.reset();
ricardo_95 36:d10f368d037b 601 button_lock_hold_timer.start();
ricardo_95 36:d10f368d037b 602 delay_between_button_pressed.reset();
ricardo_95 36:d10f368d037b 603 delay_between_button_pressed.start();
ricardo_95 21:13e4824bc364 604 }
ricardo_95 21:13e4824bc364 605
ricardo_95 36:d10f368d037b 606 void end_timer_lock_button() // End timer lock.
ricardo_95 21:13e4824bc364 607 {
deldering95 43:d09814c177a0 608 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 609 usb_serial.printf("Lock released.\n");
ricardo_95 36:d10f368d037b 610 }
ricardo_95 36:d10f368d037b 611 lock_flag = 0; // Set lock_flag off.
Ishy 55:b74e7076d7a0 612 lock_is_logged = 0;
ricardo_95 36:d10f368d037b 613 button_lock_hold_timer.stop(); // Stop and reset holdtimer
ricardo_95 36:d10f368d037b 614 button_lock_hold_timer.reset();
ricardo_95 36:d10f368d037b 615 }
ricardo_95 36:d10f368d037b 616
ricardo_95 36:d10f368d037b 617 void reposition_button_triggered()
ricardo_95 36:d10f368d037b 618 {
ricardo_95 36:d10f368d037b 619 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.
deldering95 48:aca02ef5cd01 620 lock_flash = 10;
deldering95 58:8cfa736d8553 621 }
deldering95 58:8cfa736d8553 622
Ishy 55:b74e7076d7a0 623 delay_between_button_pressed.reset();
Ishy 55:b74e7076d7a0 624 delay_between_button_pressed.start();
Ishy 55:b74e7076d7a0 625 if (test_mode == 1) { // If statement for test purposal.
Ishy 55:b74e7076d7a0 626 usb_serial.printf("Reposition triggered.\n");
Ishy 55:b74e7076d7a0 627 LED_on_dev_board1 = !LED_on_dev_board1;
Ishy 55:b74e7076d7a0 628 }
deldering95 58:8cfa736d8553 629
deldering95 66:88c910cd4d9e 630 if (lock_state == 1||button_new_patient.read()==0) reposition_lock_flag = 1;
deldering95 58:8cfa736d8553 631 else {
deldering95 66:88c910cd4d9e 632 reposition_button_hold_timer.reset();
deldering95 66:88c910cd4d9e 633 reposition_button_hold_timer.start();
deldering95 66:88c910cd4d9e 634
ricardo_95 36:d10f368d037b 635 reposition_feedback_LED = control_LED_intensity;
Ishy 55:b74e7076d7a0 636 pi_serial.printf("&05\n");
deldering95 58:8cfa736d8553 637 if(test_mode == 1) usb_serial.printf("&05\n");
ricardo_95 21:13e4824bc364 638 }
ricardo_95 21:13e4824bc364 639 }
ricardo_95 21:13e4824bc364 640
deldering95 43:d09814c177a0 641 void rise_reposition() // Interrupt for rising edge reposition function (deactivation; active low).
ricardo_95 21:13e4824bc364 642 {
deldering95 43:d09814c177a0 643 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 644 usb_serial.printf("Reposition released.\n");
ricardo_95 34:1614f4f2b841 645 }
deldering95 58:8cfa736d8553 646
Ishy 55:b74e7076d7a0 647 if (reposition_feedback_LED != 0) {
Ishy 55:b74e7076d7a0 648 pi_serial.printf("&50\n");
deldering95 58:8cfa736d8553 649
Ishy 55:b74e7076d7a0 650 if(test_mode == 1) usb_serial.printf("&50\n");
Ishy 55:b74e7076d7a0 651 }
deldering95 66:88c910cd4d9e 652 reposition_button_hold_timer.stop();
deldering95 66:88c910cd4d9e 653 reposition_button_hold_timer.reset();
ricardo_95 36:d10f368d037b 654 reposition_feedback_LED = 0;
ricardo_95 21:13e4824bc364 655 }
Ishy 55:b74e7076d7a0 656 //TODO rename to calibration
ricardo_95 36:d10f368d037b 657 void mute_button_triggered()
ricardo_95 21:13e4824bc364 658 {
ricardo_95 21:13e4824bc364 659
ricardo_95 36:d10f368d037b 660 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.
deldering95 48:aca02ef5cd01 661 lock_flash = 10;
Ishy 55:b74e7076d7a0 662 }
deldering95 58:8cfa736d8553 663
Ishy 55:b74e7076d7a0 664 delay_between_button_pressed.reset();
Ishy 55:b74e7076d7a0 665 delay_between_button_pressed.start();
Ishy 55:b74e7076d7a0 666 button_calibration_hold_timer.reset(); // inline ?
Ishy 55:b74e7076d7a0 667 button_calibration_hold_timer.start();
deldering95 58:8cfa736d8553 668
Ishy 55:b74e7076d7a0 669 if (lock_state == 1) {
Ishy 55:b74e7076d7a0 670 mute_lock_flag = 1;
Ishy 55:b74e7076d7a0 671 }
deldering95 58:8cfa736d8553 672
Ishy 55:b74e7076d7a0 673 else {
deldering95 58:8cfa736d8553 674 mute_feedback_LED = control_LED_intensity;
deldering95 58:8cfa736d8553 675 pi_serial.printf("&07\n");
deldering95 58:8cfa736d8553 676 if (test_mode == 1) usb_serial.printf("&07\n");
deldering95 58:8cfa736d8553 677 mute_flag = 1;
Ishy 55:b74e7076d7a0 678 }
deldering95 58:8cfa736d8553 679
Ishy 55:b74e7076d7a0 680 if (test_mode == 1) { // If statement for test purposal.
Ishy 55:b74e7076d7a0 681 usb_serial.printf("Calibration triggered\n");
Ishy 55:b74e7076d7a0 682 LED_on_dev_board1 = !LED_on_dev_board1;
Ishy 55:b74e7076d7a0 683 }
deldering95 43:d09814c177a0 684
deldering95 58:8cfa736d8553 685
ricardo_95 21:13e4824bc364 686 }
ricardo_95 21:13e4824bc364 687
deldering95 51:69087c44e8ac 688 void rise_mute() // Interrupt for rising edge reposition function (deactivation; active low).
ricardo_95 21:13e4824bc364 689 {
deldering95 43:d09814c177a0 690 if (test_mode == 1) { // If statement for test purposal.
Ishy 55:b74e7076d7a0 691 usb_serial.printf("Calibration released.\n");
ricardo_95 34:1614f4f2b841 692 }
Ishy 55:b74e7076d7a0 693 if(lock_state == 0 && mute_feedback_LED != 0) {
Ishy 55:b74e7076d7a0 694 pi_serial.printf("&70\n");
Ishy 55:b74e7076d7a0 695 if (test_mode == 1) usb_serial.printf("&70\n");
Ishy 55:b74e7076d7a0 696 }
deldering95 58:8cfa736d8553 697
deldering95 51:69087c44e8ac 698 mute_feedback_LED = 0;
ricardo_95 21:13e4824bc364 699
deldering95 43:d09814c177a0 700 button_calibration_hold_timer.stop(); // Timer reset for calibration function of new patient button.
ricardo_95 36:d10f368d037b 701 button_calibration_hold_timer.reset();
ricardo_95 21:13e4824bc364 702
ricardo_95 36:d10f368d037b 703 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 704 } else {
ricardo_95 21:13e4824bc364 705 if (calibration_flag == 0) {
ricardo_95 21:13e4824bc364 706
deldering95 43:d09814c177a0 707 if (LED_on_dev_board1 == 0) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 708 LED_on_dev_board1 = 1;
ricardo_95 21:13e4824bc364 709 } else {
ricardo_95 36:d10f368d037b 710 LED_on_dev_board1 = 0;
ricardo_95 21:13e4824bc364 711 }
ricardo_95 21:13e4824bc364 712
ricardo_95 21:13e4824bc364 713 } else {
ricardo_95 21:13e4824bc364 714 calibration_flag = 0;
ricardo_95 21:13e4824bc364 715 }
ricardo_95 21:13e4824bc364 716 }
deldering95 51:69087c44e8ac 717
deldering95 51:69087c44e8ac 718 }
deldering95 51:69087c44e8ac 719
deldering95 51:69087c44e8ac 720 void trigger_new_patient() // Function to trigger hold timer for new patient and calibration function.
deldering95 51:69087c44e8ac 721 {
deldering95 51:69087c44e8ac 722
deldering95 51:69087c44e8ac 723 if (lock_state == 1 | (delay_between_button_pressed.read_ms() < buttondelay_ms)) {
deldering95 51:69087c44e8ac 724 lock_flash = 10;
Ishy 55:b74e7076d7a0 725 }
deldering95 58:8cfa736d8553 726
Ishy 55:b74e7076d7a0 727 delay_between_button_pressed.reset();
Ishy 55:b74e7076d7a0 728 delay_between_button_pressed.start();
deldering95 58:8cfa736d8553 729
deldering95 66:88c910cd4d9e 730 if (lock_state == 1||button_reposition.read()==0) new_patient_lock_flag = 1;
Ishy 55:b74e7076d7a0 731 else {
deldering95 66:88c910cd4d9e 732 new_patient_button_hold_timer.reset();
deldering95 66:88c910cd4d9e 733 new_patient_button_hold_timer.start();
deldering95 66:88c910cd4d9e 734
Ishy 55:b74e7076d7a0 735 new_patient_feedback_LED = control_LED_intensity;
Ishy 55:b74e7076d7a0 736 pi_serial.printf("&06\n");
deldering95 66:88c910cd4d9e 737 //new_patient_flag = 1;
deldering95 58:8cfa736d8553 738
deldering95 58:8cfa736d8553 739 if(test_mode == 1) {
Ishy 55:b74e7076d7a0 740 usb_serial.printf("&06\n");
deldering95 51:69087c44e8ac 741 }
deldering95 51:69087c44e8ac 742 }
deldering95 58:8cfa736d8553 743
Ishy 55:b74e7076d7a0 744 if (test_mode == 1) { // If statement for test purposal.
Ishy 55:b74e7076d7a0 745 usb_serial.printf("New patient triggered.\n");
Ishy 55:b74e7076d7a0 746 }
deldering95 58:8cfa736d8553 747
deldering95 51:69087c44e8ac 748 }
deldering95 51:69087c44e8ac 749
deldering95 51:69087c44e8ac 750 void activate_new_patient_function() // Timer calibration function.
deldering95 51:69087c44e8ac 751 {
deldering95 51:69087c44e8ac 752 if (test_mode == 1) { // If statement for test purposal.
deldering95 51:69087c44e8ac 753 usb_serial.printf("New patient released.\n");
deldering95 58:8cfa736d8553 754
Ishy 55:b74e7076d7a0 755 }
deldering95 66:88c910cd4d9e 756 new_patient_button_hold_timer.stop();
deldering95 66:88c910cd4d9e 757 new_patient_button_hold_timer.reset();
deldering95 66:88c910cd4d9e 758
deldering95 58:8cfa736d8553 759
Ishy 55:b74e7076d7a0 760 if (new_patient_feedback_LED != 0) {
Ishy 55:b74e7076d7a0 761 pi_serial.printf("&60\n");
Ishy 55:b74e7076d7a0 762 if(test_mode) usb_serial.printf("&60\n");
deldering95 51:69087c44e8ac 763 }
deldering95 51:69087c44e8ac 764 new_patient_feedback_LED = 0;
ricardo_95 21:13e4824bc364 765 }
ricardo_95 21:13e4824bc364 766
deldering95 43:d09814c177a0 767 void timer_functions() // Function which contains statements using timers.
ricardo_95 21:13e4824bc364 768 {
deldering95 48:aca02ef5cd01 769 if (button_lock == 1) {
deldering95 44:dcbde3175a37 770 button_lock_hold_timer.stop();
deldering95 44:dcbde3175a37 771 button_lock_hold_timer.reset();
deldering95 44:dcbde3175a37 772 }
ricardo_95 36:d10f368d037b 773 if ((button_lock_hold_timer.read_ms() > locktime_ms) && lock_flag == 0 && button_lock == 0) { // If statement for lock function.
ricardo_95 21:13e4824bc364 774 lock_flag = 1;
ricardo_95 36:d10f368d037b 775 LED_on_dev_board2 = !LED_on_dev_board2;
ricardo_95 21:13e4824bc364 776 lock_state = !lock_state;
deldering95 43:d09814c177a0 777
deldering95 43:d09814c177a0 778 if (lock_state == 0) { // If statement to control lock feedback LED above button.
ricardo_95 36:d10f368d037b 779 lock_feedback_LED = control_LED_intensity;
Ishy 55:b74e7076d7a0 780 pi_serial.printf("&08\n");
deldering95 58:8cfa736d8553 781 if(test_mode == 1) usb_serial.printf("&08\n");
ricardo_95 21:13e4824bc364 782 } else {
ricardo_95 36:d10f368d037b 783 lock_feedback_LED = 0;
Ishy 55:b74e7076d7a0 784 pi_serial.printf("&80\n");
Ishy 55:b74e7076d7a0 785 if(test_mode == 1) usb_serial.printf("&80\n");
ricardo_95 21:13e4824bc364 786 }
ricardo_95 21:13e4824bc364 787 }
ricardo_95 21:13e4824bc364 788
deldering95 51:69087c44e8ac 789 if (button_mute == 1) {
deldering95 44:dcbde3175a37 790 button_calibration_hold_timer.stop();
deldering95 44:dcbde3175a37 791 button_calibration_hold_timer.reset();
deldering95 44:dcbde3175a37 792 }
deldering95 44:dcbde3175a37 793
deldering95 66:88c910cd4d9e 794 if (button_reposition == 1) {
deldering95 66:88c910cd4d9e 795 reposition_button_hold_timer.stop();
deldering95 66:88c910cd4d9e 796 reposition_button_hold_timer.reset();
deldering95 66:88c910cd4d9e 797 }
deldering95 66:88c910cd4d9e 798
deldering95 66:88c910cd4d9e 799
deldering95 51:69087c44e8ac 800 if ((button_calibration_hold_timer.read_ms() > calibrationtime_ms) && calibration_flag == 0 && button_mute == 0 && lock_state == 0) { // If statement for calibration algorithm.
ricardo_95 21:13e4824bc364 801 calibration_flag = 1;
ricardo_95 21:13e4824bc364 802 calibration_flash = 11;
deldering95 58:8cfa736d8553 803
Ishy 55:b74e7076d7a0 804 if (test_mode == 1) { // If statement for test purposal.
ricardo_95 36:d10f368d037b 805 usb_serial.printf("Calibrate triggered.\n");
ricardo_95 34:1614f4f2b841 806 }
Ishy 55:b74e7076d7a0 807 pi_serial.printf(">33\n");
deldering95 58:8cfa736d8553 808
ricardo_95 21:13e4824bc364 809 }
deldering95 66:88c910cd4d9e 810 /*
deldering95 66:88c910cd4d9e 811 if (delay_between_button_pressed.read_ms() > delay_lock_interface) { // If buttons are not pressed for 3 minutes, set lock active.
deldering95 66:88c910cd4d9e 812 lock_state = 1;
deldering95 66:88c910cd4d9e 813 LED_on_dev_board2 = 1;
deldering95 66:88c910cd4d9e 814 lock_feedback_LED = 0;
deldering95 66:88c910cd4d9e 815 if (!auto_lock_led_logged) {
deldering95 66:88c910cd4d9e 816 pi_serial.printf("&80\n");
deldering95 66:88c910cd4d9e 817 if(test_mode == 1) usb_serial.printf("&80\n");
deldering95 66:88c910cd4d9e 818 auto_lock_led_logged = 1;
deldering95 66:88c910cd4d9e 819 }
deldering95 66:88c910cd4d9e 820 } else {
deldering95 66:88c910cd4d9e 821 auto_lock_led_logged = 0;
deldering95 66:88c910cd4d9e 822 }*/
ricardo_95 21:13e4824bc364 823 }
ricardo_95 21:13e4824bc364 824
ricardo_95 36:d10f368d037b 825 void set_userinterface_LED() // Control functions for LED above buttons (added because of failures).
ricardo_95 21:13e4824bc364 826 {
ricardo_95 21:13e4824bc364 827 if (lock_state == 1) {
ricardo_95 21:13e4824bc364 828 } else {
ricardo_95 36:d10f368d037b 829 if (button_reposition == 0) {
ricardo_95 36:d10f368d037b 830 reposition_feedback_LED = control_LED_intensity;
ricardo_95 21:13e4824bc364 831 } else {
ricardo_95 36:d10f368d037b 832 reposition_feedback_LED = 0;
ricardo_95 21:13e4824bc364 833 }
ricardo_95 21:13e4824bc364 834
ricardo_95 36:d10f368d037b 835 if (button_new_patient == 0) {
ricardo_95 36:d10f368d037b 836 new_patient_feedback_LED = control_LED_intensity;
ricardo_95 21:13e4824bc364 837 } else {
ricardo_95 36:d10f368d037b 838 new_patient_feedback_LED = 0;
ricardo_95 21:13e4824bc364 839 }
ricardo_95 21:13e4824bc364 840 }
deldering95 48:aca02ef5cd01 841 if (lock_flash >= 1 && lock_state == 1) {
deldering95 48:aca02ef5cd01 842 if ((lock_flash % 2) == 0) {
deldering95 48:aca02ef5cd01 843 lock_feedback_LED = control_LED_intensity;
Ishy 55:b74e7076d7a0 844 pi_serial.printf("&08\n");
Ishy 55:b74e7076d7a0 845 if(test_mode == 1) usb_serial.printf("&08\n");
deldering95 48:aca02ef5cd01 846 } else {
deldering95 48:aca02ef5cd01 847 lock_feedback_LED = 0;
Ishy 55:b74e7076d7a0 848 pi_serial.printf("&80\n");
Ishy 55:b74e7076d7a0 849 if(test_mode == 1) usb_serial.printf("&80\n");
ricardo_95 21:13e4824bc364 850 }
deldering95 48:aca02ef5cd01 851 lock_flash--;
deldering95 48:aca02ef5cd01 852 } else {
deldering95 48:aca02ef5cd01 853 lock_flash = 0;
ricardo_95 21:13e4824bc364 854 }
ricardo_95 21:13e4824bc364 855 }
ricardo_95 21:13e4824bc364 856
deldering95 57:fac732476810 857 void sensorplate_detached()
deldering95 57:fac732476810 858 {
deldering95 58:8cfa736d8553 859 if(piezo_electric_sample_timer.read_us() > total_readout_cycle_time_us) {
deldering95 58:8cfa736d8553 860 NVIC_SystemReset();
deldering95 58:8cfa736d8553 861 }
deldering95 57:fac732476810 862 }
deldering95 57:fac732476810 863
deldering95 57:fac732476810 864
deldering95 43:d09814c177a0 865 int main() // Main function. inline function "Momo Init" bijvoorbeeld
deldering95 43:d09814c177a0 866 {
deldering95 66:88c910cd4d9e 867 pi_serial.attach(serial_read,Serial::RxIrq);
deldering95 66:88c910cd4d9e 868 ws.useII(WS2812::PER_PIXEL);
deldering95 66:88c910cd4d9e 869 ws.setII(255);
deldering95 66:88c910cd4d9e 870 px.SetAll(colourbuf[4]); // use global intensity scaling
deldering95 51:69087c44e8ac 871 set_intensity_LEDs(); // Initialize intensity for user interface LED's and LED's shines to wall.
deldering95 66:88c910cd4d9e 872 ws.write_offsets(px.getBuf(),0,0,0);
deldering95 53:54c882995514 873
deldering95 48:aca02ef5cd01 874 speaker1 = 1;
ricardo_95 36:d10f368d037b 875 wait_ms(boot_delay_ms); // Wait to boot sensorplate first.
deldering95 48:aca02ef5cd01 876 speaker1 = 0;
ricardo_95 39:cff99a9b7237 877 i2c_sensorplate_adc.frequency(i2c__frequency); // Set frequency for i2c connection to sensorplate (variable is declared in config part).
ricardo_95 36:d10f368d037b 878 usb_serial.baud(baud_rate); // Set serial USB connection baud rate (variable is declared in config part).
ricardo_95 36:d10f368d037b 879 pi_serial.baud(baud_rate); // Same as line 697, but now for serial PI connection.
ricardo_95 36:d10f368d037b 880 piezo_resistive_adc1.setGain(GAIN_TWOTHIRDS); // Set ranges of ADC to +/-6.144V (end is marked with #):
deldering95 43:d09814c177a0 881 piezo_resistive_adc2.setGain(GAIN_TWOTHIRDS);
deldering95 51:69087c44e8ac 882 piezo_electric_adc.setGain(GAIN_TWO);
deldering95 43:d09814c177a0 883 pi_serial.format(8, SerialBase::None, 1); // Set serial communication line with PI.
ricardo_95 7:dba5091c8b7d 884
deldering95 57:fac732476810 885 testpin_sensorplate.mode(PullUp);
deldering95 43:d09814c177a0 886 button_lock.mode(PullUp);
deldering95 43:d09814c177a0 887 button_reposition.mode(PullUp);
deldering95 43:d09814c177a0 888 button_mute.mode(PullUp);
deldering95 43:d09814c177a0 889 button_new_patient.mode(PullUp);
deldering95 43:d09814c177a0 890
deldering95 57:fac732476810 891 testpin_sensorplate.fall(&sensorplate_detached);
ricardo_95 36:d10f368d037b 892 button_lock.fall(&trigger_lock); // Interrupt for rising edge lock button.
ricardo_95 36:d10f368d037b 893 button_lock.rise(&end_timer_lock_button);
ricardo_95 36:d10f368d037b 894 button_reposition.fall(&reposition_button_triggered);
ricardo_95 36:d10f368d037b 895 button_reposition.rise(&rise_reposition);
ricardo_95 36:d10f368d037b 896 button_mute.fall(&mute_button_triggered);
deldering95 51:69087c44e8ac 897 button_mute.rise(&rise_mute);
ricardo_95 36:d10f368d037b 898 button_new_patient.fall(&trigger_new_patient); // New patient/calibration button rising event.
deldering95 43:d09814c177a0 899 button_new_patient.rise(&activate_new_patient_function); // Falling edge for calibration algorithm option.
ricardo_95 21:13e4824bc364 900
deldering95 48:aca02ef5cd01 901 __disable_irq();
deldering95 48:aca02ef5cd01 902 while(!pi_active) {
deldering95 66:88c910cd4d9e 903 comet_timer.reset();
deldering95 66:88c910cd4d9e 904 comet_timer.start();
deldering95 66:88c910cd4d9e 905 ws.useII(WS2812::PER_PIXEL);
deldering95 66:88c910cd4d9e 906 ws.setII(255);
deldering95 66:88c910cd4d9e 907 tail_step = (255-COMET_TAIL_END_INTENSITY)/TAIL_LENGTH;
deldering95 66:88c910cd4d9e 908 comet++;
deldering95 66:88c910cd4d9e 909 px.SetAll(colourbuf[6]);
deldering95 66:88c910cd4d9e 910 px.Set(comet%ALARMBUF,colourbuf[4]);
deldering95 66:88c910cd4d9e 911 px.SetI(comet%ALARMBUF,255);
deldering95 66:88c910cd4d9e 912 for(int i=1; i<=TAIL_LENGTH; i++) {
deldering95 66:88c910cd4d9e 913 tail=(comet-i);
deldering95 66:88c910cd4d9e 914 if(tail<0)tail=0;
deldering95 66:88c910cd4d9e 915 px.Set(tail%ALARMBUF,colourbuf[4]);
deldering95 66:88c910cd4d9e 916 px.SetI(tail%ALARMBUF,(255-(tail_step*i)));
deldering95 66:88c910cd4d9e 917 }
deldering95 66:88c910cd4d9e 918 colour_code = (colour_code_1 << 1 | colour_code_0);
deldering95 66:88c910cd4d9e 919 if(colour_code != 0b00 && pi_active == false && (comet%ALARMBUF)==(ALARMBUF-1)) {
deldering95 66:88c910cd4d9e 920 pi_active = true;
deldering95 66:88c910cd4d9e 921 }
deldering95 67:1b300aa30923 922 if(testpin_sensorplate.read()) {
deldering95 67:1b300aa30923 923 px.Set(6,colourbuf[0]);
deldering95 67:1b300aa30923 924 px.SetI(6,255);
deldering95 67:1b300aa30923 925 }
deldering95 66:88c910cd4d9e 926 ws.write_offsets(px.getBuf(),0,0,0);
deldering95 66:88c910cd4d9e 927 while(comet_timer.read_ms()<total_comet_cycle_time_ms) {}
deldering95 66:88c910cd4d9e 928 }
deldering95 66:88c910cd4d9e 929 for(int i=ALARMBUF-1; i>=0; i--) {
deldering95 66:88c910cd4d9e 930 comet_timer.reset();
deldering95 66:88c910cd4d9e 931 comet_timer.start();
deldering95 66:88c910cd4d9e 932 for(int j=1; j<=TAIL_LENGTH; j++) {
deldering95 66:88c910cd4d9e 933 tail=(i-j);
deldering95 66:88c910cd4d9e 934 if(tail>=0) {
deldering95 66:88c910cd4d9e 935 px.Set(tail,colourbuf[4]);
deldering95 66:88c910cd4d9e 936 px.SetI(tail,(int(255-(tail_step*j))));
deldering95 66:88c910cd4d9e 937 }
deldering95 66:88c910cd4d9e 938 }
deldering95 66:88c910cd4d9e 939 px.Set(i,colourbuf[4]);
deldering95 66:88c910cd4d9e 940 px.SetI(i,255);
deldering95 67:1b300aa30923 941 if(testpin_sensorplate.read()) {
deldering95 67:1b300aa30923 942 px.Set(6,colourbuf[0]);
deldering95 67:1b300aa30923 943 px.SetI(6,255);
deldering95 67:1b300aa30923 944 }
deldering95 66:88c910cd4d9e 945 while(comet_timer.read_ms()<total_comet_cycle_time_ms) {}
deldering95 66:88c910cd4d9e 946 ws.write_offsets(px.getBuf(),0,0,0);
deldering95 66:88c910cd4d9e 947 }
ricardo_95 19:3b5999fa7b7e 948
deldering95 51:69087c44e8ac 949 __enable_irq();
deldering95 66:88c910cd4d9e 950 wait(1);
deldering95 51:69087c44e8ac 951 delay_between_button_pressed.reset(); // Delaytimer reset en start.
deldering95 51:69087c44e8ac 952 delay_between_button_pressed.start();
deldering95 51:69087c44e8ac 953
deldering95 66:88c910cd4d9e 954 // ws.useII(WS2812::GLOBAL);
deldering95 51:69087c44e8ac 955 reposition_feedback_LED = 0;
deldering95 51:69087c44e8ac 956 new_patient_feedback_LED = 0;
deldering95 51:69087c44e8ac 957 mute_feedback_LED = 0;
deldering95 51:69087c44e8ac 958 usb_serial.printf("Lock State: %d\n",lock_state);
deldering95 48:aca02ef5cd01 959 lock_feedback_LED = control_LED_intensity; // Lock LED initialization.
deldering95 51:69087c44e8ac 960
DEldering 0:c0e44c46c573 961 while (1) {
Ishy 42:673ddef4cfa4 962 piezo_electric_sample_timer.reset(); // Clock gebruiken o.i.d.?
Ishy 42:673ddef4cfa4 963 piezo_electric_sample_timer.start();
ricardo_95 46:a0e6e088a50a 964 connection_test_sensorplate = !testpin_sensorplate && pi_active;
deldering95 43:d09814c177a0 965
Ishy 42:673ddef4cfa4 966 if (test_mode == 1) {
Ishy 55:b74e7076d7a0 967 // usb_serial.printf("Connection test sensorplate = %d\n", connection_test_sensorplate);
Ishy 42:673ddef4cfa4 968 }
deldering95 43:d09814c177a0 969 if (test_mode == 1) {
Ishy 55:b74e7076d7a0 970 // usb_serial.printf("Loop time: %d ms\n",piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 971 }
deldering95 43:d09814c177a0 972
Ishy 42:673ddef4cfa4 973 if (connection_test_sensorplate == 1) {
deldering95 58:8cfa736d8553 974 piezo_electric_array[0] = piezo_electric_adc.readADC_Differential_0_3(); // First PE readout.
deldering95 58:8cfa736d8553 975 piezo_electric_array[3] = piezo_electric_adc.readADC_Differential_1_3(); // First PE readout.
deldering95 58:8cfa736d8553 976
deldering95 48:aca02ef5cd01 977 for (uint8_t k = 0; k < 4; ++k) {
deldering95 48:aca02ef5cd01 978 piezo_resistive_array[k] = piezo_resistive_adc1.readADC_SingleEnded(k); // First 4 PR readout.
deldering95 48:aca02ef5cd01 979 }
deldering95 43:d09814c177a0 980 if (test_mode == 1) {
Ishy 55:b74e7076d7a0 981 // usb_serial.printf("Loop time: %d ms\n",piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 982 }
deldering95 58:8cfa736d8553 983 while(piezo_electric_sample_timer.read_us()<(1*(total_readout_cycle_time_us/3))) {} // Wait untill 20% of cycle. Energy efficiency is not fine in this situation, correct if low energy is needed.
deldering95 58:8cfa736d8553 984 piezo_electric_array[1] = piezo_electric_adc.readADC_Differential_0_3(); // Second PE readout.
deldering95 58:8cfa736d8553 985 piezo_electric_array[4] = piezo_electric_adc.readADC_Differential_1_3(); // First PE readout.
deldering95 43:d09814c177a0 986
deldering95 48:aca02ef5cd01 987 for (uint8_t k = 0; k < 4; ++k) {
deldering95 48:aca02ef5cd01 988 piezo_resistive_array[k+4] = piezo_resistive_adc2.readADC_SingleEnded(k); // Last 4 PR readout.
deldering95 48:aca02ef5cd01 989 }
deldering95 43:d09814c177a0 990 if (test_mode == 1) {
Ishy 55:b74e7076d7a0 991 // usb_serial.printf("Loop time: %d ms\n",piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 992 }
deldering95 58:8cfa736d8553 993 while(piezo_electric_sample_timer.read_us()<(2*(total_readout_cycle_time_us/3))) {} // Wait untill 40% of cycle. Energy efficiency is not fine in this situation, correct if low energy is needed.
deldering95 58:8cfa736d8553 994 piezo_electric_array[2] = piezo_electric_adc.readADC_Differential_0_3(); // Third PE readout.
deldering95 58:8cfa736d8553 995 piezo_electric_array[5] = piezo_electric_adc.readADC_Differential_1_3(); // First PE readout.
deldering95 43:d09814c177a0 996
deldering95 48:aca02ef5cd01 997 angle_device_sensorplate.getAccelero(accelerometer_sensorplate); // Get accelerometer data.
deldering95 48:aca02ef5cd01 998 angle = accelerometer_sensorplate[2]*100;
deldering95 48:aca02ef5cd01 999 if(angle == 0) {
deldering95 51:69087c44e8ac 1000 MPU6050_belt angle_device_sensorplate(PB_9, PB_8);
deldering95 53:54c882995514 1001 angle_device_sensorplate.getAccelero(accelerometer_sensorplate);
deldering95 48:aca02ef5cd01 1002 angle = accelerometer_sensorplate[2]*100;
deldering95 48:aca02ef5cd01 1003 }
deldering95 53:54c882995514 1004 if((abs(accelerometer_sensorplate[0])+abs(accelerometer_sensorplate[1])+abs(accelerometer_sensorplate[2]))<= 6) {
deldering95 53:54c882995514 1005 for(uint8_t k = 0; k < 3; ++k) {
deldering95 53:54c882995514 1006 accelerometer_sensorplate[k]=accelerometer_sensorplate[k]*2;
deldering95 53:54c882995514 1007 }
deldering95 53:54c882995514 1008 }
deldering95 48:aca02ef5cd01 1009 angle_device_sensorplate.getGyro(gyroscope_sensorplate); // Get gyroscope data.
deldering95 43:d09814c177a0 1010 if (test_mode == 1) {
Ishy 55:b74e7076d7a0 1011 // usb_serial.printf("Loop time: %d ms\n",piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 1012 }
deldering95 48:aca02ef5cd01 1013 if (test_belt == 1) {
deldering95 48:aca02ef5cd01 1014 angle_device_reference_belt.getGyro(gyroscope_reference_belt); // Get gyroscope data from Belt.
deldering95 48:aca02ef5cd01 1015 angle_device_reference_belt.getAccelero(accelerometer_reference_belt); // Get accelerometer data from belt.
deldering95 48:aca02ef5cd01 1016 }
deldering95 43:d09814c177a0 1017
deldering95 48:aca02ef5cd01 1018 if (connection_test_sensorplate == 1) {
deldering95 48:aca02ef5cd01 1019 if (test_belt == 0) { // If statement for sending serial information sensorplate data when connection test is active.
deldering95 48:aca02ef5cd01 1020 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 53:54c882995514 1021 } else {
deldering95 53:54c882995514 1022 // 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.
deldering95 53:54c882995514 1023 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 48:aca02ef5cd01 1024 }
deldering95 48:aca02ef5cd01 1025 } // binair print and convert in pi
deldering95 53:54c882995514 1026 else {
deldering95 53:54c882995514 1027 pi_serial.printf("?,%f,%f,%f,%f,%f,%f,0,0,0,0,0,0,\n",0,0,0,0,0,0);
deldering95 53:54c882995514 1028 }
Ishy 42:673ddef4cfa4 1029 }
deldering95 43:d09814c177a0 1030 if (test_mode == 1) {
Ishy 55:b74e7076d7a0 1031 // usb_serial.printf("Loop time: %d ms\n",piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 1032 }
Ishy 42:673ddef4cfa4 1033 timer_functions();
deldering95 43:d09814c177a0 1034 if (test_mode == 1) {
Ishy 55:b74e7076d7a0 1035 // usb_serial.printf("Loop time after timer_functions: %d ms\n",piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 1036 }
deldering95 43:d09814c177a0 1037
deldering95 66:88c910cd4d9e 1038 colour_wheel(LED_colour_wheel_percentage); // Function to select colour.
deldering95 67:1b300aa30923 1039 percentage_tester+=0.2;
deldering95 67:1b300aa30923 1040 //LED_colour_wheel_percentage=percentage_tester;
Ishy 42:673ddef4cfa4 1041 set_userinterface_LED(); // Set LED's of user interface (LED's above buttons).
deldering95 43:d09814c177a0 1042
deldering95 43:d09814c177a0 1043 if (test_mode == 1) { // If statement for test purposal.
Ishy 55:b74e7076d7a0 1044 // usb_serial.printf("Angle device sensorplate = %d\n",angle_device_sensorplate.testConnection());
Ishy 42:673ddef4cfa4 1045 }
deldering95 43:d09814c177a0 1046
Ishy 42:673ddef4cfa4 1047 if (connection_test_sensorplate == 1) {
deldering95 58:8cfa736d8553 1048 piezo_electric_array[4] = piezo_electric_adc.readADC_Differential_0_3(); // Fifth PE readout.
Ishy 42:673ddef4cfa4 1049 }
deldering95 43:d09814c177a0 1050
Ishy 42:673ddef4cfa4 1051 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 1052
deldering95 43:d09814c177a0 1053 if (test_mode == 1) {
Ishy 55:b74e7076d7a0 1054 // usb_serial.printf("Loop time: %d ms\n",piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 1055 }
deldering95 43:d09814c177a0 1056
deldering95 43:d09814c177a0 1057 if (test_mode == 0) { // If statements for test purposal (untill * mark).
Ishy 55:b74e7076d7a0 1058 // usb_serial.printf("Loop time pre serial: %d ms\n",piezo_electric_sample_timer.read_ms());
deldering95 43:d09814c177a0 1059 }
deldering95 66:88c910cd4d9e 1060 //serial_read(); // Call function for reading information from PI by serial connection.
deldering95 43:d09814c177a0 1061 serial_log(); // Call function for logging information to PI by serial connection.
deldering95 43:d09814c177a0 1062
deldering95 43:d09814c177a0 1063 if (test_mode == 0) { // If statements for test purposal (untill * mark).
Ishy 42:673ddef4cfa4 1064 usb_serial.printf("Loop time: %d ms\n",piezo_electric_sample_timer.read_ms());
Ishy 42:673ddef4cfa4 1065 }
deldering95 48:aca02ef5cd01 1066
deldering95 47:80cfc181f8b3 1067 while(piezo_electric_sample_timer.read_us()<(total_readout_cycle_time_us)) {} // Wait untill 100% of cycle. Energy efficiency is not fine in this situation, correct if low energy is needed.
Ishy 42:673ddef4cfa4 1068 //if (test_pin == 1) {
Ishy 42:673ddef4cfa4 1069 // test_mode = 1;
Ishy 42:673ddef4cfa4 1070 // usb_serial.printf("%d\n",test_mode);
Ishy 42:673ddef4cfa4 1071 // }
Ishy 42:673ddef4cfa4 1072 // if (test_pin == 0) {
Ishy 42:673ddef4cfa4 1073 // test_mode = 0;
Ishy 42:673ddef4cfa4 1074 // usb_serial.printf("%d\n",test_mode);
Ishy 42:673ddef4cfa4 1075 // }
DEldering 0:c0e44c46c573 1076 }
ricardo_95 12:7b3a5940f911 1077 }