Example of using Hexiwear buttons and declaring screens.
Dependencies: FXOS8700 FXAS21002 Hexi_KW40Z Hexi_OLED_SSD1351
Diff: main.cpp
- Revision:
- 0:d1d36a3da39b
- Child:
- 1:e4b38d6918ba
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Nov 12 22:14:37 2017 +0000 @@ -0,0 +1,764 @@ +/********************************************************************** +Texas State University Senior Project - HexiHeart +Team Zeta: Alex Song, Jasmine Rounsaville, Issam Hichami, Neil Baker +Version: HexiHeart_1st 11/12/17 +This version has basic menu layout and screen timeout feature. The menu +are just placeholders (for the most part) and will be either adjusted or +replaced with graphic images. + +***********************************************************************/ + +#include "mbed.h" +#include "Hexi_KW40Z.h" // Button and BLE fuctions +#include "FXOS8700.h" // 3D Accelorometer & Mag +#include "FXAS21002.h" // 3-Axis Gyroscope +#include "Hexi_OLED_SSD1351.h" // OLED fuctions +#include "OLED_types.h" // Text attributs +#include "string.h" +#include "OpenSans_Font.h" +/* We need to confirm whether it's better to include and +configure every module for lowest power, or whether it's +better to save memory by not doing that +*/ + +// Definitions +#define LED_ON 0 +#define LED_OFF 1 +#define SCRN_TIME 10.0 +#define Debug 1 // If "Debug" is defined, our code will compile for debug. Comment out for Production code. + +void StartHaptic(void); +void StopHaptic(void const *n); +void error_screen(void); +void update_display(void); + +// ***************** Global variables *********************** +char text_1[20]; // Text buffer - Do we need more? +bool OLED_ON = 1; // Turn OLED power on/off +bool Fall_Alert = 0; // Initialize as no active alert +bool Panic_Alert = 0; // Initialize as no active alert +bool Fall_Alert_Mode = 1; // Initialize with fall alert mode on +bool Heart_Rate_Mode = 0; // Initialize with Heart rate off +float Accel_Mag=0.0; // Vector magnitude calculated from sensor data +float Accel_Data[3]; // Accel Data from sensor +float Gyro_Mag=0.0; // Vector magnitude calculated from sensor data +float Gyro_Data[3]; // Gyro data from sensor +float Fall_Thresh=0.5; // Initialize Fall detect Threshold +float Impact_Thresh=3.0; // Initialize Impact detect Threshold +float Movement_Thresh=50.0; // Initialize Movement detect Threshold +uint8_t Age = 30; // Initialize age +uint8_t Max_BPM = 190; // Initialize Max BPM +uint8_t Screen_Num = 0; // Initialize to main screen +uint8_t Error_Num = 0; // Error num for debug +// ***************** Define pins ***************************** +FXAS21002 gyro(PTC11,PTC10); // Gyroscope +SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); // SSD1351 OLED Driver (MOSI,SCLK,POWER,CS,RST,DC) +FXOS8700 accel(PTC11, PTC10); // Accelorometer +FXOS8700 mag(PTC11, PTC10); // Mag (same chip as Accel) + +DigitalOut RED_Led(LED1); +DigitalOut GRN_Led(LED2); +DigitalOut BLU_Led(LED3); +DigitalOut haptic(PTB9); + +/* Instantiate the Hexi KW40Z Driver (UART TX, UART RX) */ +KW40Z kw40z_device(PTE24, PTE25); + +/* Define timer for haptic feedback */ +RtosTimer hapticTimer(StopHaptic, osTimerOnce); + +//***************** Tickers and Timers ***************** +Ticker Screen_Timer;// use ticker to turn off OLED + +void timout_timer(){// turn off display mode + oled.FillScreen(COLOR_BLACK); // Clear screen.. is there a better command for this? + OLED_ON = 0; // set flag to off + Screen_Timer.detach(); + }//end routine + +void ButtonUp(void) +{ +Screen_Timer.attach(&timout_timer,(SCRN_TIME));//Is this sufficient to reset/restart ticker timer for OLED? +if (OLED_ON == 0){ + OLED_ON = 1; // Scree was off, set to On + update_display(); +} +else +{ +switch(Screen_Num) { + case 0: {// We're in Main Screen + // do nothing, wrong button + break; + } + case 1: {// Panic Alert option + StartHaptic(); + Screen_Num = 5; //Change to screen 5 +#ifdef Debug // in debug show debug/diagnostic screens + Screen_Num = 20; //Change to screen 20 +#endif + + update_display(); + break; + } + case 2: {// Fall Alert option + StartHaptic(); + Screen_Num = 1; //Change to screen 1 + update_display(); + break; + } + case 3: {// Heart Rate Monitoring option + StartHaptic(); + Screen_Num = 2; //Change to screen 2 + update_display(); + break; + } + case 4: {// Alert History option + StartHaptic(); + Screen_Num = 3; //Change to screen 3 + update_display(); + break; + } + case 5: {// About HexiHeart + StartHaptic(); + Screen_Num = 4; //Change to screen 4 + update_display(); + break; + } + case 6: {// Panic Alert + StartHaptic(); + Panic_Alert = !Panic_Alert; + update_display(); + break; + } + case 7: {// Heart Rate Zone + StartHaptic(); + //Increment Age + break; + } + case 8: {// Alert History + StartHaptic(); + //Increment alert index + break; + } + case 20: {// Diagnostic/Debug Screens + StartHaptic(); + Screen_Num = 5; //Change to screen 5 + update_display(); + break; + } + case 21: {// Fall Diagnostic + StartHaptic(); + Screen_Num = 25; //Change to screen 25 + update_display(); + break; + } + case 22: {// Fall Debug + StartHaptic(); + Screen_Num = 21; //Change to screen 21 + update_display(); + break; + } + case 23: {// Heart Rate Diagnostic + StartHaptic(); + Screen_Num = 22; //Change to screen 22 + update_display(); + break; + } + case 24: {// Heart Rate Debug + StartHaptic(); + Screen_Num = 23; //Change to screen 23 + update_display(); + break; + } + case 25: {// Heat Index Diagnostic + StartHaptic(); + Screen_Num = 24; //Change to screen 24 + update_display(); + break; + } + default: { + break; + } + } + } +} + +void ButtonDown(void) +{ +Screen_Timer.attach(&timout_timer,(SCRN_TIME));//Is this sufficient to reset/restart ticker timer for OLED? +if (OLED_ON == 0){ + OLED_ON = 1; // Scree was off, set to On + update_display(); +} +else +{ + +switch(Screen_Num) { + case 0: {// We're in Main Screen + // do nothing, wrong button + break; + } + case 1: {// Panic Alert option + StartHaptic(); + Screen_Num = 2; //Change to screen 2 + update_display(); + break; + } + case 2: {// Fall Alert option + StartHaptic(); + Screen_Num = 3; //Change to screen 3 + update_display(); + break; + } + case 3: {// Heart Rate Monitoring option + StartHaptic(); + Screen_Num = 4; //Change to screen 4 + update_display(); + break; + } + case 4: {// Alert History option + StartHaptic(); + Screen_Num = 5; //Change to screen 5 + update_display(); + break; + } + case 5: {// About HexiHeart option + StartHaptic(); + Screen_Num = 1; //Change to screen 1 +#ifdef Debug // in debug show debug/diagnostic screens + Screen_Num = 20; //Change to screen 20 +#endif + update_display(); + break; + } + case 6: {// Panic Alert + // do nothing, wrong button + break; + } + case 7: {// Heart Rate Zone + StartHaptic(); + //decriment Age + break; + } + case 8: {// Alert History + StartHaptic(); + //decriment alert index + break; + } + case 20: {// Diagnostic/Debug Screens + StartHaptic(); + Screen_Num = 1; //Change to screen 1 + update_display(); + break; + } + case 21: {// Fall Diagnostic + StartHaptic(); + Screen_Num = 22; //Change to screen 22 + update_display(); + break; + } + case 22: {// Fall Debug + StartHaptic(); + Screen_Num = 23; //Change to screen 25 + update_display(); + break; + } + case 23: {// Heart Rate Diagnostic + StartHaptic(); + Screen_Num = 24; //Change to screen 24 + update_display(); + break; + } + case 24: {// Heart Rate Ddebug + StartHaptic(); + Screen_Num = 25; //Change to screen 25 + update_display(); + break; + } + case 25: {// Heat Index Diagnostic + StartHaptic(); + Screen_Num = 21; //Change to screen 21 + update_display(); + break; + } + default: { + break; + } + } + } +} + +void ButtonRight(void) +{ +Screen_Timer.attach(&timout_timer,(SCRN_TIME));//Is this sufficient to reset/restart ticker timer for OLED? +if (OLED_ON == 0){ + OLED_ON = 1; // Scree was off, set to On + update_display(); +} +else +{ + switch(Screen_Num) { + case 0: {// We're in Main Screen + StartHaptic(); + Screen_Num = 1; //Change to screen 1 + update_display(); + break; + } + case 1: {// Panic Alert option + StartHaptic(); + Screen_Num = 6; //Change to screen 6 + update_display(); + break; + } + case 2: {// Fall Alert option + StartHaptic(); + // toggle on/off + break; + } + case 3: {// Heart Rate Monitoring option + StartHaptic(); + Screen_Num = 7; //Change to screen 7 + update_display(); + break; + } + case 4: {// Alert History option + StartHaptic(); + Screen_Num = 8; //Change to screen 8 + update_display(); + break; + } + case 5: {// About HexiHeart option + StartHaptic(); + Screen_Num = 9; //Change to screen 9 + update_display(); + break; + } + + case 6: {// Panic Alert + // do nothing, wrong button + break; + } + case 7: {// Heart Rate Zone + StartHaptic(); + // toggle on/off + break; + } + case 20: {// Diagnostic/Debug Screens + StartHaptic(); + Screen_Num = 21; //Change to screen 21 + update_display(); + break; + } + default: { + break; + } + } + } +} + +void ButtonLeft(void) +{ + Screen_Timer.attach(&timout_timer,(SCRN_TIME));//Is this sufficient to reset/restart ticker timer for OLED? + if (OLED_ON == 0){ + OLED_ON = 1; // Scree was off, set to On + update_display(); +} +else +{ + switch(Screen_Num) { + case 0: {// We're in Main Screen + // do nothing, wrong button + break; + } + case 1: {// Panic Alert option + StartHaptic(); + Screen_Num = 0; //Change to screen 0 + update_display(); + break; + } + case 2: {// Fall Alert option + StartHaptic(); + Screen_Num = 0; //Change to screen 0 + update_display(); + break; + } + case 3: {// Heart Rate Monitoring option + StartHaptic(); + Screen_Num = 0; //Change to screen 0 + update_display(); + break; + } + case 4: {// Alert History option + StartHaptic(); + Screen_Num = 0; //Change to screen 0 + update_display(); + break; + } + case 5: {// About HexiHeart option + StartHaptic(); + Screen_Num = 0; //Change to screen 0 + update_display(); + break; + } + case 6: {// Panic Alert + StartHaptic(); + Screen_Num = 1; //Change to screen 1 + update_display(); + break; + } + case 7: {// Heart Rate Zone + StartHaptic(); + Screen_Num = 3; //Change to screen 3 + update_display(); + break; + } + case 8: {// Alert History + StartHaptic(); + Screen_Num = 4; //Change to screen 4 + update_display(); + break; + } + case 20: {// Diagnostic/Debug Screens + StartHaptic(); + Screen_Num = 0; //Change to screen 0 + update_display(); + break; + } + case 21: {// Fall Diagnostic + StartHaptic(); + Screen_Num = 20; //Change to screen 20 + update_display(); + break; + } + case 22: {// Fall Debug + StartHaptic(); + Screen_Num = 20; //Change to screen 20 + update_display(); + break; + } + case 23: {// Heart Rate Diagnostic + StartHaptic(); + Screen_Num = 20; //Change to screen 20 + update_display(); + break; + } + case 24: {// Heart Rate Debug + StartHaptic(); + Screen_Num = 20; //Change to screen 20 + update_display(); + break; + } + case 25: {// Heat Index Diagnostic + StartHaptic(); + Screen_Num = 20; //Change to screen 20 + update_display(); + break; + } + default: { + break; + } + } + } +} + + +void ButtonSlide(void) // What is this Slide button??? +{ + Screen_Timer.attach(&timout_timer,(SCRN_TIME));//Is this sufficient to reset/restart ticker timer for OLED? + if (OLED_ON == 0){ + OLED_ON = 1; // Scree was off, set to On +} + StartHaptic(); + oled.FillScreen(COLOR_BLACK); // Clear screen + strcpy((char *) text_1,"Slide Button"); + oled.Label((uint8_t *)text_1,0,40); +} + +int main() +{ + oled.FillScreen(COLOR_BLACK); // Clear screen + // ***************** Local variables *********************** + // float accel_data[3]; float accel_rms=0.0; + +// ************** configure sensor modules ****************** + accel.accel_config(); + mag.mag_config(); +// gyro.gyro_config(); + + RED_Led = LED_OFF; + GRN_Led = LED_OFF; + BLU_Led = LED_OFF; +// ***** Register callbacks/interupts to application functions ********* + kw40z_device.attach_buttonUp(&ButtonUp); + kw40z_device.attach_buttonDown(&ButtonDown); + kw40z_device.attach_buttonLeft(&ButtonLeft); + kw40z_device.attach_buttonRight(&ButtonRight); + kw40z_device.attach_buttonSlide(&ButtonSlide); + +// **** Get OLED Class Default Text Properties **************** + oled_text_properties_t textProperties = {0}; + oled.GetTextProperties(&textProperties); + +// *********Set text color and screen alignment ************** + textProperties.fontColor = COLOR_WHITE; + textProperties.alignParam = OLED_TEXT_ALIGN_LEFT; + oled.SetTextProperties(&textProperties); + +// ************** Display spash screen ********************** + + oled.Label((uint8_t *)"Hexi",20,5); // Display white "Hexi" at x,y + textProperties.fontColor = COLOR_RED; + oled.SetTextProperties(&textProperties); + oled.Label((uint8_t *)"Heart",45,5); // Display red "Heart" at x,y + + #ifdef Debug // if this is non-production version - do this + strcpy((char *) text_1,"This is Debug Ver"); + oled.Label((uint8_t *)text_1,0,60); // text_1 at x,y + StartHaptic(); + #endif + textProperties.fontColor = COLOR_WHITE; + oled.SetTextProperties(&textProperties); + wait(3); // wait 3 seconds + update_display(); // Displays current screen (screen 0) + Screen_Timer.attach(&timout_timer,(SCRN_TIME));//start ticker timer for turning off LCD +// ******************* Main Loop ************************* + while (true) { + + Thread::wait(500); // wait half a sec in each loop + } +} +// ************** end of main() + +void update_display(void) +{ +oled_text_properties_t textProperties = {0}; // Need these to change font color +oled.GetTextProperties(&textProperties); // Need these to change font color + switch(Screen_Num) { + case 0: {// Main Screen + oled.FillScreen(COLOR_BLACK); // Clear screen + oled.Label((uint8_t *)"Batt",60,0); // Display "Batt" at x,y + oled.Label((uint8_t *)"Date",35,20); // Display "Date" at x,y + oled.Label((uint8_t *)"Time",35,40); // Display "Time" at x,y + oled.Label((uint8_t *)"H.I.",10,80); // Display "H.I." at x,y + oled.Label((uint8_t *)"BT",40,80); //Display "BT" at x,y + oled.Label((uint8_t *)"Menu",60,80); //Display "Menu" at x,y + if(Heart_Rate_Mode == 1){ + oled.Label((uint8_t *)"BPM",35,60); // Display "H.I." at x,y + } + break; + } + case 1: {// Panic Alert option + oled.FillScreen(COLOR_BLACK); // Clear screen + oled.Label((uint8_t *)"Panic Alert",20,5); // Display at x,y + oled.Label((uint8_t *)"*",85,15); // "*" at x,y + oled.Label((uint8_t *)"*",85,60); // "*" at x,y + oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y + oled.Label((uint8_t *)"Enter",60,80); //Display "enter" at x,y + break; + } + case 2: {// Fall Alert option + oled.FillScreen(COLOR_BLACK); // Clear screen + oled.Label((uint8_t *)"Fall Alert",20,5); // Display at x,y + oled.Label((uint8_t *)"*",85,15); // "*" at x,y + oled.Label((uint8_t *)"*",85,60); // "*" at x,y + oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y + oled.Label((uint8_t *)"Toggle",60,80); //Display "Toggle" at x,y + break; + } + case 3: {// Heart Rate Monitoring option + oled.FillScreen(COLOR_BLACK); // Clear screen + oled.Label((uint8_t *)"Heart Rate",20,5); // Display at x,y + oled.Label((uint8_t *)"*",85,15); // "*" at x,y + oled.Label((uint8_t *)"*",85,60); // "*" at x,y + oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y + oled.Label((uint8_t *)"Enter",60,80); //Display at x,y + break; + } + case 4: {// Alert History option + oled.FillScreen(COLOR_BLACK); // Clear screen + oled.Label((uint8_t *)"Alert History",5,5); // Display at x,y + oled.Label((uint8_t *)"*",85,15); // "*" at x,y + oled.Label((uint8_t *)"*",85,60); // "*" at x,y + oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y + oled.Label((uint8_t *)"Enter",60,80); //Display at x,y + break; + } + case 5: {// About HexiHeart Screen + + oled.FillScreen(COLOR_BLACK); // Clear screen + oled.Label((uint8_t *)"Hexi",20,20); // Display white "Hexi" at x,y + textProperties.fontColor = COLOR_RED; + oled.SetTextProperties(&textProperties); + oled.Label((uint8_t *)"Heart",45,20); // Display red "Heart" at x,y + textProperties.fontColor = COLOR_WHITE; + oled.SetTextProperties(&textProperties); + strcpy((char *) text_1,"About"); + oled.Label((uint8_t *)text_1,30,5); // text_1 at x,y + oled.Label((uint8_t *)"*",85,15); // "*" at x,y + oled.Label((uint8_t *)"*",85,60); // "*" at x,y + oled.Label((uint8_t *)" Back ",9,80); // Display "Back" at x,y + oled.Label((uint8_t *)" Enter ",59,80); //Display at x,y + break; + } + + case 6: {// Panic Alert + oled.FillScreen(COLOR_BLACK); // Clear screen + if (Panic_Alert == 0){ + oled.Label((uint8_t *)"Send ",20,10); // Display at x,y + } + else { + oled.Label((uint8_t *)"Dismiss ",17,10); // Display at x,y + } + oled.Label((uint8_t *)"Panic Alert",15,40); // Display at x,y + oled.Label((uint8_t *)"-->",80,15); // "*" at x,y + oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y + break; + } + case 7: {// Heart Rate Zone + oled.FillScreen(COLOR_BLACK); // Clear screen + oled.Label((uint8_t *)"Heart Rate",15,5); // Display at x,y + oled.Label((uint8_t *)"Zone",25,15); // Display at x,y + oled.Label((uint8_t *)"Age: ",20,40); // Display at x,y + textProperties.fontColor = COLOR_GREEN; + oled.SetTextProperties(&textProperties); + oled.Label((uint8_t *)Age,30,40); // Display at x,y + textProperties.fontColor = COLOR_WHITE; + oled.SetTextProperties(&textProperties); + oled.Label((uint8_t *)"+",85,15); // "+" at x,y + oled.Label((uint8_t *)"-",85,60); // "-" at x,y + oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y + break; + } + case 8: {// Alert History + oled.FillScreen(COLOR_BLACK); // Clear screen + oled.Label((uint8_t *)"Alert History",5,5); // Display at x,y + oled.Label((uint8_t *)"Date - Time",20,40); // Display at x,y + oled.Label((uint8_t *)"Alert Type:",20,60); // Display at x,y + oled.Label((uint8_t *)"+",85,15); // "*" at x,y + oled.Label((uint8_t *)"-",85,60); // "*" at x,y + oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y + break; + } +#ifdef Debug // if this is non-production/debug version - do this + case 20: {// Diagnostic/Debug Screens + oled.FillScreen(COLOR_BLACK); // Clear screen + textProperties.fontColor = COLOR_RED; + oled.SetTextProperties(&textProperties); + oled.Label((uint8_t *)"Diagnostics",10,5); // Display at x,y + oled.Label((uint8_t *)" Enter ",59,80); //Display at x,y + textProperties.fontColor = COLOR_WHITE; + oled.SetTextProperties(&textProperties); + oled.Label((uint8_t *)"*",85,15); // "*" at x,y + oled.Label((uint8_t *)"*",85,60); // "*" at x,y + oled.Label((uint8_t *)" Back ",9,80); // Display "Back" at x,y + + break; + } + case 21: {// Fall Alert Diagnostic Screen + oled.FillScreen(COLOR_BLACK); // Clear screen + textProperties.fontColor = COLOR_RED; + oled.SetTextProperties(&textProperties); + oled.Label((uint8_t *)"Fall",30,5); // Display at x,y + oled.Label((uint8_t *)"Diagnostic",25,5); // Display at x,y + textProperties.fontColor = COLOR_WHITE; + oled.SetTextProperties(&textProperties); + accel.acquire_accel_data_g(Accel_Data); + // gyro.acquire_gyro_data_g(Gyro_Data); + Accel_Mag = sqrt(((Accel_Data[0]*Accel_Data[0])+(Accel_Data[1]*Accel_Data[1])+(Accel_Data[2]*Accel_Data[2]))); + // Gyro_Mag = (abs(Gyro_Data[0])+abs(Gyro_Data[1])+abs(Gyro_Data[3])); + sprintf(text_1," Accel:%2.2f g ",Accel_Mag); + oled.Label((uint8_t *)text_1,10,40);// text_1 at x,y + sprintf(text_1," Gyro:%4.0f D/S ",Gyro_Mag); + oled.Label((uint8_t *)text_1,10,60);// text_1 at x,y + oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y + break; + } + case 22: {// Fall Alert Debug Screen + oled.FillScreen(COLOR_BLACK); // Clear screen + textProperties.fontColor = COLOR_RED; + oled.SetTextProperties(&textProperties); + oled.Label((uint8_t *)"Fall Debug",15,5); // Display at x,y + textProperties.fontColor = COLOR_GREEN; + oled.SetTextProperties(&textProperties); + sprintf(text_1," %1.1f g ",Fall_Thresh); + oled.Label((uint8_t *)text_1,35,20);// text_1 at x,y + sprintf(text_1," %2.1f g ",Impact_Thresh); + oled.Label((uint8_t *)text_1,35,35);// text_1 at x,y + sprintf(text_1," %3.0f D/S ",Movement_Thresh); + oled.Label((uint8_t *)text_1,35,50);// text_1 at x,y + textProperties.fontColor = COLOR_WHITE; + oled.SetTextProperties(&textProperties); + oled.Label((uint8_t *)"F-Th:",5,20); // "*" at x,y + oled.Label((uint8_t *)"I-Th:",5,35); // "*" at x,y + oled.Label((uint8_t *)"M-Th:",5,50); // "*" at x,y + oled.Label((uint8_t *)"*",85,15); // "*" at x,y + oled.Label((uint8_t *)"*",85,60); // "*" at x,y + oled.Label((uint8_t *)" Back ",9,80); // Display "Back" at x,y + // oled.Label((uint8_t *)" Enter ",59,80); //Display at x,y + break; + } + case 23: {// Heart Rate Diagnostic Screen + oled.FillScreen(COLOR_BLACK); // Clear screen + textProperties.fontColor = COLOR_RED; + oled.SetTextProperties(&textProperties); + oled.Label((uint8_t *)"H.R. Diagnostic",5,5); // Display at x,y + textProperties.fontColor = COLOR_WHITE; + oled.SetTextProperties(&textProperties); + oled.Label((uint8_t *)"*",85,15); // "*" at x,y + oled.Label((uint8_t *)"*",85,60); // "*" at x,y + oled.Label((uint8_t *)" Back ",9,80); // Display "Back" at x,y + // oled.Label((uint8_t *)" Enter ",59,80); //Display at x,y + break; + } + case 24: {// Heart Rate Debug Screen + oled.FillScreen(COLOR_BLACK); // Clear screen + textProperties.fontColor = COLOR_RED; + oled.SetTextProperties(&textProperties); + oled.Label((uint8_t *)"H.R. Debug",10,5); // Display at x,y + textProperties.fontColor = COLOR_WHITE; + oled.SetTextProperties(&textProperties); + oled.Label((uint8_t *)"*",85,15); // "*" at x,y + oled.Label((uint8_t *)"*",85,60); // "*" at x,y + oled.Label((uint8_t *)" Back ",9,80); // Display "Back" at x,y + // oled.Label((uint8_t *)" Enter ",59,80); //Display at x,y + break; + } + case 25: {// Heat Index Diagnostic Screen + oled.FillScreen(COLOR_BLACK); // Clear screen + textProperties.fontColor = COLOR_RED; + oled.SetTextProperties(&textProperties); + oled.Label((uint8_t *)"H.I. Diagnostic",5,5); // Display at x,y + textProperties.fontColor = COLOR_WHITE; + oled.SetTextProperties(&textProperties); + oled.Label((uint8_t *)"*",85,15); // "*" at x,y + oled.Label((uint8_t *)"*",85,60); // "*" at x,y + oled.Label((uint8_t *)" Back ",9,80); // Display "Back" at x,y + // oled.Label((uint8_t *)" Enter ",59,80); //Display at x,y + break; + } +#endif // end of non-production/debug version code + default: { + Error_Num=1; + error_screen(); // Clear screen + break; + } + } +} +void error_screen(void){ + oled.FillScreen(COLOR_RED); // Clear screen + oled.Label((uint8_t *)"Error! ",30,30); // Display error at x,y + sprintf(text_1," %i ",Error_Num); + oled.Label((uint8_t *)text_1,30,60); // Display error at x,y + wait(3); // wait 3 seconds + oled.FillScreen(COLOR_BLACK); // Clear screen +} +void StartHaptic(void) +{ + hapticTimer.start(30); // was originaly 50 + haptic = 1; +} + +void StopHaptic(void const *n) { + haptic = 0; + hapticTimer.stop(); +}