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:
nbaker
Date:
Mon Feb 19 05:11:42 2018 +0000
Parent:
7:3d5a8aea0b63
Child:
9:d2e39ee9fedd
Commit message:
This version has BLE screens added, data values refreshed at 2Hz for two screens, fall function variables are adjustable, and other minor improvements.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Wed Feb 14 22:53:49 2018 +0000
+++ b/main.cpp	Mon Feb 19 05:11:42 2018 +0000
@@ -29,6 +29,7 @@
 */
 
 // Definitions
+#define SW_Ver          2.07    // For displaying software version
 #define LED_ON          0
 #define LED_OFF         1
 #define SCRN_TIME       10.0
@@ -48,7 +49,7 @@
 void StopHaptic(void const *n);
 void error_screen(void);
 void update_display(void);// Screen lables refreshed
-void update_data(void);   // Screen data(only)refreshed 
+void update_display_date(void);  // Screen data(only)refreshed 
 void Decrement_Age();
 void Set_Max_Bpm();
 void Set_Zone_Boundaries();
@@ -75,12 +76,14 @@
 char text_1[20];            // Text buffer - Do we need more?
 char display_buff[30];      //Buffer for conversion to char to display
 char text[20];              // Text Buffer for dynamic value displayed
+bool BLE_On = 0;            // Initialize as BLE on
+char pass [20];              // Passcode
 bool Led_Zones = 1;
 bool HR_Enable = 0;
 bool OLED_ON = 1;           // Turn OLED power on/off
 bool Fall_Alert = 1;        // 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
+uint8_t 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
@@ -171,7 +174,7 @@
             }
             case 1: {// Panic Alert option
                 StartHaptic();
-                Screen_Num = 26;  //Change to screen 5
+                Screen_Num = 5;  //Change to screen 5
 #ifdef Debug    // in debug show debug/diagnostic screens                         
                 Screen_Num = 26;  //Change to screen 20
 #endif
@@ -181,7 +184,7 @@
             }
             case 2: {// Fall Alert option
                 StartHaptic();
-                Screen_Num = 1;  //Change to screen 1
+                Screen_Num = 71;  //Change to screen 71
                 update_display();
                 break;
             }
@@ -224,6 +227,24 @@
                 //Increment  alert index
                 break;
             }
+            case 9: {// HexiHeart About info1
+                    StartHaptic();
+                    Screen_Num = 11;  //Change to screen 11
+                    update_display();
+                    break;
+                }    
+            case 10: {// HexiHeart About info2
+                    StartHaptic();
+                    Screen_Num = 9;  //Change to screen 9
+                    update_display();
+                    break;
+                }    
+            case 11: {// HexiHeart About info3
+                    StartHaptic();
+                    Screen_Num = 10;  //Change to screen 9
+                    update_display();
+                    break;
+                } 
             case 20: {// Diagnostic/Debug Screens
                 StartHaptic();
                 Screen_Num = 5;  //Change to screen 5
@@ -288,6 +309,62 @@
                 update_display();
                 break;
             }
+            
+            case 41: {//Fall mode 0,1,2,3
+                StartHaptic();
+                Fall_Alert_Mode++;
+                if(Fall_Alert_Mode > 3){
+                Fall_Alert_Mode = 0;
+                }//endif
+                update_display();
+                __disable_irq();    // Disable all Interrupts
+                fall_config(10);  // reset sensor
+                wait(0.1);
+                fall_config(Fall_Alert_Mode);
+                wait(0.1);
+                __enable_irq();     // Enable all Interrupts
+                wait(0.3);
+                update_display();
+                break;
+            }    
+            case 42: {// F-Th adj
+                StartHaptic();
+                Fall_Thresh = Fall_Thresh + 0.05;
+                if(Fall_Thresh > 0.9){
+                Fall_Thresh = 0.9;
+                }//endif
+                update_display();
+                break;
+            }
+            case 43: {// I-Th adj
+                StartHaptic();
+                Impact_Thresh = Impact_Thresh + 0.1;
+                if(Impact_Thresh > 3.9){
+                Impact_Thresh = 3.9;
+                }//endif
+                update_display();
+                break;
+            }
+            case 44: {// M-Th adj
+                StartHaptic();
+                Movement_Thresh = Movement_Thresh + 5.0;
+                if(Movement_Thresh > 300.0){
+                Movement_Thresh = 300.0;
+                }//endif
+                update_display();
+                break;
+            }
+            
+            case 71: {// BLE
+                StartHaptic();
+                Screen_Num = 1; //Change to screen 1
+                update_display();
+                break;
+            }
+            case 72: {// BlueTooth on/off
+                // do nothing, wrong button or change to another screen number if you're making more BLE type screens
+                break;
+            }
             default: {
                 break;
             }
@@ -311,7 +388,7 @@
             }
             case 1: {// Panic Alert option
                 StartHaptic();
-                Screen_Num = 2;  //Change to screen 2
+                Screen_Num = 71;  //Change to screen 71
                 update_display();
                 break;
             }
@@ -356,6 +433,24 @@
                 //decriment alert index
                 break;
             }
+            case 9: {// HexiHeart About info1
+                    StartHaptic();
+                    Screen_Num = 10;  //Change to screen 10
+                    update_display();
+                    break;
+                }
+            case 10: {// HexiHeart About info2
+                    StartHaptic();
+                    Screen_Num = 11;  //Change to screen 11
+                    update_display();
+                    break;
+                }
+            case 11: {// HexiHeart About info3
+                    StartHaptic();
+                    Screen_Num = 9;  //Change to screen 9
+                    update_display();
+                    break;
+                }            
             case 20: {// Diagnostic/Debug Screens
                 StartHaptic();
                 Screen_Num = 26;  //Change to screen 1
@@ -429,6 +524,61 @@
                 update_display();
                 break;
             }
+            case 41: {//Fall mode 0,1,2,3
+                Fall_Alert_Mode--;
+                if(Fall_Alert_Mode > 3){// should be 0xff if decr from zero
+                Fall_Alert_Mode = 3;
+                }  //endif
+                update_display();
+                __disable_irq();    // Disable all Interrupts
+                fall_config(10);  // reset sensor
+                wait(0.1);
+                fall_config(Fall_Alert_Mode);
+                wait(0.1);
+                __enable_irq();     // Enable all Interrupts
+                wait(0.2);
+                update_display();
+                break;
+            }
+            case 42: {// F-Th adj
+                StartHaptic();
+                Fall_Thresh = Fall_Thresh - 0.05;
+                if(Fall_Thresh < 0.1){
+                Fall_Thresh = 0.1;
+                }//endif
+                update_display();
+                break;
+            }
+            case 43: {// I-Th adj
+                StartHaptic();
+                Impact_Thresh = Impact_Thresh - 0.1;
+                if(Impact_Thresh < 0.9){
+                Impact_Thresh = 0.9;
+                }//endif
+                update_display();
+                break;
+            }
+            case 44: {// M-Th adj
+                StartHaptic();
+                Movement_Thresh = Movement_Thresh - 5.0;
+                if(Movement_Thresh < 5.0){
+                Movement_Thresh = 5.0;
+                }//endif
+                update_display();
+                break;
+            }
+            
+            case 71: {// BLE
+                StartHaptic();
+                Screen_Num = 2; //Change to screen 2
+                update_display();
+                break;
+            }
+            case 72: {// BlueTooth on/off
+                // do nothing, wrong button or change to another screen number if you're making more BLE type screens
+                break;
+            }
+            
             default: {
                 break;
             }
@@ -504,6 +654,12 @@
                 update_display();
                 break;
             }
+            case 22: {// Fall Debug
+                StartHaptic();
+                Screen_Num = 41;  //Change to screen 41
+                update_display();
+                break;
+            }
             case 26: {//Change to Heart Rate Config Screen
                 StartHaptic();
                 Screen_Num = 27;
@@ -546,6 +702,41 @@
                 update_display();
                 break;
             }
+            case 41: {// Fall-Mode adj
+                StartHaptic();
+                Screen_Num = 42;  //Change to screen 42
+                update_display();
+                break;
+            }       
+            case 42: {// F-Th adj
+                StartHaptic();
+                Screen_Num = 43;  //Change to screen 43
+                update_display();
+                break;
+            }
+            case 43: {// I-Th adj
+                StartHaptic();
+                Screen_Num = 44;  //Change to screen 44
+                update_display();
+                break;
+            }
+            case 44: {// M-Th adj
+                // do nothing for now
+                break;
+            }
+             case 71: {// BLE
+                StartHaptic();
+                Screen_Num = 72;  //Change to screen 72
+                update_display();
+                break;
+            }
+             case 72: {// BlueTooth on/off
+                StartHaptic();
+                BLE_On = !BLE_On;
+                update_display();
+                break;
+            }           
+            
             default: {
                 break;
             }
@@ -613,6 +804,24 @@
                 update_display();
                 break;
             }
+            case 9: {// About HexiHeart info1
+                    StartHaptic();
+                    Screen_Num = 5;  //Change to screen 5
+                    update_display();
+                    break;
+                }
+            case 10: {// HexiHeart About info2
+                    StartHaptic();
+                    Screen_Num = 5;  //Change to screen 5
+                    update_display();
+                    break;
+                }
+            case 11: {// HexiHeart About info3
+                    StartHaptic();
+                    Screen_Num = 5;  //Change to screen 5
+                    update_display();
+                    break;
+                }            
             case 20: {// Diagnostic/Debug Screens
                 StartHaptic();
                 Screen_Num = 0;  //Change to screen 0
@@ -691,6 +900,44 @@
                 update_display();
                 break;
             }
+            case 41: {// Fall mode screen
+                StartHaptic();
+                Screen_Num = 22;
+                update_display();
+                break;
+            }    
+            case 42: {// F-Th adj
+                StartHaptic();
+                Screen_Num = 41;  //Change to screen 41
+                update_display();
+                break;
+            }
+            case 43: {// I-Th adj
+                StartHaptic();
+                Screen_Num = 42;  //Change to screen 42
+                update_display();
+                break;
+            }
+            case 44: {// M-Th adj
+                StartHaptic();
+                Screen_Num = 43;  //Change to screen 43
+                update_display();
+                break;
+            }                  
+             case 71: {// BLE
+                StartHaptic();
+                Screen_Num = 0;  //Change to screen 0
+                update_display();
+                break;
+            }
+
+            case 72: {// BlueTooth on/off
+                StartHaptic();
+                Screen_Num = 71;  //Change to screen 71
+                update_display();
+                break;
+            }
+           
             default: {
                 break;
             }
@@ -714,7 +961,7 @@
 int main()
 {
 //   set_time(1256729737);  // Set RTC time to Wed, 28 Oct 2009 11:35:37
-   set_time(48*365*24*3600+61*24*3600+10*3600);  // Set RTC time to Mon, 19 Feb 2018 10:00
+   set_time(48*365*24*3600+61*24*3600+10*3600-4);  // Set RTC time to Mon, 19 Feb 2018 10:00
     OLED_PWR = 1;  // Turn on OLED power supply
     
     
@@ -726,7 +973,7 @@
 // **************  configure sensor modules  ******************
     //    accel.accel_config();   // configure sensor
  //   fall_config(1);         // configure sensor for fall detect
-     fall_config(3); // configure sensor for fall mode
+    fall_config(Fall_Alert_Mode); // configure sensor for current fall mode
 //    mag.mag_config();
     gyro.gyro_config();
 
@@ -737,7 +984,8 @@
     Led_clk2 = 0; // LEDs on docking station default to off, need to turn on with a 1
     Led_clk3 = 0; // LEDs on docking station default to off, need to turn on with a 1
     Non_Free_PWR = 1;   // Start with non-freescale sensors (Pres/Temp/Hum/Light)on
-    HR_PWR = 1;         // Start with Heart rate sensor powered on
+
+    HR_PWR = 0;         // Start with Heart rate sensor powered off
     
 // ***** Register callbacks/interupts to application functions *********
     kw40z_device.attach_buttonUp(&ButtonUp);
@@ -761,17 +1009,20 @@
     oled.SetTextProperties(&textProperties);
 
 // **************  Display spash screen  **********************
-
+    oled.FillScreen(COLOR_BLACK); // Clear 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
+    strcpy((char *) text_1,"This is Debug");
+    oled.Label((uint8_t *)text_1,15,50);  // text_1 at x,y
+    sprintf(text_1," Ver:%2.2f  ",SW_Ver);
+    oled.Label((uint8_t *)text_1,30,70);// text_1 at x,y
+    StartHaptic(); 
+    #endif
+    
     textProperties.fontColor = COLOR_WHITE;
     oled.SetTextProperties(&textProperties);
     wait(3);  // wait 3 seconds
@@ -784,7 +1035,7 @@
     {
     Thread::wait(500);          // wait 0.5 sec each loop
     if(OLED_PWR==1){
- //       update_data();
+    update_display_date();     // refresh display date w/o updating entire display 
         }// end if
     i++;
     }// end while(i<20)
@@ -795,9 +1046,7 @@
     wait(0.01);          // BLIP led 1/10 sec each loop
     RED_Led = LED_OFF;    // Used only for diagnostic of wait command
     Led_clk3 = 0; 
-    Thread::wait(490);    // keep up the pace, at 0.5 sec (0.01s+0.49s) update date
-
-//    update_data();        // refresh display date w/o updating entire display 
+    Thread::wait(490);    // keep up the pace, at 0.5 sec (0.01s+0.49s) update date 
 
     } // end of while(true)
 
@@ -809,6 +1058,7 @@
     OLED_PWR = 1;  // make sure OLED power supply is on
     oled_text_properties_t textProperties = {0};  // Need these to change font color
     oled.GetTextProperties(&textProperties);      // Need these to change font color
+    __disable_irq();    // Disable all Interrupts
     switch(Screen_Num) {
         case 0: {// Main Screen
             HexiwearBattery battery;
@@ -824,7 +1074,7 @@
             } else {
             sprintf(text_1, "%i%%", (uint8_t)battery.readLevelPercent());
             }
-            oled.TextBox((uint8_t *)text_1,60,0,35,15); //show level value of battery originaly at  55,40,35,15
+            oled.TextBox((uint8_t *)text_1,60,0,35,15); //show level value of battery in a 35px by 15px text box at x=60, y=0
         
         textProperties.fontColor = COLOR_WHITE;
         oled.SetTextProperties(&textProperties);
@@ -838,7 +1088,11 @@
             oled.Label((uint8_t *)"Menu",60,80);  //Display "Menu" at x,y
             
             textProperties.fontColor = COLOR_GRAY;
+            if(BLE_On == 1){
+               textProperties.fontColor = COLOR_BLUE; 
+               }
             oled.SetTextProperties(&textProperties);
+            
             oled.Label((uint8_t *)"BT",40,80);  //Display "BT" at x,y
             textProperties.fontColor = COLOR_WHITE;
             oled.SetTextProperties(&textProperties);  
@@ -856,7 +1110,7 @@
                           
             Heat_Index_Calculation();
             sprintf(text,"%i",heat_index);
-            oled.TextBox((uint8_t *)text,3,80,15,15); 
+            oled.TextBox((uint8_t *)text,3,80,15,15); //show HI in a 15px by 15px text box at x=3, y=80
             strcpy((char *) text,"dF");oled.Label((uint8_t *)text,18,80);
             
             if(Heart_Rate_Mode == 1) {
@@ -976,6 +1230,73 @@
             oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
             break;
         }
+        
+        case 9: {// About HexiHeart info1
+                    oled.FillScreen(COLOR_BLACK); // Clear screen
+                    oled.Label((uint8_t *)"Hexi",20,1); // Display white "Hexi" at x,y
+                    textProperties.fontColor = COLOR_RED;
+                    oled.SetTextProperties(&textProperties);  
+                    oled.Label((uint8_t *)"Heart",45,0); // Display red "Heart" at x,y  
+                    textProperties.fontColor = COLOR_WHITE;
+                    oled.SetTextProperties(&textProperties);  
+                    oled.Label((uint8_t *)"Senior Proj",5,15); //
+                    oled.Label((uint8_t *)"Team Zeta E1.7",5,30); //
+                    oled.Label((uint8_t *)"Texas State Univ",0,45); //        
+                    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 10: {// About HexiHeart info2
+                    oled.FillScreen(COLOR_BLACK); // Clear screen
+                    oled.Label((uint8_t *)"Hexi",20,0); // Display white "Hexi" at x,y
+                    textProperties.fontColor = COLOR_RED;
+                    oled.SetTextProperties(&textProperties);  
+                    oled.Label((uint8_t *)"Heart",45,0); // Display red "Heart" at x,y  
+                    textProperties.fontColor = COLOR_WHITE;
+                    oled.SetTextProperties(&textProperties);  
+                    oled.Label((uint8_t *)"E2.7 Team Zeta",2,12); //
+                    oled.Label((uint8_t *)"Alex Song",5,25); //
+                    oled.Label((uint8_t *)"Jasmine Rounsav",5,38); // Jasmine Rounsaville is to long
+                    oled.Label((uint8_t *)"Issam Hichami",5,51); // 
+                    oled.Label((uint8_t *)"Neil Baker",5,64); //           
+
+                    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 11: {// About HexiHeart info3
+                    oled.FillScreen(COLOR_BLACK); // Clear screen
+                    oled.Label((uint8_t *)"Hexi",20,0); // Display white "Hexi" at x,y
+                    textProperties.fontColor = COLOR_RED;
+                    oled.SetTextProperties(&textProperties);  
+                    oled.Label((uint8_t *)"Heart",45,0); // Display red "Heart" at x,y  
+                // *********get screen alignment  **************
+                    oled_text_properties_t textProperties = {0};
+                    oled.GetTextProperties(&textProperties); 
+                // *********Set text color and screen alignment  **************
+                    textProperties.alignParam = OLED_TEXT_ALIGN_CENTER;
+                    oled.SetTextProperties(&textProperties);   
+  
+                    #ifdef Debug  // if this is non-production version - do this
+                        oled.Label((uint8_t *)"This is Debug",0,25);  // text_1 at X=10,y=25
+                        oled.Label((uint8_t *)"Ver of SW",0,40);  // text_1 at x=20,y=40
+                    #endif
+                    textProperties.fontColor = COLOR_WHITE;
+                    oled.SetTextProperties(&textProperties);  
+                    sprintf(text_1," SW_Ver:%2.2f  ",SW_Ver);
+                    oled.Label((uint8_t *)text_1,0,55);// text_1 at x=10,y
+                    textProperties.alignParam = OLED_TEXT_ALIGN_LEFT;
+                    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;
+                }       
+        
 #ifdef Debug  // if this is non-production/debug version - do this
         case 20: {// Diagnostic/Debug Screens
             oled.FillScreen(COLOR_BLACK); // Clear screen
@@ -992,6 +1313,9 @@
             break;
         }
         case 21: {// Fall Alert Diagnostic Screen
+            if(Fall_Alert_Mode == 0){
+                fall_config(11); // turn accel sensor to active to take reading
+            }
             oled.FillScreen(COLOR_BLACK); // Clear screen
             textProperties.fontColor = COLOR_RED;
             oled.SetTextProperties(&textProperties);
@@ -999,14 +1323,19 @@
        //     oled.Label((uint8_t *)"Diagnostic",25,5); // Display at x,y
             textProperties.fontColor = COLOR_WHITE;
             oled.SetTextProperties(&textProperties);
+            gyro.acquire_gyro_data_dps(Gyro_Data);
+            Gyro_Mag = (abs(Gyro_Data[0])+abs(Gyro_Data[1])+abs(Gyro_Data[2]));
             accel.acquire_accel_data_g(Accel_Data);
-//                   gyro.acquire_gyro_data_g(Gyro_Data);
-            Accel_Mag = 2*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]));
+            if(Fall_Alert_Mode == 0){
+                fall_config(12); // turn accel sensor to standby
+            }
+            Accel_Mag = 2*sqrt(((Accel_Data[0]*Accel_Data[0])+(Accel_Data[1]*Accel_Data[1])+(Accel_Data[2]*Accel_Data[2])));     
             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 *)"*",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;
         }
@@ -1017,21 +1346,39 @@
             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);
+            sprintf(text_1," %i ",Fall_Alert_Mode);
             oled.Label((uint8_t *)text_1,35,20);// text_1 at x,y
-            sprintf(text_1," %2.1f g  ",Impact_Thresh);
+            textProperties.fontColor = COLOR_GRAY;
+            if(Fall_Alert_Mode == 1 || Fall_Alert_Mode == 3){
+            textProperties.fontColor = COLOR_GREEN;
+            }
+            oled.SetTextProperties(&textProperties);
+            sprintf(text_1," %1.2f g  ",Fall_Thresh);
             oled.Label((uint8_t *)text_1,35,35);// text_1 at x,y
+            textProperties.fontColor = COLOR_GRAY;
+            if(Fall_Alert_Mode == 2 || Fall_Alert_Mode == 3){
+            textProperties.fontColor = COLOR_GREEN;
+            }
+            oled.SetTextProperties(&textProperties);
+            sprintf(text_1," %2.2f g  ",Impact_Thresh);
+            oled.Label((uint8_t *)text_1,35,50);// text_1 at x,y
+            textProperties.fontColor = COLOR_GRAY;
+            if(Fall_Alert_Mode == 3){
+            //textProperties.fontColor = COLOR_GREEN;
+            }
+            oled.SetTextProperties(&textProperties);
             sprintf(text_1," %3.0f D/S  ",Movement_Thresh);
-            oled.Label((uint8_t *)text_1,35,50);// text_1 at x,y
+            oled.Label((uint8_t *)text_1,35,65);// 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 *)"Mode:",5,20); // "*" at x,y
+            oled.Label((uint8_t *)"F-Th:",5,35); // "*" at x,y
+            oled.Label((uint8_t *)"I-Th:",5,50); // "*" at x,y
+            oled.Label((uint8_t *)"M-Th:",5,65); // "*" 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
+            oled.Label((uint8_t *)" Enter ",59,80);  //Display at x,y
             break;
         }
         case 23: {// Heart Rate Diagnostic Screen
@@ -1092,7 +1439,7 @@
         /* Format the value */
             sprintf(text,"%i",sample_ftemp);
         
-        /* Display time reading in 35px by 15px textbox at(x=55, y=40) */
+        /* Display temp reading in 15px by 15px textbox at(x=55, y=40) */
             oled.TextBox((uint8_t *)text,55,40,15,15); //Increase textbox for more digits
         
         /* Display Units */
@@ -1102,7 +1449,7 @@
         /* Format the value */
             sprintf(text,"%i",sample_humid);
         
-        /* Display time reading in 35px by 15px textbox at(x=55, y=40) */
+        /* Display Hum reading in 15px by 15px textbox at(x=55, y=57) */
             oled.TextBox((uint8_t *)text,55,57,15,15); //Increase textbox for more digits
         
         /* Display Units */
@@ -1117,7 +1464,7 @@
         /* Format the value */
             sprintf(text,"%i",heat_index);
         
-        /* Display time reading in 35px by 15px textbox at(x=55, y=40) */
+        /* Display HI reading in 15px by 15px textbox at(x=55, y=23) */
             oled.TextBox((uint8_t *)text,55,23,15,15); //Increase textbox for more digits
         
         /* Display Units */
@@ -1388,15 +1735,118 @@
             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 41: { //Fall mode
+            oled.FillScreen(COLOR_BLACK);
+            oled.Label((uint8_t *)"Adj Fall Mode", 10, 5);
+            sprintf(display_buff, "%u", Fall_Alert_Mode); //Convert int to char array for displaying mode
+            oled.Label((uint8_t *)"Mode:", 5, 30);
+            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 *)"Next",60,80);  //Display "Next" at x,y
+            textProperties.fontColor = COLOR_GREEN;
+            oled.SetTextProperties(&textProperties);
+            oled.Label((uint8_t *)display_buff,43,30); // Display at x,y
+            textProperties.fontColor = COLOR_WHITE;
+            oled.SetTextProperties(&textProperties);
+            break;
+        }
+        case 42: { //Fall Thresh
+            oled.FillScreen(COLOR_BLACK);
+            oled.Label((uint8_t *)"Adj F-Th", 10, 5);
+            sprintf(display_buff, "%2.2f g", Fall_Thresh); //Convert int to char array for displaying mode
+            oled.Label((uint8_t *)"F_Th:", 5, 30);
+            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 *)"Next",60,80);  //Display "Next" at x,y
+            textProperties.fontColor = COLOR_GREEN;
+            oled.SetTextProperties(&textProperties);
+            oled.Label((uint8_t *)display_buff,43,30); // Display at x,y
+            textProperties.fontColor = COLOR_WHITE;
+            oled.SetTextProperties(&textProperties);
+            break;
+        }
+        case 43: { //Impact Thresh
+            oled.FillScreen(COLOR_BLACK);
+            oled.Label((uint8_t *)"Adj I-Th", 10, 5);
+            sprintf(display_buff, "%2.2f g", Impact_Thresh); //Convert int to char array for displaying mode
+            oled.Label((uint8_t *)"I_Th:", 5, 30);
+            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 *)"Next",60,80);  //Display "Next" at x,y
+            textProperties.fontColor = COLOR_GREEN;
+            oled.SetTextProperties(&textProperties);
+            oled.Label((uint8_t *)display_buff,43,30); // Display at x,y
+            textProperties.fontColor = COLOR_WHITE;
+            oled.SetTextProperties(&textProperties);
+            break;
+        }
+        case 44: { //Motion Thresh
+            oled.FillScreen(COLOR_BLACK);
+            oled.Label((uint8_t *)"Adj M-Th", 10, 5);
+            sprintf(display_buff, "%4.0f D/S", Movement_Thresh); //Convert int to char array for displaying mode
+            oled.Label((uint8_t *)"M_Th:", 5, 30);
+            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 *)"Next",60,80);  //Display "Next" at x,y
+            textProperties.fontColor = COLOR_GREEN;
+            oled.SetTextProperties(&textProperties);
+            oled.Label((uint8_t *)display_buff,43,30); // Display at x,y
+            textProperties.fontColor = COLOR_WHITE;
+            oled.SetTextProperties(&textProperties);
+            break;
         }
 #endif  // end of non-production/debug version code
+
+        case 71: {// BLE
+            oled.FillScreen(COLOR_BLACK); // Clear screen
+            oled.Label((uint8_t *)"BLUETOOTH",5,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 72: {// BlueTooth on/off
+            oled.FillScreen(COLOR_BLACK); // Clear screen
+            oled.Label((uint8_t *)"BLUETOOTH",5,5); // Display at x,y
+            if (BLE_On == 1) {
+                strcpy((char *) text,"PAIR CODE");
+                oled.TextBox((uint8_t *)text,5,25,85,18);
+                /* Display Bond Pass Key in a 85px by 18px textbox at x=5,y=25 */
+                
+/* This part was not compiling
+                sprintf(text,"%d", kw40z_device.GetPassKey());
+                oled.TextBox((uint8_t *)text,0,40,95,18);
+*/        
+                oled.TextBox((uint8_t *)"Passkey",5,40,85,18); //show passkey in a 85px by 18px text box at x=5, y=40
+            } else {
+                oled.Label((uint8_t *)" Off ",40,40);
+            }
+  //          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;
+        }
+
+
         default: {
             Error_Num=1;
             error_screen(); // Clear screen
             break;
         }
-    }
-}
+    }//end of switch
+    __enable_irq();     // Enable all Interrupts
+}// end upday_display()
+
 void error_screen(void)
 {
     oled.FillScreen(COLOR_RED); // Clear screen
@@ -1416,7 +1866,10 @@
 ******************************************************************************/
 void StartHaptic(void)
 {
-    hapticTimer.start(30);  // was originaly 50
+    hapticTimer.start(30);  // was originaly 50, then 30 
+    /* this 30 value seems to not work after Neil added a global 
+    __disable_irq() and __enable_irq() for the update_display() functions on 2/18/18
+    */
     haptic = 1;
 }
 
@@ -1426,8 +1879,9 @@
 Inputs: An int representing the duration of the vibration
 Returns: None
 ******************************************************************************/
+
 void StartHaptic(int x)
-{
+{   
     hapticTimer.start(x);
     haptic = 1;
 }
@@ -1795,11 +2249,10 @@
          
 //__disable_irq();    // Disable all Interrupts
 //    oled.Label((uint8_t *)" Fall Detected ",05,70); // Display at x,y 
- 
     update_display();
             Accel_Mag = 2*sqrt(((Accel_Data_Event[0]*Accel_Data_Event[0])+(Accel_Data_Event[1]*Accel_Data_Event[1])+(Accel_Data_Event[2]*Accel_Data_Event[2])));
             sprintf(text_1,"Free-Fall:%2.2fg",Accel_Mag);
-            oled.Label((uint8_t *)text_1,10,5);// text_1 at x,y
+            oled.Label((uint8_t *)text_1,2,5);// text_1 at x,y
 
     BLU_Led = LED_ON;  // LEDs default to on, need to turn off
     Led_clk2 = 1;  // Turn LED2 on docking station on
@@ -1818,7 +2271,7 @@
     haptic = 0;         // Turn off Haptic
     BLU_Led = LED_OFF;  // Turn off HexiHeart Blue LED
     Led_clk2 = 0;       // Turn off LED2 on docking station on
-    oled.Label((uint8_t *)"                         ",05,70); // clear display at x,y
+ //   oled.Label((uint8_t *)"                         ",05,70); // clear display at x,y
     Accel_INT1.fall(&fall_detect); // Accel sensor's int#1 calls interupt routine
 }    //end fall_det_end interupt routine
 
@@ -1841,9 +2294,9 @@
     //        update_display();
             
             accel.acquire_accel_data_g(Accel_Data);
-             Accel_Mag = 2*sqrt(((Accel_Data_Event[0]*Accel_Data_Event[0])+(Accel_Data_Event[1]*Accel_Data_Event[1])+(Accel_Data_Event[2]*Accel_Data_Event[2])));
+            Accel_Mag = 2*sqrt(((Accel_Data_Event[0]*Accel_Data_Event[0])+(Accel_Data_Event[1]*Accel_Data_Event[1])+(Accel_Data_Event[2]*Accel_Data_Event[2])));
             sprintf(text_1,"Impact:%2.2fg",Accel_Mag);
-            oled.Label((uint8_t *)text_1,10,20);// text_1 at x,y
+            oled.Label((uint8_t *)text_1,3,20);// text_1 at x,y
  
          Led_clk3 = 1;  // Turn LED2 on docking station on
  }// end if     
@@ -1857,26 +2310,24 @@
 Returns: None
 ******************************************************************************/
       
-
 void fall_config(uint8_t Num){ 
 // use case switches here to configure for 
-switch(Num) {
-                case 0: {// configure as normal (or maybe sleep)
+switch(Num) {           
+                case 0: {// put in standby
                   char d[2]; 
                     d[0] = FXOS8700_CTRL_REG1;                     //Puts device in Standby mode
                     d[1] = 0x00; 
-                    i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2);
+                    i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2);                  
                     
-                    d[0] = FXOS8700_CTRL_REG1;                     //Puts device back into active mode
-                    d[1] = 0x01;
-                    i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d, 2);
+                    /*For lowest power ~8uA, set ODR-12.5Hz,(low-pwr accel mode) or 2uA in standby mode */
                     oled.Label((uint8_t *)" Mode 0 ",30,60); // Display "mode" at x,y
-                    break;
-                }
-                case 1: {// configure for free-fall int
-                    StartHaptic();  // for debug
+                    oled.Label((uint8_t *)" No Int",30,75); // Display "mode" at x,y 
+                    break;      
+                }// end of case 0
+                
+                case 1: {// configure for free-fall int only
                     char d[2]; 
-                    d[0] = FXOS8700_CTRL_REG1;                      //Config reg1
+                    d[0] = 0x2a;                                       //0x2a Config reg1
                     d[1] = 0x00;                                    //Put device in Standby mode
                     if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
                         oled.Label((uint8_t *)" Step1 error ",30,05); // Display "error" at x,y                  
@@ -1884,19 +2335,19 @@
                     }//end if
                     
                     d[0] = 0x0e;                                    //XYZ_DATA_CFG (set full-scall range)
-                    d[1] = 0b00000000;                              //Set data to default range of +/-2g for full range (2x0.488mg/LSB), High-pass filter off
+                    d[1] = 0b00000001;                              //Set data to default range of +/-2g for full range (2x0.488mg/LSB), High-pass filter off
                     if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
                         oled.Label((uint8_t *)" Step1a error ",30,05); // Display "error" at x,y      
                         wait(3.0); // display for 3 seconds
                     }//end if
- 
-                    d[0] = 0x0a;                                    //TRIG_CFG (address of trigger config reg)
+ /*
+                    d[0] = 0x0a;                                    //TRIG_CFG (address of FIFO trigger config reg)
                     d[1] = 0b00000100;                              //Trigger on freefall
                     if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
                         oled.Label((uint8_t *)" Step2 error ",30,05); // Display "error" at x,y      
                         wait(3.0); // display for 3 seconds
                     }//end if
-                    
+ */                   
                     d[0] = 0x15;                                    //A_FFMT_CFG (address of Free fall trigger config reg), write in Standby only
                     d[1] = 0b00111000;                              //set to freefall, and look at all axis.
                     if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
@@ -1939,7 +2390,7 @@
                         oled.Label((uint8_t *)" Step8 error ",30,05); // Display "error" at x,y 
                         wait(3.0); // display for 3 seconds
                     }//end if            
-                 
+                    
                     d[0] = 0x2e;                                    //CTRL_REG5 (Int routing reg), write in Standby only
                     d[1] = 0b00000100;                              // Make FFMT int output on pin INT1(PTC1)
                     if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
@@ -1947,7 +2398,7 @@
                         wait(3.0); // display for 3 seconds
                     }//end if                  
                     
-                    d[0] = FXOS8700_CTRL_REG1;                     //CTRL_REG1, write in Standby only except for bit[0]
+                    d[0] = 0x2a;                         //0x2a Config reg1, write in Standby only except for bit[0]
                     d[1] = 0b00011001;                    //Auto-Sleep mode on set to 50Hz, ODR set to 100Hz Puts device back into Active mode 
                     if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
                         oled.Label((uint8_t *)" Step10 error ",30,05); // Display "error" at x,y 
@@ -1955,16 +2406,13 @@
                     }//end if  
                     
                     //oled.FillScreen(COLOR_BLACK); // Clear screen
-                    oled.Label((uint8_t *)" Mode 1 ",30,60); // Display "mode" at x,y   
-                    GRN_Led = LED_ON;  // LEDs default to on, need to turn on     
+                    oled.Label((uint8_t *)" Mode 1 ",30,60); // Display "mode" at x,y
+                    oled.Label((uint8_t *)"  FF ",30,75); // Display "mode" at x,y    
+                        
                     break;
                 }// end of case 1
                 
-                 //  case 2 was an attempt at using vector-mag int for free-fall  
-                               
-                 case 3: {// configure FFMT for free-fall event AND config for vector impact
-
-                    StartHaptic();  // for debug
+                case 2: {// configure for vector impact only
                     char d[2]; 
                     
                     d[0] = FXOS8700_CTRL_REG1;                      //Config reg1 0x2a
@@ -1980,14 +2428,114 @@
                         oled.Label((uint8_t *)" Step1a error ",30,05); // Display "error" at x,y      
                         wait(3.0); // display for 3 seconds
                     }//end if
- 
-                    d[0] = 0x0a;                                    //TRIG_CFG (address of trigger config reg)
+ /*
+                    d[0] = 0x0a;                                    //TRIG_CFG (address of FIFO trigger config reg)
                     d[1] = 0b00000110;                              //Trigger on freefall and on Vector
                     if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
                         oled.Label((uint8_t *)" Step2 error ",30,05); // Display "error" at x,y      
                         wait(3.0); // display for 3 seconds
                     }//end if
+ */                                      
+                    d[0] = 0x5f;                                    //A_VECM_CFG (address of Vector config reg), write in Standby only
+                    d[1] = 0b00111000;                              //Use reference values, don't update ref, enable.
+                    if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
+                        oled.Label((uint8_t *)" Step3 error ",30,05); // Display "error" at x,y 
+                        wait(3.0); // display for 3 seconds
+                    }//end if
+                       
+                    d[0] = 0x60;                                    //A_VECM_MSB (address of Vector threshold reg), write in Active or Standby
+                    d[1] = 0b00000111;                                //set impact threshold to less than 1g for now                   
+  //                 d[1] = uint8_t((1000*Impact_Thresh/0.488)/256);        //set MSB Impact threshold - Resolution is 0.488mg/LSB so 0.5g=1024.6 => MSB=0b00000100 LSB=0b00000000 
+                    if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
+                        oled.Label((uint8_t *)" Step4a error ",30,05); // Display "error" at x,y 
+                        wait(3.0); // display for 3 seconds
+                    }//end if  
+           
+                    d[0] = 0x61;                                    //A_VECM_LSB (address of Vector threshold reg), write in Active or Standby
+                    d[1] = 0b00000011;                                //set impact threshold to less than 1g for now                   
+  //                 d[1] = uint8_t(256*((1000*Impact_Thresh/0.488)%256));  //set MSB Impact threshold - Resolution 0.488mg/LSB so 0.5g=1024.6 => MSB=0b00000100 LSB=0b00000000 
+                    if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
+                        oled.Label((uint8_t *)" Step4b error ",30,05); // Display "error" at x,y 
+                        wait(3.0); // display for 3 seconds
+                    }//end if             
+                     
+                    d[0] = 0x62;                                    //A_VECM_COUNT (address of Vector debounce counter), write in Active or Standby
+                    d[1] = 0b00000110;                              //with ODR at 100Hz, should equal ??mS debounce time or ??mS in Sleep
+                    if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
+                        oled.Label((uint8_t *)" Step5 error ",30,05); // Display "error" at x,y 
+                        wait(3.0); // display for 3 seconds
+                    }//end if 
+                           
+                   // Registers 0x63 - 0x68 are vector reference values which I'm leaving set to 0 because we want absolute measurements    
+                                  
+                    d[0] = 0x2b;                                    //CTRL_REG2 (address of control reg), write in Standby only
+                    d[1] = 0b00001101;                              //Turns Auto-Sleep mode on and low-noise, low power
+                    if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
+                        oled.Label((uint8_t *)" Step6 error ",30,05); // Display "error" at x,y 
+                        wait(3.0); // display for 3 seconds
+                    }//end if    
                     
+                    d[0] = 0x2c;                                    //CTRL_REG3 (address of Int control reg), write in Standby only
+                    d[1] = 0b00000100;                              //Vector will wake chip from sleep, int are active high
+  //                  d[1] = 0b00001000;                              //FFMT will wake chip from sleep, int are active high
+                    if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
+                        oled.Label((uint8_t *)" Step7 error ",30,05); // Display "error" at x,y 
+                        wait(3.0); // display for 3 seconds
+                    }//end if    
+                        
+                    d[0] = 0x2d;                                    //CTRL_REG4 (address of Int enable reg), write in Standby only
+                    d[1] = 0b00000010;                              // Vector int enabled
+ //                   d[1] = 0b00000100;                              // FFMT int enabled 
+                    if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
+                        oled.Label((uint8_t *)" Step8 error ",30,05); // Display "error" at x,y 
+                        wait(3.0); // display for 3 seconds
+                    }//end if            
+                    wait(0.2);  // people have had a problem here and needed a delay
+                    d[0] = 0x2e;                                    //CTRL_REG5 (Int routing reg), write in Standby only
+                    d[1] = 0b00000100;                              // Make FFMT int output on pin INT1(PTC1) and Vector on INT2(PTD13)
+                    if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
+                        oled.Label((uint8_t *)" Step9 error ",30,05); // Display "error" at x,y 
+                        wait(3.0); // display for 3 seconds
+                    }//end if                  
+                    
+                    d[0] = FXOS8700_CTRL_REG1;                     //CTRL_REG1, write in Standby only except for bit[0]
+                    d[1] = 0b00011001;                              //Auto-Sleep mode on set to 50Hz, ODR set to 100Hz Puts device back into Active mode 
+                    if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
+                        oled.Label((uint8_t *)" Step10 error ",30,05); // Display "error" at x,y 
+                        wait(3.0); // display for 3 seconds
+                    }//end if  
+                    
+                    //oled.FillScreen(COLOR_BLACK); // Clear screen
+                    oled.Label((uint8_t *)" Mode 2 ",30,60); // Display "mode" at x,y   
+                    oled.Label((uint8_t *)"Imp ",30,75); // Display "mode" at x,y 
+                    break;
+                }// end of case 2    
+                               
+                 case 3: {// configure FFMT for free-fall event AND config for vector impact
+
+                    char d[2]; 
+                    
+                    d[0] = 0x2a;                                    //0x2a Config reg1,  
+                    d[1] = 0x00;                                    //Put device in Standby mode
+                    if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
+                        oled.Label((uint8_t *)" Step1 error ",30,05); // Display "error" at x,y                  
+                        wait(3.0); // display for 3 seconds
+                    }//end if 
+ 
+                    d[0] = 0x0e;                                    //XYZ_DATA_CFG (set full-scall range)
+                    d[1] = 0b00000001;                              //Set data to +/-4g for full range (0.488mg/LSB), High-pass filter off
+                    if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
+                        oled.Label((uint8_t *)" Step1a error ",30,05); // Display "error" at x,y      
+                        wait(3.0); // display for 3 seconds
+                    }//end if
+ /*
+                    d[0] = 0x0a;                                    //TRIG_CFG (address of FIFO trigger config reg)
+                    d[1] = 0b00000110;                              //Trigger on freefall and on Vector
+                    if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
+                        oled.Label((uint8_t *)" Step2 error ",30,05); // Display "error" at x,y      
+                        wait(3.0); // display for 3 seconds
+                    }//end if
+  */                  
                     d[0] = 0x15;                                    //A_FFMT_CFG (address of Free fall trigger config reg), write in Standby only
                     d[1] = 0b00111000;                              //set to freefall, and look at all axis.
                     if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
@@ -2018,7 +2566,7 @@
                     }//end if
                        
                     d[0] = 0x60;                                    //A_VECM_MSB (address of Vector threshold reg), write in Active or Standby
-                    d[1] = 0b00001111;                                //set impact threshold to less than 1g for now                   
+                    d[1] = 0b00000111;                                //set impact threshold to less than 1g for now                   
   //                 d[1] = uint8_t((1000*Impact_Thresh/0.488)/256);        //set MSB Impact threshold - Resolution is 0.488mg/LSB so 0.5g=1024.6 => MSB=0b00000100 LSB=0b00000000 
                     if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
                         oled.Label((uint8_t *)" Step4a error ",30,05); // Display "error" at x,y 
@@ -2062,7 +2610,8 @@
                         oled.Label((uint8_t *)" Step8 error ",30,05); // Display "error" at x,y 
                         wait(3.0); // display for 3 seconds
                     }//end if            
-                 
+                    wait(0.2);  // people have had a problem here and needed a delay
+                    
                     d[0] = 0x2e;                                    //CTRL_REG5 (Int routing reg), write in Standby only
                     d[1] = 0b00000100;                              // Make FFMT int output on pin INT1(PTC1) and Vector on INT2(PTD13)
                     if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
@@ -2070,7 +2619,7 @@
                         wait(3.0); // display for 3 seconds
                     }//end if                  
                     
-                    d[0] = FXOS8700_CTRL_REG1;                     //CTRL_REG1, write in Standby only except for bit[0]
+                    d[0] = 0x2a;                          //0x2a Config reg1, write in Standby only except for bit[0]
                     d[1] = 0b00011001;                    //Auto-Sleep mode on set to 50Hz, ODR set to 100Hz Puts device back into Active mode 
                     if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
                         oled.Label((uint8_t *)" Step10 error ",30,05); // Display "error" at x,y 
@@ -2078,25 +2627,60 @@
                     }//end if  
                     
                     //oled.FillScreen(COLOR_BLACK); // Clear screen
-                    oled.Label((uint8_t *)" Mode 3 ",30,60); // Display "mode" at x,y   
-          //          GRN_Led = LED_ON;  // LEDs default to on, need to turn on  
- 
-
+                    oled.Label((uint8_t *)" Mode 3 ",30,60); // Display "mode" at x,y
+                    oled.Label((uint8_t *)"FF & Imp",30,75); // Display "mode" at x,y    
                     break;
                 }// end of case 3
                        
                 case 10: {// reset IC 
                   char d[2]; 
+                    d[0] = 0x2a;                          //0x2a Config reg1
+                    d[1] = 0x00;                                    //Put device in Standby mode
+                    if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
+                        oled.Label((uint8_t *)" Step1 error ",30,05); // Display "error" at x,y                  
+                        wait(3.0); // display for 3 seconds
+                    }//end if
+                       
                     d[0] = 0x2b;                                //CTRL_REG2 
                     d[1] = 0b01000000;                          // set bit to force reset of FXOS8700 
                     if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
                         oled.Label((uint8_t *)" Reset error ",30,05); // Display "error" at x,y 
                         wait(3.0); // display for 3 seconds
                     }//end if    
-                    oled.Label((uint8_t *)" reset ",30,60); // Display "reset" at x,y
+                    oled.Label((uint8_t *)" Reset ",30,45); // Display "reset" at x,y
                     break;
                 }// end case 10      
                 
+                case 11: {// wake for read, was in stanby
+                  char d[2];
+                    d[0] = FXOS8700_CTRL_REG1;                     //Puts device in Standby mode just in case
+                    d[1] = 0x00; 
+                    i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2); 
+                      
+                    d[0] = 0x0e;                                    //XYZ_DATA_CFG (set full-scall range)
+                    d[1] = 0b00000001;                              //Set data to +/-4g for full range (0.488mg/LSB), High-pass filter off
+                    i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2);  
+                                               
+                    /*For lowest power ~8uA, set ODR-12.5Hz,(low-pwr accel mode) or 2uA in standby mode */        
+                    d[0] = 0x2a;                          //0x2a Config reg1, write in Standby only except for bit[0]
+                    d[1] = 0b00011001;                    //Auto-Sleep mode on set to 50Hz, ODR set to 100Hz Puts device back into Active mode 
+                    i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d, 2);
+                    break;
+                }// end of case 11 
+                
+                case 12: {// put into standby
+                  char d[2]; 
+                    d[0] = FXOS8700_CTRL_REG1;                     //Puts device in Standby mode
+                    d[1] = 0x00; 
+                    i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2);                  
+                    
+                    /*For lowest power ~8uA, set ODR-12.5Hz,(low-pwr accel mode) or 2uA in standby mode */
+                    
+
+                    break;
+                }// end of case 11             
+                
+                
                 default: {
                     oled.Label((uint8_t *)" Mode ? ",30,60); // Display "mode" at x,y
                     // unknown config
@@ -2106,3 +2690,98 @@
 
 }// end Fall_config
 
+/*****************************************************************************
+Name: update_display_date
+Purpose: Updating display data without updating any data labels.  This keeps
+measurements and time values current while reducing screen flicker.
+******************************************************************************/
+void update_display_date(void)
+{
+    oled_text_properties_t textProperties = {0};  // Need these to change font color
+    oled.GetTextProperties(&textProperties);      // Need these to change font color
+    __disable_irq();    // Disable all Interrupts
+    
+        switch(Screen_Num) {
+    case 0: {// Main Screen
+            HexiwearBattery battery;
+            battery.sensorOn();  
+            if (battery.isBatteryCharging()) {
+            textProperties.fontColor = COLOR_GREEN;
+            oled.SetTextProperties(&textProperties);  
+                     
+            sprintf(text_1, "%i%%+", (uint8_t)battery.readLevelPercent());
+  //          Screen_Timer.attach(&timout_timer,(SCRN_TIME));// Reset/restart ticker timer for OLED while fully charged
+            } else {
+            sprintf(text_1, "%i%%", (uint8_t)battery.readLevelPercent());
+            }
+            oled.TextBox((uint8_t *)text_1,60,0,35,15); //show level value of battery in a 35px by 15px text box at x=60, y=0
+
+            textProperties.fontColor = COLOR_WHITE;
+            oled.SetTextProperties(&textProperties);  
+           
+// added real time and date information            
+            char buffer[32];
+            time_t seconds = time(NULL);
+            strftime(buffer,32, "%a,%d %m %Y.%H:%M:%S\r", localtime(&seconds));
+//        sprintf(text_1,"%c%c/%c%c/%c%c%c%c ",buffer[7],buffer[8],buffer[4],buffer[5],buffer[10],buffer[11],buffer[12],buffer[13]);
+//        oled.Label((uint8_t *)text_1,20,20);// Date at x,y
+            sprintf(text_1,"%c%c:%c%c:%c%c ",buffer[15],buffer[16],buffer[18],buffer[19],buffer[21],buffer[22]);
+            oled.Label((uint8_t *)text_1,25,40);// Time at x,y
+   
+            Heat_Index_Calculation();
+            sprintf(text,"%i",heat_index);
+            oled.TextBox((uint8_t *)text,3,80,15,15); //show HI in a 15px by 15px text box at x=3, y=80
+            break;
+        }// end case 0
+                     
+            case 21: {// Fall Alert Diagnostic Screen
+            if(Fall_Alert_Mode == 0){
+                fall_config(11); // turn accel sensor to active to take reading
+            }
+            textProperties.fontColor = COLOR_WHITE;
+            oled.SetTextProperties(&textProperties);
+            gyro.acquire_gyro_data_dps(Gyro_Data);
+            Gyro_Mag = (abs(Gyro_Data[0])+abs(Gyro_Data[1])+abs(Gyro_Data[2]));
+            sprintf(text_1," %4.0f D/S  ",Gyro_Mag);
+            oled.Label((uint8_t *)text_1,42,60);// text_1 at x,y
+            
+            accel.acquire_accel_data_g(Accel_Data);
+            if(Fall_Alert_Mode == 0){
+                fall_config(12); // turn accel sensor back to standby
+            }
+            Accel_Mag = 2*sqrt(((Accel_Data[0]*Accel_Data[0])+(Accel_Data[1]*Accel_Data[1])+(Accel_Data[2]*Accel_Data[2])));
+            sprintf(text_1," %2.2f g  ",Accel_Mag);
+            oled.Label((uint8_t *)text_1,44,40);// text_1 at x,y
+            if(Accel_Mag > Fall_Thresh + 0.1 && Led_clk2 == 1){// are we stuck in limbo?
+            fall_det_end(); 
+            }
+            break;
+        }//end case 21       
+            
+            default: {
+                    // do nothing for other screens
+             break;
+                } 
+    }// end switch   
+    __enable_irq();     // Enable all Interrupts 
+}// end of update_display_date
+
+
+/*****************************************************************************
+Name: BLUETOOTH
+Purpose: HexiHeart Connecction
+Inputs: None
+Returns: None
+******************************************************************************/
+
+
+void txTask(void)
+{
+
+    while (true) {
+        /*Notify Hexiwear App that it is running Sensor Tag mode*/
+ /*    This part was not compiling   
+      kw40z_device.SendSetApplicationMode(GUI_CURRENT_APP_SENSOR_TAG);
+ */     
+    }
+}
\ No newline at end of file