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 Hexiwear_zeta

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?

UserRevisionLine numberNew 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 }