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

Files at this revision

API Documentation at this revision

Comitter:
asong
Date:
Mon Feb 05 16:14:13 2018 +0000
Parent:
1:e4b38d6918ba
Child:
3:6792c1ba586c
Commit message:
Newest version with cleaned up code and more heart rate logic ; ; -Alex

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- 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; 
+    }
+  }   
+
+}