Example of using Hexiwear buttons and declaring screens.
Dependencies: FXOS8700 FXAS21002 Hexi_KW40Z Hexi_OLED_SSD1351
Diff: main.cpp
- Revision:
- 2:824ed4ae8d52
- Parent:
- 1:e4b38d6918ba
- Child:
- 3:53c096a80151
diff -r e4b38d6918ba -r 824ed4ae8d52 main.cpp --- a/main.cpp Sat Feb 03 21:42:00 2018 +0000 +++ b/main.cpp Mon Feb 05 16:14:13 2018 +0000 @@ -18,27 +18,52 @@ #include "OpenSans_Font.h" #include "MAX30101.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. +#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. +#define HIGHEST_ZONE 4 +#define LOWEST_ZONE 1 +#define ENTER_BELOW 25 +#define ENTER_ABOVE 50 +#define EXIT_BELOW 75 +#define EXIT_ABOVE 100 +#define VIB_OPT_2 75 + void StartHaptic(void); void StartHaptic(int x); void StopHaptic(void const *n); void error_screen(void); void update_display(void); +void Decrement_Age(); +void Set_Max_Bpm(); +void Set_Zone_Boundaries(); +void Increment_Age(); +void Increment_Target_Zone(); +void Decrement_Target_Zone(); +void Increment_HR_Vibr_Pref(); +void Decrement_HR_Vibr_Pref(); +void Determine_Current_Zone(); +void Heart_Rate_Vibrations(); +void Increment_Heart_Rate(); +void Decrement_Heart_Rate(); +void Enable_Heart_Rate(); +void Disable_Heart_Rate(); +void Led_Zone_Indicator(); // ***************** Global variables *********************** char text_1[20]; // Text buffer - Do we need more? -char display_buff[20]; //Buffer for conversion to char to display +char display_buff[30]; //Buffer for conversion to char to display +bool Led_Zones = 1; bool HR_Enable = 0; bool OLED_ON = 1; // Turn OLED power on/off bool Fall_Alert = 0; // Initialize as no active alert @@ -52,18 +77,21 @@ 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 Current_Zone = 1; +uint8_t Prev_Zone = 1; +uint8_t Heart_Rate = 100; uint8_t HR_buff[250]; uint8_t *HR_return; uint8_t Age = 50; // Initialize age -uint8_t Max_BPM = 220 - Age; // Initialize Max BPM +uint8_t Max_Bpm = 220 - Age; // Initialize Max BPM uint8_t Screen_Num = 0; // Initialize to main screen uint8_t Error_Num = 0; // Error num for debug -uint8_t HR_Vibration = 1; //Choose Heart Rate Vibration Options -uint8_t Target_Zone = 3; //Initialize Target Heart Rate Zone to Zone 3 -uint8_t HR_Zone1[2] = {Max_BPM * .50, Max_BPM * .60}; //Heart Rate Zone 1 -uint8_t HR_Zone2[2] = {HR_Zone1[1] + 1, Max_BPM * .70}; //Heart Rate Zone 2 -uint8_t HR_Zone3[2] = {HR_Zone2[1] + 1, Max_BPM * .80}; //Heart Rate Zone 3 -uint8_t HR_Zone4[2] = {HR_Zone3[1] + 1, Max_BPM}; //Heart Rate Zone 4 +uint8_t HR_Vibration = 2; //Choose Heart Rate Vibration Options +uint8_t Target_Zone = 2; //Initialize Target Heart Rate Zone to Zone 3 +uint8_t HR_Zone1[2] = {Max_Bpm * .50, Max_Bpm * .60}; //Heart Rate Zone 1 +uint8_t HR_Zone2[2] = {HR_Zone1[1] + 1, Max_Bpm * .70}; //Heart Rate Zone 2 +uint8_t HR_Zone3[2] = {HR_Zone2[1] + 1, Max_Bpm * .80}; //Heart Rate Zone 3 +uint8_t HR_Zone4[2] = {HR_Zone3[1] + 1, Max_Bpm}; //Heart Rate Zone 4 // ***************** Define pins ***************************** FXAS21002 gyro(PTC11,PTC10); // Gyroscope SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); // SSD1351 OLED Driver (MOSI,SCLK,POWER,CS,RST,DC) @@ -146,6 +174,7 @@ } case 7: {// Heart Rate Zone StartHaptic(50); + Enable_Heart_Rate(); //heart.enable(); //HR_Enable = 1; //while(HR_Enable == 1) @@ -201,46 +230,24 @@ break; } case 27: {//Incrementing Age - StartHaptic(); - if(Age < 100) { - Age += 1; - Screen_Num = 27; - } else { - Age = 1; - } - Max_BPM = 220 - Age; //Calculate New Max BPM - HR_Zone1[0] = Max_BPM * .50; //Set Heart Rate Zone 1 - HR_Zone1[1] = Max_BPM * .60; //Set Heart Rate Zone 1 - HR_Zone2[0] = HR_Zone1[1] + 1; //Set Heart Rate Zone 2 - HR_Zone2[1] = Max_BPM * .70; //Set Heart Rate Zone 2 - HR_Zone3[0] = HR_Zone2[1] + 1; //Set Heart Rate Zone 3 - HR_Zone3[1] = Max_BPM * .80; //Set Heart Rate Zone 3 - HR_Zone4[0] = HR_Zone3[1] + 1; //Set Heart Rate Zone 4 - HR_Zone4[1] = Max_BPM; //Set Heart Rate Zone 4 + Increment_Age(); + Set_Zone_Boundaries(); update_display(); break; - } case 28: {//Changing Heart Rate Vibration Preferences - StartHaptic(); - if(HR_Vibration == 3) { - HR_Vibration = 1; - } else { - HR_Vibration += 1; - } + Increment_HR_Vibr_Pref(); update_display(); break; } case 30: {//Change Target Heart Rate Zone Preference - StartHaptic(); - if(Target_Zone == 4) - { - Target_Zone = 1; - } - else - { - Target_Zone += 1; - } + Increment_Target_Zone(); + update_display(); + break; + } + case 31: { //Manually Increment Heart Rate by 1 + Increment_Heart_Rate(); + Determine_Current_Zone(); update_display(); break; } @@ -304,7 +311,7 @@ } case 7: {// Heart Rate Zone StartHaptic(100); - HR_Enable = 0; + Disable_Heart_Rate(); break; } case 8: {// Alert History @@ -355,46 +362,33 @@ break; } case 27: { //Decrement Age - StartHaptic(); - if(Age == 1) { - Age = 100; - } else { - Age -= 1; - Screen_Num = 27; - } - Max_BPM = 220 - Age; //Calculate New Max BPM - HR_Zone1[0] = Max_BPM * .50; //Set Heart Rate Zone 1 - HR_Zone1[1] = Max_BPM * .60; //Set Heart Rate Zone 1 - HR_Zone2[0] = HR_Zone1[1] + 1; //Set Heart Rate Zone 2 - HR_Zone2[1] = Max_BPM * .70; //Set Heart Rate Zone 2 - HR_Zone3[0] = HR_Zone2[1] + 1; //Set Heart Rate Zone 3 - HR_Zone3[1] = Max_BPM * .80; //Set Heart Rate Zone 3 - HR_Zone4[0] = HR_Zone3[1] + 1; //Set Heart Rate Zone 4 - HR_Zone4[1] = Max_BPM; //Set Heart Rate Zone 4 + Decrement_Age(); + Set_Zone_Boundaries(); update_display(); break; } case 28: { //Changing Heart Rate Vibration Preference - StartHaptic(); - if(HR_Vibration == 1) { - HR_Vibration = 3; - } else { - HR_Vibration -= 1; - } + /* + StartHaptic(); + if(HR_Vibration == 1) { + HR_Vibration = 3; + } else { + HR_Vibration -= 1; + } + */ + Decrement_HR_Vibr_Pref(); update_display(); break; } case 30: {//Change Target Heart Rate Zone Preference - StartHaptic(); - if(Target_Zone == 1) - { - Target_Zone = 4; - } - else - { - Target_Zone -= 1; - } + Decrement_Target_Zone(); + update_display(); + break; + } + case 31: { //Manually decrement heart rate by 1 + Decrement_Heart_Rate(); + Determine_Current_Zone(); update_display(); break; } @@ -455,7 +449,8 @@ } case 7: {// Heart Rate Zone StartHaptic(); - // toggle on/off + Screen_Num = 31; + update_display(); break; } case 20: {// Diagnostic/Debug Screens @@ -482,7 +477,7 @@ update_display(); break; } - case 29: {//Change Target Heart Rate Zone Preference + case 29: {//Change Target Heart Rate Zone Preference StartHaptic(); Screen_Num = 30; update_display(); @@ -494,6 +489,18 @@ update_display(); break; } + case 31: { + StartHaptic(); + Screen_Num = 32; + update_display(); + break; + } + case 32: { + StartHaptic(); + Screen_Num = 7; + update_display(); + break; + } default: { break; } @@ -621,12 +628,24 @@ update_display(); break; } - case 30: {//Change Target Heart Rate Zone Preference + case 30: {//Change Target Heart Rate Zone Preference StartHaptic(); Screen_Num = 29; update_display(); break; } + case 31: { + StartHaptic(); + Screen_Num = 7; + update_display(); + break; + } + case 32: { + StartHaptic(); + Screen_Num = 31; + update_display(); + break; + } default: { break; } @@ -791,6 +810,12 @@ oled.FillScreen(COLOR_BLACK); // Clear screen oled.Label((uint8_t *)"Heart Rate",15,5); // Display at x,y oled.Label((uint8_t *)"HR:",15,25); // Display at x,y + sprintf(display_buff, "%u", Heart_Rate); + textProperties.fontColor = COLOR_RED; //Change font to red + oled.SetTextProperties(&textProperties);//Implement color change + oled.Label((uint8_t *)display_buff,43,25); // Display at x,y + textProperties.fontColor = COLOR_WHITE; + oled.SetTextProperties(&textProperties); oled.Label((uint8_t *)"Age: ",15,45); // Display at x,y textProperties.fontColor = COLOR_GREEN; oled.SetTextProperties(&textProperties); //implements the color change @@ -798,11 +823,11 @@ oled.Label((uint8_t *)display_buff,43,45); // 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 *)"On",80,15); // "+" at x,y + oled.Label((uint8_t *)"Off",78,60); // "-" at x,y oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y oled.Label((uint8_t *)"Next",59,80); // Display "Next" at x,y - + //heart.enable(); //sprintf(display_buff, "%u", heart.getRevisionID()); //Convert int to char array for displaying user age //oled.Label((uint8_t *)display_buff,45,25); // Display at x,y @@ -942,7 +967,7 @@ oled.Label((uint8_t *)"Max bpm:",10,50); textProperties.fontColor = COLOR_RED; oled.SetTextProperties(&textProperties); //implements the color change - sprintf(display_buff, "%u", Max_BPM); //Convert int to char array for displaying user max bpm + sprintf(display_buff, "%u", Max_Bpm); //Convert int to char array for displaying user max bpm oled.Label((uint8_t *)display_buff, 65, 50); textProperties.fontColor = COLOR_WHITE; oled.SetTextProperties(&textProperties); @@ -1020,8 +1045,8 @@ oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y oled.Label((uint8_t *)"Next",60,80); //Display "Next" at x,y break; - } - case 30:{ //Enter Target Heart Rate Zone Preference + } + case 30: { //Enter Target Heart Rate Zone Preference oled.FillScreen(COLOR_BLACK); oled.Label((uint8_t *)"Zone Pref", 10, 5);// Display at x,y oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y @@ -1030,23 +1055,16 @@ oled.Label((uint8_t *)"-",85,60); // "-" at x,y oled.Label((uint8_t *)"Target:", 10, 25);// Display at x,y sprintf(display_buff, "%u", Target_Zone); // Convert int to char to display - if(Target_Zone == 1) - { + if(Target_Zone == 1) { textProperties.fontColor = COLOR_YELLOW; //Change font to yellow oled.SetTextProperties(&textProperties);//Implement color change - } - else if(Target_Zone == 2) - { + } else if(Target_Zone == 2) { textProperties.fontColor = COLOR_BLUE; //Change font to blue oled.SetTextProperties(&textProperties);//Implement color change - } - else if(Target_Zone == 3) - { + } else if(Target_Zone == 3) { textProperties.fontColor = COLOR_GREEN; //Change font to green oled.SetTextProperties(&textProperties);//Implement color change - } - else if(Target_Zone == 4) - { + } else if(Target_Zone == 4) { textProperties.fontColor = COLOR_RED; //Change font to red oled.SetTextProperties(&textProperties);//Implement color change } @@ -1054,8 +1072,7 @@ textProperties.fontColor = COLOR_WHITE; //Change font to white oled.SetTextProperties(&textProperties);//Implement color change oled.Label((uint8_t *)"Bounds:", 10, 45);// Display at x,y - if(Target_Zone == 1) - { + if(Target_Zone == 1) { textProperties.fontColor = COLOR_YELLOW; //Change font to yellow oled.SetTextProperties(&textProperties);//Implement color change sprintf(display_buff, "%u", HR_Zone1[0]); // Convert int to char to display @@ -1063,9 +1080,7 @@ oled.Label((uint8_t *)"-", 32, 60);// Display at x,y sprintf(display_buff, "%u", HR_Zone1[1]); // Convert int to char to display oled.Label((uint8_t *)display_buff, 40, 60);// Display at x,y - } - else if(Target_Zone == 2) - { + } else if(Target_Zone == 2) { textProperties.fontColor = COLOR_BLUE; //Change font to blue oled.SetTextProperties(&textProperties);//Implement color change sprintf(display_buff, "%u", HR_Zone2[0]); // Convert int to char to display @@ -1073,9 +1088,7 @@ oled.Label((uint8_t *)"-", 32, 60);// Display at x,y sprintf(display_buff, "%u", HR_Zone2[1]); // Convert int to char to display oled.Label((uint8_t *)display_buff, 40, 60);// Display at x,y - } - else if(Target_Zone == 3) - { + } else if(Target_Zone == 3) { textProperties.fontColor = COLOR_GREEN; //Change font to green oled.SetTextProperties(&textProperties);//Implement color change sprintf(display_buff, "%u", HR_Zone3[0]); // Convert int to char to display @@ -1083,9 +1096,7 @@ oled.Label((uint8_t *)"-", 32, 60); // Display at x,y sprintf(display_buff, "%u", HR_Zone3[1]); // Convert int to char to display oled.Label((uint8_t *)display_buff, 40, 60);// Display at x,y - } - else if(Target_Zone == 4) - { + } else if(Target_Zone == 4) { textProperties.fontColor = COLOR_RED; //Change font to red oled.SetTextProperties(&textProperties);//Implement color change sprintf(display_buff, "%u", HR_Zone4[0]); // Convert int to char to display @@ -1096,14 +1107,110 @@ } textProperties.fontColor = COLOR_WHITE; //Change font to white oled.SetTextProperties(&textProperties);//Implement color change - break; + break; + } + case 31: { + oled.FillScreen(COLOR_BLACK); + Heart_Rate_Vibrations(); + oled.Label((uint8_t *)"Enter HR", 10, 5);// Display at x,y + oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y + oled.Label((uint8_t *)"Next",60,80); //Display "Next" 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 *)"HR:", 10, 25); + sprintf(display_buff, "%u", Heart_Rate); // Convert int to char to display + textProperties.fontColor = COLOR_RED; //Change font to red + oled.SetTextProperties(&textProperties);//Implement color change + oled.Label((uint8_t *)display_buff, 40, 25); + textProperties.fontColor = COLOR_WHITE; //Change font to white + oled.SetTextProperties(&textProperties);//Implement color change + oled.Label((uint8_t *)"Cur Zone:", 10, 45); + if(Current_Zone == 1) { + textProperties.fontColor = COLOR_YELLOW; + oled.SetTextProperties(&textProperties); + } else if(Current_Zone == 2) { + textProperties.fontColor = COLOR_BLUE; + oled.SetTextProperties(&textProperties); + } else if(Current_Zone == 3) { + textProperties.fontColor = COLOR_GREEN; + oled.SetTextProperties(&textProperties); + } else if(Current_Zone == 4) { + textProperties.fontColor = COLOR_RED; + oled.SetTextProperties(&textProperties); + } + sprintf(display_buff, "%u", Current_Zone); // Convert int to char to display + oled.Label((uint8_t *)display_buff, 71, 45); + textProperties.fontColor = COLOR_WHITE; //Change font to white + oled.SetTextProperties(&textProperties);//Implement color change + oled.Label((uint8_t *)"Prev Zone:", 10, 60); + if(Prev_Zone == 1) { + textProperties.fontColor = COLOR_YELLOW; + oled.SetTextProperties(&textProperties); + } else if(Prev_Zone == 2) { + textProperties.fontColor = COLOR_BLUE; + oled.SetTextProperties(&textProperties); + } else if(Prev_Zone == 3) { + textProperties.fontColor = COLOR_GREEN; + oled.SetTextProperties(&textProperties); + } else if(Prev_Zone == 4) { + textProperties.fontColor = COLOR_RED; + oled.SetTextProperties(&textProperties); + } + sprintf(display_buff, "%u", Prev_Zone); // Convert int to char to display + oled.Label((uint8_t *)display_buff, 71, 60); + textProperties.fontColor = COLOR_WHITE; //Change font to white + oled.SetTextProperties(&textProperties);//Implement color change + Led_Zone_Indicator(); + break; + } + case 32: { + //Zone Boundary Info + oled.FillScreen(COLOR_BLACK); + oled.Label((uint8_t *)"HR Zone Info", 10, 5);// Display at x,y + textProperties.fontColor = COLOR_YELLOW; //Change font to yellow + oled.SetTextProperties(&textProperties);//Implement color change + oled.Label((uint8_t *)"Z1:", 10, 20);// Display at x,y + sprintf(display_buff, "%u", HR_Zone1[0]); // Convert int to char to display + oled.Label((uint8_t *)display_buff, 30, 20);// Display at x,y + oled.Label((uint8_t *)"-", 52, 20);// Display at x,y + sprintf(display_buff, "%u", HR_Zone1[1]); // Convert int to char to display + oled.Label((uint8_t *)display_buff, 60, 20);// Display at x,y + textProperties.fontColor = COLOR_BLUE; //Change font to blue + oled.SetTextProperties(&textProperties);//Implement color change + oled.Label((uint8_t *)"Z2:", 10, 35);// Display at x,y + sprintf(display_buff, "%u", HR_Zone2[0]); // Convert int to char to display + oled.Label((uint8_t *)display_buff, 30, 35);// Display at x,y + oled.Label((uint8_t *)"-", 52, 35);// Display at x,y + sprintf(display_buff, "%u", HR_Zone2[1]); // Convert int to char to display + oled.Label((uint8_t *)display_buff, 60, 35);// Display at x,y + textProperties.fontColor = COLOR_GREEN; //Change font to green + oled.SetTextProperties(&textProperties);//Implement color change + oled.Label((uint8_t *)"Z3:", 10, 50);// Display at x,y + sprintf(display_buff, "%u", HR_Zone3[0]); // Convert int to char to display + oled.Label((uint8_t *)display_buff, 30, 50);// Display at x,y + oled.Label((uint8_t *)"-", 52, 50);// Display at x,y + sprintf(display_buff, "%u", HR_Zone3[1]); // Convert int to char to display + oled.Label((uint8_t *)display_buff, 60, 50);// Display at x,y + textProperties.fontColor = COLOR_RED; //Change font to red + oled.SetTextProperties(&textProperties);//Implement color change + oled.Label((uint8_t *)"Z4:", 10, 65);// Display at x,y + sprintf(display_buff, "%u", HR_Zone4[0]); // Convert int to char to display + oled.Label((uint8_t *)display_buff, 30, 65);// Display at x,y + oled.Label((uint8_t *)"-", 52, 65);// Display at x,y + sprintf(display_buff, "%u", HR_Zone4[1]); // Convert int to char to display + oled.Label((uint8_t *)display_buff, 60, 65);// Display at x,y + textProperties.fontColor = COLOR_WHITE; //Change font to white + oled.SetTextProperties(&textProperties);//Implement color change + oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y + oled.Label((uint8_t *)"Next",60,80); //Display "Next" at x,y + break; } #endif // end of non-production/debug version code default: { - Error_Num=1; - error_screen(); // Clear screen - break; - } + Error_Num=1; + error_screen(); // Clear screen + break; + } } } void error_screen(void) @@ -1115,16 +1222,30 @@ wait(3); // wait 3 seconds oled.FillScreen(COLOR_BLACK); // Clear screen } + +/***************************************************************************** +Name: StartHaptic +Purpose: Cause the HexiHeart device to vibrate for a predetermined amount of + time +Inputs: None +Returns: None +******************************************************************************/ void StartHaptic(void) { hapticTimer.start(30); // was originaly 50 haptic = 1; } +/***************************************************************************** +Name: StartHaptic +Purpose: Cause the HexiHeart device to vibrate for x amount of time +Inputs: An int representing the duration of the vibration +Returns: None +******************************************************************************/ void StartHaptic(int x) { hapticTimer.start(x); - haptic = 1; + haptic = 1; } void StopHaptic(void const *n) @@ -1132,3 +1253,320 @@ haptic = 0; hapticTimer.stop(); } + +/***************************************************************************** +Name: Increment_Age +Purpose: Increment the user's age by 1 +Inputs: None +Returns: None +******************************************************************************/ +void Increment_Age() +{ + StartHaptic(); + if(Age < 100) { + Age += 1; + Screen_Num = 27; + } else { + Age = 1; + } +} + +/***************************************************************************** +Name: Decrement_Age +Purpose: Decrement the user's age by 1 +Inputs: None +Returns: None +******************************************************************************/ +void Decrement_Age() +{ + StartHaptic(); + if(Age == 1) { + Age = 100; + } else { + Age -= 1; + Screen_Num = 27; + } +} + +/***************************************************************************** +Name: Set_Max_Bpm +Purpose: Calculates the user's maximum heart rate based on their age +Inputs: None +Returns: None +******************************************************************************/ +void Set_Max_Bpm() +{ + Max_Bpm = 220 - Age; +} + +/***************************************************************************** +Name: Set_Zone_Boundaries +Purpose: Calculates the user's heart rate zones' boundaries based on the user's + maximum heart rate +Inputs: None +Returns: None +******************************************************************************/ +void Set_Zone_Boundaries() +{ + Set_Max_Bpm(); + HR_Zone1[0] = Max_Bpm * .50; //Set Heart Rate Zone 1 + HR_Zone1[1] = Max_Bpm * .60; //Set Heart Rate Zone 1 + HR_Zone2[0] = HR_Zone1[1] + 1; //Set Heart Rate Zone 2 + HR_Zone2[1] = Max_Bpm * .70; //Set Heart Rate Zone 2 + HR_Zone3[0] = HR_Zone2[1] + 1; //Set Heart Rate Zone 3 + HR_Zone3[1] = Max_Bpm * .80; //Set Heart Rate Zone 3 + HR_Zone4[0] = HR_Zone3[1] + 1; //Set Heart Rate Zone 4 + HR_Zone4[1] = Max_Bpm; //Set Heart Rate Zone 4 +} + +/***************************************************************************** +Name: Increment_Target_Zone +Purpose: Imcrements the user's target heart rate zone preference by 1 +Inputs: None +Returns: None +******************************************************************************/ +void Increment_Target_Zone() +{ + StartHaptic(); + if(Target_Zone == 4) { + Target_Zone = 1; + } else { + Target_Zone += 1; + } +} + +/***************************************************************************** +Name: Decrement_Target_Zone +Purpose: Decrements the user's target heart rate zone preference by 1 +Inputs: None +Returns: None +******************************************************************************/ +void Decrement_Target_Zone() +{ + StartHaptic(); + if(Target_Zone == 1) { + Target_Zone = 4; + } else { + Target_Zone -= 1; + } +} + +/***************************************************************************** +Name: Increment_HR_Vibr_Pref +Purpose: Increment the user's heart rate vibration preference by 1 +Inputs: None +Returns: None +******************************************************************************/ +void Increment_HR_Vibr_Pref() +{ + StartHaptic(); + if(HR_Vibration == 3) { + HR_Vibration = 1; + } else { + HR_Vibration += 1; + } +} + +/***************************************************************************** +Name: Decrement_HR_Vibr_Pref +Purpose: Decrement the user's heart rate vibration preference by 1 +Inputs: None +Returns: None +******************************************************************************/ +void Decrement_HR_Vibr_Pref() +{ + StartHaptic(); + if(HR_Vibration == 1) { + HR_Vibration = 3; + } else { + HR_Vibration -= 1; + } +} + +/***************************************************************************** +Name: Enable_Heart_Rate +Purpose: Turn on the HexiHeart heart rate function +Inputs: None +Returns: None +******************************************************************************/ +void Enable_Heart_Rate() +{ + Heart_Rate_Mode = true; + Heart_Rate_Vibrations(); +} + +/***************************************************************************** +Name: Disable_Heart_Rate +Purpose: Turn off the HexiHeart heart rate function +Inputs: None +Returns: None +******************************************************************************/ +void Disable_Heart_Rate() +{ + Heart_Rate_Mode = false; + Heart_Rate_Vibrations(); +} + +/***************************************************************************** +Name: Determine_Current_Zone +Purpose: Determines which zone the heart rate is in and assigns the curent + zone and previous zone +Inputs: None +Returns: None +******************************************************************************/ +void Determine_Current_Zone() +{ + Prev_Zone = Current_Zone; + + if(Heart_Rate >= HR_Zone1[0] && Heart_Rate <= HR_Zone1[1]) { + Current_Zone = 1; + } else if(Heart_Rate >= HR_Zone2[0] && Heart_Rate <= HR_Zone2[1]) { + Current_Zone = 2; + } else if(Heart_Rate >= HR_Zone3[0] && Heart_Rate <= HR_Zone3[1]) { + Current_Zone = 3; + } else if(Heart_Rate >= HR_Zone4[0] && Heart_Rate <= HR_Zone4[1]) { + Current_Zone = 4; + } else { + //error reading, don't change anything + } + + +} +/***************************************************************************** +Name: Run_Heart_Vibrations +Purpose: Performs the HexiHeart heart rate function +Inputs: None +Returns: None +******************************************************************************/ +void Heart_Rate_Vibrations() +{ + if(Heart_Rate_Mode == true) { + if(HR_Vibration == 1) { + //All Pre-loaded vibrations enabled + if(Current_Zone == Prev_Zone) { + // Do nothing if no zone change + } else if(Current_Zone == Target_Zone) { //Changed to target zone + if(Target_Zone == LOWEST_ZONE || Prev_Zone > Target_Zone) { //must have entered from above + StartHaptic(ENTER_ABOVE); + } else if(Target_Zone == HIGHEST_ZONE || Prev_Zone < Target_Zone) { //must have entered from below + StartHaptic(ENTER_BELOW); + } + } else if(Current_Zone != Target_Zone && Prev_Zone == Target_Zone) { + if(Target_Zone == HIGHEST_ZONE || Current_Zone < Target_Zone) { //must have exited below + StartHaptic(EXIT_BELOW); + } else if(Target_Zone == LOWEST_ZONE || Current_Zone > Target_Zone) { //must have exited above + StartHaptic(EXIT_ABOVE); + } + } + } else if(HR_Vibration == 2) { + //Only Entering and Exiting target zone + if(Current_Zone == Prev_Zone) { + //do nothing + } else if(Current_Zone == Target_Zone) { + StartHaptic(VIB_OPT_2); + wait(0.1); + StartHaptic(VIB_OPT_2); + } else if(Current_Zone != Target_Zone && Prev_Zone == Target_Zone) { + StartHaptic(VIB_OPT_2); + wait(0.1); + StartHaptic(VIB_OPT_2); + wait(0.1); + StartHaptic(VIB_OPT_2); + } + + } else if(HR_Vibration == 3) { + //No Vibrations + + } else { + //Error, can only be choices 1-3 + error_screen(); + } + } +} + +/***************************************************************************** +Name: Increment_Heart_Rate +Purpose: Manually increment the the heart rate measurement by 1 for testing + purposes +Inputs: None +Returns: None +******************************************************************************/ +void Increment_Heart_Rate() +{ + //StartHaptic(); + if(Heart_Rate == HR_Zone4[1]) { + Heart_Rate = HR_Zone1[0]; + } else { + Heart_Rate += 1; + } +} + +/***************************************************************************** +Name: Decrement_Heart_Rate +Purpose: Manually decrement the the heart rate measurement by 1 for testing + purposes +Inputs: None +Returns: None +******************************************************************************/ +void Decrement_Heart_Rate() +{ + //StartHaptic(); + if(Heart_Rate == HR_Zone1[0]) { + Heart_Rate = HR_Zone4[1]; + } else { + Heart_Rate -= 1; + } +} + +void Led_Zone_Indicator() +{ + if(Led_Zones == true) + { + if(Current_Zone == 1) + { + BLU_Led = LED_OFF; + RED_Led = LED_ON; + GRN_Led = LED_ON; + //wait(0.5); + //RED_Led = LED_OFF; + //GRN_Led = LED_OFF; + } + else if(Current_Zone == 2) + { + if(Prev_Zone == 1) + { + RED_Led = LED_OFF; + GRN_Led = LED_OFF; + } + else if(Prev_Zone == 3) + { + GRN_Led = LED_OFF; + } + BLU_Led = LED_ON; + //wait(0.5); + //BLU_Led = LED_OFF; + } + else if(Current_Zone == 3) + { + if(Prev_Zone == 2) + { + BLU_Led = LED_OFF; + } + else if(Prev_Zone == 4) + { + RED_Led = LED_OFF; + } + GRN_Led = LED_ON; + //wait(0.5); + //GRN_Led = LED_OFF; + } + else if(Current_Zone == 4) + { + GRN_Led = LED_OFF; + RED_Led = LED_ON; + //wait(0.5); + //RED_Led = LED_OFF; + } + } + +}