The HexiHeart is a demo project product that takes advantage of many of the onboard Hexiwear sensors and capabilities to create a multifunctional fitness and safety watch.
Dependencies: FXAS21002 FXOS8700 Hexi_KW40Z Hexi_OLED_SSD1351 MAXIM W25Q64FVSSIG HTU21D MPL3115A2 TSL2561
Fork of HexiHeart_Alex by
main.cpp@0:d1d36a3da39b, 2017-11-12 (annotated)
- Committer:
- nbaker
- Date:
- Sun Nov 12 22:14:37 2017 +0000
- Revision:
- 0:d1d36a3da39b
- Child:
- 1:e4b38d6918ba
This is my first attempt at the menu structure and basic features.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nbaker | 0:d1d36a3da39b | 1 | /********************************************************************** |
nbaker | 0:d1d36a3da39b | 2 | Texas State University Senior Project - HexiHeart |
nbaker | 0:d1d36a3da39b | 3 | Team Zeta: Alex Song, Jasmine Rounsaville, Issam Hichami, Neil Baker |
nbaker | 0:d1d36a3da39b | 4 | Version: HexiHeart_1st 11/12/17 |
nbaker | 0:d1d36a3da39b | 5 | This version has basic menu layout and screen timeout feature. The menu |
nbaker | 0:d1d36a3da39b | 6 | are just placeholders (for the most part) and will be either adjusted or |
nbaker | 0:d1d36a3da39b | 7 | replaced with graphic images. |
nbaker | 0:d1d36a3da39b | 8 | |
nbaker | 0:d1d36a3da39b | 9 | ***********************************************************************/ |
nbaker | 0:d1d36a3da39b | 10 | |
nbaker | 0:d1d36a3da39b | 11 | #include "mbed.h" |
nbaker | 0:d1d36a3da39b | 12 | #include "Hexi_KW40Z.h" // Button and BLE fuctions |
nbaker | 0:d1d36a3da39b | 13 | #include "FXOS8700.h" // 3D Accelorometer & Mag |
nbaker | 0:d1d36a3da39b | 14 | #include "FXAS21002.h" // 3-Axis Gyroscope |
nbaker | 0:d1d36a3da39b | 15 | #include "Hexi_OLED_SSD1351.h" // OLED fuctions |
nbaker | 0:d1d36a3da39b | 16 | #include "OLED_types.h" // Text attributs |
nbaker | 0:d1d36a3da39b | 17 | #include "string.h" |
nbaker | 0:d1d36a3da39b | 18 | #include "OpenSans_Font.h" |
nbaker | 0:d1d36a3da39b | 19 | /* We need to confirm whether it's better to include and |
nbaker | 0:d1d36a3da39b | 20 | configure every module for lowest power, or whether it's |
nbaker | 0:d1d36a3da39b | 21 | better to save memory by not doing that |
nbaker | 0:d1d36a3da39b | 22 | */ |
nbaker | 0:d1d36a3da39b | 23 | |
nbaker | 0:d1d36a3da39b | 24 | // Definitions |
nbaker | 0:d1d36a3da39b | 25 | #define LED_ON 0 |
nbaker | 0:d1d36a3da39b | 26 | #define LED_OFF 1 |
nbaker | 0:d1d36a3da39b | 27 | #define SCRN_TIME 10.0 |
nbaker | 0:d1d36a3da39b | 28 | #define Debug 1 // If "Debug" is defined, our code will compile for debug. Comment out for Production code. |
nbaker | 0:d1d36a3da39b | 29 | |
nbaker | 0:d1d36a3da39b | 30 | void StartHaptic(void); |
nbaker | 0:d1d36a3da39b | 31 | void StopHaptic(void const *n); |
nbaker | 0:d1d36a3da39b | 32 | void error_screen(void); |
nbaker | 0:d1d36a3da39b | 33 | void update_display(void); |
nbaker | 0:d1d36a3da39b | 34 | |
nbaker | 0:d1d36a3da39b | 35 | // ***************** Global variables *********************** |
nbaker | 0:d1d36a3da39b | 36 | char text_1[20]; // Text buffer - Do we need more? |
nbaker | 0:d1d36a3da39b | 37 | bool OLED_ON = 1; // Turn OLED power on/off |
nbaker | 0:d1d36a3da39b | 38 | bool Fall_Alert = 0; // Initialize as no active alert |
nbaker | 0:d1d36a3da39b | 39 | bool Panic_Alert = 0; // Initialize as no active alert |
nbaker | 0:d1d36a3da39b | 40 | bool Fall_Alert_Mode = 1; // Initialize with fall alert mode on |
nbaker | 0:d1d36a3da39b | 41 | bool Heart_Rate_Mode = 0; // Initialize with Heart rate off |
nbaker | 0:d1d36a3da39b | 42 | float Accel_Mag=0.0; // Vector magnitude calculated from sensor data |
nbaker | 0:d1d36a3da39b | 43 | float Accel_Data[3]; // Accel Data from sensor |
nbaker | 0:d1d36a3da39b | 44 | float Gyro_Mag=0.0; // Vector magnitude calculated from sensor data |
nbaker | 0:d1d36a3da39b | 45 | float Gyro_Data[3]; // Gyro data from sensor |
nbaker | 0:d1d36a3da39b | 46 | float Fall_Thresh=0.5; // Initialize Fall detect Threshold |
nbaker | 0:d1d36a3da39b | 47 | float Impact_Thresh=3.0; // Initialize Impact detect Threshold |
nbaker | 0:d1d36a3da39b | 48 | float Movement_Thresh=50.0; // Initialize Movement detect Threshold |
nbaker | 0:d1d36a3da39b | 49 | uint8_t Age = 30; // Initialize age |
nbaker | 0:d1d36a3da39b | 50 | uint8_t Max_BPM = 190; // Initialize Max BPM |
nbaker | 0:d1d36a3da39b | 51 | uint8_t Screen_Num = 0; // Initialize to main screen |
nbaker | 0:d1d36a3da39b | 52 | uint8_t Error_Num = 0; // Error num for debug |
nbaker | 0:d1d36a3da39b | 53 | // ***************** Define pins ***************************** |
nbaker | 0:d1d36a3da39b | 54 | FXAS21002 gyro(PTC11,PTC10); // Gyroscope |
nbaker | 0:d1d36a3da39b | 55 | SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); // SSD1351 OLED Driver (MOSI,SCLK,POWER,CS,RST,DC) |
nbaker | 0:d1d36a3da39b | 56 | FXOS8700 accel(PTC11, PTC10); // Accelorometer |
nbaker | 0:d1d36a3da39b | 57 | FXOS8700 mag(PTC11, PTC10); // Mag (same chip as Accel) |
nbaker | 0:d1d36a3da39b | 58 | |
nbaker | 0:d1d36a3da39b | 59 | DigitalOut RED_Led(LED1); |
nbaker | 0:d1d36a3da39b | 60 | DigitalOut GRN_Led(LED2); |
nbaker | 0:d1d36a3da39b | 61 | DigitalOut BLU_Led(LED3); |
nbaker | 0:d1d36a3da39b | 62 | DigitalOut haptic(PTB9); |
nbaker | 0:d1d36a3da39b | 63 | |
nbaker | 0:d1d36a3da39b | 64 | /* Instantiate the Hexi KW40Z Driver (UART TX, UART RX) */ |
nbaker | 0:d1d36a3da39b | 65 | KW40Z kw40z_device(PTE24, PTE25); |
nbaker | 0:d1d36a3da39b | 66 | |
nbaker | 0:d1d36a3da39b | 67 | /* Define timer for haptic feedback */ |
nbaker | 0:d1d36a3da39b | 68 | RtosTimer hapticTimer(StopHaptic, osTimerOnce); |
nbaker | 0:d1d36a3da39b | 69 | |
nbaker | 0:d1d36a3da39b | 70 | //***************** Tickers and Timers ***************** |
nbaker | 0:d1d36a3da39b | 71 | Ticker Screen_Timer;// use ticker to turn off OLED |
nbaker | 0:d1d36a3da39b | 72 | |
nbaker | 0:d1d36a3da39b | 73 | void timout_timer(){// turn off display mode |
nbaker | 0:d1d36a3da39b | 74 | oled.FillScreen(COLOR_BLACK); // Clear screen.. is there a better command for this? |
nbaker | 0:d1d36a3da39b | 75 | OLED_ON = 0; // set flag to off |
nbaker | 0:d1d36a3da39b | 76 | Screen_Timer.detach(); |
nbaker | 0:d1d36a3da39b | 77 | }//end routine |
nbaker | 0:d1d36a3da39b | 78 | |
nbaker | 0:d1d36a3da39b | 79 | void ButtonUp(void) |
nbaker | 0:d1d36a3da39b | 80 | { |
nbaker | 0:d1d36a3da39b | 81 | Screen_Timer.attach(&timout_timer,(SCRN_TIME));//Is this sufficient to reset/restart ticker timer for OLED? |
nbaker | 0:d1d36a3da39b | 82 | if (OLED_ON == 0){ |
nbaker | 0:d1d36a3da39b | 83 | OLED_ON = 1; // Scree was off, set to On |
nbaker | 0:d1d36a3da39b | 84 | update_display(); |
nbaker | 0:d1d36a3da39b | 85 | } |
nbaker | 0:d1d36a3da39b | 86 | else |
nbaker | 0:d1d36a3da39b | 87 | { |
nbaker | 0:d1d36a3da39b | 88 | switch(Screen_Num) { |
nbaker | 0:d1d36a3da39b | 89 | case 0: {// We're in Main Screen |
nbaker | 0:d1d36a3da39b | 90 | // do nothing, wrong button |
nbaker | 0:d1d36a3da39b | 91 | break; |
nbaker | 0:d1d36a3da39b | 92 | } |
nbaker | 0:d1d36a3da39b | 93 | case 1: {// Panic Alert option |
nbaker | 0:d1d36a3da39b | 94 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 95 | Screen_Num = 5; //Change to screen 5 |
nbaker | 0:d1d36a3da39b | 96 | #ifdef Debug // in debug show debug/diagnostic screens |
nbaker | 0:d1d36a3da39b | 97 | Screen_Num = 20; //Change to screen 20 |
nbaker | 0:d1d36a3da39b | 98 | #endif |
nbaker | 0:d1d36a3da39b | 99 | |
nbaker | 0:d1d36a3da39b | 100 | update_display(); |
nbaker | 0:d1d36a3da39b | 101 | break; |
nbaker | 0:d1d36a3da39b | 102 | } |
nbaker | 0:d1d36a3da39b | 103 | case 2: {// Fall Alert option |
nbaker | 0:d1d36a3da39b | 104 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 105 | Screen_Num = 1; //Change to screen 1 |
nbaker | 0:d1d36a3da39b | 106 | update_display(); |
nbaker | 0:d1d36a3da39b | 107 | break; |
nbaker | 0:d1d36a3da39b | 108 | } |
nbaker | 0:d1d36a3da39b | 109 | case 3: {// Heart Rate Monitoring option |
nbaker | 0:d1d36a3da39b | 110 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 111 | Screen_Num = 2; //Change to screen 2 |
nbaker | 0:d1d36a3da39b | 112 | update_display(); |
nbaker | 0:d1d36a3da39b | 113 | break; |
nbaker | 0:d1d36a3da39b | 114 | } |
nbaker | 0:d1d36a3da39b | 115 | case 4: {// Alert History option |
nbaker | 0:d1d36a3da39b | 116 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 117 | Screen_Num = 3; //Change to screen 3 |
nbaker | 0:d1d36a3da39b | 118 | update_display(); |
nbaker | 0:d1d36a3da39b | 119 | break; |
nbaker | 0:d1d36a3da39b | 120 | } |
nbaker | 0:d1d36a3da39b | 121 | case 5: {// About HexiHeart |
nbaker | 0:d1d36a3da39b | 122 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 123 | Screen_Num = 4; //Change to screen 4 |
nbaker | 0:d1d36a3da39b | 124 | update_display(); |
nbaker | 0:d1d36a3da39b | 125 | break; |
nbaker | 0:d1d36a3da39b | 126 | } |
nbaker | 0:d1d36a3da39b | 127 | case 6: {// Panic Alert |
nbaker | 0:d1d36a3da39b | 128 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 129 | Panic_Alert = !Panic_Alert; |
nbaker | 0:d1d36a3da39b | 130 | update_display(); |
nbaker | 0:d1d36a3da39b | 131 | break; |
nbaker | 0:d1d36a3da39b | 132 | } |
nbaker | 0:d1d36a3da39b | 133 | case 7: {// Heart Rate Zone |
nbaker | 0:d1d36a3da39b | 134 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 135 | //Increment Age |
nbaker | 0:d1d36a3da39b | 136 | break; |
nbaker | 0:d1d36a3da39b | 137 | } |
nbaker | 0:d1d36a3da39b | 138 | case 8: {// Alert History |
nbaker | 0:d1d36a3da39b | 139 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 140 | //Increment alert index |
nbaker | 0:d1d36a3da39b | 141 | break; |
nbaker | 0:d1d36a3da39b | 142 | } |
nbaker | 0:d1d36a3da39b | 143 | case 20: {// Diagnostic/Debug Screens |
nbaker | 0:d1d36a3da39b | 144 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 145 | Screen_Num = 5; //Change to screen 5 |
nbaker | 0:d1d36a3da39b | 146 | update_display(); |
nbaker | 0:d1d36a3da39b | 147 | break; |
nbaker | 0:d1d36a3da39b | 148 | } |
nbaker | 0:d1d36a3da39b | 149 | case 21: {// Fall Diagnostic |
nbaker | 0:d1d36a3da39b | 150 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 151 | Screen_Num = 25; //Change to screen 25 |
nbaker | 0:d1d36a3da39b | 152 | update_display(); |
nbaker | 0:d1d36a3da39b | 153 | break; |
nbaker | 0:d1d36a3da39b | 154 | } |
nbaker | 0:d1d36a3da39b | 155 | case 22: {// Fall Debug |
nbaker | 0:d1d36a3da39b | 156 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 157 | Screen_Num = 21; //Change to screen 21 |
nbaker | 0:d1d36a3da39b | 158 | update_display(); |
nbaker | 0:d1d36a3da39b | 159 | break; |
nbaker | 0:d1d36a3da39b | 160 | } |
nbaker | 0:d1d36a3da39b | 161 | case 23: {// Heart Rate Diagnostic |
nbaker | 0:d1d36a3da39b | 162 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 163 | Screen_Num = 22; //Change to screen 22 |
nbaker | 0:d1d36a3da39b | 164 | update_display(); |
nbaker | 0:d1d36a3da39b | 165 | break; |
nbaker | 0:d1d36a3da39b | 166 | } |
nbaker | 0:d1d36a3da39b | 167 | case 24: {// Heart Rate Debug |
nbaker | 0:d1d36a3da39b | 168 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 169 | Screen_Num = 23; //Change to screen 23 |
nbaker | 0:d1d36a3da39b | 170 | update_display(); |
nbaker | 0:d1d36a3da39b | 171 | break; |
nbaker | 0:d1d36a3da39b | 172 | } |
nbaker | 0:d1d36a3da39b | 173 | case 25: {// Heat Index Diagnostic |
nbaker | 0:d1d36a3da39b | 174 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 175 | Screen_Num = 24; //Change to screen 24 |
nbaker | 0:d1d36a3da39b | 176 | update_display(); |
nbaker | 0:d1d36a3da39b | 177 | break; |
nbaker | 0:d1d36a3da39b | 178 | } |
nbaker | 0:d1d36a3da39b | 179 | default: { |
nbaker | 0:d1d36a3da39b | 180 | break; |
nbaker | 0:d1d36a3da39b | 181 | } |
nbaker | 0:d1d36a3da39b | 182 | } |
nbaker | 0:d1d36a3da39b | 183 | } |
nbaker | 0:d1d36a3da39b | 184 | } |
nbaker | 0:d1d36a3da39b | 185 | |
nbaker | 0:d1d36a3da39b | 186 | void ButtonDown(void) |
nbaker | 0:d1d36a3da39b | 187 | { |
nbaker | 0:d1d36a3da39b | 188 | Screen_Timer.attach(&timout_timer,(SCRN_TIME));//Is this sufficient to reset/restart ticker timer for OLED? |
nbaker | 0:d1d36a3da39b | 189 | if (OLED_ON == 0){ |
nbaker | 0:d1d36a3da39b | 190 | OLED_ON = 1; // Scree was off, set to On |
nbaker | 0:d1d36a3da39b | 191 | update_display(); |
nbaker | 0:d1d36a3da39b | 192 | } |
nbaker | 0:d1d36a3da39b | 193 | else |
nbaker | 0:d1d36a3da39b | 194 | { |
nbaker | 0:d1d36a3da39b | 195 | |
nbaker | 0:d1d36a3da39b | 196 | switch(Screen_Num) { |
nbaker | 0:d1d36a3da39b | 197 | case 0: {// We're in Main Screen |
nbaker | 0:d1d36a3da39b | 198 | // do nothing, wrong button |
nbaker | 0:d1d36a3da39b | 199 | break; |
nbaker | 0:d1d36a3da39b | 200 | } |
nbaker | 0:d1d36a3da39b | 201 | case 1: {// Panic Alert option |
nbaker | 0:d1d36a3da39b | 202 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 203 | Screen_Num = 2; //Change to screen 2 |
nbaker | 0:d1d36a3da39b | 204 | update_display(); |
nbaker | 0:d1d36a3da39b | 205 | break; |
nbaker | 0:d1d36a3da39b | 206 | } |
nbaker | 0:d1d36a3da39b | 207 | case 2: {// Fall Alert option |
nbaker | 0:d1d36a3da39b | 208 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 209 | Screen_Num = 3; //Change to screen 3 |
nbaker | 0:d1d36a3da39b | 210 | update_display(); |
nbaker | 0:d1d36a3da39b | 211 | break; |
nbaker | 0:d1d36a3da39b | 212 | } |
nbaker | 0:d1d36a3da39b | 213 | case 3: {// Heart Rate Monitoring option |
nbaker | 0:d1d36a3da39b | 214 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 215 | Screen_Num = 4; //Change to screen 4 |
nbaker | 0:d1d36a3da39b | 216 | update_display(); |
nbaker | 0:d1d36a3da39b | 217 | break; |
nbaker | 0:d1d36a3da39b | 218 | } |
nbaker | 0:d1d36a3da39b | 219 | case 4: {// Alert History option |
nbaker | 0:d1d36a3da39b | 220 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 221 | Screen_Num = 5; //Change to screen 5 |
nbaker | 0:d1d36a3da39b | 222 | update_display(); |
nbaker | 0:d1d36a3da39b | 223 | break; |
nbaker | 0:d1d36a3da39b | 224 | } |
nbaker | 0:d1d36a3da39b | 225 | case 5: {// About HexiHeart option |
nbaker | 0:d1d36a3da39b | 226 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 227 | Screen_Num = 1; //Change to screen 1 |
nbaker | 0:d1d36a3da39b | 228 | #ifdef Debug // in debug show debug/diagnostic screens |
nbaker | 0:d1d36a3da39b | 229 | Screen_Num = 20; //Change to screen 20 |
nbaker | 0:d1d36a3da39b | 230 | #endif |
nbaker | 0:d1d36a3da39b | 231 | update_display(); |
nbaker | 0:d1d36a3da39b | 232 | break; |
nbaker | 0:d1d36a3da39b | 233 | } |
nbaker | 0:d1d36a3da39b | 234 | case 6: {// Panic Alert |
nbaker | 0:d1d36a3da39b | 235 | // do nothing, wrong button |
nbaker | 0:d1d36a3da39b | 236 | break; |
nbaker | 0:d1d36a3da39b | 237 | } |
nbaker | 0:d1d36a3da39b | 238 | case 7: {// Heart Rate Zone |
nbaker | 0:d1d36a3da39b | 239 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 240 | //decriment Age |
nbaker | 0:d1d36a3da39b | 241 | break; |
nbaker | 0:d1d36a3da39b | 242 | } |
nbaker | 0:d1d36a3da39b | 243 | case 8: {// Alert History |
nbaker | 0:d1d36a3da39b | 244 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 245 | //decriment alert index |
nbaker | 0:d1d36a3da39b | 246 | break; |
nbaker | 0:d1d36a3da39b | 247 | } |
nbaker | 0:d1d36a3da39b | 248 | case 20: {// Diagnostic/Debug Screens |
nbaker | 0:d1d36a3da39b | 249 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 250 | Screen_Num = 1; //Change to screen 1 |
nbaker | 0:d1d36a3da39b | 251 | update_display(); |
nbaker | 0:d1d36a3da39b | 252 | break; |
nbaker | 0:d1d36a3da39b | 253 | } |
nbaker | 0:d1d36a3da39b | 254 | case 21: {// Fall Diagnostic |
nbaker | 0:d1d36a3da39b | 255 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 256 | Screen_Num = 22; //Change to screen 22 |
nbaker | 0:d1d36a3da39b | 257 | update_display(); |
nbaker | 0:d1d36a3da39b | 258 | break; |
nbaker | 0:d1d36a3da39b | 259 | } |
nbaker | 0:d1d36a3da39b | 260 | case 22: {// Fall Debug |
nbaker | 0:d1d36a3da39b | 261 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 262 | Screen_Num = 23; //Change to screen 25 |
nbaker | 0:d1d36a3da39b | 263 | update_display(); |
nbaker | 0:d1d36a3da39b | 264 | break; |
nbaker | 0:d1d36a3da39b | 265 | } |
nbaker | 0:d1d36a3da39b | 266 | case 23: {// Heart Rate Diagnostic |
nbaker | 0:d1d36a3da39b | 267 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 268 | Screen_Num = 24; //Change to screen 24 |
nbaker | 0:d1d36a3da39b | 269 | update_display(); |
nbaker | 0:d1d36a3da39b | 270 | break; |
nbaker | 0:d1d36a3da39b | 271 | } |
nbaker | 0:d1d36a3da39b | 272 | case 24: {// Heart Rate Ddebug |
nbaker | 0:d1d36a3da39b | 273 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 274 | Screen_Num = 25; //Change to screen 25 |
nbaker | 0:d1d36a3da39b | 275 | update_display(); |
nbaker | 0:d1d36a3da39b | 276 | break; |
nbaker | 0:d1d36a3da39b | 277 | } |
nbaker | 0:d1d36a3da39b | 278 | case 25: {// Heat Index Diagnostic |
nbaker | 0:d1d36a3da39b | 279 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 280 | Screen_Num = 21; //Change to screen 21 |
nbaker | 0:d1d36a3da39b | 281 | update_display(); |
nbaker | 0:d1d36a3da39b | 282 | break; |
nbaker | 0:d1d36a3da39b | 283 | } |
nbaker | 0:d1d36a3da39b | 284 | default: { |
nbaker | 0:d1d36a3da39b | 285 | break; |
nbaker | 0:d1d36a3da39b | 286 | } |
nbaker | 0:d1d36a3da39b | 287 | } |
nbaker | 0:d1d36a3da39b | 288 | } |
nbaker | 0:d1d36a3da39b | 289 | } |
nbaker | 0:d1d36a3da39b | 290 | |
nbaker | 0:d1d36a3da39b | 291 | void ButtonRight(void) |
nbaker | 0:d1d36a3da39b | 292 | { |
nbaker | 0:d1d36a3da39b | 293 | Screen_Timer.attach(&timout_timer,(SCRN_TIME));//Is this sufficient to reset/restart ticker timer for OLED? |
nbaker | 0:d1d36a3da39b | 294 | if (OLED_ON == 0){ |
nbaker | 0:d1d36a3da39b | 295 | OLED_ON = 1; // Scree was off, set to On |
nbaker | 0:d1d36a3da39b | 296 | update_display(); |
nbaker | 0:d1d36a3da39b | 297 | } |
nbaker | 0:d1d36a3da39b | 298 | else |
nbaker | 0:d1d36a3da39b | 299 | { |
nbaker | 0:d1d36a3da39b | 300 | switch(Screen_Num) { |
nbaker | 0:d1d36a3da39b | 301 | case 0: {// We're in Main Screen |
nbaker | 0:d1d36a3da39b | 302 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 303 | Screen_Num = 1; //Change to screen 1 |
nbaker | 0:d1d36a3da39b | 304 | update_display(); |
nbaker | 0:d1d36a3da39b | 305 | break; |
nbaker | 0:d1d36a3da39b | 306 | } |
nbaker | 0:d1d36a3da39b | 307 | case 1: {// Panic Alert option |
nbaker | 0:d1d36a3da39b | 308 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 309 | Screen_Num = 6; //Change to screen 6 |
nbaker | 0:d1d36a3da39b | 310 | update_display(); |
nbaker | 0:d1d36a3da39b | 311 | break; |
nbaker | 0:d1d36a3da39b | 312 | } |
nbaker | 0:d1d36a3da39b | 313 | case 2: {// Fall Alert option |
nbaker | 0:d1d36a3da39b | 314 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 315 | // toggle on/off |
nbaker | 0:d1d36a3da39b | 316 | break; |
nbaker | 0:d1d36a3da39b | 317 | } |
nbaker | 0:d1d36a3da39b | 318 | case 3: {// Heart Rate Monitoring option |
nbaker | 0:d1d36a3da39b | 319 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 320 | Screen_Num = 7; //Change to screen 7 |
nbaker | 0:d1d36a3da39b | 321 | update_display(); |
nbaker | 0:d1d36a3da39b | 322 | break; |
nbaker | 0:d1d36a3da39b | 323 | } |
nbaker | 0:d1d36a3da39b | 324 | case 4: {// Alert History option |
nbaker | 0:d1d36a3da39b | 325 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 326 | Screen_Num = 8; //Change to screen 8 |
nbaker | 0:d1d36a3da39b | 327 | update_display(); |
nbaker | 0:d1d36a3da39b | 328 | break; |
nbaker | 0:d1d36a3da39b | 329 | } |
nbaker | 0:d1d36a3da39b | 330 | case 5: {// About HexiHeart option |
nbaker | 0:d1d36a3da39b | 331 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 332 | Screen_Num = 9; //Change to screen 9 |
nbaker | 0:d1d36a3da39b | 333 | update_display(); |
nbaker | 0:d1d36a3da39b | 334 | break; |
nbaker | 0:d1d36a3da39b | 335 | } |
nbaker | 0:d1d36a3da39b | 336 | |
nbaker | 0:d1d36a3da39b | 337 | case 6: {// Panic Alert |
nbaker | 0:d1d36a3da39b | 338 | // do nothing, wrong button |
nbaker | 0:d1d36a3da39b | 339 | break; |
nbaker | 0:d1d36a3da39b | 340 | } |
nbaker | 0:d1d36a3da39b | 341 | case 7: {// Heart Rate Zone |
nbaker | 0:d1d36a3da39b | 342 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 343 | // toggle on/off |
nbaker | 0:d1d36a3da39b | 344 | break; |
nbaker | 0:d1d36a3da39b | 345 | } |
nbaker | 0:d1d36a3da39b | 346 | case 20: {// Diagnostic/Debug Screens |
nbaker | 0:d1d36a3da39b | 347 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 348 | Screen_Num = 21; //Change to screen 21 |
nbaker | 0:d1d36a3da39b | 349 | update_display(); |
nbaker | 0:d1d36a3da39b | 350 | break; |
nbaker | 0:d1d36a3da39b | 351 | } |
nbaker | 0:d1d36a3da39b | 352 | default: { |
nbaker | 0:d1d36a3da39b | 353 | break; |
nbaker | 0:d1d36a3da39b | 354 | } |
nbaker | 0:d1d36a3da39b | 355 | } |
nbaker | 0:d1d36a3da39b | 356 | } |
nbaker | 0:d1d36a3da39b | 357 | } |
nbaker | 0:d1d36a3da39b | 358 | |
nbaker | 0:d1d36a3da39b | 359 | void ButtonLeft(void) |
nbaker | 0:d1d36a3da39b | 360 | { |
nbaker | 0:d1d36a3da39b | 361 | Screen_Timer.attach(&timout_timer,(SCRN_TIME));//Is this sufficient to reset/restart ticker timer for OLED? |
nbaker | 0:d1d36a3da39b | 362 | if (OLED_ON == 0){ |
nbaker | 0:d1d36a3da39b | 363 | OLED_ON = 1; // Scree was off, set to On |
nbaker | 0:d1d36a3da39b | 364 | update_display(); |
nbaker | 0:d1d36a3da39b | 365 | } |
nbaker | 0:d1d36a3da39b | 366 | else |
nbaker | 0:d1d36a3da39b | 367 | { |
nbaker | 0:d1d36a3da39b | 368 | switch(Screen_Num) { |
nbaker | 0:d1d36a3da39b | 369 | case 0: {// We're in Main Screen |
nbaker | 0:d1d36a3da39b | 370 | // do nothing, wrong button |
nbaker | 0:d1d36a3da39b | 371 | break; |
nbaker | 0:d1d36a3da39b | 372 | } |
nbaker | 0:d1d36a3da39b | 373 | case 1: {// Panic Alert option |
nbaker | 0:d1d36a3da39b | 374 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 375 | Screen_Num = 0; //Change to screen 0 |
nbaker | 0:d1d36a3da39b | 376 | update_display(); |
nbaker | 0:d1d36a3da39b | 377 | break; |
nbaker | 0:d1d36a3da39b | 378 | } |
nbaker | 0:d1d36a3da39b | 379 | case 2: {// Fall Alert option |
nbaker | 0:d1d36a3da39b | 380 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 381 | Screen_Num = 0; //Change to screen 0 |
nbaker | 0:d1d36a3da39b | 382 | update_display(); |
nbaker | 0:d1d36a3da39b | 383 | break; |
nbaker | 0:d1d36a3da39b | 384 | } |
nbaker | 0:d1d36a3da39b | 385 | case 3: {// Heart Rate Monitoring option |
nbaker | 0:d1d36a3da39b | 386 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 387 | Screen_Num = 0; //Change to screen 0 |
nbaker | 0:d1d36a3da39b | 388 | update_display(); |
nbaker | 0:d1d36a3da39b | 389 | break; |
nbaker | 0:d1d36a3da39b | 390 | } |
nbaker | 0:d1d36a3da39b | 391 | case 4: {// Alert History option |
nbaker | 0:d1d36a3da39b | 392 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 393 | Screen_Num = 0; //Change to screen 0 |
nbaker | 0:d1d36a3da39b | 394 | update_display(); |
nbaker | 0:d1d36a3da39b | 395 | break; |
nbaker | 0:d1d36a3da39b | 396 | } |
nbaker | 0:d1d36a3da39b | 397 | case 5: {// About HexiHeart option |
nbaker | 0:d1d36a3da39b | 398 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 399 | Screen_Num = 0; //Change to screen 0 |
nbaker | 0:d1d36a3da39b | 400 | update_display(); |
nbaker | 0:d1d36a3da39b | 401 | break; |
nbaker | 0:d1d36a3da39b | 402 | } |
nbaker | 0:d1d36a3da39b | 403 | case 6: {// Panic Alert |
nbaker | 0:d1d36a3da39b | 404 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 405 | Screen_Num = 1; //Change to screen 1 |
nbaker | 0:d1d36a3da39b | 406 | update_display(); |
nbaker | 0:d1d36a3da39b | 407 | break; |
nbaker | 0:d1d36a3da39b | 408 | } |
nbaker | 0:d1d36a3da39b | 409 | case 7: {// Heart Rate Zone |
nbaker | 0:d1d36a3da39b | 410 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 411 | Screen_Num = 3; //Change to screen 3 |
nbaker | 0:d1d36a3da39b | 412 | update_display(); |
nbaker | 0:d1d36a3da39b | 413 | break; |
nbaker | 0:d1d36a3da39b | 414 | } |
nbaker | 0:d1d36a3da39b | 415 | case 8: {// Alert History |
nbaker | 0:d1d36a3da39b | 416 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 417 | Screen_Num = 4; //Change to screen 4 |
nbaker | 0:d1d36a3da39b | 418 | update_display(); |
nbaker | 0:d1d36a3da39b | 419 | break; |
nbaker | 0:d1d36a3da39b | 420 | } |
nbaker | 0:d1d36a3da39b | 421 | case 20: {// Diagnostic/Debug Screens |
nbaker | 0:d1d36a3da39b | 422 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 423 | Screen_Num = 0; //Change to screen 0 |
nbaker | 0:d1d36a3da39b | 424 | update_display(); |
nbaker | 0:d1d36a3da39b | 425 | break; |
nbaker | 0:d1d36a3da39b | 426 | } |
nbaker | 0:d1d36a3da39b | 427 | case 21: {// Fall Diagnostic |
nbaker | 0:d1d36a3da39b | 428 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 429 | Screen_Num = 20; //Change to screen 20 |
nbaker | 0:d1d36a3da39b | 430 | update_display(); |
nbaker | 0:d1d36a3da39b | 431 | break; |
nbaker | 0:d1d36a3da39b | 432 | } |
nbaker | 0:d1d36a3da39b | 433 | case 22: {// Fall Debug |
nbaker | 0:d1d36a3da39b | 434 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 435 | Screen_Num = 20; //Change to screen 20 |
nbaker | 0:d1d36a3da39b | 436 | update_display(); |
nbaker | 0:d1d36a3da39b | 437 | break; |
nbaker | 0:d1d36a3da39b | 438 | } |
nbaker | 0:d1d36a3da39b | 439 | case 23: {// Heart Rate Diagnostic |
nbaker | 0:d1d36a3da39b | 440 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 441 | Screen_Num = 20; //Change to screen 20 |
nbaker | 0:d1d36a3da39b | 442 | update_display(); |
nbaker | 0:d1d36a3da39b | 443 | break; |
nbaker | 0:d1d36a3da39b | 444 | } |
nbaker | 0:d1d36a3da39b | 445 | case 24: {// Heart Rate Debug |
nbaker | 0:d1d36a3da39b | 446 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 447 | Screen_Num = 20; //Change to screen 20 |
nbaker | 0:d1d36a3da39b | 448 | update_display(); |
nbaker | 0:d1d36a3da39b | 449 | break; |
nbaker | 0:d1d36a3da39b | 450 | } |
nbaker | 0:d1d36a3da39b | 451 | case 25: {// Heat Index Diagnostic |
nbaker | 0:d1d36a3da39b | 452 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 453 | Screen_Num = 20; //Change to screen 20 |
nbaker | 0:d1d36a3da39b | 454 | update_display(); |
nbaker | 0:d1d36a3da39b | 455 | break; |
nbaker | 0:d1d36a3da39b | 456 | } |
nbaker | 0:d1d36a3da39b | 457 | default: { |
nbaker | 0:d1d36a3da39b | 458 | break; |
nbaker | 0:d1d36a3da39b | 459 | } |
nbaker | 0:d1d36a3da39b | 460 | } |
nbaker | 0:d1d36a3da39b | 461 | } |
nbaker | 0:d1d36a3da39b | 462 | } |
nbaker | 0:d1d36a3da39b | 463 | |
nbaker | 0:d1d36a3da39b | 464 | |
nbaker | 0:d1d36a3da39b | 465 | void ButtonSlide(void) // What is this Slide button??? |
nbaker | 0:d1d36a3da39b | 466 | { |
nbaker | 0:d1d36a3da39b | 467 | Screen_Timer.attach(&timout_timer,(SCRN_TIME));//Is this sufficient to reset/restart ticker timer for OLED? |
nbaker | 0:d1d36a3da39b | 468 | if (OLED_ON == 0){ |
nbaker | 0:d1d36a3da39b | 469 | OLED_ON = 1; // Scree was off, set to On |
nbaker | 0:d1d36a3da39b | 470 | } |
nbaker | 0:d1d36a3da39b | 471 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 472 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 473 | strcpy((char *) text_1,"Slide Button"); |
nbaker | 0:d1d36a3da39b | 474 | oled.Label((uint8_t *)text_1,0,40); |
nbaker | 0:d1d36a3da39b | 475 | } |
nbaker | 0:d1d36a3da39b | 476 | |
nbaker | 0:d1d36a3da39b | 477 | int main() |
nbaker | 0:d1d36a3da39b | 478 | { |
nbaker | 0:d1d36a3da39b | 479 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 480 | // ***************** Local variables *********************** |
nbaker | 0:d1d36a3da39b | 481 | // float accel_data[3]; float accel_rms=0.0; |
nbaker | 0:d1d36a3da39b | 482 | |
nbaker | 0:d1d36a3da39b | 483 | // ************** configure sensor modules ****************** |
nbaker | 0:d1d36a3da39b | 484 | accel.accel_config(); |
nbaker | 0:d1d36a3da39b | 485 | mag.mag_config(); |
nbaker | 0:d1d36a3da39b | 486 | // gyro.gyro_config(); |
nbaker | 0:d1d36a3da39b | 487 | |
nbaker | 0:d1d36a3da39b | 488 | RED_Led = LED_OFF; |
nbaker | 0:d1d36a3da39b | 489 | GRN_Led = LED_OFF; |
nbaker | 0:d1d36a3da39b | 490 | BLU_Led = LED_OFF; |
nbaker | 0:d1d36a3da39b | 491 | // ***** Register callbacks/interupts to application functions ********* |
nbaker | 0:d1d36a3da39b | 492 | kw40z_device.attach_buttonUp(&ButtonUp); |
nbaker | 0:d1d36a3da39b | 493 | kw40z_device.attach_buttonDown(&ButtonDown); |
nbaker | 0:d1d36a3da39b | 494 | kw40z_device.attach_buttonLeft(&ButtonLeft); |
nbaker | 0:d1d36a3da39b | 495 | kw40z_device.attach_buttonRight(&ButtonRight); |
nbaker | 0:d1d36a3da39b | 496 | kw40z_device.attach_buttonSlide(&ButtonSlide); |
nbaker | 0:d1d36a3da39b | 497 | |
nbaker | 0:d1d36a3da39b | 498 | // **** Get OLED Class Default Text Properties **************** |
nbaker | 0:d1d36a3da39b | 499 | oled_text_properties_t textProperties = {0}; |
nbaker | 0:d1d36a3da39b | 500 | oled.GetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 501 | |
nbaker | 0:d1d36a3da39b | 502 | // *********Set text color and screen alignment ************** |
nbaker | 0:d1d36a3da39b | 503 | textProperties.fontColor = COLOR_WHITE; |
nbaker | 0:d1d36a3da39b | 504 | textProperties.alignParam = OLED_TEXT_ALIGN_LEFT; |
nbaker | 0:d1d36a3da39b | 505 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 506 | |
nbaker | 0:d1d36a3da39b | 507 | // ************** Display spash screen ********************** |
nbaker | 0:d1d36a3da39b | 508 | |
nbaker | 0:d1d36a3da39b | 509 | oled.Label((uint8_t *)"Hexi",20,5); // Display white "Hexi" at x,y |
nbaker | 0:d1d36a3da39b | 510 | textProperties.fontColor = COLOR_RED; |
nbaker | 0:d1d36a3da39b | 511 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 512 | oled.Label((uint8_t *)"Heart",45,5); // Display red "Heart" at x,y |
nbaker | 0:d1d36a3da39b | 513 | |
nbaker | 0:d1d36a3da39b | 514 | #ifdef Debug // if this is non-production version - do this |
nbaker | 0:d1d36a3da39b | 515 | strcpy((char *) text_1,"This is Debug Ver"); |
nbaker | 0:d1d36a3da39b | 516 | oled.Label((uint8_t *)text_1,0,60); // text_1 at x,y |
nbaker | 0:d1d36a3da39b | 517 | StartHaptic(); |
nbaker | 0:d1d36a3da39b | 518 | #endif |
nbaker | 0:d1d36a3da39b | 519 | textProperties.fontColor = COLOR_WHITE; |
nbaker | 0:d1d36a3da39b | 520 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 521 | wait(3); // wait 3 seconds |
nbaker | 0:d1d36a3da39b | 522 | update_display(); // Displays current screen (screen 0) |
nbaker | 0:d1d36a3da39b | 523 | Screen_Timer.attach(&timout_timer,(SCRN_TIME));//start ticker timer for turning off LCD |
nbaker | 0:d1d36a3da39b | 524 | // ******************* Main Loop ************************* |
nbaker | 0:d1d36a3da39b | 525 | while (true) { |
nbaker | 0:d1d36a3da39b | 526 | |
nbaker | 0:d1d36a3da39b | 527 | Thread::wait(500); // wait half a sec in each loop |
nbaker | 0:d1d36a3da39b | 528 | } |
nbaker | 0:d1d36a3da39b | 529 | } |
nbaker | 0:d1d36a3da39b | 530 | // ************** end of main() |
nbaker | 0:d1d36a3da39b | 531 | |
nbaker | 0:d1d36a3da39b | 532 | void update_display(void) |
nbaker | 0:d1d36a3da39b | 533 | { |
nbaker | 0:d1d36a3da39b | 534 | oled_text_properties_t textProperties = {0}; // Need these to change font color |
nbaker | 0:d1d36a3da39b | 535 | oled.GetTextProperties(&textProperties); // Need these to change font color |
nbaker | 0:d1d36a3da39b | 536 | switch(Screen_Num) { |
nbaker | 0:d1d36a3da39b | 537 | case 0: {// Main Screen |
nbaker | 0:d1d36a3da39b | 538 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 539 | oled.Label((uint8_t *)"Batt",60,0); // Display "Batt" at x,y |
nbaker | 0:d1d36a3da39b | 540 | oled.Label((uint8_t *)"Date",35,20); // Display "Date" at x,y |
nbaker | 0:d1d36a3da39b | 541 | oled.Label((uint8_t *)"Time",35,40); // Display "Time" at x,y |
nbaker | 0:d1d36a3da39b | 542 | oled.Label((uint8_t *)"H.I.",10,80); // Display "H.I." at x,y |
nbaker | 0:d1d36a3da39b | 543 | oled.Label((uint8_t *)"BT",40,80); //Display "BT" at x,y |
nbaker | 0:d1d36a3da39b | 544 | oled.Label((uint8_t *)"Menu",60,80); //Display "Menu" at x,y |
nbaker | 0:d1d36a3da39b | 545 | if(Heart_Rate_Mode == 1){ |
nbaker | 0:d1d36a3da39b | 546 | oled.Label((uint8_t *)"BPM",35,60); // Display "H.I." at x,y |
nbaker | 0:d1d36a3da39b | 547 | } |
nbaker | 0:d1d36a3da39b | 548 | break; |
nbaker | 0:d1d36a3da39b | 549 | } |
nbaker | 0:d1d36a3da39b | 550 | case 1: {// Panic Alert option |
nbaker | 0:d1d36a3da39b | 551 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 552 | oled.Label((uint8_t *)"Panic Alert",20,5); // Display at x,y |
nbaker | 0:d1d36a3da39b | 553 | oled.Label((uint8_t *)"*",85,15); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 554 | oled.Label((uint8_t *)"*",85,60); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 555 | oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y |
nbaker | 0:d1d36a3da39b | 556 | oled.Label((uint8_t *)"Enter",60,80); //Display "enter" at x,y |
nbaker | 0:d1d36a3da39b | 557 | break; |
nbaker | 0:d1d36a3da39b | 558 | } |
nbaker | 0:d1d36a3da39b | 559 | case 2: {// Fall Alert option |
nbaker | 0:d1d36a3da39b | 560 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 561 | oled.Label((uint8_t *)"Fall Alert",20,5); // Display at x,y |
nbaker | 0:d1d36a3da39b | 562 | oled.Label((uint8_t *)"*",85,15); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 563 | oled.Label((uint8_t *)"*",85,60); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 564 | oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y |
nbaker | 0:d1d36a3da39b | 565 | oled.Label((uint8_t *)"Toggle",60,80); //Display "Toggle" at x,y |
nbaker | 0:d1d36a3da39b | 566 | break; |
nbaker | 0:d1d36a3da39b | 567 | } |
nbaker | 0:d1d36a3da39b | 568 | case 3: {// Heart Rate Monitoring option |
nbaker | 0:d1d36a3da39b | 569 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 570 | oled.Label((uint8_t *)"Heart Rate",20,5); // Display at x,y |
nbaker | 0:d1d36a3da39b | 571 | oled.Label((uint8_t *)"*",85,15); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 572 | oled.Label((uint8_t *)"*",85,60); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 573 | oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y |
nbaker | 0:d1d36a3da39b | 574 | oled.Label((uint8_t *)"Enter",60,80); //Display at x,y |
nbaker | 0:d1d36a3da39b | 575 | break; |
nbaker | 0:d1d36a3da39b | 576 | } |
nbaker | 0:d1d36a3da39b | 577 | case 4: {// Alert History option |
nbaker | 0:d1d36a3da39b | 578 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 579 | oled.Label((uint8_t *)"Alert History",5,5); // Display at x,y |
nbaker | 0:d1d36a3da39b | 580 | oled.Label((uint8_t *)"*",85,15); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 581 | oled.Label((uint8_t *)"*",85,60); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 582 | oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y |
nbaker | 0:d1d36a3da39b | 583 | oled.Label((uint8_t *)"Enter",60,80); //Display at x,y |
nbaker | 0:d1d36a3da39b | 584 | break; |
nbaker | 0:d1d36a3da39b | 585 | } |
nbaker | 0:d1d36a3da39b | 586 | case 5: {// About HexiHeart Screen |
nbaker | 0:d1d36a3da39b | 587 | |
nbaker | 0:d1d36a3da39b | 588 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 589 | oled.Label((uint8_t *)"Hexi",20,20); // Display white "Hexi" at x,y |
nbaker | 0:d1d36a3da39b | 590 | textProperties.fontColor = COLOR_RED; |
nbaker | 0:d1d36a3da39b | 591 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 592 | oled.Label((uint8_t *)"Heart",45,20); // Display red "Heart" at x,y |
nbaker | 0:d1d36a3da39b | 593 | textProperties.fontColor = COLOR_WHITE; |
nbaker | 0:d1d36a3da39b | 594 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 595 | strcpy((char *) text_1,"About"); |
nbaker | 0:d1d36a3da39b | 596 | oled.Label((uint8_t *)text_1,30,5); // text_1 at x,y |
nbaker | 0:d1d36a3da39b | 597 | oled.Label((uint8_t *)"*",85,15); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 598 | oled.Label((uint8_t *)"*",85,60); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 599 | oled.Label((uint8_t *)" Back ",9,80); // Display "Back" at x,y |
nbaker | 0:d1d36a3da39b | 600 | oled.Label((uint8_t *)" Enter ",59,80); //Display at x,y |
nbaker | 0:d1d36a3da39b | 601 | break; |
nbaker | 0:d1d36a3da39b | 602 | } |
nbaker | 0:d1d36a3da39b | 603 | |
nbaker | 0:d1d36a3da39b | 604 | case 6: {// Panic Alert |
nbaker | 0:d1d36a3da39b | 605 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 606 | if (Panic_Alert == 0){ |
nbaker | 0:d1d36a3da39b | 607 | oled.Label((uint8_t *)"Send ",20,10); // Display at x,y |
nbaker | 0:d1d36a3da39b | 608 | } |
nbaker | 0:d1d36a3da39b | 609 | else { |
nbaker | 0:d1d36a3da39b | 610 | oled.Label((uint8_t *)"Dismiss ",17,10); // Display at x,y |
nbaker | 0:d1d36a3da39b | 611 | } |
nbaker | 0:d1d36a3da39b | 612 | oled.Label((uint8_t *)"Panic Alert",15,40); // Display at x,y |
nbaker | 0:d1d36a3da39b | 613 | oled.Label((uint8_t *)"-->",80,15); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 614 | oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y |
nbaker | 0:d1d36a3da39b | 615 | break; |
nbaker | 0:d1d36a3da39b | 616 | } |
nbaker | 0:d1d36a3da39b | 617 | case 7: {// Heart Rate Zone |
nbaker | 0:d1d36a3da39b | 618 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 619 | oled.Label((uint8_t *)"Heart Rate",15,5); // Display at x,y |
nbaker | 0:d1d36a3da39b | 620 | oled.Label((uint8_t *)"Zone",25,15); // Display at x,y |
nbaker | 0:d1d36a3da39b | 621 | oled.Label((uint8_t *)"Age: ",20,40); // Display at x,y |
nbaker | 0:d1d36a3da39b | 622 | textProperties.fontColor = COLOR_GREEN; |
nbaker | 0:d1d36a3da39b | 623 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 624 | oled.Label((uint8_t *)Age,30,40); // Display at x,y |
nbaker | 0:d1d36a3da39b | 625 | textProperties.fontColor = COLOR_WHITE; |
nbaker | 0:d1d36a3da39b | 626 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 627 | oled.Label((uint8_t *)"+",85,15); // "+" at x,y |
nbaker | 0:d1d36a3da39b | 628 | oled.Label((uint8_t *)"-",85,60); // "-" at x,y |
nbaker | 0:d1d36a3da39b | 629 | oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y |
nbaker | 0:d1d36a3da39b | 630 | break; |
nbaker | 0:d1d36a3da39b | 631 | } |
nbaker | 0:d1d36a3da39b | 632 | case 8: {// Alert History |
nbaker | 0:d1d36a3da39b | 633 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 634 | oled.Label((uint8_t *)"Alert History",5,5); // Display at x,y |
nbaker | 0:d1d36a3da39b | 635 | oled.Label((uint8_t *)"Date - Time",20,40); // Display at x,y |
nbaker | 0:d1d36a3da39b | 636 | oled.Label((uint8_t *)"Alert Type:",20,60); // Display at x,y |
nbaker | 0:d1d36a3da39b | 637 | oled.Label((uint8_t *)"+",85,15); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 638 | oled.Label((uint8_t *)"-",85,60); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 639 | oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y |
nbaker | 0:d1d36a3da39b | 640 | break; |
nbaker | 0:d1d36a3da39b | 641 | } |
nbaker | 0:d1d36a3da39b | 642 | #ifdef Debug // if this is non-production/debug version - do this |
nbaker | 0:d1d36a3da39b | 643 | case 20: {// Diagnostic/Debug Screens |
nbaker | 0:d1d36a3da39b | 644 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 645 | textProperties.fontColor = COLOR_RED; |
nbaker | 0:d1d36a3da39b | 646 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 647 | oled.Label((uint8_t *)"Diagnostics",10,5); // Display at x,y |
nbaker | 0:d1d36a3da39b | 648 | oled.Label((uint8_t *)" Enter ",59,80); //Display at x,y |
nbaker | 0:d1d36a3da39b | 649 | textProperties.fontColor = COLOR_WHITE; |
nbaker | 0:d1d36a3da39b | 650 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 651 | oled.Label((uint8_t *)"*",85,15); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 652 | oled.Label((uint8_t *)"*",85,60); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 653 | oled.Label((uint8_t *)" Back ",9,80); // Display "Back" at x,y |
nbaker | 0:d1d36a3da39b | 654 | |
nbaker | 0:d1d36a3da39b | 655 | break; |
nbaker | 0:d1d36a3da39b | 656 | } |
nbaker | 0:d1d36a3da39b | 657 | case 21: {// Fall Alert Diagnostic Screen |
nbaker | 0:d1d36a3da39b | 658 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 659 | textProperties.fontColor = COLOR_RED; |
nbaker | 0:d1d36a3da39b | 660 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 661 | oled.Label((uint8_t *)"Fall",30,5); // Display at x,y |
nbaker | 0:d1d36a3da39b | 662 | oled.Label((uint8_t *)"Diagnostic",25,5); // Display at x,y |
nbaker | 0:d1d36a3da39b | 663 | textProperties.fontColor = COLOR_WHITE; |
nbaker | 0:d1d36a3da39b | 664 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 665 | accel.acquire_accel_data_g(Accel_Data); |
nbaker | 0:d1d36a3da39b | 666 | // gyro.acquire_gyro_data_g(Gyro_Data); |
nbaker | 0:d1d36a3da39b | 667 | Accel_Mag = sqrt(((Accel_Data[0]*Accel_Data[0])+(Accel_Data[1]*Accel_Data[1])+(Accel_Data[2]*Accel_Data[2]))); |
nbaker | 0:d1d36a3da39b | 668 | // Gyro_Mag = (abs(Gyro_Data[0])+abs(Gyro_Data[1])+abs(Gyro_Data[3])); |
nbaker | 0:d1d36a3da39b | 669 | sprintf(text_1," Accel:%2.2f g ",Accel_Mag); |
nbaker | 0:d1d36a3da39b | 670 | oled.Label((uint8_t *)text_1,10,40);// text_1 at x,y |
nbaker | 0:d1d36a3da39b | 671 | sprintf(text_1," Gyro:%4.0f D/S ",Gyro_Mag); |
nbaker | 0:d1d36a3da39b | 672 | oled.Label((uint8_t *)text_1,10,60);// text_1 at x,y |
nbaker | 0:d1d36a3da39b | 673 | oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y |
nbaker | 0:d1d36a3da39b | 674 | break; |
nbaker | 0:d1d36a3da39b | 675 | } |
nbaker | 0:d1d36a3da39b | 676 | case 22: {// Fall Alert Debug Screen |
nbaker | 0:d1d36a3da39b | 677 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 678 | textProperties.fontColor = COLOR_RED; |
nbaker | 0:d1d36a3da39b | 679 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 680 | oled.Label((uint8_t *)"Fall Debug",15,5); // Display at x,y |
nbaker | 0:d1d36a3da39b | 681 | textProperties.fontColor = COLOR_GREEN; |
nbaker | 0:d1d36a3da39b | 682 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 683 | sprintf(text_1," %1.1f g ",Fall_Thresh); |
nbaker | 0:d1d36a3da39b | 684 | oled.Label((uint8_t *)text_1,35,20);// text_1 at x,y |
nbaker | 0:d1d36a3da39b | 685 | sprintf(text_1," %2.1f g ",Impact_Thresh); |
nbaker | 0:d1d36a3da39b | 686 | oled.Label((uint8_t *)text_1,35,35);// text_1 at x,y |
nbaker | 0:d1d36a3da39b | 687 | sprintf(text_1," %3.0f D/S ",Movement_Thresh); |
nbaker | 0:d1d36a3da39b | 688 | oled.Label((uint8_t *)text_1,35,50);// text_1 at x,y |
nbaker | 0:d1d36a3da39b | 689 | textProperties.fontColor = COLOR_WHITE; |
nbaker | 0:d1d36a3da39b | 690 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 691 | oled.Label((uint8_t *)"F-Th:",5,20); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 692 | oled.Label((uint8_t *)"I-Th:",5,35); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 693 | oled.Label((uint8_t *)"M-Th:",5,50); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 694 | oled.Label((uint8_t *)"*",85,15); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 695 | oled.Label((uint8_t *)"*",85,60); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 696 | oled.Label((uint8_t *)" Back ",9,80); // Display "Back" at x,y |
nbaker | 0:d1d36a3da39b | 697 | // oled.Label((uint8_t *)" Enter ",59,80); //Display at x,y |
nbaker | 0:d1d36a3da39b | 698 | break; |
nbaker | 0:d1d36a3da39b | 699 | } |
nbaker | 0:d1d36a3da39b | 700 | case 23: {// Heart Rate Diagnostic Screen |
nbaker | 0:d1d36a3da39b | 701 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 702 | textProperties.fontColor = COLOR_RED; |
nbaker | 0:d1d36a3da39b | 703 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 704 | oled.Label((uint8_t *)"H.R. Diagnostic",5,5); // Display at x,y |
nbaker | 0:d1d36a3da39b | 705 | textProperties.fontColor = COLOR_WHITE; |
nbaker | 0:d1d36a3da39b | 706 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 707 | oled.Label((uint8_t *)"*",85,15); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 708 | oled.Label((uint8_t *)"*",85,60); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 709 | oled.Label((uint8_t *)" Back ",9,80); // Display "Back" at x,y |
nbaker | 0:d1d36a3da39b | 710 | // oled.Label((uint8_t *)" Enter ",59,80); //Display at x,y |
nbaker | 0:d1d36a3da39b | 711 | break; |
nbaker | 0:d1d36a3da39b | 712 | } |
nbaker | 0:d1d36a3da39b | 713 | case 24: {// Heart Rate Debug Screen |
nbaker | 0:d1d36a3da39b | 714 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 715 | textProperties.fontColor = COLOR_RED; |
nbaker | 0:d1d36a3da39b | 716 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 717 | oled.Label((uint8_t *)"H.R. Debug",10,5); // Display at x,y |
nbaker | 0:d1d36a3da39b | 718 | textProperties.fontColor = COLOR_WHITE; |
nbaker | 0:d1d36a3da39b | 719 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 720 | oled.Label((uint8_t *)"*",85,15); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 721 | oled.Label((uint8_t *)"*",85,60); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 722 | oled.Label((uint8_t *)" Back ",9,80); // Display "Back" at x,y |
nbaker | 0:d1d36a3da39b | 723 | // oled.Label((uint8_t *)" Enter ",59,80); //Display at x,y |
nbaker | 0:d1d36a3da39b | 724 | break; |
nbaker | 0:d1d36a3da39b | 725 | } |
nbaker | 0:d1d36a3da39b | 726 | case 25: {// Heat Index Diagnostic Screen |
nbaker | 0:d1d36a3da39b | 727 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 728 | textProperties.fontColor = COLOR_RED; |
nbaker | 0:d1d36a3da39b | 729 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 730 | oled.Label((uint8_t *)"H.I. Diagnostic",5,5); // Display at x,y |
nbaker | 0:d1d36a3da39b | 731 | textProperties.fontColor = COLOR_WHITE; |
nbaker | 0:d1d36a3da39b | 732 | oled.SetTextProperties(&textProperties); |
nbaker | 0:d1d36a3da39b | 733 | oled.Label((uint8_t *)"*",85,15); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 734 | oled.Label((uint8_t *)"*",85,60); // "*" at x,y |
nbaker | 0:d1d36a3da39b | 735 | oled.Label((uint8_t *)" Back ",9,80); // Display "Back" at x,y |
nbaker | 0:d1d36a3da39b | 736 | // oled.Label((uint8_t *)" Enter ",59,80); //Display at x,y |
nbaker | 0:d1d36a3da39b | 737 | break; |
nbaker | 0:d1d36a3da39b | 738 | } |
nbaker | 0:d1d36a3da39b | 739 | #endif // end of non-production/debug version code |
nbaker | 0:d1d36a3da39b | 740 | default: { |
nbaker | 0:d1d36a3da39b | 741 | Error_Num=1; |
nbaker | 0:d1d36a3da39b | 742 | error_screen(); // Clear screen |
nbaker | 0:d1d36a3da39b | 743 | break; |
nbaker | 0:d1d36a3da39b | 744 | } |
nbaker | 0:d1d36a3da39b | 745 | } |
nbaker | 0:d1d36a3da39b | 746 | } |
nbaker | 0:d1d36a3da39b | 747 | void error_screen(void){ |
nbaker | 0:d1d36a3da39b | 748 | oled.FillScreen(COLOR_RED); // Clear screen |
nbaker | 0:d1d36a3da39b | 749 | oled.Label((uint8_t *)"Error! ",30,30); // Display error at x,y |
nbaker | 0:d1d36a3da39b | 750 | sprintf(text_1," %i ",Error_Num); |
nbaker | 0:d1d36a3da39b | 751 | oled.Label((uint8_t *)text_1,30,60); // Display error at x,y |
nbaker | 0:d1d36a3da39b | 752 | wait(3); // wait 3 seconds |
nbaker | 0:d1d36a3da39b | 753 | oled.FillScreen(COLOR_BLACK); // Clear screen |
nbaker | 0:d1d36a3da39b | 754 | } |
nbaker | 0:d1d36a3da39b | 755 | void StartHaptic(void) |
nbaker | 0:d1d36a3da39b | 756 | { |
nbaker | 0:d1d36a3da39b | 757 | hapticTimer.start(30); // was originaly 50 |
nbaker | 0:d1d36a3da39b | 758 | haptic = 1; |
nbaker | 0:d1d36a3da39b | 759 | } |
nbaker | 0:d1d36a3da39b | 760 | |
nbaker | 0:d1d36a3da39b | 761 | void StopHaptic(void const *n) { |
nbaker | 0:d1d36a3da39b | 762 | haptic = 0; |
nbaker | 0:d1d36a3da39b | 763 | hapticTimer.stop(); |
nbaker | 0:d1d36a3da39b | 764 | } |