The HexiHeart is a demo project product that takes advantage of many of the onboard Hexiwear sensors and capabilities to create a multifunctional fitness and safety watch.

Dependencies:   FXAS21002 FXOS8700 Hexi_KW40Z Hexi_OLED_SSD1351 MAXIM W25Q64FVSSIG HTU21D MPL3115A2 TSL2561

Fork of HexiHeart_Alex by Hexiwear_zeta

Committer:
nbaker
Date:
Tue Mar 06 00:22:47 2018 +0000
Revision:
9:d2e39ee9fedd
Parent:
8:a5c77b45008d
Child:
10:eaea844e763c
Fixed impact detect functionality, all fall detect parameters are now adjustable, added motion detect function, incorporated new heat index calc, increased font by 20% for time/date. Added SW and power resetting to initialize sensors in known state.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
asong 1:e4b38d6918ba 1 /**********************************************************************
nbaker 9:d2e39ee9fedd 2 Texas State University Senior Project - HexiHeart
nbaker 0:d1d36a3da39b 3 Team Zeta: Alex Song, Jasmine Rounsaville, Issam Hichami, Neil Baker
nbaker 9:d2e39ee9fedd 4
nbaker 9:d2e39ee9fedd 5 Program layout:
nbaker 9:d2e39ee9fedd 6 Declarations
nbaker 9:d2e39ee9fedd 7 Up Button routines
nbaker 9:d2e39ee9fedd 8 Down Button routines
nbaker 9:d2e39ee9fedd 9 Right Button routines
nbaker 9:d2e39ee9fedd 10 Left Button routines
nbaker 9:d2e39ee9fedd 11 Main()
nbaker 9:d2e39ee9fedd 12 Main display screen routines
nbaker 9:d2e39ee9fedd 13 Function and interupt routines
nbaker 9:d2e39ee9fedd 14 Display data screen update routines
nbaker 9:d2e39ee9fedd 15
nbaker 9:d2e39ee9fedd 16 v2.08 - Fixed impact detect functionality, all fall detect parameters are now adjustable,
nbaker 9:d2e39ee9fedd 17 added motion detect function, incorporated new heat index calc, increased font by 20% for time/date.
nbaker 9:d2e39ee9fedd 18 Added SW and power resetting to initialize sensors in known state.
nbaker 9:d2e39ee9fedd 19
nbaker 9:d2e39ee9fedd 20 v2.07 - 2/18/18 - Added fall mode option to test fall/impact separately, Added global
nbaker 9:d2e39ee9fedd 21 interrupt disable prevent button interrupts while refreshing screen, this caused haptic
nbaker 9:d2e39ee9fedd 22 timer to stop working right.
nbaker 9:d2e39ee9fedd 23
nbaker 9:d2e39ee9fedd 24 v1.0 - 11/12/17
nbaker 0:d1d36a3da39b 25 This version has basic menu layout and screen timeout feature. The menu
asong 1:e4b38d6918ba 26 are just placeholders (for the most part) and will be either adjusted or
nbaker 0:d1d36a3da39b 27 replaced with graphic images.
nbaker 0:d1d36a3da39b 28
nbaker 0:d1d36a3da39b 29 ***********************************************************************/
nbaker 0:d1d36a3da39b 30
nbaker 0:d1d36a3da39b 31 #include "mbed.h"
nbaker 0:d1d36a3da39b 32 #include "Hexi_KW40Z.h" // Button and BLE fuctions
nbaker 9:d2e39ee9fedd 33 #include "FXOS8700.h" // Freescale/NXP FXOS8700CQ - 3D Accelorometer & Mag
nbaker 9:d2e39ee9fedd 34 #include "FXAS21002.h" // Freescale/NXP FXAS21002CQ - 3-Axis Gyroscope
nbaker 9:d2e39ee9fedd 35 //#include "MPL3115A2.h" // Freescale/NXP MPL3115A2 - pressure sensor
nbaker 9:d2e39ee9fedd 36 #include "HTU21D.h" // Non-Freescale/NXP - HTU21D - combo temperature and Humidity
nbaker 9:d2e39ee9fedd 37 #include "W25Q64FV.h" // Non-Freescale/NXP - W25Q64FVSSIG - 8MB/64Mbit Serial Flash memory
nbaker 9:d2e39ee9fedd 38 #include "MAX30101.h" // Non-Freescale MAX30101 - Optical Heart rate sensor
nbaker 9:d2e39ee9fedd 39 //#include "TSL2561.h" // Non-Freescale/NXP TSL2561 - light sensor
nbaker 9:d2e39ee9fedd 40 #include "Hexi_Battery/hexi_battery.h" // Battery status
nbaker 0:d1d36a3da39b 41 #include "Hexi_OLED_SSD1351.h" // OLED fuctions
nbaker 0:d1d36a3da39b 42 #include "OLED_types.h" // Text attributs
nbaker 0:d1d36a3da39b 43 #include "string.h"
nbaker 0:d1d36a3da39b 44 #include "OpenSans_Font.h"
nbaker 9:d2e39ee9fedd 45 #include "images.h"
asong 1:e4b38d6918ba 46
asong 2:824ed4ae8d52 47
nbaker 0:d1d36a3da39b 48 // Definitions
nbaker 9:d2e39ee9fedd 49 #define SW_Ver 2.08 // For displaying software version
asong 2:824ed4ae8d52 50 #define LED_ON 0
asong 2:824ed4ae8d52 51 #define LED_OFF 1
asong 2:824ed4ae8d52 52 #define SCRN_TIME 10.0
asong 2:824ed4ae8d52 53 #define Debug 1 // If "Debug" is defined, our code will compile for debug. Comment out for Production code.
asong 2:824ed4ae8d52 54 #define HIGHEST_ZONE 4
asong 2:824ed4ae8d52 55 #define LOWEST_ZONE 1
asong 2:824ed4ae8d52 56 #define ENTER_BELOW 25
asong 2:824ed4ae8d52 57 #define ENTER_ABOVE 50
asong 2:824ed4ae8d52 58 #define EXIT_BELOW 75
asong 2:824ed4ae8d52 59 #define EXIT_ABOVE 100
asong 2:824ed4ae8d52 60 #define VIB_OPT_2 75
nbaker 4:0803151bc5e4 61 #define FXOS8700_I2C_ADDRESS_ (0x1E<<1) //pins SA0,SA1=0
nbaker 9:d2e39ee9fedd 62 #define FXAS21002_I2C_ADDRESS_ 0x40 //
nbaker 9:d2e39ee9fedd 63 //#define TSL2561_I2C_ADDRESS_ (0x29 << 1) // Address select line is grounded
nbaker 9:d2e39ee9fedd 64 //#define MPL3115A2_I2C_ADDRESS_ ? //
asong 1:e4b38d6918ba 65
nbaker 0:d1d36a3da39b 66 void StartHaptic(void);
asong 1:e4b38d6918ba 67 void StartHaptic(int x);
nbaker 0:d1d36a3da39b 68 void StopHaptic(void const *n);
nbaker 9:d2e39ee9fedd 69 void error_screen(void); // display error screen
nbaker 4:0803151bc5e4 70 void update_display(void);// Screen lables refreshed
nbaker 8:a5c77b45008d 71 void update_display_date(void); // Screen data(only)refreshed
asong 2:824ed4ae8d52 72 void Decrement_Age();
asong 2:824ed4ae8d52 73 void Set_Max_Bpm();
asong 2:824ed4ae8d52 74 void Set_Zone_Boundaries();
asong 2:824ed4ae8d52 75 void Increment_Age();
asong 2:824ed4ae8d52 76 void Increment_Target_Zone();
asong 2:824ed4ae8d52 77 void Decrement_Target_Zone();
asong 2:824ed4ae8d52 78 void Increment_HR_Vibr_Pref();
asong 2:824ed4ae8d52 79 void Decrement_HR_Vibr_Pref();
asong 2:824ed4ae8d52 80 void Determine_Current_Zone();
asong 2:824ed4ae8d52 81 void Heart_Rate_Vibrations();
asong 2:824ed4ae8d52 82 void Increment_Heart_Rate();
asong 2:824ed4ae8d52 83 void Decrement_Heart_Rate();
asong 2:824ed4ae8d52 84 void Enable_Heart_Rate();
asong 2:824ed4ae8d52 85 void Disable_Heart_Rate();
asong 2:824ed4ae8d52 86 void Led_Zone_Indicator();
jmr274 5:e1431272be79 87 void Heat_Index_Calculation();
nbaker 4:0803151bc5e4 88 void fall_config(uint8_t);
nbaker 9:d2e39ee9fedd 89 void gyro_sensor_config(uint8_t);
nbaker 9:d2e39ee9fedd 90 void light_config(uint8_t);
nbaker 9:d2e39ee9fedd 91 void press_config(uint8_t);
nbaker 4:0803151bc5e4 92 void fall_detect(void);
nbaker 4:0803151bc5e4 93 void fall_det_end(void);
nbaker 4:0803151bc5e4 94 void fall_detect_off(void);
nbaker 4:0803151bc5e4 95 void impact_detect(void);
nbaker 9:d2e39ee9fedd 96 void motion_detect();
nbaker 9:d2e39ee9fedd 97 void MAX30101_test_config(uint8_t);
nbaker 9:d2e39ee9fedd 98
asong 1:e4b38d6918ba 99
nbaker 0:d1d36a3da39b 100 // ***************** Global variables ***********************
nbaker 0:d1d36a3da39b 101 char text_1[20]; // Text buffer - Do we need more?
asong 2:824ed4ae8d52 102 char display_buff[30]; //Buffer for conversion to char to display
jmr274 5:e1431272be79 103 char text[20]; // Text Buffer for dynamic value displayed
nbaker 8:a5c77b45008d 104 bool BLE_On = 0; // Initialize as BLE on
nbaker 8:a5c77b45008d 105 char pass [20]; // Passcode
asong 2:824ed4ae8d52 106 bool Led_Zones = 1;
asong 1:e4b38d6918ba 107 bool HR_Enable = 0;
nbaker 0:d1d36a3da39b 108 bool OLED_ON = 1; // Turn OLED power on/off
nbaker 4:0803151bc5e4 109 bool Fall_Alert = 1; // Initialize as no active alert
jmr274 5:e1431272be79 110 bool Panic_Alert = 0; // Initialize as no active alert
nbaker 9:d2e39ee9fedd 111 uint8_t Fall_Alert_Mode = 4; // Initialize with fall alert mode on
jmr274 5:e1431272be79 112 bool Heart_Rate_Mode = 0; // Initialize with Heart rate off
nbaker 0:d1d36a3da39b 113 float Accel_Mag=0.0; // Vector magnitude calculated from sensor data
nbaker 0:d1d36a3da39b 114 float Accel_Data[3]; // Accel Data from sensor
nbaker 7:3d5a8aea0b63 115 float Accel_Data_Event[3]; // Accel Data from sensor at interupt
jmr274 5:e1431272be79 116 float Gyro_Mag=0.0; // Vector magnitude calculated from sensor data
jmr274 5:e1431272be79 117 float Gyro_Data[3]; // Gyro data from sensor
jmr274 5:e1431272be79 118 float Fall_Thresh=0.5; // Initialize Fall detect Threshold
jmr274 5:e1431272be79 119 float Impact_Thresh=3.0; // Initialize Impact detect Threshold
jmr274 5:e1431272be79 120 float Movement_Thresh=50.0; // Initialize Movement detect Threshold
nbaker 9:d2e39ee9fedd 121 float Min_Movement_Time=5.0; // Initialize Movement minimum movement time to 5 sec
nbaker 9:d2e39ee9fedd 122 float Min_Movement_duration=60.0; // Initialize Movement min-movement testing duration to 60 sec
asong 2:824ed4ae8d52 123 uint8_t Current_Zone = 1;
asong 2:824ed4ae8d52 124 uint8_t Prev_Zone = 1;
asong 2:824ed4ae8d52 125 uint8_t Heart_Rate = 100;
asong 1:e4b38d6918ba 126 uint8_t HR_buff[250];
asong 1:e4b38d6918ba 127 uint8_t *HR_return;
asong 1:e4b38d6918ba 128 uint8_t Age = 50; // Initialize age
asong 2:824ed4ae8d52 129 uint8_t Max_Bpm = 220 - Age; // Initialize Max BPM
nbaker 0:d1d36a3da39b 130 uint8_t Screen_Num = 0; // Initialize to main screen
asong 1:e4b38d6918ba 131 uint8_t Error_Num = 0; // Error num for debug
asong 2:824ed4ae8d52 132 uint8_t HR_Vibration = 2; //Choose Heart Rate Vibration Options
asong 2:824ed4ae8d52 133 uint8_t Target_Zone = 2; //Initialize Target Heart Rate Zone to Zone 3
asong 2:824ed4ae8d52 134 uint8_t HR_Zone1[2] = {Max_Bpm * .50, Max_Bpm * .60}; //Heart Rate Zone 1
asong 2:824ed4ae8d52 135 uint8_t HR_Zone2[2] = {HR_Zone1[1] + 1, Max_Bpm * .70}; //Heart Rate Zone 2
asong 2:824ed4ae8d52 136 uint8_t HR_Zone3[2] = {HR_Zone2[1] + 1, Max_Bpm * .80}; //Heart Rate Zone 3
asong 2:824ed4ae8d52 137 uint8_t HR_Zone4[2] = {HR_Zone3[1] + 1, Max_Bpm}; //Heart Rate Zone 4
nbaker 9:d2e39ee9fedd 138 int sample_ftemp; // used in Heat index calc
nbaker 9:d2e39ee9fedd 139 int sample_humid; // used in Heat index calc
nbaker 9:d2e39ee9fedd 140 int heat_index; // used in Heat index calc
nbaker 9:d2e39ee9fedd 141 int hi_calc; // used in Heat index calc
nbaker 9:d2e39ee9fedd 142 int adjustment; // used in Heat index calc
nbaker 9:d2e39ee9fedd 143
nbaker 9:d2e39ee9fedd 144 // Pointers for screen images
nbaker 9:d2e39ee9fedd 145 const uint8_t *Hexi_Heart_ = Hexi_Heart_bmp;
nbaker 9:d2e39ee9fedd 146 //const uint8_t *NB_Linkedin = NB_Linkedin_bmp;
nbaker 9:d2e39ee9fedd 147 //const uint8_t *AS_Linkedin = NB_Linkedin_bmp;
nbaker 9:d2e39ee9fedd 148 //const uint8_t *IR_Linkedin = NB_Linkedin_bmp;
nbaker 9:d2e39ee9fedd 149 //const uint8_t *IH_Linkedin = NB_Linkedin_bmp;
nbaker 9:d2e39ee9fedd 150
jmr274 5:e1431272be79 151
nbaker 0:d1d36a3da39b 152 // ***************** Define pins *****************************
nbaker 9:d2e39ee9fedd 153 //W25Q64FVSSIG - 8MB/64Mbit Serial Flash memory (SPI1)(MOSI,SCLK,POWER,CS,RST,DC)
nbaker 9:d2e39ee9fedd 154 //W25Q64FV(PinName mosi, PinName miso, PinName sclk, PinName cs, int frequency=10000000);
nbaker 9:d2e39ee9fedd 155 //MKW40Z (SPI1)
nbaker 9:d2e39ee9fedd 156 SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); // SSD1351 OLED Driver SPI2(MOSI,SCLK,POWER,CS,RST,DC)
nbaker 9:d2e39ee9fedd 157 FXAS21002 gyro(PTC11,PTC10); // Gyroscope (I2C1 data bus(SDA, SCL))
nbaker 9:d2e39ee9fedd 158 FXOS8700 accel(PTC11, PTC10); // Accelorometer (I2C1 data bus(SDA, SCL))
nbaker 9:d2e39ee9fedd 159 FXOS8700 mag(PTC11, PTC10); // Mag (same chip as Accel) (I2C1 data bus(SDA, SCL))
nbaker 9:d2e39ee9fedd 160 //MAX30101 heart(PTB1, PTB0); //Heart Rate Chip (I2C0 data bus(SDA, SCL))
nbaker 9:d2e39ee9fedd 161 HTU21D temphumid(PTB1,PTB0); // HTU21D Sensor (I2C0 data bus(SDA, SCL))
nbaker 9:d2e39ee9fedd 162 //TSL2561 - (PTB1, PTB0); //Amb light sensor (I2C0 data bus(SDA, SCL))
nbaker 0:d1d36a3da39b 163
nbaker 4:0803151bc5e4 164 // initialize I2C bus for FXOS8700, FXAS-Gyro, MPL-Pressure
nbaker 4:0803151bc5e4 165 I2C i2c_bus1(PTC11, PTC10); // (SDA, SCL)
nbaker 9:d2e39ee9fedd 166 // initialize I2C bus for MAX30101, HTU21D, TSL2561
nbaker 9:d2e39ee9fedd 167 I2C i2c_bus0(PTB1, PTB0); // (SDA, SCL)
nbaker 9:d2e39ee9fedd 168
nbaker 9:d2e39ee9fedd 169 // initialize SPI bus for W25Q64FVSSIG, (and MKW40Z if needed)
nbaker 9:d2e39ee9fedd 170 // SPI spi_bus1(PTD6, PTD7, PTD5); // (MOSI, MISO, SCLK) CS=PTD4?(low=select)
nbaker 4:0803151bc5e4 171
nbaker 0:d1d36a3da39b 172 DigitalOut RED_Led(LED1);
nbaker 0:d1d36a3da39b 173 DigitalOut GRN_Led(LED2);
nbaker 0:d1d36a3da39b 174 DigitalOut BLU_Led(LED3);
nbaker 0:d1d36a3da39b 175 DigitalOut haptic(PTB9);
nbaker 4:0803151bc5e4 176 DigitalOut Led_clk1(PTA12);
nbaker 4:0803151bc5e4 177 DigitalOut Led_clk2(PTA13);
nbaker 4:0803151bc5e4 178 DigitalOut Led_clk3(PTA14);
nbaker 4:0803151bc5e4 179
nbaker 9:d2e39ee9fedd 180 DigitalOut OLED_PWR(PTC13); // this pin turns on/off 15V supply to OLED display
nbaker 9:d2e39ee9fedd 181 DigitalOut PowerEN (PTB12); // 3V3B Power Enable for HTU21D (Temp/Hum sensor) and Light sensor Sensor supply
nbaker 9:d2e39ee9fedd 182 DigitalOut HR_PWR(PTA29); // this pin turns on/off power to heart rate sensor
jmr274 5:e1431272be79 183 //DigitalIn Sw1(PTA12); //Switch 'T1' on docking station AND Led_clk1!!
jmr274 5:e1431272be79 184 //DigitalIn Sw2(PTA13); //Switch 'T2' on docking station AND Led_clk2!!
jmr274 5:e1431272be79 185 DigitalIn Sw3(PTA15); //Switch 'T3' on docking station
nbaker 4:0803151bc5e4 186
nbaker 0:d1d36a3da39b 187
asong 1:e4b38d6918ba 188 /* Instantiate the Hexi KW40Z Driver (UART TX, UART RX) */
nbaker 0:d1d36a3da39b 189 KW40Z kw40z_device(PTE24, PTE25);
nbaker 0:d1d36a3da39b 190
nbaker 0:d1d36a3da39b 191 /* Define timer for haptic feedback */
nbaker 0:d1d36a3da39b 192 RtosTimer hapticTimer(StopHaptic, osTimerOnce);
nbaker 0:d1d36a3da39b 193
nbaker 4:0803151bc5e4 194 //***************** Interrups *****************
nbaker 9:d2e39ee9fedd 195 InterruptIn Accel_INT1(PTC1); // Accel sensor's interupt 1
nbaker 9:d2e39ee9fedd 196 InterruptIn Accel_INT2(PTD13); // Accel sensor's interupt 2
nbaker 9:d2e39ee9fedd 197 InterruptIn Gyro_INT1(PTD1); // Gyro sensor's interupt 1
nbaker 9:d2e39ee9fedd 198 InterruptIn Gyro_INT2(PTC18); // Gyro sensor's interupt 2
nbaker 9:d2e39ee9fedd 199 //InterruptIn Amb_Light_INT1(PTC0); // TSL2561- Light sensor's interupt
nbaker 9:d2e39ee9fedd 200 //InterruptIn HR_INT1(PTB18); // MAX30101 - Heart rate sensor's interupt
nbaker 9:d2e39ee9fedd 201 //InterruptIn Pressure_INT1(PTD12); // MPL3115A2 pressure sensor's interupt 1
nbaker 9:d2e39ee9fedd 202 //InterruptIn Pressure_INT2(PTD10); // MPL3115A2 pressure sensor's interupt 2
nbaker 4:0803151bc5e4 203
nbaker 0:d1d36a3da39b 204 //***************** Tickers and Timers *****************
nbaker 0:d1d36a3da39b 205 Ticker Screen_Timer;// use ticker to turn off OLED
nbaker 0:d1d36a3da39b 206
nbaker 4:0803151bc5e4 207 void timout_timer(){ // turn off display mode
nbaker 9:d2e39ee9fedd 208 #ifdef Debug // in debug keep screens on for demo
nbaker 9:d2e39ee9fedd 209 HexiwearBattery battery;
nbaker 9:d2e39ee9fedd 210 battery.sensorOn();
nbaker 9:d2e39ee9fedd 211
nbaker 9:d2e39ee9fedd 212 if (battery.isBatteryCharging() || (uint8_t)battery.readLevelPercent()> 99) {
nbaker 9:d2e39ee9fedd 213 Screen_Timer.attach(&timout_timer,(SCRN_TIME));// Reset/restart ticker timer for OLED while fully charged
nbaker 9:d2e39ee9fedd 214 } //end if
nbaker 9:d2e39ee9fedd 215 else {
nbaker 9:d2e39ee9fedd 216 #endif
nbaker 4:0803151bc5e4 217 // oled.FillScreen(COLOR_BLACK); // Clear screen.. is there a better command for this?
nbaker 4:0803151bc5e4 218 OLED_PWR = 0; // Turn off OLED power supply
nbaker 4:0803151bc5e4 219 OLED_ON = 0; // set flag to off
nbaker 4:0803151bc5e4 220 Screen_Timer.detach(); // detach Ticker
nbaker 9:d2e39ee9fedd 221 #ifdef Debug // in debug keep screens on for demo
nbaker 9:d2e39ee9fedd 222 } // endelse
nbaker 9:d2e39ee9fedd 223 #endif
asong 1:e4b38d6918ba 224 }//end routine
asong 1:e4b38d6918ba 225
nbaker 0:d1d36a3da39b 226 void ButtonUp(void)
nbaker 0:d1d36a3da39b 227 {
asong 1:e4b38d6918ba 228 Screen_Timer.attach(&timout_timer,(SCRN_TIME));//Is this sufficient to reset/restart ticker timer for OLED?
asong 1:e4b38d6918ba 229 if (OLED_ON == 0) {
asong 1:e4b38d6918ba 230 OLED_ON = 1; // Scree was off, set to On
asong 1:e4b38d6918ba 231 update_display();
asong 1:e4b38d6918ba 232 } else {
asong 1:e4b38d6918ba 233 switch(Screen_Num) {
asong 1:e4b38d6918ba 234 case 0: {// We're in Main Screen
asong 1:e4b38d6918ba 235 // do nothing, wrong button
asong 1:e4b38d6918ba 236 break;
asong 1:e4b38d6918ba 237 }
asong 1:e4b38d6918ba 238 case 1: {// Panic Alert option
asong 1:e4b38d6918ba 239 StartHaptic();
nbaker 8:a5c77b45008d 240 Screen_Num = 5; //Change to screen 5
nbaker 0:d1d36a3da39b 241 #ifdef Debug // in debug show debug/diagnostic screens
asong 1:e4b38d6918ba 242 Screen_Num = 26; //Change to screen 20
nbaker 0:d1d36a3da39b 243 #endif
nbaker 0:d1d36a3da39b 244
asong 1:e4b38d6918ba 245 update_display();
asong 1:e4b38d6918ba 246 break;
asong 1:e4b38d6918ba 247 }
asong 1:e4b38d6918ba 248 case 2: {// Fall Alert option
asong 1:e4b38d6918ba 249 StartHaptic();
nbaker 8:a5c77b45008d 250 Screen_Num = 71; //Change to screen 71
asong 1:e4b38d6918ba 251 update_display();
asong 1:e4b38d6918ba 252 break;
asong 1:e4b38d6918ba 253 }
asong 1:e4b38d6918ba 254 case 3: {// Heart Rate Monitoring option
asong 1:e4b38d6918ba 255 StartHaptic();
asong 1:e4b38d6918ba 256 Screen_Num = 2; //Change to screen 2
asong 1:e4b38d6918ba 257 update_display();
asong 1:e4b38d6918ba 258 break;
asong 1:e4b38d6918ba 259 }
asong 1:e4b38d6918ba 260 case 4: {// Alert History option
asong 1:e4b38d6918ba 261 StartHaptic();
asong 1:e4b38d6918ba 262 Screen_Num = 3; //Change to screen 3
asong 1:e4b38d6918ba 263 update_display();
asong 1:e4b38d6918ba 264 break;
asong 1:e4b38d6918ba 265 }
asong 1:e4b38d6918ba 266 case 5: {// About HexiHeart
asong 1:e4b38d6918ba 267 StartHaptic();
asong 1:e4b38d6918ba 268 Screen_Num = 4; //Change to screen 4
asong 1:e4b38d6918ba 269 update_display();
asong 1:e4b38d6918ba 270 break;
asong 1:e4b38d6918ba 271 }
asong 1:e4b38d6918ba 272 case 6: {// Panic Alert
asong 1:e4b38d6918ba 273 StartHaptic();
asong 1:e4b38d6918ba 274 Panic_Alert = !Panic_Alert;
asong 1:e4b38d6918ba 275 update_display();
asong 1:e4b38d6918ba 276 break;
asong 1:e4b38d6918ba 277 }
asong 1:e4b38d6918ba 278 case 7: {// Heart Rate Zone
asong 1:e4b38d6918ba 279 StartHaptic(50);
asong 2:824ed4ae8d52 280 Enable_Heart_Rate();
asong 1:e4b38d6918ba 281 //heart.enable();
asong 1:e4b38d6918ba 282 //HR_Enable = 1;
asong 1:e4b38d6918ba 283 //while(HR_Enable == 1)
asong 1:e4b38d6918ba 284 // heart.readRawData(HR_buff, HR_return);
asong 1:e4b38d6918ba 285 //update_display();
asong 1:e4b38d6918ba 286 break;
asong 1:e4b38d6918ba 287 }
asong 1:e4b38d6918ba 288 case 8: {// Alert History
asong 1:e4b38d6918ba 289 StartHaptic();
asong 1:e4b38d6918ba 290 //Increment alert index
asong 1:e4b38d6918ba 291 break;
asong 1:e4b38d6918ba 292 }
nbaker 8:a5c77b45008d 293 case 9: {// HexiHeart About info1
nbaker 8:a5c77b45008d 294 StartHaptic();
nbaker 8:a5c77b45008d 295 Screen_Num = 11; //Change to screen 11
nbaker 8:a5c77b45008d 296 update_display();
nbaker 8:a5c77b45008d 297 break;
nbaker 8:a5c77b45008d 298 }
nbaker 8:a5c77b45008d 299 case 10: {// HexiHeart About info2
nbaker 8:a5c77b45008d 300 StartHaptic();
nbaker 8:a5c77b45008d 301 Screen_Num = 9; //Change to screen 9
nbaker 8:a5c77b45008d 302 update_display();
nbaker 8:a5c77b45008d 303 break;
nbaker 8:a5c77b45008d 304 }
nbaker 8:a5c77b45008d 305 case 11: {// HexiHeart About info3
nbaker 8:a5c77b45008d 306 StartHaptic();
nbaker 8:a5c77b45008d 307 Screen_Num = 10; //Change to screen 9
nbaker 8:a5c77b45008d 308 update_display();
nbaker 8:a5c77b45008d 309 break;
nbaker 8:a5c77b45008d 310 }
asong 1:e4b38d6918ba 311 case 20: {// Diagnostic/Debug Screens
asong 1:e4b38d6918ba 312 StartHaptic();
asong 1:e4b38d6918ba 313 Screen_Num = 5; //Change to screen 5
asong 1:e4b38d6918ba 314 update_display();
asong 1:e4b38d6918ba 315 break;
asong 1:e4b38d6918ba 316 }
asong 1:e4b38d6918ba 317 case 21: {// Fall Diagnostic
asong 1:e4b38d6918ba 318 StartHaptic();
asong 1:e4b38d6918ba 319 Screen_Num = 25; //Change to screen 25
asong 1:e4b38d6918ba 320 update_display();
asong 1:e4b38d6918ba 321 break;
asong 1:e4b38d6918ba 322 }
asong 1:e4b38d6918ba 323 case 22: {// Fall Debug
asong 1:e4b38d6918ba 324 StartHaptic();
asong 1:e4b38d6918ba 325 Screen_Num = 21; //Change to screen 21
asong 1:e4b38d6918ba 326 update_display();
asong 1:e4b38d6918ba 327 break;
asong 1:e4b38d6918ba 328 }
asong 1:e4b38d6918ba 329 case 23: {// Heart Rate Diagnostic
asong 1:e4b38d6918ba 330 StartHaptic();
asong 1:e4b38d6918ba 331 Screen_Num = 22; //Change to screen 22
asong 1:e4b38d6918ba 332 update_display();
asong 1:e4b38d6918ba 333 break;
asong 1:e4b38d6918ba 334 }
asong 1:e4b38d6918ba 335 case 24: {// Heart Rate Debug
asong 1:e4b38d6918ba 336 StartHaptic();
asong 1:e4b38d6918ba 337 Screen_Num = 23; //Change to screen 23
asong 1:e4b38d6918ba 338 update_display();
asong 1:e4b38d6918ba 339 break;
asong 1:e4b38d6918ba 340 }
asong 1:e4b38d6918ba 341 case 25: {// Heat Index Diagnostic
asong 1:e4b38d6918ba 342 StartHaptic();
asong 1:e4b38d6918ba 343 Screen_Num = 24; //Change to screen 24
asong 1:e4b38d6918ba 344 update_display();
asong 1:e4b38d6918ba 345 break;
asong 1:e4b38d6918ba 346 }
asong 1:e4b38d6918ba 347 case 26: {//Heart Rate Config Option
asong 1:e4b38d6918ba 348 StartHaptic();
asong 1:e4b38d6918ba 349 Screen_Num = 20;
asong 1:e4b38d6918ba 350 update_display();
asong 1:e4b38d6918ba 351 break;
asong 1:e4b38d6918ba 352 }
asong 1:e4b38d6918ba 353 case 27: {//Incrementing Age
asong 2:824ed4ae8d52 354 Increment_Age();
asong 2:824ed4ae8d52 355 Set_Zone_Boundaries();
asong 1:e4b38d6918ba 356 update_display();
asong 1:e4b38d6918ba 357 break;
asong 1:e4b38d6918ba 358 }
asong 1:e4b38d6918ba 359 case 28: {//Changing Heart Rate Vibration Preferences
asong 2:824ed4ae8d52 360 Increment_HR_Vibr_Pref();
asong 1:e4b38d6918ba 361 update_display();
asong 1:e4b38d6918ba 362 break;
asong 1:e4b38d6918ba 363 }
asong 1:e4b38d6918ba 364 case 30: {//Change Target Heart Rate Zone Preference
asong 2:824ed4ae8d52 365 Increment_Target_Zone();
asong 2:824ed4ae8d52 366 update_display();
asong 2:824ed4ae8d52 367 break;
asong 2:824ed4ae8d52 368 }
asong 2:824ed4ae8d52 369 case 31: { //Manually Increment Heart Rate by 1
asong 2:824ed4ae8d52 370 Increment_Heart_Rate();
asong 2:824ed4ae8d52 371 Determine_Current_Zone();
asong 1:e4b38d6918ba 372 update_display();
asong 1:e4b38d6918ba 373 break;
asong 1:e4b38d6918ba 374 }
nbaker 8:a5c77b45008d 375
nbaker 9:d2e39ee9fedd 376 case 41: {//Fall mode 0,1,2,3,4
nbaker 9:d2e39ee9fedd 377 // 0=nothing, 1=fall_only, 2=impact only, 3=motion_only, 4=all
nbaker 8:a5c77b45008d 378 StartHaptic();
nbaker 8:a5c77b45008d 379 Fall_Alert_Mode++;
nbaker 9:d2e39ee9fedd 380 if(Fall_Alert_Mode > 4){
nbaker 8:a5c77b45008d 381 Fall_Alert_Mode = 0;
nbaker 8:a5c77b45008d 382 }//endif
nbaker 8:a5c77b45008d 383 update_display();
nbaker 8:a5c77b45008d 384 __disable_irq(); // Disable all Interrupts
nbaker 9:d2e39ee9fedd 385 fall_config(10); // reset accel sensor
nbaker 9:d2e39ee9fedd 386 gyro_sensor_config(10); // reset gyro sensor
nbaker 8:a5c77b45008d 387 wait(0.1);
nbaker 9:d2e39ee9fedd 388 gyro_sensor_config(Fall_Alert_Mode); // leave gyro sensor active
nbaker 8:a5c77b45008d 389 fall_config(Fall_Alert_Mode);
nbaker 8:a5c77b45008d 390 wait(0.1);
nbaker 8:a5c77b45008d 391 __enable_irq(); // Enable all Interrupts
nbaker 8:a5c77b45008d 392 wait(0.3);
nbaker 8:a5c77b45008d 393 update_display();
nbaker 8:a5c77b45008d 394 break;
nbaker 8:a5c77b45008d 395 }
nbaker 8:a5c77b45008d 396 case 42: {// F-Th adj
nbaker 8:a5c77b45008d 397 StartHaptic();
nbaker 9:d2e39ee9fedd 398 Fall_Thresh = Fall_Thresh + 0.05f;
nbaker 9:d2e39ee9fedd 399 if(Fall_Thresh > 0.9f){
nbaker 8:a5c77b45008d 400 Fall_Thresh = 0.9;
nbaker 8:a5c77b45008d 401 }//endif
nbaker 8:a5c77b45008d 402 update_display();
nbaker 8:a5c77b45008d 403 break;
nbaker 8:a5c77b45008d 404 }
nbaker 8:a5c77b45008d 405 case 43: {// I-Th adj
nbaker 8:a5c77b45008d 406 StartHaptic();
nbaker 9:d2e39ee9fedd 407 Impact_Thresh = Impact_Thresh + 0.1f;
nbaker 9:d2e39ee9fedd 408 if(Impact_Thresh > 3.9f){
nbaker 8:a5c77b45008d 409 Impact_Thresh = 3.9;
nbaker 8:a5c77b45008d 410 }//endif
nbaker 8:a5c77b45008d 411 update_display();
nbaker 8:a5c77b45008d 412 break;
nbaker 8:a5c77b45008d 413 }
nbaker 8:a5c77b45008d 414 case 44: {// M-Th adj
nbaker 8:a5c77b45008d 415 StartHaptic();
nbaker 9:d2e39ee9fedd 416 Movement_Thresh = Movement_Thresh + 5.0f;
nbaker 9:d2e39ee9fedd 417 if(Movement_Thresh > 300.0f){
nbaker 8:a5c77b45008d 418 Movement_Thresh = 300.0;
nbaker 8:a5c77b45008d 419 }//endif
nbaker 8:a5c77b45008d 420 update_display();
nbaker 8:a5c77b45008d 421 break;
nbaker 8:a5c77b45008d 422 }
nbaker 9:d2e39ee9fedd 423 case 45: {// Min_Movement_Time adj
nbaker 9:d2e39ee9fedd 424 StartHaptic();
nbaker 9:d2e39ee9fedd 425 Min_Movement_Time = Min_Movement_Time + 0.1f;
nbaker 9:d2e39ee9fedd 426 if(Min_Movement_Time > 2.4f){
nbaker 9:d2e39ee9fedd 427 Min_Movement_Time = 2.4;
nbaker 9:d2e39ee9fedd 428 }//endif
nbaker 9:d2e39ee9fedd 429 update_display();
nbaker 9:d2e39ee9fedd 430 break;
nbaker 9:d2e39ee9fedd 431 }
nbaker 9:d2e39ee9fedd 432 case 46: {// Min_Movement_duration adj
nbaker 9:d2e39ee9fedd 433 StartHaptic();
nbaker 9:d2e39ee9fedd 434 Min_Movement_duration = Min_Movement_duration + 5.0f;
nbaker 9:d2e39ee9fedd 435 if(Min_Movement_duration > 300.0f){
nbaker 9:d2e39ee9fedd 436 Min_Movement_duration = 300.0;
nbaker 9:d2e39ee9fedd 437 }//endif
nbaker 9:d2e39ee9fedd 438 update_display();
nbaker 9:d2e39ee9fedd 439 break;
nbaker 9:d2e39ee9fedd 440 }
nbaker 8:a5c77b45008d 441
nbaker 8:a5c77b45008d 442 case 71: {// BLE
nbaker 8:a5c77b45008d 443 StartHaptic();
nbaker 8:a5c77b45008d 444 Screen_Num = 1; //Change to screen 1
nbaker 8:a5c77b45008d 445 update_display();
nbaker 8:a5c77b45008d 446 break;
nbaker 8:a5c77b45008d 447 }
nbaker 8:a5c77b45008d 448 case 72: {// BlueTooth on/off
nbaker 8:a5c77b45008d 449 // do nothing, wrong button or change to another screen number if you're making more BLE type screens
nbaker 8:a5c77b45008d 450 break;
nbaker 8:a5c77b45008d 451 }
asong 1:e4b38d6918ba 452 default: {
asong 1:e4b38d6918ba 453 break;
asong 1:e4b38d6918ba 454 }
asong 1:e4b38d6918ba 455 }
nbaker 0:d1d36a3da39b 456 }
asong 1:e4b38d6918ba 457
nbaker 0:d1d36a3da39b 458 }
nbaker 0:d1d36a3da39b 459
nbaker 0:d1d36a3da39b 460 void ButtonDown(void)
nbaker 0:d1d36a3da39b 461 {
asong 1:e4b38d6918ba 462 Screen_Timer.attach(&timout_timer,(SCRN_TIME));//Is this sufficient to reset/restart ticker timer for OLED?
asong 1:e4b38d6918ba 463 if (OLED_ON == 0) {
asong 1:e4b38d6918ba 464 OLED_ON = 1; // Screen was off, set to On
asong 1:e4b38d6918ba 465 update_display();
asong 1:e4b38d6918ba 466 } else {
nbaker 0:d1d36a3da39b 467
asong 1:e4b38d6918ba 468 switch(Screen_Num) {
asong 1:e4b38d6918ba 469 case 0: {// We're in Main Screen
asong 1:e4b38d6918ba 470 // do nothing, wrong button
asong 1:e4b38d6918ba 471 break;
asong 1:e4b38d6918ba 472 }
asong 1:e4b38d6918ba 473 case 1: {// Panic Alert option
asong 1:e4b38d6918ba 474 StartHaptic();
nbaker 8:a5c77b45008d 475 Screen_Num = 71; //Change to screen 71
asong 1:e4b38d6918ba 476 update_display();
asong 1:e4b38d6918ba 477 break;
asong 1:e4b38d6918ba 478 }
asong 1:e4b38d6918ba 479 case 2: {// Fall Alert option
asong 1:e4b38d6918ba 480 StartHaptic();
asong 1:e4b38d6918ba 481 Screen_Num = 3; //Change to screen 3
asong 1:e4b38d6918ba 482 update_display();
asong 1:e4b38d6918ba 483 break;
asong 1:e4b38d6918ba 484 }
asong 1:e4b38d6918ba 485 case 3: {// Heart Rate Monitoring option
asong 1:e4b38d6918ba 486 StartHaptic();
asong 1:e4b38d6918ba 487 Screen_Num = 4; //Change to screen 4
asong 1:e4b38d6918ba 488 update_display();
asong 1:e4b38d6918ba 489 break;
asong 1:e4b38d6918ba 490 }
asong 1:e4b38d6918ba 491 case 4: {// Alert History option
asong 1:e4b38d6918ba 492 StartHaptic();
asong 1:e4b38d6918ba 493 Screen_Num = 5; //Change to screen 5
asong 1:e4b38d6918ba 494 update_display();
asong 1:e4b38d6918ba 495 break;
asong 1:e4b38d6918ba 496 }
asong 1:e4b38d6918ba 497 case 5: {// About HexiHeart option
asong 1:e4b38d6918ba 498 StartHaptic();
asong 1:e4b38d6918ba 499 Screen_Num = 26; //Change to screen 1
nbaker 0:d1d36a3da39b 500 #ifdef Debug // in debug show debug/diagnostic screens
asong 1:e4b38d6918ba 501 Screen_Num = 20; //Change to screen 20
nbaker 0:d1d36a3da39b 502 #endif
asong 1:e4b38d6918ba 503 update_display();
asong 1:e4b38d6918ba 504 break;
asong 1:e4b38d6918ba 505 }
asong 1:e4b38d6918ba 506 case 6: {// Panic Alert
asong 1:e4b38d6918ba 507 // do nothing, wrong button
asong 1:e4b38d6918ba 508 break;
asong 1:e4b38d6918ba 509 }
asong 1:e4b38d6918ba 510 case 7: {// Heart Rate Zone
asong 1:e4b38d6918ba 511 StartHaptic(100);
asong 2:824ed4ae8d52 512 Disable_Heart_Rate();
asong 1:e4b38d6918ba 513 break;
asong 1:e4b38d6918ba 514 }
asong 1:e4b38d6918ba 515 case 8: {// Alert History
asong 1:e4b38d6918ba 516 StartHaptic();
asong 1:e4b38d6918ba 517 //decriment alert index
asong 1:e4b38d6918ba 518 break;
asong 1:e4b38d6918ba 519 }
nbaker 8:a5c77b45008d 520 case 9: {// HexiHeart About info1
nbaker 8:a5c77b45008d 521 StartHaptic();
nbaker 8:a5c77b45008d 522 Screen_Num = 10; //Change to screen 10
nbaker 8:a5c77b45008d 523 update_display();
nbaker 8:a5c77b45008d 524 break;
nbaker 8:a5c77b45008d 525 }
nbaker 8:a5c77b45008d 526 case 10: {// HexiHeart About info2
nbaker 8:a5c77b45008d 527 StartHaptic();
nbaker 8:a5c77b45008d 528 Screen_Num = 11; //Change to screen 11
nbaker 8:a5c77b45008d 529 update_display();
nbaker 8:a5c77b45008d 530 break;
nbaker 8:a5c77b45008d 531 }
nbaker 8:a5c77b45008d 532 case 11: {// HexiHeart About info3
nbaker 8:a5c77b45008d 533 StartHaptic();
nbaker 8:a5c77b45008d 534 Screen_Num = 9; //Change to screen 9
nbaker 8:a5c77b45008d 535 update_display();
nbaker 8:a5c77b45008d 536 break;
nbaker 8:a5c77b45008d 537 }
asong 1:e4b38d6918ba 538 case 20: {// Diagnostic/Debug Screens
asong 1:e4b38d6918ba 539 StartHaptic();
asong 1:e4b38d6918ba 540 Screen_Num = 26; //Change to screen 1
asong 1:e4b38d6918ba 541 update_display();
asong 1:e4b38d6918ba 542 break;
asong 1:e4b38d6918ba 543 }
asong 1:e4b38d6918ba 544 case 21: {// Fall Diagnostic
asong 1:e4b38d6918ba 545 StartHaptic();
asong 1:e4b38d6918ba 546 Screen_Num = 22; //Change to screen 22
asong 1:e4b38d6918ba 547 update_display();
asong 1:e4b38d6918ba 548 break;
asong 1:e4b38d6918ba 549 }
asong 1:e4b38d6918ba 550 case 22: {// Fall Debug
asong 1:e4b38d6918ba 551 StartHaptic();
asong 1:e4b38d6918ba 552 Screen_Num = 23; //Change to screen 23
asong 1:e4b38d6918ba 553 update_display();
asong 1:e4b38d6918ba 554 break;
asong 1:e4b38d6918ba 555 }
asong 1:e4b38d6918ba 556 case 23: {// Heart Rate Diagnostic
asong 1:e4b38d6918ba 557 StartHaptic();
asong 1:e4b38d6918ba 558 Screen_Num = 24; //Change to screen 24
asong 1:e4b38d6918ba 559 update_display();
asong 1:e4b38d6918ba 560 break;
asong 1:e4b38d6918ba 561 }
asong 1:e4b38d6918ba 562 case 24: {// Heart Rate Debug
asong 1:e4b38d6918ba 563 StartHaptic();
asong 1:e4b38d6918ba 564 Screen_Num = 25; //Change to screen 25
asong 1:e4b38d6918ba 565 update_display();
asong 1:e4b38d6918ba 566 break;
asong 1:e4b38d6918ba 567 }
asong 1:e4b38d6918ba 568 case 25: {// Heat Index Diagnostic
asong 1:e4b38d6918ba 569 StartHaptic();
asong 1:e4b38d6918ba 570 Screen_Num = 21; //Change to screen 21
asong 1:e4b38d6918ba 571 update_display();
asong 1:e4b38d6918ba 572 break;
asong 1:e4b38d6918ba 573 }
asong 1:e4b38d6918ba 574 case 26: {//Heart Rate Configs
asong 1:e4b38d6918ba 575 StartHaptic();
asong 1:e4b38d6918ba 576 Screen_Num = 1;
asong 1:e4b38d6918ba 577 update_display();
asong 1:e4b38d6918ba 578 break;
asong 1:e4b38d6918ba 579 }
asong 1:e4b38d6918ba 580 case 27: { //Decrement Age
asong 2:824ed4ae8d52 581 Decrement_Age();
asong 2:824ed4ae8d52 582 Set_Zone_Boundaries();
asong 1:e4b38d6918ba 583 update_display();
asong 1:e4b38d6918ba 584 break;
asong 1:e4b38d6918ba 585
asong 1:e4b38d6918ba 586 }
asong 1:e4b38d6918ba 587 case 28: { //Changing Heart Rate Vibration Preference
asong 2:824ed4ae8d52 588 /*
asong 2:824ed4ae8d52 589 StartHaptic();
asong 2:824ed4ae8d52 590 if(HR_Vibration == 1) {
asong 2:824ed4ae8d52 591 HR_Vibration = 3;
asong 2:824ed4ae8d52 592 } else {
asong 2:824ed4ae8d52 593 HR_Vibration -= 1;
asong 2:824ed4ae8d52 594 }
asong 2:824ed4ae8d52 595 */
asong 2:824ed4ae8d52 596 Decrement_HR_Vibr_Pref();
asong 1:e4b38d6918ba 597 update_display();
asong 1:e4b38d6918ba 598 break;
asong 1:e4b38d6918ba 599 }
asong 1:e4b38d6918ba 600 case 30: {//Change Target Heart Rate Zone Preference
asong 2:824ed4ae8d52 601 Decrement_Target_Zone();
asong 2:824ed4ae8d52 602 update_display();
asong 2:824ed4ae8d52 603 break;
asong 2:824ed4ae8d52 604 }
asong 2:824ed4ae8d52 605 case 31: { //Manually decrement heart rate by 1
asong 2:824ed4ae8d52 606 Decrement_Heart_Rate();
asong 2:824ed4ae8d52 607 Determine_Current_Zone();
asong 1:e4b38d6918ba 608 update_display();
asong 1:e4b38d6918ba 609 break;
asong 1:e4b38d6918ba 610 }
nbaker 8:a5c77b45008d 611 case 41: {//Fall mode 0,1,2,3
nbaker 9:d2e39ee9fedd 612 // 0=nothing, 1=fall_only, 2=impact only, 3=motion_only, 4=all
nbaker 9:d2e39ee9fedd 613 StartHaptic();
nbaker 8:a5c77b45008d 614 Fall_Alert_Mode--;
nbaker 8:a5c77b45008d 615 if(Fall_Alert_Mode > 3){// should be 0xff if decr from zero
nbaker 8:a5c77b45008d 616 Fall_Alert_Mode = 3;
nbaker 8:a5c77b45008d 617 } //endif
nbaker 8:a5c77b45008d 618 update_display();
nbaker 8:a5c77b45008d 619 __disable_irq(); // Disable all Interrupts
nbaker 9:d2e39ee9fedd 620 fall_config(10); // reset accel sensor
nbaker 9:d2e39ee9fedd 621 gyro_sensor_config(10); // reset gyro sensor
nbaker 8:a5c77b45008d 622 wait(0.1);
nbaker 9:d2e39ee9fedd 623 gyro_sensor_config(Fall_Alert_Mode); // leave gyro sensor active
nbaker 8:a5c77b45008d 624 fall_config(Fall_Alert_Mode);
nbaker 8:a5c77b45008d 625 wait(0.1);
nbaker 8:a5c77b45008d 626 __enable_irq(); // Enable all Interrupts
nbaker 8:a5c77b45008d 627 wait(0.2);
nbaker 8:a5c77b45008d 628 update_display();
nbaker 8:a5c77b45008d 629 break;
nbaker 8:a5c77b45008d 630 }
nbaker 8:a5c77b45008d 631 case 42: {// F-Th adj
nbaker 8:a5c77b45008d 632 StartHaptic();
nbaker 9:d2e39ee9fedd 633 Fall_Thresh = Fall_Thresh - 0.05f;
nbaker 9:d2e39ee9fedd 634 if(Fall_Thresh < 0.1f){
nbaker 8:a5c77b45008d 635 Fall_Thresh = 0.1;
nbaker 8:a5c77b45008d 636 }//endif
nbaker 8:a5c77b45008d 637 update_display();
nbaker 8:a5c77b45008d 638 break;
nbaker 8:a5c77b45008d 639 }
nbaker 8:a5c77b45008d 640 case 43: {// I-Th adj
nbaker 8:a5c77b45008d 641 StartHaptic();
nbaker 9:d2e39ee9fedd 642 Impact_Thresh = Impact_Thresh - 0.1f;
nbaker 9:d2e39ee9fedd 643 if(Impact_Thresh < 0.9f){
nbaker 8:a5c77b45008d 644 Impact_Thresh = 0.9;
nbaker 8:a5c77b45008d 645 }//endif
nbaker 8:a5c77b45008d 646 update_display();
nbaker 8:a5c77b45008d 647 break;
nbaker 8:a5c77b45008d 648 }
nbaker 8:a5c77b45008d 649 case 44: {// M-Th adj
nbaker 8:a5c77b45008d 650 StartHaptic();
nbaker 9:d2e39ee9fedd 651 Movement_Thresh = Movement_Thresh - 5.0f;
nbaker 9:d2e39ee9fedd 652 if(Movement_Thresh < 5.0f){
nbaker 8:a5c77b45008d 653 Movement_Thresh = 5.0;
nbaker 8:a5c77b45008d 654 }//endif
nbaker 8:a5c77b45008d 655 update_display();
nbaker 8:a5c77b45008d 656 break;
nbaker 8:a5c77b45008d 657 }
nbaker 9:d2e39ee9fedd 658 case 45: {// Min_Movement_Time adj
nbaker 9:d2e39ee9fedd 659 StartHaptic();
nbaker 9:d2e39ee9fedd 660 Min_Movement_Time = Min_Movement_Time - 0.1f;
nbaker 9:d2e39ee9fedd 661 if(Min_Movement_Time < 0.5f){
nbaker 9:d2e39ee9fedd 662 Min_Movement_Time = 0.5;
nbaker 9:d2e39ee9fedd 663 }//endif
nbaker 9:d2e39ee9fedd 664 update_display();
nbaker 9:d2e39ee9fedd 665 break;
nbaker 9:d2e39ee9fedd 666 }
nbaker 9:d2e39ee9fedd 667 case 46: {// Min_Movement_duration adj
nbaker 9:d2e39ee9fedd 668 StartHaptic();
nbaker 9:d2e39ee9fedd 669 Min_Movement_duration = Min_Movement_duration - 5.0f;
nbaker 9:d2e39ee9fedd 670 if(Min_Movement_duration < 5.0f){
nbaker 9:d2e39ee9fedd 671 Min_Movement_duration = 5.0;
nbaker 9:d2e39ee9fedd 672 }//endif
nbaker 9:d2e39ee9fedd 673 update_display();
nbaker 9:d2e39ee9fedd 674 break;
nbaker 9:d2e39ee9fedd 675 }
nbaker 9:d2e39ee9fedd 676
nbaker 8:a5c77b45008d 677 case 71: {// BLE
nbaker 8:a5c77b45008d 678 StartHaptic();
nbaker 8:a5c77b45008d 679 Screen_Num = 2; //Change to screen 2
nbaker 8:a5c77b45008d 680 update_display();
nbaker 8:a5c77b45008d 681 break;
nbaker 8:a5c77b45008d 682 }
nbaker 8:a5c77b45008d 683 case 72: {// BlueTooth on/off
nbaker 8:a5c77b45008d 684 // do nothing, wrong button or change to another screen number if you're making more BLE type screens
nbaker 8:a5c77b45008d 685 break;
nbaker 8:a5c77b45008d 686 }
nbaker 8:a5c77b45008d 687
asong 1:e4b38d6918ba 688 default: {
asong 1:e4b38d6918ba 689 break;
asong 1:e4b38d6918ba 690 }
asong 1:e4b38d6918ba 691 }
nbaker 0:d1d36a3da39b 692 }
nbaker 0:d1d36a3da39b 693 }
nbaker 0:d1d36a3da39b 694
nbaker 0:d1d36a3da39b 695 void ButtonRight(void)
nbaker 0:d1d36a3da39b 696 {
asong 1:e4b38d6918ba 697 Screen_Timer.attach(&timout_timer,(SCRN_TIME));//Is this sufficient to reset/restart ticker timer for OLED?
asong 1:e4b38d6918ba 698 if (OLED_ON == 0) {
asong 1:e4b38d6918ba 699 OLED_ON = 1; // Screen was off, set to On
asong 1:e4b38d6918ba 700 update_display();
asong 1:e4b38d6918ba 701 } else {
asong 1:e4b38d6918ba 702 switch(Screen_Num) {
asong 1:e4b38d6918ba 703 case 0: {// We're in Main Screen
asong 1:e4b38d6918ba 704 StartHaptic();
asong 1:e4b38d6918ba 705 Screen_Num = 1; //Change to screen 1
asong 1:e4b38d6918ba 706 update_display();
asong 1:e4b38d6918ba 707 break;
asong 1:e4b38d6918ba 708 }
asong 1:e4b38d6918ba 709 case 1: {// Panic Alert option
asong 1:e4b38d6918ba 710 StartHaptic();
asong 1:e4b38d6918ba 711 Screen_Num = 6; //Change to screen 6
asong 1:e4b38d6918ba 712 update_display();
asong 1:e4b38d6918ba 713 break;
asong 1:e4b38d6918ba 714 }
asong 1:e4b38d6918ba 715 case 2: {// Fall Alert option
asong 1:e4b38d6918ba 716 StartHaptic();
nbaker 4:0803151bc5e4 717 if(Fall_Alert == 1){
nbaker 4:0803151bc5e4 718 Accel_INT1.fall(&fall_detect_off); // turn off Accel sensor's int#1 calls interupt routine
nbaker 4:0803151bc5e4 719 Fall_Alert = 0;
nbaker 4:0803151bc5e4 720 }
nbaker 4:0803151bc5e4 721 else{
nbaker 4:0803151bc5e4 722 Accel_INT1.fall(&fall_detect); // Accel sensor's int#1 calls interupt routine
nbaker 4:0803151bc5e4 723 Fall_Alert = 1;
nbaker 4:0803151bc5e4 724 }
nbaker 4:0803151bc5e4 725 update_display();
asong 1:e4b38d6918ba 726 break;
asong 1:e4b38d6918ba 727 }
asong 1:e4b38d6918ba 728 case 3: {// Heart Rate Monitoring option
asong 1:e4b38d6918ba 729 StartHaptic();
asong 1:e4b38d6918ba 730 Screen_Num = 7; //Change to screen 7
asong 1:e4b38d6918ba 731 update_display();
asong 1:e4b38d6918ba 732 break;
asong 1:e4b38d6918ba 733 }
asong 1:e4b38d6918ba 734 case 4: {// Alert History option
asong 1:e4b38d6918ba 735 StartHaptic();
asong 1:e4b38d6918ba 736 Screen_Num = 8; //Change to screen 8
asong 1:e4b38d6918ba 737 update_display();
asong 1:e4b38d6918ba 738 break;
asong 1:e4b38d6918ba 739 }
asong 1:e4b38d6918ba 740 case 5: {// About HexiHeart option
asong 1:e4b38d6918ba 741 StartHaptic();
asong 1:e4b38d6918ba 742 Screen_Num = 9; //Change to screen 9
asong 1:e4b38d6918ba 743 update_display();
asong 1:e4b38d6918ba 744 break;
asong 1:e4b38d6918ba 745 }
nbaker 0:d1d36a3da39b 746
asong 1:e4b38d6918ba 747 case 6: {// Panic Alert
asong 1:e4b38d6918ba 748 // do nothing, wrong button
asong 1:e4b38d6918ba 749 break;
asong 1:e4b38d6918ba 750 }
asong 1:e4b38d6918ba 751 case 7: {// Heart Rate Zone
asong 1:e4b38d6918ba 752 StartHaptic();
asong 2:824ed4ae8d52 753 Screen_Num = 31;
asong 2:824ed4ae8d52 754 update_display();
asong 1:e4b38d6918ba 755 break;
asong 1:e4b38d6918ba 756 }
asong 1:e4b38d6918ba 757 case 20: {// Diagnostic/Debug Screens
asong 1:e4b38d6918ba 758 StartHaptic();
asong 1:e4b38d6918ba 759 Screen_Num = 21; //Change to screen 21
asong 1:e4b38d6918ba 760 update_display();
asong 1:e4b38d6918ba 761 break;
asong 1:e4b38d6918ba 762 }
nbaker 8:a5c77b45008d 763 case 22: {// Fall Debug
nbaker 8:a5c77b45008d 764 StartHaptic();
nbaker 8:a5c77b45008d 765 Screen_Num = 41; //Change to screen 41
nbaker 8:a5c77b45008d 766 update_display();
nbaker 8:a5c77b45008d 767 break;
nbaker 8:a5c77b45008d 768 }
asong 1:e4b38d6918ba 769 case 26: {//Change to Heart Rate Config Screen
asong 1:e4b38d6918ba 770 StartHaptic();
asong 1:e4b38d6918ba 771 Screen_Num = 27;
asong 1:e4b38d6918ba 772 update_display();
asong 1:e4b38d6918ba 773 break;
asong 1:e4b38d6918ba 774 }
asong 1:e4b38d6918ba 775 case 27: {//Change to Heart Rate Vibration Preferences
asong 1:e4b38d6918ba 776 StartHaptic();
asong 1:e4b38d6918ba 777 Screen_Num = 28;
asong 1:e4b38d6918ba 778 update_display();
asong 1:e4b38d6918ba 779 break;
asong 1:e4b38d6918ba 780 }
asong 1:e4b38d6918ba 781 case 28: {//Change to Heart Rate Zone Boundary Info
asong 1:e4b38d6918ba 782 StartHaptic();
asong 1:e4b38d6918ba 783 Screen_Num = 29;
asong 1:e4b38d6918ba 784 update_display();
asong 1:e4b38d6918ba 785 break;
asong 1:e4b38d6918ba 786 }
asong 2:824ed4ae8d52 787 case 29: {//Change Target Heart Rate Zone Preference
asong 1:e4b38d6918ba 788 StartHaptic();
asong 1:e4b38d6918ba 789 Screen_Num = 30;
asong 1:e4b38d6918ba 790 update_display();
asong 1:e4b38d6918ba 791 break;
asong 1:e4b38d6918ba 792 }
asong 1:e4b38d6918ba 793 case 30: {//Change to Heart Rate Config Screen
asong 1:e4b38d6918ba 794 StartHaptic();
asong 1:e4b38d6918ba 795 Screen_Num = 27;
asong 1:e4b38d6918ba 796 update_display();
asong 1:e4b38d6918ba 797 break;
asong 1:e4b38d6918ba 798 }
asong 2:824ed4ae8d52 799 case 31: {
asong 2:824ed4ae8d52 800 StartHaptic();
asong 2:824ed4ae8d52 801 Screen_Num = 32;
asong 2:824ed4ae8d52 802 update_display();
asong 2:824ed4ae8d52 803 break;
asong 2:824ed4ae8d52 804 }
asong 2:824ed4ae8d52 805 case 32: {
asong 2:824ed4ae8d52 806 StartHaptic();
asong 2:824ed4ae8d52 807 Screen_Num = 7;
asong 2:824ed4ae8d52 808 update_display();
asong 2:824ed4ae8d52 809 break;
asong 2:824ed4ae8d52 810 }
nbaker 8:a5c77b45008d 811 case 41: {// Fall-Mode adj
nbaker 8:a5c77b45008d 812 StartHaptic();
nbaker 8:a5c77b45008d 813 Screen_Num = 42; //Change to screen 42
nbaker 8:a5c77b45008d 814 update_display();
nbaker 8:a5c77b45008d 815 break;
nbaker 8:a5c77b45008d 816 }
nbaker 8:a5c77b45008d 817 case 42: {// F-Th adj
nbaker 8:a5c77b45008d 818 StartHaptic();
nbaker 8:a5c77b45008d 819 Screen_Num = 43; //Change to screen 43
nbaker 8:a5c77b45008d 820 update_display();
nbaker 8:a5c77b45008d 821 break;
nbaker 8:a5c77b45008d 822 }
nbaker 8:a5c77b45008d 823 case 43: {// I-Th adj
nbaker 8:a5c77b45008d 824 StartHaptic();
nbaker 8:a5c77b45008d 825 Screen_Num = 44; //Change to screen 44
nbaker 8:a5c77b45008d 826 update_display();
nbaker 8:a5c77b45008d 827 break;
nbaker 8:a5c77b45008d 828 }
nbaker 8:a5c77b45008d 829 case 44: {// M-Th adj
nbaker 9:d2e39ee9fedd 830 StartHaptic();
nbaker 9:d2e39ee9fedd 831 Screen_Num = 45; //Change to screen 44
nbaker 9:d2e39ee9fedd 832 update_display();
nbaker 8:a5c77b45008d 833 break;
nbaker 8:a5c77b45008d 834 }
nbaker 9:d2e39ee9fedd 835 case 45: {// Min_time adj
nbaker 9:d2e39ee9fedd 836 StartHaptic();
nbaker 9:d2e39ee9fedd 837 Screen_Num = 46; //Change to screen 44
nbaker 9:d2e39ee9fedd 838 update_display();
nbaker 9:d2e39ee9fedd 839 break;
nbaker 9:d2e39ee9fedd 840 }
nbaker 9:d2e39ee9fedd 841 case 46: {// Time_dur adj
nbaker 9:d2e39ee9fedd 842 //do nothing for now
nbaker 9:d2e39ee9fedd 843 break;
nbaker 9:d2e39ee9fedd 844 }
nbaker 9:d2e39ee9fedd 845
nbaker 8:a5c77b45008d 846 case 71: {// BLE
nbaker 8:a5c77b45008d 847 StartHaptic();
nbaker 8:a5c77b45008d 848 Screen_Num = 72; //Change to screen 72
nbaker 8:a5c77b45008d 849 update_display();
nbaker 8:a5c77b45008d 850 break;
nbaker 8:a5c77b45008d 851 }
nbaker 8:a5c77b45008d 852 case 72: {// BlueTooth on/off
nbaker 8:a5c77b45008d 853 StartHaptic();
nbaker 8:a5c77b45008d 854 BLE_On = !BLE_On;
nbaker 8:a5c77b45008d 855 update_display();
nbaker 8:a5c77b45008d 856 break;
nbaker 8:a5c77b45008d 857 }
nbaker 8:a5c77b45008d 858
asong 1:e4b38d6918ba 859 default: {
asong 1:e4b38d6918ba 860 break;
asong 1:e4b38d6918ba 861 }
asong 1:e4b38d6918ba 862 }
nbaker 0:d1d36a3da39b 863 }
nbaker 0:d1d36a3da39b 864 }
nbaker 0:d1d36a3da39b 865
nbaker 0:d1d36a3da39b 866 void ButtonLeft(void)
nbaker 0:d1d36a3da39b 867 {
asong 1:e4b38d6918ba 868 Screen_Timer.attach(&timout_timer,(SCRN_TIME));//Is this sufficient to reset/restart ticker timer for OLED?
asong 1:e4b38d6918ba 869 if (OLED_ON == 0) {
asong 1:e4b38d6918ba 870 OLED_ON = 1; // Screen was off, set to On
asong 1:e4b38d6918ba 871 update_display();
asong 1:e4b38d6918ba 872 } else {
asong 1:e4b38d6918ba 873 switch(Screen_Num) {
asong 1:e4b38d6918ba 874 case 0: {// We're in Main Screen
asong 1:e4b38d6918ba 875 // do nothing, wrong button
asong 1:e4b38d6918ba 876 break;
asong 1:e4b38d6918ba 877 }
asong 1:e4b38d6918ba 878 case 1: {// Panic Alert option
asong 1:e4b38d6918ba 879 StartHaptic();
asong 1:e4b38d6918ba 880 Screen_Num = 0; //Change to screen 0
asong 1:e4b38d6918ba 881 update_display();
asong 1:e4b38d6918ba 882 break;
asong 1:e4b38d6918ba 883 }
asong 1:e4b38d6918ba 884 case 2: {// Fall Alert option
asong 1:e4b38d6918ba 885 StartHaptic();
asong 1:e4b38d6918ba 886 Screen_Num = 0; //Change to screen 0
asong 1:e4b38d6918ba 887 update_display();
asong 1:e4b38d6918ba 888 break;
asong 1:e4b38d6918ba 889 }
asong 1:e4b38d6918ba 890 case 3: {// Heart Rate Monitoring option
asong 1:e4b38d6918ba 891 StartHaptic();
asong 1:e4b38d6918ba 892 Screen_Num = 0; //Change to screen 0
asong 1:e4b38d6918ba 893 update_display();
asong 1:e4b38d6918ba 894 break;
asong 1:e4b38d6918ba 895 }
asong 1:e4b38d6918ba 896 case 4: {// Alert History option
asong 1:e4b38d6918ba 897 StartHaptic();
asong 1:e4b38d6918ba 898 Screen_Num = 0; //Change to screen 0
asong 1:e4b38d6918ba 899 update_display();
asong 1:e4b38d6918ba 900 break;
asong 1:e4b38d6918ba 901 }
asong 1:e4b38d6918ba 902 case 5: {// About HexiHeart option
asong 1:e4b38d6918ba 903 StartHaptic();
asong 1:e4b38d6918ba 904 Screen_Num = 0; //Change to screen 0
asong 1:e4b38d6918ba 905 update_display();
asong 1:e4b38d6918ba 906 break;
asong 1:e4b38d6918ba 907 }
asong 1:e4b38d6918ba 908 case 6: {// Panic Alert
asong 1:e4b38d6918ba 909 StartHaptic();
asong 1:e4b38d6918ba 910 Screen_Num = 1; //Change to screen 1
asong 1:e4b38d6918ba 911 update_display();
asong 1:e4b38d6918ba 912 break;
asong 1:e4b38d6918ba 913 }
asong 1:e4b38d6918ba 914 case 7: {// Heart Rate Zone
asong 1:e4b38d6918ba 915 StartHaptic();
asong 1:e4b38d6918ba 916 Screen_Num = 3; //Change to screen 3
asong 1:e4b38d6918ba 917 update_display();
asong 1:e4b38d6918ba 918 break;
asong 1:e4b38d6918ba 919 }
asong 1:e4b38d6918ba 920 case 8: {// Alert History
asong 1:e4b38d6918ba 921 StartHaptic();
asong 1:e4b38d6918ba 922 Screen_Num = 4; //Change to screen 4
asong 1:e4b38d6918ba 923 update_display();
asong 1:e4b38d6918ba 924 break;
asong 1:e4b38d6918ba 925 }
nbaker 8:a5c77b45008d 926 case 9: {// About HexiHeart info1
nbaker 8:a5c77b45008d 927 StartHaptic();
nbaker 8:a5c77b45008d 928 Screen_Num = 5; //Change to screen 5
nbaker 8:a5c77b45008d 929 update_display();
nbaker 8:a5c77b45008d 930 break;
nbaker 8:a5c77b45008d 931 }
nbaker 8:a5c77b45008d 932 case 10: {// HexiHeart About info2
nbaker 8:a5c77b45008d 933 StartHaptic();
nbaker 8:a5c77b45008d 934 Screen_Num = 5; //Change to screen 5
nbaker 8:a5c77b45008d 935 update_display();
nbaker 8:a5c77b45008d 936 break;
nbaker 8:a5c77b45008d 937 }
nbaker 8:a5c77b45008d 938 case 11: {// HexiHeart About info3
nbaker 8:a5c77b45008d 939 StartHaptic();
nbaker 8:a5c77b45008d 940 Screen_Num = 5; //Change to screen 5
nbaker 8:a5c77b45008d 941 update_display();
nbaker 8:a5c77b45008d 942 break;
nbaker 8:a5c77b45008d 943 }
asong 1:e4b38d6918ba 944 case 20: {// Diagnostic/Debug Screens
asong 1:e4b38d6918ba 945 StartHaptic();
asong 1:e4b38d6918ba 946 Screen_Num = 0; //Change to screen 0
asong 1:e4b38d6918ba 947 update_display();
asong 1:e4b38d6918ba 948 break;
asong 1:e4b38d6918ba 949 }
asong 1:e4b38d6918ba 950 case 21: {// Fall Diagnostic
asong 1:e4b38d6918ba 951 StartHaptic();
asong 1:e4b38d6918ba 952 Screen_Num = 20; //Change to screen 20
asong 1:e4b38d6918ba 953 update_display();
asong 1:e4b38d6918ba 954 break;
asong 1:e4b38d6918ba 955 }
asong 1:e4b38d6918ba 956 case 22: {// Fall Debug
asong 1:e4b38d6918ba 957 StartHaptic();
asong 1:e4b38d6918ba 958 Screen_Num = 20; //Change to screen 20
asong 1:e4b38d6918ba 959 update_display();
asong 1:e4b38d6918ba 960 break;
asong 1:e4b38d6918ba 961 }
asong 1:e4b38d6918ba 962 case 23: {// Heart Rate Diagnostic
asong 1:e4b38d6918ba 963 StartHaptic();
asong 1:e4b38d6918ba 964 Screen_Num = 20; //Change to screen 20
asong 1:e4b38d6918ba 965 update_display();
asong 1:e4b38d6918ba 966 break;
asong 1:e4b38d6918ba 967 }
asong 1:e4b38d6918ba 968 case 24: {// Heart Rate Debug
asong 1:e4b38d6918ba 969 StartHaptic();
asong 1:e4b38d6918ba 970 Screen_Num = 20; //Change to screen 20
asong 1:e4b38d6918ba 971 update_display();
asong 1:e4b38d6918ba 972 break;
asong 1:e4b38d6918ba 973 }
asong 1:e4b38d6918ba 974 case 25: {// Heat Index Diagnostic
asong 1:e4b38d6918ba 975 StartHaptic();
asong 1:e4b38d6918ba 976 Screen_Num = 20; //Change to screen 20
asong 1:e4b38d6918ba 977 update_display();
asong 1:e4b38d6918ba 978 break;
asong 1:e4b38d6918ba 979 }
asong 1:e4b38d6918ba 980 case 26: {//Heart Rate Config Option
asong 1:e4b38d6918ba 981 StartHaptic();
asong 1:e4b38d6918ba 982 Screen_Num = 0;
asong 1:e4b38d6918ba 983 update_display();
asong 1:e4b38d6918ba 984 break;
asong 1:e4b38d6918ba 985 }
asong 1:e4b38d6918ba 986 case 27: {//Enter Age
asong 1:e4b38d6918ba 987 StartHaptic();
asong 1:e4b38d6918ba 988 Screen_Num = 26;
asong 1:e4b38d6918ba 989 update_display();
asong 1:e4b38d6918ba 990 break;
asong 1:e4b38d6918ba 991 }
asong 1:e4b38d6918ba 992 case 28: {//Heart Rate Vibration Preference Screen
asong 1:e4b38d6918ba 993 StartHaptic();
asong 1:e4b38d6918ba 994 Screen_Num = 27;
asong 1:e4b38d6918ba 995 update_display();
asong 1:e4b38d6918ba 996 break;
asong 1:e4b38d6918ba 997 }
asong 1:e4b38d6918ba 998 case 29: {//Heart Rate Zone Boundary Info
asong 1:e4b38d6918ba 999 StartHaptic();
asong 1:e4b38d6918ba 1000 Screen_Num = 28;
asong 1:e4b38d6918ba 1001 update_display();
asong 1:e4b38d6918ba 1002 break;
asong 1:e4b38d6918ba 1003 }
asong 2:824ed4ae8d52 1004 case 30: {//Change Target Heart Rate Zone Preference
asong 1:e4b38d6918ba 1005 StartHaptic();
asong 1:e4b38d6918ba 1006 Screen_Num = 29;
asong 1:e4b38d6918ba 1007 update_display();
asong 1:e4b38d6918ba 1008 break;
asong 1:e4b38d6918ba 1009 }
asong 2:824ed4ae8d52 1010 case 31: {
asong 2:824ed4ae8d52 1011 StartHaptic();
asong 2:824ed4ae8d52 1012 Screen_Num = 7;
asong 2:824ed4ae8d52 1013 update_display();
asong 2:824ed4ae8d52 1014 break;
asong 2:824ed4ae8d52 1015 }
asong 2:824ed4ae8d52 1016 case 32: {
asong 2:824ed4ae8d52 1017 StartHaptic();
asong 2:824ed4ae8d52 1018 Screen_Num = 31;
asong 2:824ed4ae8d52 1019 update_display();
asong 2:824ed4ae8d52 1020 break;
asong 2:824ed4ae8d52 1021 }
nbaker 8:a5c77b45008d 1022 case 41: {// Fall mode screen
nbaker 8:a5c77b45008d 1023 StartHaptic();
nbaker 8:a5c77b45008d 1024 Screen_Num = 22;
nbaker 8:a5c77b45008d 1025 update_display();
nbaker 8:a5c77b45008d 1026 break;
nbaker 8:a5c77b45008d 1027 }
nbaker 8:a5c77b45008d 1028 case 42: {// F-Th adj
nbaker 8:a5c77b45008d 1029 StartHaptic();
nbaker 8:a5c77b45008d 1030 Screen_Num = 41; //Change to screen 41
nbaker 8:a5c77b45008d 1031 update_display();
nbaker 8:a5c77b45008d 1032 break;
nbaker 8:a5c77b45008d 1033 }
nbaker 8:a5c77b45008d 1034 case 43: {// I-Th adj
nbaker 8:a5c77b45008d 1035 StartHaptic();
nbaker 8:a5c77b45008d 1036 Screen_Num = 42; //Change to screen 42
nbaker 8:a5c77b45008d 1037 update_display();
nbaker 8:a5c77b45008d 1038 break;
nbaker 8:a5c77b45008d 1039 }
nbaker 8:a5c77b45008d 1040 case 44: {// M-Th adj
nbaker 8:a5c77b45008d 1041 StartHaptic();
nbaker 8:a5c77b45008d 1042 Screen_Num = 43; //Change to screen 43
nbaker 8:a5c77b45008d 1043 update_display();
nbaker 8:a5c77b45008d 1044 break;
nbaker 9:d2e39ee9fedd 1045 }
nbaker 9:d2e39ee9fedd 1046 case 45: {// M-time adj
nbaker 9:d2e39ee9fedd 1047 StartHaptic();
nbaker 9:d2e39ee9fedd 1048 Screen_Num = 44; //Change to screen 44
nbaker 9:d2e39ee9fedd 1049 update_display();
nbaker 9:d2e39ee9fedd 1050 break;
nbaker 9:d2e39ee9fedd 1051 }
nbaker 9:d2e39ee9fedd 1052 case 46: {// M-dur adj
nbaker 9:d2e39ee9fedd 1053 StartHaptic();
nbaker 9:d2e39ee9fedd 1054 Screen_Num = 45; //Change to screen 45
nbaker 9:d2e39ee9fedd 1055 update_display();
nbaker 9:d2e39ee9fedd 1056 break;
nbaker 9:d2e39ee9fedd 1057 }
nbaker 9:d2e39ee9fedd 1058
nbaker 8:a5c77b45008d 1059 case 71: {// BLE
nbaker 8:a5c77b45008d 1060 StartHaptic();
nbaker 8:a5c77b45008d 1061 Screen_Num = 0; //Change to screen 0
nbaker 8:a5c77b45008d 1062 update_display();
nbaker 8:a5c77b45008d 1063 break;
nbaker 8:a5c77b45008d 1064 }
nbaker 8:a5c77b45008d 1065
nbaker 8:a5c77b45008d 1066 case 72: {// BlueTooth on/off
nbaker 8:a5c77b45008d 1067 StartHaptic();
nbaker 8:a5c77b45008d 1068 Screen_Num = 71; //Change to screen 71
nbaker 8:a5c77b45008d 1069 update_display();
nbaker 8:a5c77b45008d 1070 break;
nbaker 8:a5c77b45008d 1071 }
nbaker 8:a5c77b45008d 1072
asong 1:e4b38d6918ba 1073 default: {
asong 1:e4b38d6918ba 1074 break;
asong 1:e4b38d6918ba 1075 }
asong 1:e4b38d6918ba 1076 }
nbaker 0:d1d36a3da39b 1077 }
nbaker 0:d1d36a3da39b 1078 }
nbaker 0:d1d36a3da39b 1079
nbaker 0:d1d36a3da39b 1080
nbaker 0:d1d36a3da39b 1081 void ButtonSlide(void) // What is this Slide button???
nbaker 0:d1d36a3da39b 1082 {
asong 1:e4b38d6918ba 1083 Screen_Timer.attach(&timout_timer,(SCRN_TIME));//Is this sufficient to reset/restart ticker timer for OLED?
asong 1:e4b38d6918ba 1084 if (OLED_ON == 0) {
asong 1:e4b38d6918ba 1085 OLED_ON = 1; // Screen was off, set to On
asong 1:e4b38d6918ba 1086 }
nbaker 0:d1d36a3da39b 1087 StartHaptic();
nbaker 0:d1d36a3da39b 1088 oled.FillScreen(COLOR_BLACK); // Clear screen
nbaker 0:d1d36a3da39b 1089 strcpy((char *) text_1,"Slide Button");
nbaker 0:d1d36a3da39b 1090 oled.Label((uint8_t *)text_1,0,40);
nbaker 0:d1d36a3da39b 1091 }
asong 1:e4b38d6918ba 1092
nbaker 0:d1d36a3da39b 1093 int main()
nbaker 0:d1d36a3da39b 1094 {
nbaker 7:3d5a8aea0b63 1095 // set_time(1256729737); // Set RTC time to Wed, 28 Oct 2009 11:35:37
nbaker 9:d2e39ee9fedd 1096 // set_time((Year-1970)*365*24*3600+(days of this year)*24*3600+(hr)*3600 + (min)*60 + (Sec) - fudge factor); // Set RTC time to Mon, 19 Feb 2018 10:00
nbaker 9:d2e39ee9fedd 1097 // set_time(48*365*24*3600 + 61*24*3600 + 10*3600-4); // Set RTC time to Mon, 19 Feb 2018 10:00
nbaker 9:d2e39ee9fedd 1098 set_time((2018-1970)*365.25f*24*3600 + (31+28+1-1)*24*3600 + (16)*3600 + (5)*60+ (1) + 38); // Set RTC time
nbaker 9:d2e39ee9fedd 1099 RED_Led = LED_OFF;
nbaker 9:d2e39ee9fedd 1100 GRN_Led = LED_OFF;
nbaker 9:d2e39ee9fedd 1101 BLU_Led = LED_OFF;
nbaker 9:d2e39ee9fedd 1102 Led_clk1 = 0; // LEDs on docking station default to off, need to turn on with a 1
nbaker 9:d2e39ee9fedd 1103 Led_clk2 = 0; // LEDs on docking station default to off, need to turn on with a 1
nbaker 9:d2e39ee9fedd 1104 Led_clk3 = 0; // LEDs on docking station default to off, need to turn on with a 1
jmr274 5:e1431272be79 1105
nbaker 9:d2e39ee9fedd 1106 // ***************** Reset sensors ***********************
nbaker 9:d2e39ee9fedd 1107 OLED_PWR = 0; // Turn off OLED power supply
nbaker 9:d2e39ee9fedd 1108 PowerEN = 1; // Turn off (=1)HTU21(Temp/Hum) and TSL2561(Light) sensors to reset them
nbaker 9:d2e39ee9fedd 1109 HR_PWR = 0; // Turn off (=0) Heart rate sensor 1.8V and HRM(3.3V) supply to reset
nbaker 9:d2e39ee9fedd 1110 wait(0.2); // how long should we wait for sensors to power down?
jmr274 5:e1431272be79 1111
nbaker 9:d2e39ee9fedd 1112 PowerEN = 0; // Turn on (=0) HTU21(Temp/Hum) and TSL2561(Light) sensors to reset them
nbaker 9:d2e39ee9fedd 1113 HR_PWR = 1; // Turn on (=1)Heart rate sensor
nbaker 9:d2e39ee9fedd 1114 OLED_PWR = 1; // Turn on OLED power supply
nbaker 9:d2e39ee9fedd 1115 wait(0.2); // how long should we wait for sensors to power up?
nbaker 9:d2e39ee9fedd 1116
nbaker 9:d2e39ee9fedd 1117 oled.FillScreen(COLOR_BLACK); // Clear screen
nbaker 9:d2e39ee9fedd 1118 fall_config(10); // SW reset accell sensor
nbaker 9:d2e39ee9fedd 1119 gyro_sensor_config(10); // SW reset gyro sensor
nbaker 9:d2e39ee9fedd 1120 press_config(0); // put pressure sensor into 2uA standby, we're not using it
nbaker 9:d2e39ee9fedd 1121 MAX30101_test_config(10); // SW reset accell sensor
nbaker 9:d2e39ee9fedd 1122 oled.FillScreen(COLOR_BLACK); // Clear screen
nbaker 9:d2e39ee9fedd 1123
asong 1:e4b38d6918ba 1124 // ***************** Local variables ***********************
asong 1:e4b38d6918ba 1125 // float accel_data[3]; float accel_rms=0.0;
nbaker 4:0803151bc5e4 1126 int i;
nbaker 4:0803151bc5e4 1127
nbaker 0:d1d36a3da39b 1128 // ************** configure sensor modules ******************
asong 1:e4b38d6918ba 1129
nbaker 9:d2e39ee9fedd 1130 // accel.accel_config(); // original configure accel sensor
nbaker 9:d2e39ee9fedd 1131 fall_config(Fall_Alert_Mode); // configure sensor (I2C1) for current fall mode
nbaker 9:d2e39ee9fedd 1132 //Fall_Alert_Mode: 0=none, 1=fall_only, 2=impact only, 3=motion_only, 4=all
nbaker 9:d2e39ee9fedd 1133 // gyro.gyro_config(); // original configure gyro sensor
nbaker 9:d2e39ee9fedd 1134 gyro_sensor_config(Fall_Alert_Mode); // configure gyro sensor (I2C1) 0=standby, 1=active, 2=interupt set up
nbaker 9:d2e39ee9fedd 1135 // mag.mag_config(); // we don't need mag
nbaker 9:d2e39ee9fedd 1136 // light_config(0); // config TSL2561 ambient light sensor (I2C0) for lowest power - cycling PowerEn should have reset it to state
nbaker 9:d2e39ee9fedd 1137 // Configure HTU21(Temp/Hum)? No need, it seems to draw 0.02uA when not being activly read over data bus
nbaker 8:a5c77b45008d 1138
nbaker 9:d2e39ee9fedd 1139 // need to configure MAX30101 at some point
nbaker 9:d2e39ee9fedd 1140 // MAX30101_test_config(0);
nbaker 9:d2e39ee9fedd 1141
nbaker 9:d2e39ee9fedd 1142
nbaker 0:d1d36a3da39b 1143 // ***** Register callbacks/interupts to application functions *********
nbaker 0:d1d36a3da39b 1144 kw40z_device.attach_buttonUp(&ButtonUp);
nbaker 0:d1d36a3da39b 1145 kw40z_device.attach_buttonDown(&ButtonDown);
nbaker 0:d1d36a3da39b 1146 kw40z_device.attach_buttonLeft(&ButtonLeft);
nbaker 0:d1d36a3da39b 1147 kw40z_device.attach_buttonRight(&ButtonRight);
nbaker 4:0803151bc5e4 1148 // kw40z_device.attach_buttonSlide(&ButtonSlide);
nbaker 4:0803151bc5e4 1149
nbaker 4:0803151bc5e4 1150 // ***** attaching interupts to functions *********
nbaker 9:d2e39ee9fedd 1151 Accel_INT1.fall(&fall_detect); // Accel sensor's int#1 calls interupt routine
nbaker 9:d2e39ee9fedd 1152 Accel_INT2.fall(&impact_detect); //Accel sensor's int#2 calls interupt routine
nbaker 9:d2e39ee9fedd 1153 Gyro_INT1.fall(&motion_detect); // Gyro sensor's int#1 (PTD1) calls interupt routine
nbaker 9:d2e39ee9fedd 1154 //Gyro_INT2.fall(&motion_detect); // Gyro sensor's int#2 (PTC18) calls interupt routine
nbaker 9:d2e39ee9fedd 1155 //HR_INT1.fall(&some_HR_read_function_yet_to_be_named); // MAX30101 - Heart rate sensor's interupt
nbaker 0:d1d36a3da39b 1156
nbaker 0:d1d36a3da39b 1157 // **** Get OLED Class Default Text Properties ****************
asong 1:e4b38d6918ba 1158 oled_text_properties_t textProperties = {0};
asong 1:e4b38d6918ba 1159 oled.GetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1160
nbaker 0:d1d36a3da39b 1161 // *********Set text color and screen alignment **************
nbaker 9:d2e39ee9fedd 1162 //textProperties.font = OpenSans_12x18_Regular; // Max Width of Character = 12px, Max Height of Character = 18px
nbaker 9:d2e39ee9fedd 1163 //textProperties.font = OpenSans_10x15_Regular; // <-This is default Font, Max Width of Character = 10px, Max Height of Character = 15px
asong 1:e4b38d6918ba 1164 textProperties.fontColor = COLOR_WHITE;
asong 1:e4b38d6918ba 1165 textProperties.alignParam = OLED_TEXT_ALIGN_LEFT;
asong 1:e4b38d6918ba 1166 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1167
nbaker 0:d1d36a3da39b 1168 // ************** Display spash screen **********************
nbaker 9:d2e39ee9fedd 1169 /*
nbaker 9:d2e39ee9fedd 1170 oled.FillScreen(COLOR_BLACK); // Clear screen
nbaker 9:d2e39ee9fedd 1171 oled.DrawImage(Hexi_Heart_,0,0); // my Hexi_Heart image is offset for some reason
nbaker 9:d2e39ee9fedd 1172 wait(0.5); // wait 3 seconds
nbaker 9:d2e39ee9fedd 1173 */
nbaker 8:a5c77b45008d 1174 oled.FillScreen(COLOR_BLACK); // Clear screen
nbaker 0:d1d36a3da39b 1175 oled.Label((uint8_t *)"Hexi",20,5); // Display white "Hexi" at x,y
nbaker 0:d1d36a3da39b 1176 textProperties.fontColor = COLOR_RED;
asong 1:e4b38d6918ba 1177 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1178 oled.Label((uint8_t *)"Heart",45,5); // Display red "Heart" at x,y
nbaker 0:d1d36a3da39b 1179
asong 1:e4b38d6918ba 1180 #ifdef Debug // if this is non-production version - do this
nbaker 8:a5c77b45008d 1181 strcpy((char *) text_1,"This is Debug");
nbaker 9:d2e39ee9fedd 1182 oled.Label((uint8_t *)text_1,15,45); // text_1 at x,y
nbaker 9:d2e39ee9fedd 1183 strcpy((char *) text_1,"Ver:");
nbaker 9:d2e39ee9fedd 1184 oled.Label((uint8_t *)text_1,15,60); // text_1 at x,y
nbaker 9:d2e39ee9fedd 1185 sprintf(text_1,"%2.2f ",SW_Ver);
nbaker 9:d2e39ee9fedd 1186 oled.Label((uint8_t *)text_1,60,60);// text_1 at x,y
nbaker 8:a5c77b45008d 1187 StartHaptic();
nbaker 8:a5c77b45008d 1188 #endif
nbaker 8:a5c77b45008d 1189
nbaker 0:d1d36a3da39b 1190 textProperties.fontColor = COLOR_WHITE;
nbaker 0:d1d36a3da39b 1191 oled.SetTextProperties(&textProperties);
nbaker 9:d2e39ee9fedd 1192 wait(2); // wait 3 seconds
nbaker 9:d2e39ee9fedd 1193
nbaker 9:d2e39ee9fedd 1194
asong 1:e4b38d6918ba 1195 update_display(); // Displays current screen (screen 0)
nbaker 0:d1d36a3da39b 1196 Screen_Timer.attach(&timout_timer,(SCRN_TIME));//start ticker timer for turning off LCD
asong 1:e4b38d6918ba 1197 // ******************* Main Loop *************************
nbaker 0:d1d36a3da39b 1198 while (true) {
nbaker 4:0803151bc5e4 1199 i=0;
nbaker 4:0803151bc5e4 1200 while (i<20)// used for "Heart beat flash and updated any displayed data)
nbaker 4:0803151bc5e4 1201 {
nbaker 4:0803151bc5e4 1202 Thread::wait(500); // wait 0.5 sec each loop
nbaker 4:0803151bc5e4 1203 if(OLED_PWR==1){
nbaker 8:a5c77b45008d 1204 update_display_date(); // refresh display date w/o updating entire display
nbaker 4:0803151bc5e4 1205 }// end if
nbaker 9:d2e39ee9fedd 1206
nbaker 4:0803151bc5e4 1207 i++;
nbaker 4:0803151bc5e4 1208 }// end while(i<20)
jmr274 5:e1431272be79 1209
nbaker 4:0803151bc5e4 1210 // wait(10); // wait 10 sec each loop, was orig half sec
nbaker 4:0803151bc5e4 1211 RED_Led = LED_ON; // Used only for diagnostic of wait command
nbaker 4:0803151bc5e4 1212 Led_clk3 = 1; // Used only for diagnostic of wait command
nbaker 4:0803151bc5e4 1213 wait(0.01); // BLIP led 1/10 sec each loop
nbaker 9:d2e39ee9fedd 1214 /// VLPW(0.01); // BLIP led 1/10 sec each loop
nbaker 4:0803151bc5e4 1215 RED_Led = LED_OFF; // Used only for diagnostic of wait command
nbaker 4:0803151bc5e4 1216 Led_clk3 = 0;
nbaker 8:a5c77b45008d 1217 Thread::wait(490); // keep up the pace, at 0.5 sec (0.01s+0.49s) update date
nbaker 9:d2e39ee9fedd 1218
nbaker 4:0803151bc5e4 1219 } // end of while(true)
nbaker 4:0803151bc5e4 1220
nbaker 0:d1d36a3da39b 1221 }
nbaker 0:d1d36a3da39b 1222 // ************** end of main()
nbaker 0:d1d36a3da39b 1223
nbaker 0:d1d36a3da39b 1224 void update_display(void)
nbaker 0:d1d36a3da39b 1225 {
nbaker 4:0803151bc5e4 1226 OLED_PWR = 1; // make sure OLED power supply is on
asong 1:e4b38d6918ba 1227 oled_text_properties_t textProperties = {0}; // Need these to change font color
asong 1:e4b38d6918ba 1228 oled.GetTextProperties(&textProperties); // Need these to change font color
nbaker 8:a5c77b45008d 1229 __disable_irq(); // Disable all Interrupts
asong 1:e4b38d6918ba 1230 switch(Screen_Num) {
asong 1:e4b38d6918ba 1231 case 0: {// Main Screen
nbaker 4:0803151bc5e4 1232 HexiwearBattery battery;
nbaker 4:0803151bc5e4 1233 battery.sensorOn();
asong 1:e4b38d6918ba 1234 oled.FillScreen(COLOR_BLACK); // Clear screen
nbaker 4:0803151bc5e4 1235
nbaker 4:0803151bc5e4 1236 if (battery.isBatteryCharging()) {
nbaker 4:0803151bc5e4 1237 textProperties.fontColor = COLOR_GREEN;
nbaker 4:0803151bc5e4 1238 oled.SetTextProperties(&textProperties);
nbaker 4:0803151bc5e4 1239 // sprintf(text_1, "%s", "chrg");
nbaker 4:0803151bc5e4 1240 sprintf(text_1, "%i%%+", (uint8_t)battery.readLevelPercent());
nbaker 4:0803151bc5e4 1241 Screen_Timer.attach(&timout_timer,(SCRN_TIME));// Reset/restart ticker timer for OLED while fully charged
nbaker 4:0803151bc5e4 1242 } else {
nbaker 4:0803151bc5e4 1243 sprintf(text_1, "%i%%", (uint8_t)battery.readLevelPercent());
nbaker 4:0803151bc5e4 1244 }
nbaker 8:a5c77b45008d 1245 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
nbaker 4:0803151bc5e4 1246
nbaker 4:0803151bc5e4 1247 textProperties.fontColor = COLOR_WHITE;
nbaker 4:0803151bc5e4 1248 oled.SetTextProperties(&textProperties);
nbaker 4:0803151bc5e4 1249
nbaker 4:0803151bc5e4 1250 oled.Label((uint8_t *)"Batt",35,0); // Display "Batt" at x,y
nbaker 9:d2e39ee9fedd 1251 // oled.Label((uint8_t *)"Date",35,20); // Display "Date" at x,y
nbaker 9:d2e39ee9fedd 1252 // oled.Label((uint8_t *)"Time",35,40); // Display "Time" at x,y
jmr274 5:e1431272be79 1253 // oled.Label((uint8_t *)"H.I.",10,80); // Display "H.I." at x,y
nbaker 7:3d5a8aea0b63 1254
asong 1:e4b38d6918ba 1255 oled.Label((uint8_t *)"BT",40,80); //Display "BT" at x,y
asong 1:e4b38d6918ba 1256 oled.Label((uint8_t *)"Menu",60,80); //Display "Menu" at x,y
jmr274 5:e1431272be79 1257
nbaker 7:3d5a8aea0b63 1258 textProperties.fontColor = COLOR_GRAY;
nbaker 8:a5c77b45008d 1259 if(BLE_On == 1){
nbaker 9:d2e39ee9fedd 1260 textProperties.fontColor = COLOR_BLUE; // If BLE on make "BT" blue!
nbaker 8:a5c77b45008d 1261 }
nbaker 7:3d5a8aea0b63 1262 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1263
nbaker 7:3d5a8aea0b63 1264 oled.Label((uint8_t *)"BT",40,80); //Display "BT" at x,y
nbaker 7:3d5a8aea0b63 1265 textProperties.fontColor = COLOR_WHITE;
nbaker 7:3d5a8aea0b63 1266 oled.SetTextProperties(&textProperties);
nbaker 7:3d5a8aea0b63 1267
nbaker 7:3d5a8aea0b63 1268 // added real time and date information
nbaker 7:3d5a8aea0b63 1269 char buffer[32];
nbaker 7:3d5a8aea0b63 1270 time_t seconds = time(NULL);
nbaker 9:d2e39ee9fedd 1271 strftime(buffer,32, "%a,%d %m %Y.%H:%M:%S\r", localtime(&seconds)); //format local time and store in buffer
nbaker 9:d2e39ee9fedd 1272
nbaker 9:d2e39ee9fedd 1273 textProperties.font = OpenSans_12x18_Regular; // Max Width of Character = 12px, Max Height of Character = 18px
nbaker 9:d2e39ee9fedd 1274 textProperties.fontColor = COLOR_WHITE;
nbaker 9:d2e39ee9fedd 1275 oled.SetTextProperties(&textProperties);
nbaker 9:d2e39ee9fedd 1276
nbaker 7:3d5a8aea0b63 1277 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]);
nbaker 9:d2e39ee9fedd 1278 oled.Label((uint8_t *)text_1,15,25);// Date at x,y
nbaker 7:3d5a8aea0b63 1279 sprintf(text_1,"%c%c:%c%c:%c%c ",buffer[15],buffer[16],buffer[18],buffer[19],buffer[21],buffer[22]);
nbaker 7:3d5a8aea0b63 1280 oled.Label((uint8_t *)text_1,25,40);// Time at x,y
nbaker 9:d2e39ee9fedd 1281
nbaker 9:d2e39ee9fedd 1282 textProperties.font = OpenSans_10x15_Regular; // Max Width of Character = 10px, Max Height of Character = 15px
nbaker 9:d2e39ee9fedd 1283 textProperties.fontColor = COLOR_WHITE;
nbaker 9:d2e39ee9fedd 1284 oled.SetTextProperties(&textProperties);
nbaker 9:d2e39ee9fedd 1285
jmr274 5:e1431272be79 1286 Heat_Index_Calculation();
jmr274 5:e1431272be79 1287 sprintf(text,"%i",heat_index);
nbaker 8:a5c77b45008d 1288 oled.TextBox((uint8_t *)text,3,80,15,15); //show HI in a 15px by 15px text box at x=3, y=80
jmr274 5:e1431272be79 1289 strcpy((char *) text,"dF");oled.Label((uint8_t *)text,18,80);
jmr274 5:e1431272be79 1290
asong 1:e4b38d6918ba 1291 if(Heart_Rate_Mode == 1) {
asong 1:e4b38d6918ba 1292 oled.Label((uint8_t *)"BPM",35,60); // Display "H.I." at x,y
asong 1:e4b38d6918ba 1293 }
asong 1:e4b38d6918ba 1294 break;
asong 1:e4b38d6918ba 1295 }
asong 1:e4b38d6918ba 1296 case 1: {// Panic Alert option
asong 1:e4b38d6918ba 1297 oled.FillScreen(COLOR_BLACK); // Clear screen
asong 1:e4b38d6918ba 1298 oled.Label((uint8_t *)"Panic Alert",20,5); // Display at x,y
asong 1:e4b38d6918ba 1299 oled.Label((uint8_t *)"*",85,15); // "*" at x,y
asong 1:e4b38d6918ba 1300 oled.Label((uint8_t *)"*",85,60); // "*" at x,y
asong 1:e4b38d6918ba 1301 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
asong 1:e4b38d6918ba 1302 oled.Label((uint8_t *)"Enter",60,80); //Display "enter" at x,y
asong 1:e4b38d6918ba 1303 break;
asong 1:e4b38d6918ba 1304 }
asong 1:e4b38d6918ba 1305 case 2: {// Fall Alert option
asong 1:e4b38d6918ba 1306 oled.FillScreen(COLOR_BLACK); // Clear screen
asong 1:e4b38d6918ba 1307 oled.Label((uint8_t *)"Fall Alert",20,5); // Display at x,y
nbaker 9:d2e39ee9fedd 1308 oled.Label((uint8_t *)"Protection",15,20);
nbaker 4:0803151bc5e4 1309 if (Fall_Alert == 1){
nbaker 9:d2e39ee9fedd 1310
nbaker 9:d2e39ee9fedd 1311 textProperties.fontColor = COLOR_GREEN;
nbaker 9:d2e39ee9fedd 1312 oled.SetTextProperties(&textProperties);
nbaker 9:d2e39ee9fedd 1313 oled.Label((uint8_t *)" On ",32,40);
nbaker 4:0803151bc5e4 1314 }
nbaker 4:0803151bc5e4 1315 else {
nbaker 9:d2e39ee9fedd 1316 textProperties.fontColor = COLOR_GRAY;
nbaker 9:d2e39ee9fedd 1317 oled.SetTextProperties(&textProperties);
nbaker 9:d2e39ee9fedd 1318 oled.Label((uint8_t *)" Off ",30,40);
nbaker 9:d2e39ee9fedd 1319
nbaker 4:0803151bc5e4 1320 }
nbaker 9:d2e39ee9fedd 1321 textProperties.fontColor = COLOR_WHITE;
nbaker 9:d2e39ee9fedd 1322 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1323 oled.Label((uint8_t *)"*",85,15); // "*" at x,y
asong 1:e4b38d6918ba 1324 oled.Label((uint8_t *)"*",85,60); // "*" at x,y
asong 1:e4b38d6918ba 1325 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
nbaker 9:d2e39ee9fedd 1326 oled.Label((uint8_t *)"Toggle",59,80); //Display "Toggle" at x,y
asong 1:e4b38d6918ba 1327 break;
asong 1:e4b38d6918ba 1328 }
asong 1:e4b38d6918ba 1329 case 3: {// Heart Rate Monitoring option
asong 1:e4b38d6918ba 1330 oled.FillScreen(COLOR_BLACK); // Clear screen
asong 1:e4b38d6918ba 1331 oled.Label((uint8_t *)"Heart Rate",20,5); // Display at x,y
asong 1:e4b38d6918ba 1332 oled.Label((uint8_t *)"*",85,15); // "*" at x,y
asong 1:e4b38d6918ba 1333 oled.Label((uint8_t *)"*",85,60); // "*" at x,y
asong 1:e4b38d6918ba 1334 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
asong 1:e4b38d6918ba 1335 oled.Label((uint8_t *)"Enter",60,80); //Display at x,y
asong 1:e4b38d6918ba 1336 break;
asong 1:e4b38d6918ba 1337 }
asong 1:e4b38d6918ba 1338 case 4: {// Alert History option
asong 1:e4b38d6918ba 1339 oled.FillScreen(COLOR_BLACK); // Clear screen
nbaker 7:3d5a8aea0b63 1340 oled.Label((uint8_t *)"Alert History",10,5); // Display at x,y
asong 1:e4b38d6918ba 1341 oled.Label((uint8_t *)"*",85,15); // "*" at x,y
asong 1:e4b38d6918ba 1342 oled.Label((uint8_t *)"*",85,60); // "*" at x,y
asong 1:e4b38d6918ba 1343 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
asong 1:e4b38d6918ba 1344 oled.Label((uint8_t *)"Enter",60,80); //Display at x,y
asong 1:e4b38d6918ba 1345 break;
asong 1:e4b38d6918ba 1346 }
asong 1:e4b38d6918ba 1347 case 5: {// About HexiHeart Screen
nbaker 0:d1d36a3da39b 1348
asong 1:e4b38d6918ba 1349 oled.FillScreen(COLOR_BLACK); // Clear screen
asong 1:e4b38d6918ba 1350 oled.Label((uint8_t *)"Hexi",20,20); // Display white "Hexi" at x,y
asong 1:e4b38d6918ba 1351 textProperties.fontColor = COLOR_RED;
asong 1:e4b38d6918ba 1352 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1353 oled.Label((uint8_t *)"Heart",45,20); // Display red "Heart" at x,y
asong 1:e4b38d6918ba 1354 textProperties.fontColor = COLOR_WHITE;
asong 1:e4b38d6918ba 1355 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1356 strcpy((char *) text_1,"About");
asong 1:e4b38d6918ba 1357 oled.Label((uint8_t *)text_1,30,5); // text_1 at x,y
asong 1:e4b38d6918ba 1358 oled.Label((uint8_t *)"*",85,15); // "*" at x,y
asong 1:e4b38d6918ba 1359 oled.Label((uint8_t *)"*",85,60); // "*" at x,y
nbaker 9:d2e39ee9fedd 1360 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
nbaker 9:d2e39ee9fedd 1361 oled.Label((uint8_t *)"Enter",60,80); //Display at x,y
asong 1:e4b38d6918ba 1362 break;
asong 1:e4b38d6918ba 1363 }
asong 1:e4b38d6918ba 1364
asong 1:e4b38d6918ba 1365 case 6: {// Panic Alert
asong 1:e4b38d6918ba 1366 oled.FillScreen(COLOR_BLACK); // Clear screen
asong 1:e4b38d6918ba 1367 if (Panic_Alert == 0) {
asong 1:e4b38d6918ba 1368 oled.Label((uint8_t *)"Send ",20,10); // Display at x,y
asong 1:e4b38d6918ba 1369 } else {
asong 1:e4b38d6918ba 1370 oled.Label((uint8_t *)"Dismiss ",17,10); // Display at x,y
asong 1:e4b38d6918ba 1371 }
asong 1:e4b38d6918ba 1372 oled.Label((uint8_t *)"Panic Alert",15,40); // Display at x,y
asong 1:e4b38d6918ba 1373 oled.Label((uint8_t *)"-->",80,15); // "*" at x,y
asong 1:e4b38d6918ba 1374 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
asong 1:e4b38d6918ba 1375 break;
asong 1:e4b38d6918ba 1376 }
asong 1:e4b38d6918ba 1377 case 7: {// Heart Rate Zone
asong 1:e4b38d6918ba 1378
asong 1:e4b38d6918ba 1379 oled.FillScreen(COLOR_BLACK); // Clear screen
asong 1:e4b38d6918ba 1380 oled.Label((uint8_t *)"Heart Rate",15,5); // Display at x,y
asong 1:e4b38d6918ba 1381 oled.Label((uint8_t *)"HR:",15,25); // Display at x,y
asong 2:824ed4ae8d52 1382 sprintf(display_buff, "%u", Heart_Rate);
asong 2:824ed4ae8d52 1383 textProperties.fontColor = COLOR_RED; //Change font to red
asong 2:824ed4ae8d52 1384 oled.SetTextProperties(&textProperties);//Implement color change
asong 2:824ed4ae8d52 1385 oled.Label((uint8_t *)display_buff,43,25); // Display at x,y
asong 2:824ed4ae8d52 1386 textProperties.fontColor = COLOR_WHITE;
asong 2:824ed4ae8d52 1387 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1388 oled.Label((uint8_t *)"Age: ",15,45); // Display at x,y
asong 1:e4b38d6918ba 1389 textProperties.fontColor = COLOR_GREEN;
asong 1:e4b38d6918ba 1390 oled.SetTextProperties(&textProperties); //implements the color change
asong 1:e4b38d6918ba 1391 sprintf(display_buff, "%u", Age); //Convert int to char array for displaying user age
asong 1:e4b38d6918ba 1392 oled.Label((uint8_t *)display_buff,43,45); // Display at x,y
asong 1:e4b38d6918ba 1393 textProperties.fontColor = COLOR_WHITE;
asong 1:e4b38d6918ba 1394 oled.SetTextProperties(&textProperties);
asong 2:824ed4ae8d52 1395 oled.Label((uint8_t *)"On",80,15); // "+" at x,y
asong 2:824ed4ae8d52 1396 oled.Label((uint8_t *)"Off",78,60); // "-" at x,y
asong 1:e4b38d6918ba 1397 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
nbaker 9:d2e39ee9fedd 1398 oled.Label((uint8_t *)"Next",60,80); // Display "Next" at x,y
asong 2:824ed4ae8d52 1399
asong 1:e4b38d6918ba 1400 //heart.enable();
asong 1:e4b38d6918ba 1401 //sprintf(display_buff, "%u", heart.getRevisionID()); //Convert int to char array for displaying user age
asong 1:e4b38d6918ba 1402 //oled.Label((uint8_t *)display_buff,45,25); // Display at x,y
asong 1:e4b38d6918ba 1403 //update_display();
asong 1:e4b38d6918ba 1404 break;
asong 1:e4b38d6918ba 1405 }
asong 1:e4b38d6918ba 1406 case 8: {// Alert History
asong 1:e4b38d6918ba 1407 oled.FillScreen(COLOR_BLACK); // Clear screen
asong 1:e4b38d6918ba 1408 oled.Label((uint8_t *)"Alert History",5,5); // Display at x,y
asong 1:e4b38d6918ba 1409 oled.Label((uint8_t *)"Date - Time",20,40); // Display at x,y
asong 1:e4b38d6918ba 1410 oled.Label((uint8_t *)"Alert Type:",20,60); // Display at x,y
asong 1:e4b38d6918ba 1411 oled.Label((uint8_t *)"+",85,15); // "*" at x,y
asong 1:e4b38d6918ba 1412 oled.Label((uint8_t *)"-",85,60); // "*" at x,y
asong 1:e4b38d6918ba 1413 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
asong 1:e4b38d6918ba 1414 break;
asong 1:e4b38d6918ba 1415 }
nbaker 8:a5c77b45008d 1416
nbaker 8:a5c77b45008d 1417 case 9: {// About HexiHeart info1
nbaker 8:a5c77b45008d 1418 oled.FillScreen(COLOR_BLACK); // Clear screen
nbaker 8:a5c77b45008d 1419 oled.Label((uint8_t *)"Hexi",20,1); // Display white "Hexi" at x,y
nbaker 8:a5c77b45008d 1420 textProperties.fontColor = COLOR_RED;
nbaker 8:a5c77b45008d 1421 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1422 oled.Label((uint8_t *)"Heart",45,0); // Display red "Heart" at x,y
nbaker 8:a5c77b45008d 1423 textProperties.fontColor = COLOR_WHITE;
nbaker 8:a5c77b45008d 1424 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1425 oled.Label((uint8_t *)"Senior Proj",5,15); //
nbaker 9:d2e39ee9fedd 1426 oled.Label((uint8_t *)"Team Zeta E2.7",5,30); //
nbaker 8:a5c77b45008d 1427 oled.Label((uint8_t *)"Texas State Univ",0,45); //
nbaker 8:a5c77b45008d 1428 oled.Label((uint8_t *)"+",85,15); // "*" at x,y
nbaker 8:a5c77b45008d 1429 oled.Label((uint8_t *)"-",85,60); // "*" at x,y
nbaker 8:a5c77b45008d 1430 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
nbaker 8:a5c77b45008d 1431 break;
nbaker 8:a5c77b45008d 1432 }
nbaker 8:a5c77b45008d 1433
nbaker 8:a5c77b45008d 1434 case 10: {// About HexiHeart info2
nbaker 8:a5c77b45008d 1435 oled.FillScreen(COLOR_BLACK); // Clear screen
nbaker 8:a5c77b45008d 1436 oled.Label((uint8_t *)"Hexi",20,0); // Display white "Hexi" at x,y
nbaker 8:a5c77b45008d 1437 textProperties.fontColor = COLOR_RED;
nbaker 8:a5c77b45008d 1438 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1439 oled.Label((uint8_t *)"Heart",45,0); // Display red "Heart" at x,y
nbaker 8:a5c77b45008d 1440 textProperties.fontColor = COLOR_WHITE;
nbaker 8:a5c77b45008d 1441 oled.SetTextProperties(&textProperties);
nbaker 9:d2e39ee9fedd 1442 // oled.Label((uint8_t *)"E2.7 Team Zeta",2,12); //
nbaker 9:d2e39ee9fedd 1443 oled.Label((uint8_t *)"Alex Song",5,12); //
nbaker 9:d2e39ee9fedd 1444 oled.Label((uint8_t *)"Jasmine ",5,24); // Jasmine Rounsaville is to long
nbaker 9:d2e39ee9fedd 1445 oled.Label((uint8_t *)"Rounsaville",15,37); // Jasmine Rounsaville is to long
nbaker 8:a5c77b45008d 1446 oled.Label((uint8_t *)"Issam Hichami",5,51); //
nbaker 8:a5c77b45008d 1447 oled.Label((uint8_t *)"Neil Baker",5,64); //
nbaker 8:a5c77b45008d 1448
nbaker 8:a5c77b45008d 1449 oled.Label((uint8_t *)"+",85,15); // "*" at x,y
nbaker 8:a5c77b45008d 1450 oled.Label((uint8_t *)"-",85,60); // "*" at x,y
nbaker 8:a5c77b45008d 1451 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
nbaker 8:a5c77b45008d 1452 break;
nbaker 8:a5c77b45008d 1453 }
nbaker 8:a5c77b45008d 1454
nbaker 8:a5c77b45008d 1455 case 11: {// About HexiHeart info3
nbaker 8:a5c77b45008d 1456 oled.FillScreen(COLOR_BLACK); // Clear screen
nbaker 8:a5c77b45008d 1457 oled.Label((uint8_t *)"Hexi",20,0); // Display white "Hexi" at x,y
nbaker 8:a5c77b45008d 1458 textProperties.fontColor = COLOR_RED;
nbaker 8:a5c77b45008d 1459 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1460 oled.Label((uint8_t *)"Heart",45,0); // Display red "Heart" at x,y
nbaker 8:a5c77b45008d 1461 // *********get screen alignment **************
nbaker 8:a5c77b45008d 1462 oled_text_properties_t textProperties = {0};
nbaker 8:a5c77b45008d 1463 oled.GetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1464 // *********Set text color and screen alignment **************
nbaker 8:a5c77b45008d 1465 textProperties.alignParam = OLED_TEXT_ALIGN_CENTER;
nbaker 8:a5c77b45008d 1466 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1467
nbaker 8:a5c77b45008d 1468 #ifdef Debug // if this is non-production version - do this
nbaker 8:a5c77b45008d 1469 oled.Label((uint8_t *)"This is Debug",0,25); // text_1 at X=10,y=25
nbaker 8:a5c77b45008d 1470 oled.Label((uint8_t *)"Ver of SW",0,40); // text_1 at x=20,y=40
nbaker 8:a5c77b45008d 1471 #endif
nbaker 8:a5c77b45008d 1472 textProperties.fontColor = COLOR_WHITE;
nbaker 8:a5c77b45008d 1473 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1474 sprintf(text_1," SW_Ver:%2.2f ",SW_Ver);
nbaker 8:a5c77b45008d 1475 oled.Label((uint8_t *)text_1,0,55);// text_1 at x=10,y
nbaker 8:a5c77b45008d 1476 textProperties.alignParam = OLED_TEXT_ALIGN_LEFT;
nbaker 8:a5c77b45008d 1477 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1478 oled.Label((uint8_t *)"+",85,15); // "*" at x,y
nbaker 8:a5c77b45008d 1479 oled.Label((uint8_t *)"-",85,60); // "*" at x,y
nbaker 8:a5c77b45008d 1480 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
nbaker 8:a5c77b45008d 1481 break;
nbaker 8:a5c77b45008d 1482 }
nbaker 8:a5c77b45008d 1483
asong 1:e4b38d6918ba 1484 #ifdef Debug // if this is non-production/debug version - do this
asong 1:e4b38d6918ba 1485 case 20: {// Diagnostic/Debug Screens
asong 1:e4b38d6918ba 1486 oled.FillScreen(COLOR_BLACK); // Clear screen
asong 1:e4b38d6918ba 1487 textProperties.fontColor = COLOR_RED;
asong 1:e4b38d6918ba 1488 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1489 oled.Label((uint8_t *)"Diagnostics",10,5); // Display at x,y
nbaker 9:d2e39ee9fedd 1490 oled.Label((uint8_t *)"Enter",60,80); //Display at x,y
asong 1:e4b38d6918ba 1491 textProperties.fontColor = COLOR_WHITE;
asong 1:e4b38d6918ba 1492 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1493 oled.Label((uint8_t *)"*",85,15); // "*" at x,y
asong 1:e4b38d6918ba 1494 oled.Label((uint8_t *)"*",85,60); // "*" at x,y
nbaker 9:d2e39ee9fedd 1495 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
nbaker 0:d1d36a3da39b 1496
asong 1:e4b38d6918ba 1497 break;
asong 1:e4b38d6918ba 1498 }
asong 1:e4b38d6918ba 1499 case 21: {// Fall Alert Diagnostic Screen
nbaker 8:a5c77b45008d 1500 if(Fall_Alert_Mode == 0){
nbaker 8:a5c77b45008d 1501 fall_config(11); // turn accel sensor to active to take reading
nbaker 8:a5c77b45008d 1502 }
asong 1:e4b38d6918ba 1503 oled.FillScreen(COLOR_BLACK); // Clear screen
asong 1:e4b38d6918ba 1504 textProperties.fontColor = COLOR_RED;
asong 1:e4b38d6918ba 1505 oled.SetTextProperties(&textProperties);
nbaker 7:3d5a8aea0b63 1506 oled.Label((uint8_t *)"Fall-Diag",25,5); // Display at x,y
nbaker 7:3d5a8aea0b63 1507 // oled.Label((uint8_t *)"Diagnostic",25,5); // Display at x,y
asong 1:e4b38d6918ba 1508 textProperties.fontColor = COLOR_WHITE;
asong 1:e4b38d6918ba 1509 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1510 gyro.acquire_gyro_data_dps(Gyro_Data);
nbaker 8:a5c77b45008d 1511 Gyro_Mag = (abs(Gyro_Data[0])+abs(Gyro_Data[1])+abs(Gyro_Data[2]));
asong 1:e4b38d6918ba 1512 accel.acquire_accel_data_g(Accel_Data);
nbaker 8:a5c77b45008d 1513 if(Fall_Alert_Mode == 0){
nbaker 8:a5c77b45008d 1514 fall_config(12); // turn accel sensor to standby
nbaker 8:a5c77b45008d 1515 }
nbaker 8:a5c77b45008d 1516 Accel_Mag = 2*sqrt(((Accel_Data[0]*Accel_Data[0])+(Accel_Data[1]*Accel_Data[1])+(Accel_Data[2]*Accel_Data[2])));
asong 1:e4b38d6918ba 1517 sprintf(text_1," Accel:%2.2f g ",Accel_Mag);
nbaker 9:d2e39ee9fedd 1518 oled.Label((uint8_t *)text_1,5,40);// text_1 at x,y
asong 1:e4b38d6918ba 1519 sprintf(text_1," Gyro:%4.0f D/S ",Gyro_Mag);
nbaker 9:d2e39ee9fedd 1520 oled.Label((uint8_t *)text_1,5,60);// text_1 at x,y
nbaker 8:a5c77b45008d 1521 oled.Label((uint8_t *)"*",85,15); // "*" at x,y
nbaker 8:a5c77b45008d 1522 oled.Label((uint8_t *)"*",85,60); // "*" at x,y
asong 1:e4b38d6918ba 1523 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
asong 1:e4b38d6918ba 1524 break;
asong 1:e4b38d6918ba 1525 }
asong 1:e4b38d6918ba 1526 case 22: {// Fall Alert Debug Screen
asong 1:e4b38d6918ba 1527 oled.FillScreen(COLOR_BLACK); // Clear screen
asong 1:e4b38d6918ba 1528 textProperties.fontColor = COLOR_RED;
asong 1:e4b38d6918ba 1529 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1530 oled.Label((uint8_t *)"Fall Debug",15,5); // Display at x,y
asong 1:e4b38d6918ba 1531 textProperties.fontColor = COLOR_GREEN;
asong 1:e4b38d6918ba 1532 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1533 sprintf(text_1," %i ",Fall_Alert_Mode);
asong 1:e4b38d6918ba 1534 oled.Label((uint8_t *)text_1,35,20);// text_1 at x,y
nbaker 8:a5c77b45008d 1535 textProperties.fontColor = COLOR_GRAY;
nbaker 9:d2e39ee9fedd 1536 if(Fall_Alert_Mode == 1 || Fall_Alert_Mode == 4){
nbaker 9:d2e39ee9fedd 1537 textProperties.fontColor = COLOR_GREEN;
nbaker 8:a5c77b45008d 1538 }
nbaker 8:a5c77b45008d 1539 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1540 sprintf(text_1," %1.2f g ",Fall_Thresh);
asong 1:e4b38d6918ba 1541 oled.Label((uint8_t *)text_1,35,35);// text_1 at x,y
nbaker 8:a5c77b45008d 1542 textProperties.fontColor = COLOR_GRAY;
nbaker 9:d2e39ee9fedd 1543 if(Fall_Alert_Mode == 2 || Fall_Alert_Mode == 4){
nbaker 9:d2e39ee9fedd 1544 textProperties.fontColor = COLOR_GREEN;
nbaker 8:a5c77b45008d 1545 }
nbaker 8:a5c77b45008d 1546 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1547 sprintf(text_1," %2.2f g ",Impact_Thresh);
nbaker 8:a5c77b45008d 1548 oled.Label((uint8_t *)text_1,35,50);// text_1 at x,y
nbaker 8:a5c77b45008d 1549 textProperties.fontColor = COLOR_GRAY;
nbaker 9:d2e39ee9fedd 1550 if(Fall_Alert_Mode == 3 || Fall_Alert_Mode == 4){
nbaker 9:d2e39ee9fedd 1551 textProperties.fontColor = COLOR_GREEN;
nbaker 8:a5c77b45008d 1552 }
nbaker 8:a5c77b45008d 1553 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1554 sprintf(text_1," %3.0f D/S ",Movement_Thresh);
nbaker 8:a5c77b45008d 1555 oled.Label((uint8_t *)text_1,35,65);// text_1 at x,y
asong 1:e4b38d6918ba 1556 textProperties.fontColor = COLOR_WHITE;
asong 1:e4b38d6918ba 1557 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1558 oled.Label((uint8_t *)"Mode:",5,20); // "*" at x,y
nbaker 8:a5c77b45008d 1559 oled.Label((uint8_t *)"F-Th:",5,35); // "*" at x,y
nbaker 8:a5c77b45008d 1560 oled.Label((uint8_t *)"I-Th:",5,50); // "*" at x,y
nbaker 8:a5c77b45008d 1561 oled.Label((uint8_t *)"M-Th:",5,65); // "*" at x,y
asong 1:e4b38d6918ba 1562 oled.Label((uint8_t *)"*",85,15); // "*" at x,y
asong 1:e4b38d6918ba 1563 oled.Label((uint8_t *)"*",85,60); // "*" at x,y
nbaker 9:d2e39ee9fedd 1564 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
nbaker 9:d2e39ee9fedd 1565 oled.Label((uint8_t *)"Enter",60,80); //Display at x,y
asong 1:e4b38d6918ba 1566 break;
asong 1:e4b38d6918ba 1567 }
asong 1:e4b38d6918ba 1568 case 23: {// Heart Rate Diagnostic Screen
asong 1:e4b38d6918ba 1569 oled.FillScreen(COLOR_BLACK); // Clear screen
asong 1:e4b38d6918ba 1570 textProperties.fontColor = COLOR_RED;
asong 1:e4b38d6918ba 1571 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1572 oled.Label((uint8_t *)"H.R. Diagnostic",5,5); // Display at x,y
asong 1:e4b38d6918ba 1573 textProperties.fontColor = COLOR_WHITE;
asong 1:e4b38d6918ba 1574 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1575 oled.Label((uint8_t *)"*",85,15); // "*" at x,y
asong 1:e4b38d6918ba 1576 oled.Label((uint8_t *)"*",85,60); // "*" at x,y
nbaker 9:d2e39ee9fedd 1577 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
asong 1:e4b38d6918ba 1578 // oled.Label((uint8_t *)" Enter ",59,80); //Display at x,y
asong 1:e4b38d6918ba 1579 break;
asong 1:e4b38d6918ba 1580 }
asong 1:e4b38d6918ba 1581 case 24: {// Heart Rate Debug Screen
asong 1:e4b38d6918ba 1582 oled.FillScreen(COLOR_BLACK); // Clear screen
asong 1:e4b38d6918ba 1583 textProperties.fontColor = COLOR_RED;
asong 1:e4b38d6918ba 1584 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1585 oled.Label((uint8_t *)"H.R. Debug",10,5); // Display at x,y
asong 1:e4b38d6918ba 1586 textProperties.fontColor = COLOR_WHITE;
asong 1:e4b38d6918ba 1587 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1588 oled.Label((uint8_t *)"*",85,15); // "*" at x,y
asong 1:e4b38d6918ba 1589 oled.Label((uint8_t *)"*",85,60); // "*" at x,y
nbaker 9:d2e39ee9fedd 1590 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
asong 1:e4b38d6918ba 1591 // oled.Label((uint8_t *)" Enter ",59,80); //Display at x,y
asong 1:e4b38d6918ba 1592 break;
asong 1:e4b38d6918ba 1593 }
asong 1:e4b38d6918ba 1594 case 25: {// Heat Index Diagnostic Screen
asong 1:e4b38d6918ba 1595 oled.FillScreen(COLOR_BLACK); // Clear screen
asong 1:e4b38d6918ba 1596 textProperties.fontColor = COLOR_RED;
asong 1:e4b38d6918ba 1597 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1598 oled.Label((uint8_t *)"H.I. Diagnostic",5,5); // Display at x,y
asong 1:e4b38d6918ba 1599 textProperties.fontColor = COLOR_WHITE;
asong 1:e4b38d6918ba 1600 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1601 oled.Label((uint8_t *)"*",85,15); // "*" at x,y
asong 1:e4b38d6918ba 1602 oled.Label((uint8_t *)"*",85,60); // "*" at x,y
nbaker 9:d2e39ee9fedd 1603 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
asong 1:e4b38d6918ba 1604 // oled.Label((uint8_t *)" Enter ",59,80); //Display at x,y
jmr274 5:e1431272be79 1605
jmr274 6:84e3ba00b995 1606 Heat_Index_Calculation();
jmr274 5:e1431272be79 1607
jmr274 5:e1431272be79 1608 oled_text_properties_t textProperties = {0};
jmr274 5:e1431272be79 1609 oled.GetTextProperties(&textProperties);
jmr274 5:e1431272be79 1610
jmr274 5:e1431272be79 1611 strcpy((char *) text,"Temp.");
jmr274 5:e1431272be79 1612 oled.Label((uint8_t *)text,5,40);
jmr274 5:e1431272be79 1613 strcpy((char *) text,"Humidity");
jmr274 5:e1431272be79 1614 oled.Label((uint8_t *)text,5,57);
jmr274 5:e1431272be79 1615 strcpy((char *) text,"H.I.");
jmr274 5:e1431272be79 1616 oled.Label((uint8_t *)text,5,23);
jmr274 5:e1431272be79 1617
jmr274 5:e1431272be79 1618 /* Set text properties to white and right aligned for the dynamic text */
jmr274 5:e1431272be79 1619 textProperties.fontColor = COLOR_GREEN;
jmr274 5:e1431272be79 1620 textProperties.alignParam = OLED_TEXT_ALIGN_RIGHT;
jmr274 5:e1431272be79 1621 oled.SetTextProperties(&textProperties);
jmr274 5:e1431272be79 1622
jmr274 5:e1431272be79 1623 /* Format the value */
jmr274 5:e1431272be79 1624 sprintf(text,"%i",sample_ftemp);
jmr274 5:e1431272be79 1625
nbaker 8:a5c77b45008d 1626 /* Display temp reading in 15px by 15px textbox at(x=55, y=40) */
jmr274 5:e1431272be79 1627 oled.TextBox((uint8_t *)text,55,40,15,15); //Increase textbox for more digits
jmr274 5:e1431272be79 1628
jmr274 5:e1431272be79 1629 /* Display Units */
jmr274 5:e1431272be79 1630 strcpy((char *) text,"dF");
jmr274 5:e1431272be79 1631 oled.Label((uint8_t *)text,71,40);
jmr274 5:e1431272be79 1632
jmr274 5:e1431272be79 1633 /* Format the value */
jmr274 5:e1431272be79 1634 sprintf(text,"%i",sample_humid);
jmr274 5:e1431272be79 1635
nbaker 8:a5c77b45008d 1636 /* Display Hum reading in 15px by 15px textbox at(x=55, y=57) */
jmr274 5:e1431272be79 1637 oled.TextBox((uint8_t *)text,55,57,15,15); //Increase textbox for more digits
jmr274 5:e1431272be79 1638
jmr274 5:e1431272be79 1639 /* Display Units */
jmr274 5:e1431272be79 1640 strcpy((char *) text,"%");
jmr274 5:e1431272be79 1641 oled.Label((uint8_t *)text,71,57);
jmr274 5:e1431272be79 1642
jmr274 5:e1431272be79 1643 /* Set text properties to white and right aligned for the dynamic text */
jmr274 5:e1431272be79 1644 textProperties.fontColor = COLOR_BLUE;
jmr274 5:e1431272be79 1645 textProperties.alignParam = OLED_TEXT_ALIGN_RIGHT;
jmr274 5:e1431272be79 1646 oled.SetTextProperties(&textProperties);
jmr274 5:e1431272be79 1647
jmr274 5:e1431272be79 1648 /* Format the value */
jmr274 5:e1431272be79 1649 sprintf(text,"%i",heat_index);
jmr274 5:e1431272be79 1650
nbaker 8:a5c77b45008d 1651 /* Display HI reading in 15px by 15px textbox at(x=55, y=23) */
jmr274 5:e1431272be79 1652 oled.TextBox((uint8_t *)text,55,23,15,15); //Increase textbox for more digits
jmr274 5:e1431272be79 1653
jmr274 5:e1431272be79 1654 /* Display Units */
jmr274 5:e1431272be79 1655 strcpy((char *) text,"dF");oled.Label((uint8_t *)text,71,23);
jmr274 5:e1431272be79 1656
asong 1:e4b38d6918ba 1657 break;
asong 1:e4b38d6918ba 1658 }
asong 1:e4b38d6918ba 1659 case 26: {//Heart Rate Config Option
asong 1:e4b38d6918ba 1660 oled.FillScreen(COLOR_BLACK); // Clear screen
asong 1:e4b38d6918ba 1661 oled.Label((uint8_t *)"HR Config",10,5); // Display at x,y
asong 1:e4b38d6918ba 1662 oled.Label((uint8_t *)"*",85,15); // "*" at x,y
asong 1:e4b38d6918ba 1663 oled.Label((uint8_t *)"*",85,60); // "*" at x,y
asong 1:e4b38d6918ba 1664 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
asong 1:e4b38d6918ba 1665 oled.Label((uint8_t *)"Enter",60,80); //Display "enter" at x,y
asong 1:e4b38d6918ba 1666 break;
asong 1:e4b38d6918ba 1667 }
asong 1:e4b38d6918ba 1668 case 27: { //Enter Age Screen
asong 1:e4b38d6918ba 1669 oled.FillScreen(COLOR_BLACK);
asong 1:e4b38d6918ba 1670 oled.Label((uint8_t *)"Input Age", 10, 5);
asong 1:e4b38d6918ba 1671 sprintf(display_buff, "%u", Age); //Convert int to char array for displaying user age
asong 1:e4b38d6918ba 1672 oled.Label((uint8_t *)"Age:", 10, 30);
asong 1:e4b38d6918ba 1673 oled.Label((uint8_t *)"+",85,15); // "*" at x,y
asong 1:e4b38d6918ba 1674 oled.Label((uint8_t *)"-",85,60); // "*" at x,y
asong 1:e4b38d6918ba 1675 oled.Label((uint8_t *)"Menu",10,80); // Display "Menu" at x,y
asong 1:e4b38d6918ba 1676 oled.Label((uint8_t *)"Next",60,80); //Display "Next" at x,y
asong 1:e4b38d6918ba 1677 textProperties.fontColor = COLOR_GREEN;
asong 1:e4b38d6918ba 1678 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1679 oled.Label((uint8_t *)display_buff,43,30); // Display at x,y
asong 1:e4b38d6918ba 1680 textProperties.fontColor = COLOR_WHITE;
asong 1:e4b38d6918ba 1681 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1682 oled.Label((uint8_t *)"Max bpm:",10,50);
asong 1:e4b38d6918ba 1683 textProperties.fontColor = COLOR_RED;
asong 1:e4b38d6918ba 1684 oled.SetTextProperties(&textProperties); //implements the color change
asong 2:824ed4ae8d52 1685 sprintf(display_buff, "%u", Max_Bpm); //Convert int to char array for displaying user max bpm
asong 1:e4b38d6918ba 1686 oled.Label((uint8_t *)display_buff, 65, 50);
asong 1:e4b38d6918ba 1687 textProperties.fontColor = COLOR_WHITE;
asong 1:e4b38d6918ba 1688 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1689 break;
asong 1:e4b38d6918ba 1690 }
asong 1:e4b38d6918ba 1691 case 28: {//Choose Heart Rate Vibration Option
asong 1:e4b38d6918ba 1692 oled.FillScreen(COLOR_BLACK);
asong 1:e4b38d6918ba 1693 oled.Label((uint8_t *)"Vibrate Pref", 10, 10);
asong 1:e4b38d6918ba 1694 oled.Label((uint8_t *)"Option:", 10, 25);
asong 1:e4b38d6918ba 1695 oled.Label((uint8_t *)"+",85,15); // "+" at x,y
asong 1:e4b38d6918ba 1696 oled.Label((uint8_t *)"-",85,60); // "-" at x,y
asong 1:e4b38d6918ba 1697 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
asong 1:e4b38d6918ba 1698 oled.Label((uint8_t *)"Next",60,80); //Display "Next" at x,y
asong 1:e4b38d6918ba 1699 sprintf(display_buff, "%u", HR_Vibration); //Convert int to char array for displaying user preference
asong 1:e4b38d6918ba 1700 textProperties.fontColor = COLOR_GREEN; //Change font to green
asong 1:e4b38d6918ba 1701 oled.SetTextProperties(&textProperties);//Implement color change
asong 1:e4b38d6918ba 1702 oled.Label((uint8_t *)display_buff,55,25); // Display at x,y
asong 1:e4b38d6918ba 1703 if(HR_Vibration == 1) {
asong 1:e4b38d6918ba 1704 textProperties.fontColor = COLOR_RED; //Change font to red
asong 1:e4b38d6918ba 1705 oled.SetTextProperties(&textProperties); //Implement color change
asong 1:e4b38d6918ba 1706 oled.Label((uint8_t *)"All On",10,45); // Display at x,y
asong 1:e4b38d6918ba 1707 } else if(HR_Vibration == 2) {
asong 1:e4b38d6918ba 1708 textProperties.fontColor = COLOR_RED; //Change font to red
asong 1:e4b38d6918ba 1709 oled.SetTextProperties(&textProperties);//Implement color change
asong 1:e4b38d6918ba 1710 oled.Label((uint8_t *)"Only Entering",10,38);// Display at x,y
asong 1:e4b38d6918ba 1711 oled.Label((uint8_t *)"And Exiting",10,53);// Display at x,y
asong 1:e4b38d6918ba 1712 oled.Label((uint8_t *)"Target Zone",10,68);// Display at x,y
nbaker 0:d1d36a3da39b 1713
asong 1:e4b38d6918ba 1714 } else if(HR_Vibration == 3) {
asong 1:e4b38d6918ba 1715 textProperties.fontColor = COLOR_RED; //Change font to red
asong 1:e4b38d6918ba 1716 oled.SetTextProperties(&textProperties); //Implement color change
asong 1:e4b38d6918ba 1717 oled.Label((uint8_t *)"All Off",10,45);// Display at x,y
asong 1:e4b38d6918ba 1718 }
asong 1:e4b38d6918ba 1719 textProperties.fontColor = COLOR_WHITE;
asong 1:e4b38d6918ba 1720 oled.SetTextProperties(&textProperties);
asong 1:e4b38d6918ba 1721 break;
asong 1:e4b38d6918ba 1722 }
asong 1:e4b38d6918ba 1723 case 29: { //Zone Boundary Info
asong 1:e4b38d6918ba 1724 oled.FillScreen(COLOR_BLACK);
asong 1:e4b38d6918ba 1725 oled.Label((uint8_t *)"HR Zone Info", 10, 5);// Display at x,y
asong 1:e4b38d6918ba 1726 textProperties.fontColor = COLOR_YELLOW; //Change font to yellow
asong 1:e4b38d6918ba 1727 oled.SetTextProperties(&textProperties);//Implement color change
asong 1:e4b38d6918ba 1728 oled.Label((uint8_t *)"Z1:", 10, 20);// Display at x,y
asong 1:e4b38d6918ba 1729 sprintf(display_buff, "%u", HR_Zone1[0]); // Convert int to char to display
asong 1:e4b38d6918ba 1730 oled.Label((uint8_t *)display_buff, 30, 20);// Display at x,y
asong 1:e4b38d6918ba 1731 oled.Label((uint8_t *)"-", 52, 20);// Display at x,y
asong 1:e4b38d6918ba 1732 sprintf(display_buff, "%u", HR_Zone1[1]); // Convert int to char to display
asong 1:e4b38d6918ba 1733 oled.Label((uint8_t *)display_buff, 60, 20);// Display at x,y
asong 1:e4b38d6918ba 1734 textProperties.fontColor = COLOR_BLUE; //Change font to blue
asong 1:e4b38d6918ba 1735 oled.SetTextProperties(&textProperties);//Implement color change
asong 1:e4b38d6918ba 1736 oled.Label((uint8_t *)"Z2:", 10, 35);// Display at x,y
asong 1:e4b38d6918ba 1737 sprintf(display_buff, "%u", HR_Zone2[0]); // Convert int to char to display
asong 1:e4b38d6918ba 1738 oled.Label((uint8_t *)display_buff, 30, 35);// Display at x,y
asong 1:e4b38d6918ba 1739 oled.Label((uint8_t *)"-", 52, 35);// Display at x,y
asong 1:e4b38d6918ba 1740 sprintf(display_buff, "%u", HR_Zone2[1]); // Convert int to char to display
asong 1:e4b38d6918ba 1741 oled.Label((uint8_t *)display_buff, 60, 35);// Display at x,y
asong 1:e4b38d6918ba 1742 textProperties.fontColor = COLOR_GREEN; //Change font to green
asong 1:e4b38d6918ba 1743 oled.SetTextProperties(&textProperties);//Implement color change
asong 1:e4b38d6918ba 1744 oled.Label((uint8_t *)"Z3:", 10, 50);// Display at x,y
asong 1:e4b38d6918ba 1745 sprintf(display_buff, "%u", HR_Zone3[0]); // Convert int to char to display
asong 1:e4b38d6918ba 1746 oled.Label((uint8_t *)display_buff, 30, 50);// Display at x,y
asong 1:e4b38d6918ba 1747 oled.Label((uint8_t *)"-", 52, 50);// Display at x,y
asong 1:e4b38d6918ba 1748 sprintf(display_buff, "%u", HR_Zone3[1]); // Convert int to char to display
asong 1:e4b38d6918ba 1749 oled.Label((uint8_t *)display_buff, 60, 50);// Display at x,y
asong 1:e4b38d6918ba 1750 textProperties.fontColor = COLOR_RED; //Change font to red
asong 1:e4b38d6918ba 1751 oled.SetTextProperties(&textProperties);//Implement color change
asong 1:e4b38d6918ba 1752 oled.Label((uint8_t *)"Z4:", 10, 65);// Display at x,y
asong 1:e4b38d6918ba 1753 sprintf(display_buff, "%u", HR_Zone4[0]); // Convert int to char to display
asong 1:e4b38d6918ba 1754 oled.Label((uint8_t *)display_buff, 30, 65);// Display at x,y
asong 1:e4b38d6918ba 1755 oled.Label((uint8_t *)"-", 52, 65);// Display at x,y
asong 1:e4b38d6918ba 1756 sprintf(display_buff, "%u", HR_Zone4[1]); // Convert int to char to display
asong 1:e4b38d6918ba 1757 oled.Label((uint8_t *)display_buff, 60, 65);// Display at x,y
asong 1:e4b38d6918ba 1758 textProperties.fontColor = COLOR_WHITE; //Change font to white
asong 1:e4b38d6918ba 1759 oled.SetTextProperties(&textProperties);//Implement color change
asong 1:e4b38d6918ba 1760 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
asong 1:e4b38d6918ba 1761 oled.Label((uint8_t *)"Next",60,80); //Display "Next" at x,y
asong 1:e4b38d6918ba 1762 break;
asong 2:824ed4ae8d52 1763 }
asong 2:824ed4ae8d52 1764 case 30: { //Enter Target Heart Rate Zone Preference
asong 1:e4b38d6918ba 1765 oled.FillScreen(COLOR_BLACK);
asong 1:e4b38d6918ba 1766 oled.Label((uint8_t *)"Zone Pref", 10, 5);// Display at x,y
asong 1:e4b38d6918ba 1767 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
asong 1:e4b38d6918ba 1768 oled.Label((uint8_t *)"Next",60,80); //Display "Next" at x,y
asong 1:e4b38d6918ba 1769 oled.Label((uint8_t *)"+",85,15); // "+" at x,y
asong 1:e4b38d6918ba 1770 oled.Label((uint8_t *)"-",85,60); // "-" at x,y
asong 1:e4b38d6918ba 1771 oled.Label((uint8_t *)"Target:", 10, 25);// Display at x,y
asong 1:e4b38d6918ba 1772 sprintf(display_buff, "%u", Target_Zone); // Convert int to char to display
asong 2:824ed4ae8d52 1773 if(Target_Zone == 1) {
asong 1:e4b38d6918ba 1774 textProperties.fontColor = COLOR_YELLOW; //Change font to yellow
asong 1:e4b38d6918ba 1775 oled.SetTextProperties(&textProperties);//Implement color change
asong 2:824ed4ae8d52 1776 } else if(Target_Zone == 2) {
asong 1:e4b38d6918ba 1777 textProperties.fontColor = COLOR_BLUE; //Change font to blue
asong 1:e4b38d6918ba 1778 oled.SetTextProperties(&textProperties);//Implement color change
asong 2:824ed4ae8d52 1779 } else if(Target_Zone == 3) {
asong 1:e4b38d6918ba 1780 textProperties.fontColor = COLOR_GREEN; //Change font to green
asong 1:e4b38d6918ba 1781 oled.SetTextProperties(&textProperties);//Implement color change
asong 2:824ed4ae8d52 1782 } else if(Target_Zone == 4) {
asong 1:e4b38d6918ba 1783 textProperties.fontColor = COLOR_RED; //Change font to red
asong 1:e4b38d6918ba 1784 oled.SetTextProperties(&textProperties);//Implement color change
asong 1:e4b38d6918ba 1785 }
asong 1:e4b38d6918ba 1786 oled.Label((uint8_t *)display_buff, 55, 25);// Display at x,y
asong 1:e4b38d6918ba 1787 textProperties.fontColor = COLOR_WHITE; //Change font to white
asong 1:e4b38d6918ba 1788 oled.SetTextProperties(&textProperties);//Implement color change
asong 1:e4b38d6918ba 1789 oled.Label((uint8_t *)"Bounds:", 10, 45);// Display at x,y
asong 2:824ed4ae8d52 1790 if(Target_Zone == 1) {
asong 1:e4b38d6918ba 1791 textProperties.fontColor = COLOR_YELLOW; //Change font to yellow
asong 1:e4b38d6918ba 1792 oled.SetTextProperties(&textProperties);//Implement color change
asong 1:e4b38d6918ba 1793 sprintf(display_buff, "%u", HR_Zone1[0]); // Convert int to char to display
asong 1:e4b38d6918ba 1794 oled.Label((uint8_t *)display_buff, 10, 60);// Display at x,y
asong 1:e4b38d6918ba 1795 oled.Label((uint8_t *)"-", 32, 60);// Display at x,y
asong 1:e4b38d6918ba 1796 sprintf(display_buff, "%u", HR_Zone1[1]); // Convert int to char to display
asong 1:e4b38d6918ba 1797 oled.Label((uint8_t *)display_buff, 40, 60);// Display at x,y
asong 2:824ed4ae8d52 1798 } else if(Target_Zone == 2) {
asong 1:e4b38d6918ba 1799 textProperties.fontColor = COLOR_BLUE; //Change font to blue
asong 1:e4b38d6918ba 1800 oled.SetTextProperties(&textProperties);//Implement color change
asong 1:e4b38d6918ba 1801 sprintf(display_buff, "%u", HR_Zone2[0]); // Convert int to char to display
asong 1:e4b38d6918ba 1802 oled.Label((uint8_t *)display_buff, 10, 60);// Display at x,y
asong 1:e4b38d6918ba 1803 oled.Label((uint8_t *)"-", 32, 60);// Display at x,y
asong 1:e4b38d6918ba 1804 sprintf(display_buff, "%u", HR_Zone2[1]); // Convert int to char to display
asong 1:e4b38d6918ba 1805 oled.Label((uint8_t *)display_buff, 40, 60);// Display at x,y
asong 2:824ed4ae8d52 1806 } else if(Target_Zone == 3) {
asong 1:e4b38d6918ba 1807 textProperties.fontColor = COLOR_GREEN; //Change font to green
asong 1:e4b38d6918ba 1808 oled.SetTextProperties(&textProperties);//Implement color change
asong 1:e4b38d6918ba 1809 sprintf(display_buff, "%u", HR_Zone3[0]); // Convert int to char to display
asong 1:e4b38d6918ba 1810 oled.Label((uint8_t *)display_buff, 10, 60); // Display at x,y
asong 1:e4b38d6918ba 1811 oled.Label((uint8_t *)"-", 32, 60); // Display at x,y
asong 1:e4b38d6918ba 1812 sprintf(display_buff, "%u", HR_Zone3[1]); // Convert int to char to display
asong 1:e4b38d6918ba 1813 oled.Label((uint8_t *)display_buff, 40, 60);// Display at x,y
asong 2:824ed4ae8d52 1814 } else if(Target_Zone == 4) {
asong 1:e4b38d6918ba 1815 textProperties.fontColor = COLOR_RED; //Change font to red
asong 1:e4b38d6918ba 1816 oled.SetTextProperties(&textProperties);//Implement color change
asong 1:e4b38d6918ba 1817 sprintf(display_buff, "%u", HR_Zone4[0]); // Convert int to char to display
asong 1:e4b38d6918ba 1818 oled.Label((uint8_t *)display_buff, 10, 60); // Display at x,y
asong 1:e4b38d6918ba 1819 oled.Label((uint8_t *)"-", 32, 60); // Display at x,y
asong 1:e4b38d6918ba 1820 sprintf(display_buff, "%u", HR_Zone4[1]); // Convert int to char to display
asong 1:e4b38d6918ba 1821 oled.Label((uint8_t *)display_buff, 40, 60); // Display at x,y
asong 1:e4b38d6918ba 1822 }
asong 1:e4b38d6918ba 1823 textProperties.fontColor = COLOR_WHITE; //Change font to white
asong 1:e4b38d6918ba 1824 oled.SetTextProperties(&textProperties);//Implement color change
asong 2:824ed4ae8d52 1825 break;
asong 2:824ed4ae8d52 1826 }
asong 2:824ed4ae8d52 1827 case 31: {
asong 2:824ed4ae8d52 1828 oled.FillScreen(COLOR_BLACK);
asong 2:824ed4ae8d52 1829 Heart_Rate_Vibrations();
asong 2:824ed4ae8d52 1830 oled.Label((uint8_t *)"Enter HR", 10, 5);// Display at x,y
asong 2:824ed4ae8d52 1831 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
asong 2:824ed4ae8d52 1832 oled.Label((uint8_t *)"Next",60,80); //Display "Next" at x,y
asong 2:824ed4ae8d52 1833 oled.Label((uint8_t *)"+",85,15); // "+" at x,y
asong 2:824ed4ae8d52 1834 oled.Label((uint8_t *)"-",85,60); // "-" at x,y
asong 2:824ed4ae8d52 1835 oled.Label((uint8_t *)"HR:", 10, 25);
asong 2:824ed4ae8d52 1836 sprintf(display_buff, "%u", Heart_Rate); // Convert int to char to display
asong 2:824ed4ae8d52 1837 textProperties.fontColor = COLOR_RED; //Change font to red
asong 2:824ed4ae8d52 1838 oled.SetTextProperties(&textProperties);//Implement color change
asong 2:824ed4ae8d52 1839 oled.Label((uint8_t *)display_buff, 40, 25);
asong 2:824ed4ae8d52 1840 textProperties.fontColor = COLOR_WHITE; //Change font to white
asong 2:824ed4ae8d52 1841 oled.SetTextProperties(&textProperties);//Implement color change
asong 2:824ed4ae8d52 1842 oled.Label((uint8_t *)"Cur Zone:", 10, 45);
asong 2:824ed4ae8d52 1843 if(Current_Zone == 1) {
asong 2:824ed4ae8d52 1844 textProperties.fontColor = COLOR_YELLOW;
asong 2:824ed4ae8d52 1845 oled.SetTextProperties(&textProperties);
asong 2:824ed4ae8d52 1846 } else if(Current_Zone == 2) {
asong 2:824ed4ae8d52 1847 textProperties.fontColor = COLOR_BLUE;
asong 2:824ed4ae8d52 1848 oled.SetTextProperties(&textProperties);
asong 2:824ed4ae8d52 1849 } else if(Current_Zone == 3) {
asong 2:824ed4ae8d52 1850 textProperties.fontColor = COLOR_GREEN;
asong 2:824ed4ae8d52 1851 oled.SetTextProperties(&textProperties);
asong 2:824ed4ae8d52 1852 } else if(Current_Zone == 4) {
asong 2:824ed4ae8d52 1853 textProperties.fontColor = COLOR_RED;
asong 2:824ed4ae8d52 1854 oled.SetTextProperties(&textProperties);
asong 2:824ed4ae8d52 1855 }
asong 2:824ed4ae8d52 1856 sprintf(display_buff, "%u", Current_Zone); // Convert int to char to display
asong 2:824ed4ae8d52 1857 oled.Label((uint8_t *)display_buff, 71, 45);
asong 2:824ed4ae8d52 1858 textProperties.fontColor = COLOR_WHITE; //Change font to white
asong 2:824ed4ae8d52 1859 oled.SetTextProperties(&textProperties);//Implement color change
asong 2:824ed4ae8d52 1860 oled.Label((uint8_t *)"Prev Zone:", 10, 60);
asong 2:824ed4ae8d52 1861 if(Prev_Zone == 1) {
asong 2:824ed4ae8d52 1862 textProperties.fontColor = COLOR_YELLOW;
asong 2:824ed4ae8d52 1863 oled.SetTextProperties(&textProperties);
asong 2:824ed4ae8d52 1864 } else if(Prev_Zone == 2) {
asong 2:824ed4ae8d52 1865 textProperties.fontColor = COLOR_BLUE;
asong 2:824ed4ae8d52 1866 oled.SetTextProperties(&textProperties);
asong 2:824ed4ae8d52 1867 } else if(Prev_Zone == 3) {
asong 2:824ed4ae8d52 1868 textProperties.fontColor = COLOR_GREEN;
asong 2:824ed4ae8d52 1869 oled.SetTextProperties(&textProperties);
asong 2:824ed4ae8d52 1870 } else if(Prev_Zone == 4) {
asong 2:824ed4ae8d52 1871 textProperties.fontColor = COLOR_RED;
asong 2:824ed4ae8d52 1872 oled.SetTextProperties(&textProperties);
asong 2:824ed4ae8d52 1873 }
asong 2:824ed4ae8d52 1874 sprintf(display_buff, "%u", Prev_Zone); // Convert int to char to display
asong 2:824ed4ae8d52 1875 oled.Label((uint8_t *)display_buff, 71, 60);
asong 2:824ed4ae8d52 1876 textProperties.fontColor = COLOR_WHITE; //Change font to white
asong 2:824ed4ae8d52 1877 oled.SetTextProperties(&textProperties);//Implement color change
asong 2:824ed4ae8d52 1878 Led_Zone_Indicator();
asong 2:824ed4ae8d52 1879 break;
asong 2:824ed4ae8d52 1880 }
asong 2:824ed4ae8d52 1881 case 32: {
asong 2:824ed4ae8d52 1882 //Zone Boundary Info
asong 2:824ed4ae8d52 1883 oled.FillScreen(COLOR_BLACK);
asong 2:824ed4ae8d52 1884 oled.Label((uint8_t *)"HR Zone Info", 10, 5);// Display at x,y
asong 2:824ed4ae8d52 1885 textProperties.fontColor = COLOR_YELLOW; //Change font to yellow
asong 2:824ed4ae8d52 1886 oled.SetTextProperties(&textProperties);//Implement color change
asong 2:824ed4ae8d52 1887 oled.Label((uint8_t *)"Z1:", 10, 20);// Display at x,y
asong 2:824ed4ae8d52 1888 sprintf(display_buff, "%u", HR_Zone1[0]); // Convert int to char to display
asong 2:824ed4ae8d52 1889 oled.Label((uint8_t *)display_buff, 30, 20);// Display at x,y
asong 2:824ed4ae8d52 1890 oled.Label((uint8_t *)"-", 52, 20);// Display at x,y
asong 2:824ed4ae8d52 1891 sprintf(display_buff, "%u", HR_Zone1[1]); // Convert int to char to display
asong 2:824ed4ae8d52 1892 oled.Label((uint8_t *)display_buff, 60, 20);// Display at x,y
asong 2:824ed4ae8d52 1893 textProperties.fontColor = COLOR_BLUE; //Change font to blue
asong 2:824ed4ae8d52 1894 oled.SetTextProperties(&textProperties);//Implement color change
asong 2:824ed4ae8d52 1895 oled.Label((uint8_t *)"Z2:", 10, 35);// Display at x,y
asong 2:824ed4ae8d52 1896 sprintf(display_buff, "%u", HR_Zone2[0]); // Convert int to char to display
asong 2:824ed4ae8d52 1897 oled.Label((uint8_t *)display_buff, 30, 35);// Display at x,y
asong 2:824ed4ae8d52 1898 oled.Label((uint8_t *)"-", 52, 35);// Display at x,y
asong 2:824ed4ae8d52 1899 sprintf(display_buff, "%u", HR_Zone2[1]); // Convert int to char to display
asong 2:824ed4ae8d52 1900 oled.Label((uint8_t *)display_buff, 60, 35);// Display at x,y
asong 2:824ed4ae8d52 1901 textProperties.fontColor = COLOR_GREEN; //Change font to green
asong 2:824ed4ae8d52 1902 oled.SetTextProperties(&textProperties);//Implement color change
asong 2:824ed4ae8d52 1903 oled.Label((uint8_t *)"Z3:", 10, 50);// Display at x,y
asong 2:824ed4ae8d52 1904 sprintf(display_buff, "%u", HR_Zone3[0]); // Convert int to char to display
asong 2:824ed4ae8d52 1905 oled.Label((uint8_t *)display_buff, 30, 50);// Display at x,y
asong 2:824ed4ae8d52 1906 oled.Label((uint8_t *)"-", 52, 50);// Display at x,y
asong 2:824ed4ae8d52 1907 sprintf(display_buff, "%u", HR_Zone3[1]); // Convert int to char to display
asong 2:824ed4ae8d52 1908 oled.Label((uint8_t *)display_buff, 60, 50);// Display at x,y
asong 2:824ed4ae8d52 1909 textProperties.fontColor = COLOR_RED; //Change font to red
asong 2:824ed4ae8d52 1910 oled.SetTextProperties(&textProperties);//Implement color change
asong 2:824ed4ae8d52 1911 oled.Label((uint8_t *)"Z4:", 10, 65);// Display at x,y
asong 2:824ed4ae8d52 1912 sprintf(display_buff, "%u", HR_Zone4[0]); // Convert int to char to display
asong 2:824ed4ae8d52 1913 oled.Label((uint8_t *)display_buff, 30, 65);// Display at x,y
asong 2:824ed4ae8d52 1914 oled.Label((uint8_t *)"-", 52, 65);// Display at x,y
asong 2:824ed4ae8d52 1915 sprintf(display_buff, "%u", HR_Zone4[1]); // Convert int to char to display
asong 2:824ed4ae8d52 1916 oled.Label((uint8_t *)display_buff, 60, 65);// Display at x,y
asong 2:824ed4ae8d52 1917 textProperties.fontColor = COLOR_WHITE; //Change font to white
asong 2:824ed4ae8d52 1918 oled.SetTextProperties(&textProperties);//Implement color change
asong 2:824ed4ae8d52 1919 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
asong 2:824ed4ae8d52 1920 oled.Label((uint8_t *)"Next",60,80); //Display "Next" at x,y
asong 2:824ed4ae8d52 1921 break;
nbaker 8:a5c77b45008d 1922 }
nbaker 8:a5c77b45008d 1923 case 41: { //Fall mode
nbaker 8:a5c77b45008d 1924 oled.FillScreen(COLOR_BLACK);
nbaker 8:a5c77b45008d 1925 oled.Label((uint8_t *)"Adj Fall Mode", 10, 5);
nbaker 8:a5c77b45008d 1926 sprintf(display_buff, "%u", Fall_Alert_Mode); //Convert int to char array for displaying mode
nbaker 8:a5c77b45008d 1927 oled.Label((uint8_t *)"Mode:", 5, 30);
nbaker 8:a5c77b45008d 1928 oled.Label((uint8_t *)"+",85,15); // "*" at x,y
nbaker 8:a5c77b45008d 1929 oled.Label((uint8_t *)"-",85,60); // "*" at x,y
nbaker 8:a5c77b45008d 1930 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
nbaker 8:a5c77b45008d 1931 oled.Label((uint8_t *)"Next",60,80); //Display "Next" at x,y
nbaker 8:a5c77b45008d 1932 textProperties.fontColor = COLOR_GREEN;
nbaker 8:a5c77b45008d 1933 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1934 oled.Label((uint8_t *)display_buff,43,30); // Display at x,y
nbaker 8:a5c77b45008d 1935 textProperties.fontColor = COLOR_WHITE;
nbaker 8:a5c77b45008d 1936 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1937 break;
nbaker 8:a5c77b45008d 1938 }
nbaker 8:a5c77b45008d 1939 case 42: { //Fall Thresh
nbaker 8:a5c77b45008d 1940 oled.FillScreen(COLOR_BLACK);
nbaker 8:a5c77b45008d 1941 oled.Label((uint8_t *)"Adj F-Th", 10, 5);
nbaker 8:a5c77b45008d 1942 sprintf(display_buff, "%2.2f g", Fall_Thresh); //Convert int to char array for displaying mode
nbaker 8:a5c77b45008d 1943 oled.Label((uint8_t *)"F_Th:", 5, 30);
nbaker 8:a5c77b45008d 1944 oled.Label((uint8_t *)"+",85,15); // "*" at x,y
nbaker 8:a5c77b45008d 1945 oled.Label((uint8_t *)"-",85,60); // "*" at x,y
nbaker 8:a5c77b45008d 1946 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
nbaker 8:a5c77b45008d 1947 oled.Label((uint8_t *)"Next",60,80); //Display "Next" at x,y
nbaker 8:a5c77b45008d 1948 textProperties.fontColor = COLOR_GREEN;
nbaker 8:a5c77b45008d 1949 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1950 oled.Label((uint8_t *)display_buff,43,30); // Display at x,y
nbaker 8:a5c77b45008d 1951 textProperties.fontColor = COLOR_WHITE;
nbaker 8:a5c77b45008d 1952 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1953 break;
nbaker 8:a5c77b45008d 1954 }
nbaker 8:a5c77b45008d 1955 case 43: { //Impact Thresh
nbaker 8:a5c77b45008d 1956 oled.FillScreen(COLOR_BLACK);
nbaker 8:a5c77b45008d 1957 oled.Label((uint8_t *)"Adj I-Th", 10, 5);
nbaker 8:a5c77b45008d 1958 sprintf(display_buff, "%2.2f g", Impact_Thresh); //Convert int to char array for displaying mode
nbaker 8:a5c77b45008d 1959 oled.Label((uint8_t *)"I_Th:", 5, 30);
nbaker 8:a5c77b45008d 1960 oled.Label((uint8_t *)"+",85,15); // "*" at x,y
nbaker 8:a5c77b45008d 1961 oled.Label((uint8_t *)"-",85,60); // "*" at x,y
nbaker 8:a5c77b45008d 1962 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
nbaker 8:a5c77b45008d 1963 oled.Label((uint8_t *)"Next",60,80); //Display "Next" at x,y
nbaker 8:a5c77b45008d 1964 textProperties.fontColor = COLOR_GREEN;
nbaker 8:a5c77b45008d 1965 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1966 oled.Label((uint8_t *)display_buff,43,30); // Display at x,y
nbaker 8:a5c77b45008d 1967 textProperties.fontColor = COLOR_WHITE;
nbaker 8:a5c77b45008d 1968 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1969 break;
nbaker 8:a5c77b45008d 1970 }
nbaker 8:a5c77b45008d 1971 case 44: { //Motion Thresh
nbaker 8:a5c77b45008d 1972 oled.FillScreen(COLOR_BLACK);
nbaker 8:a5c77b45008d 1973 oled.Label((uint8_t *)"Adj M-Th", 10, 5);
nbaker 8:a5c77b45008d 1974 sprintf(display_buff, "%4.0f D/S", Movement_Thresh); //Convert int to char array for displaying mode
nbaker 8:a5c77b45008d 1975 oled.Label((uint8_t *)"M_Th:", 5, 30);
nbaker 8:a5c77b45008d 1976 oled.Label((uint8_t *)"+",85,15); // "*" at x,y
nbaker 8:a5c77b45008d 1977 oled.Label((uint8_t *)"-",85,60); // "*" at x,y
nbaker 8:a5c77b45008d 1978 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
nbaker 9:d2e39ee9fedd 1979 oled.Label((uint8_t *)"Next",60,80); //Display "Next" at x,y
nbaker 9:d2e39ee9fedd 1980 textProperties.fontColor = COLOR_GREEN;
nbaker 9:d2e39ee9fedd 1981 oled.SetTextProperties(&textProperties);
nbaker 9:d2e39ee9fedd 1982 oled.Label((uint8_t *)display_buff,43,30); // Display at x,y
nbaker 9:d2e39ee9fedd 1983 textProperties.fontColor = COLOR_WHITE;
nbaker 9:d2e39ee9fedd 1984 oled.SetTextProperties(&textProperties);
nbaker 9:d2e39ee9fedd 1985 break;
nbaker 9:d2e39ee9fedd 1986 }//end case 44
nbaker 9:d2e39ee9fedd 1987 case 45: { //Min_Movement_Time
nbaker 9:d2e39ee9fedd 1988 oled.FillScreen(COLOR_BLACK);
nbaker 9:d2e39ee9fedd 1989 oled.Label((uint8_t *)"Adj MinM_Tim", 10, 5);
nbaker 9:d2e39ee9fedd 1990 sprintf(display_buff, "%1.2fSec", Min_Movement_Time); //Convert int to char array for displaying mode
nbaker 9:d2e39ee9fedd 1991 oled.Label((uint8_t *)"m_Tm:", 5, 30);
nbaker 9:d2e39ee9fedd 1992 oled.Label((uint8_t *)"+",85,15); // "*" at x,y
nbaker 9:d2e39ee9fedd 1993 oled.Label((uint8_t *)"-",85,60); // "*" at x,y
nbaker 9:d2e39ee9fedd 1994 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
nbaker 9:d2e39ee9fedd 1995 oled.Label((uint8_t *)"Next",60,80); //Display "Next" at x,y
nbaker 8:a5c77b45008d 1996 textProperties.fontColor = COLOR_GREEN;
nbaker 8:a5c77b45008d 1997 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 1998 oled.Label((uint8_t *)display_buff,43,30); // Display at x,y
nbaker 8:a5c77b45008d 1999 textProperties.fontColor = COLOR_WHITE;
nbaker 8:a5c77b45008d 2000 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 2001 break;
nbaker 9:d2e39ee9fedd 2002 }//end case 45
nbaker 9:d2e39ee9fedd 2003 case 46: { //Min_Movement_Time
nbaker 9:d2e39ee9fedd 2004 oled.FillScreen(COLOR_BLACK);
nbaker 9:d2e39ee9fedd 2005 oled.Label((uint8_t *)"Adj MinM_Dur", 10, 5);
nbaker 9:d2e39ee9fedd 2006 sprintf(display_buff, "%2.1fSec", Min_Movement_duration); //Convert int to char array for displaying mode
nbaker 9:d2e39ee9fedd 2007 oled.Label((uint8_t *)"mDur:", 5, 30);
nbaker 9:d2e39ee9fedd 2008 oled.Label((uint8_t *)"+",85,15); // "*" at x,y
nbaker 9:d2e39ee9fedd 2009 oled.Label((uint8_t *)"-",85,60); // "*" at x,y
nbaker 9:d2e39ee9fedd 2010 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
nbaker 9:d2e39ee9fedd 2011 // oled.Label((uint8_t *)"Next",60,80); //Display "Next" at x,y
nbaker 9:d2e39ee9fedd 2012 textProperties.fontColor = COLOR_GREEN;
nbaker 9:d2e39ee9fedd 2013 oled.SetTextProperties(&textProperties);
nbaker 9:d2e39ee9fedd 2014 oled.Label((uint8_t *)display_buff,43,30); // Display at x,y
nbaker 9:d2e39ee9fedd 2015 textProperties.fontColor = COLOR_WHITE;
nbaker 9:d2e39ee9fedd 2016 oled.SetTextProperties(&textProperties);
nbaker 9:d2e39ee9fedd 2017 break;
nbaker 9:d2e39ee9fedd 2018 }//end case 46
nbaker 9:d2e39ee9fedd 2019
nbaker 0:d1d36a3da39b 2020 #endif // end of non-production/debug version code
nbaker 8:a5c77b45008d 2021
nbaker 8:a5c77b45008d 2022 case 71: {// BLE
nbaker 8:a5c77b45008d 2023 oled.FillScreen(COLOR_BLACK); // Clear screen
nbaker 8:a5c77b45008d 2024 oled.Label((uint8_t *)"BLUETOOTH",5,5); // Display at x,y
nbaker 9:d2e39ee9fedd 2025 oled.Label((uint8_t *)"Enter",60,80); //Display at x,y
nbaker 8:a5c77b45008d 2026 textProperties.fontColor = COLOR_WHITE;
nbaker 8:a5c77b45008d 2027 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 2028 oled.Label((uint8_t *)"*",85,15); // "*" at x,y
nbaker 8:a5c77b45008d 2029 oled.Label((uint8_t *)"*",85,60); // "*" at x,y
nbaker 9:d2e39ee9fedd 2030 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
nbaker 8:a5c77b45008d 2031 break;
nbaker 8:a5c77b45008d 2032 }
nbaker 8:a5c77b45008d 2033
nbaker 8:a5c77b45008d 2034 case 72: {// BlueTooth on/off
nbaker 8:a5c77b45008d 2035 oled.FillScreen(COLOR_BLACK); // Clear screen
nbaker 8:a5c77b45008d 2036 oled.Label((uint8_t *)"BLUETOOTH",5,5); // Display at x,y
nbaker 8:a5c77b45008d 2037 if (BLE_On == 1) {
nbaker 8:a5c77b45008d 2038 strcpy((char *) text,"PAIR CODE");
nbaker 8:a5c77b45008d 2039 oled.TextBox((uint8_t *)text,5,25,85,18);
nbaker 8:a5c77b45008d 2040 /* Display Bond Pass Key in a 85px by 18px textbox at x=5,y=25 */
nbaker 8:a5c77b45008d 2041
nbaker 8:a5c77b45008d 2042 /* This part was not compiling
nbaker 8:a5c77b45008d 2043 sprintf(text,"%d", kw40z_device.GetPassKey());
nbaker 8:a5c77b45008d 2044 oled.TextBox((uint8_t *)text,0,40,95,18);
nbaker 8:a5c77b45008d 2045 */
nbaker 8:a5c77b45008d 2046 oled.TextBox((uint8_t *)"Passkey",5,40,85,18); //show passkey in a 85px by 18px text box at x=5, y=40
nbaker 8:a5c77b45008d 2047 } else {
nbaker 8:a5c77b45008d 2048 oled.Label((uint8_t *)" Off ",40,40);
nbaker 8:a5c77b45008d 2049 }
nbaker 8:a5c77b45008d 2050 // oled.Label((uint8_t *)"*",85,15); // "*" at x,y
nbaker 8:a5c77b45008d 2051 // oled.Label((uint8_t *)"*",85,60); // "*" at x,y
nbaker 8:a5c77b45008d 2052 oled.Label((uint8_t *)"Back",10,80); // Display "Back" at x,y
nbaker 9:d2e39ee9fedd 2053 oled.Label((uint8_t *)"Toggle",59,80); //Display "Toggle" at x,y
nbaker 8:a5c77b45008d 2054 break;
nbaker 8:a5c77b45008d 2055 }
nbaker 8:a5c77b45008d 2056
nbaker 8:a5c77b45008d 2057
asong 1:e4b38d6918ba 2058 default: {
asong 2:824ed4ae8d52 2059 Error_Num=1;
asong 2:824ed4ae8d52 2060 error_screen(); // Clear screen
asong 2:824ed4ae8d52 2061 break;
asong 2:824ed4ae8d52 2062 }
nbaker 8:a5c77b45008d 2063 }//end of switch
nbaker 8:a5c77b45008d 2064 __enable_irq(); // Enable all Interrupts
nbaker 8:a5c77b45008d 2065 }// end upday_display()
nbaker 8:a5c77b45008d 2066
asong 1:e4b38d6918ba 2067 void error_screen(void)
asong 1:e4b38d6918ba 2068 {
asong 1:e4b38d6918ba 2069 oled.FillScreen(COLOR_RED); // Clear screen
asong 1:e4b38d6918ba 2070 oled.Label((uint8_t *)"Error! ",30,30); // Display error at x,y
asong 1:e4b38d6918ba 2071 sprintf(text_1," %i ",Error_Num);
asong 1:e4b38d6918ba 2072 oled.Label((uint8_t *)text_1,30,60); // Display error at x,y
asong 1:e4b38d6918ba 2073 wait(3); // wait 3 seconds
asong 1:e4b38d6918ba 2074 oled.FillScreen(COLOR_BLACK); // Clear screen
nbaker 0:d1d36a3da39b 2075 }
asong 2:824ed4ae8d52 2076
asong 2:824ed4ae8d52 2077 /*****************************************************************************
asong 2:824ed4ae8d52 2078 Name: StartHaptic
asong 2:824ed4ae8d52 2079 Purpose: Cause the HexiHeart device to vibrate for a predetermined amount of
asong 2:824ed4ae8d52 2080 time
asong 2:824ed4ae8d52 2081 Inputs: None
asong 2:824ed4ae8d52 2082 Returns: None
asong 2:824ed4ae8d52 2083 ******************************************************************************/
nbaker 0:d1d36a3da39b 2084 void StartHaptic(void)
nbaker 0:d1d36a3da39b 2085 {
nbaker 8:a5c77b45008d 2086 hapticTimer.start(30); // was originaly 50, then 30
nbaker 8:a5c77b45008d 2087 /* this 30 value seems to not work after Neil added a global
nbaker 8:a5c77b45008d 2088 __disable_irq() and __enable_irq() for the update_display() functions on 2/18/18
nbaker 8:a5c77b45008d 2089 */
nbaker 0:d1d36a3da39b 2090 haptic = 1;
nbaker 0:d1d36a3da39b 2091 }
nbaker 0:d1d36a3da39b 2092
asong 2:824ed4ae8d52 2093 /*****************************************************************************
asong 2:824ed4ae8d52 2094 Name: StartHaptic
asong 2:824ed4ae8d52 2095 Purpose: Cause the HexiHeart device to vibrate for x amount of time
asong 2:824ed4ae8d52 2096 Inputs: An int representing the duration of the vibration
asong 2:824ed4ae8d52 2097 Returns: None
asong 2:824ed4ae8d52 2098 ******************************************************************************/
nbaker 8:a5c77b45008d 2099
asong 1:e4b38d6918ba 2100 void StartHaptic(int x)
nbaker 8:a5c77b45008d 2101 {
asong 1:e4b38d6918ba 2102 hapticTimer.start(x);
asong 2:824ed4ae8d52 2103 haptic = 1;
asong 1:e4b38d6918ba 2104 }
asong 1:e4b38d6918ba 2105
asong 1:e4b38d6918ba 2106 void StopHaptic(void const *n)
asong 1:e4b38d6918ba 2107 {
nbaker 0:d1d36a3da39b 2108 haptic = 0;
nbaker 0:d1d36a3da39b 2109 hapticTimer.stop();
nbaker 0:d1d36a3da39b 2110 }
asong 2:824ed4ae8d52 2111
asong 2:824ed4ae8d52 2112 /*****************************************************************************
asong 2:824ed4ae8d52 2113 Name: Increment_Age
asong 2:824ed4ae8d52 2114 Purpose: Increment the user's age by 1
asong 2:824ed4ae8d52 2115 Inputs: None
asong 2:824ed4ae8d52 2116 Returns: None
asong 2:824ed4ae8d52 2117 ******************************************************************************/
asong 2:824ed4ae8d52 2118 void Increment_Age()
asong 2:824ed4ae8d52 2119 {
asong 2:824ed4ae8d52 2120 StartHaptic();
asong 2:824ed4ae8d52 2121 if(Age < 100) {
asong 2:824ed4ae8d52 2122 Age += 1;
asong 2:824ed4ae8d52 2123 Screen_Num = 27;
asong 2:824ed4ae8d52 2124 } else {
asong 2:824ed4ae8d52 2125 Age = 1;
asong 2:824ed4ae8d52 2126 }
asong 2:824ed4ae8d52 2127 }
asong 2:824ed4ae8d52 2128
asong 2:824ed4ae8d52 2129 /*****************************************************************************
asong 2:824ed4ae8d52 2130 Name: Decrement_Age
asong 2:824ed4ae8d52 2131 Purpose: Decrement the user's age by 1
asong 2:824ed4ae8d52 2132 Inputs: None
asong 2:824ed4ae8d52 2133 Returns: None
asong 2:824ed4ae8d52 2134 ******************************************************************************/
asong 2:824ed4ae8d52 2135 void Decrement_Age()
asong 2:824ed4ae8d52 2136 {
asong 2:824ed4ae8d52 2137 StartHaptic();
asong 2:824ed4ae8d52 2138 if(Age == 1) {
asong 2:824ed4ae8d52 2139 Age = 100;
asong 2:824ed4ae8d52 2140 } else {
asong 2:824ed4ae8d52 2141 Age -= 1;
asong 2:824ed4ae8d52 2142 Screen_Num = 27;
asong 2:824ed4ae8d52 2143 }
asong 2:824ed4ae8d52 2144 }
asong 2:824ed4ae8d52 2145
asong 2:824ed4ae8d52 2146 /*****************************************************************************
asong 2:824ed4ae8d52 2147 Name: Set_Max_Bpm
asong 2:824ed4ae8d52 2148 Purpose: Calculates the user's maximum heart rate based on their age
asong 2:824ed4ae8d52 2149 Inputs: None
asong 2:824ed4ae8d52 2150 Returns: None
asong 2:824ed4ae8d52 2151 ******************************************************************************/
asong 2:824ed4ae8d52 2152 void Set_Max_Bpm()
asong 2:824ed4ae8d52 2153 {
asong 2:824ed4ae8d52 2154 Max_Bpm = 220 - Age;
asong 2:824ed4ae8d52 2155 }
asong 2:824ed4ae8d52 2156
asong 2:824ed4ae8d52 2157 /*****************************************************************************
asong 2:824ed4ae8d52 2158 Name: Set_Zone_Boundaries
asong 2:824ed4ae8d52 2159 Purpose: Calculates the user's heart rate zones' boundaries based on the user's
asong 2:824ed4ae8d52 2160 maximum heart rate
asong 2:824ed4ae8d52 2161 Inputs: None
asong 2:824ed4ae8d52 2162 Returns: None
asong 2:824ed4ae8d52 2163 ******************************************************************************/
asong 2:824ed4ae8d52 2164 void Set_Zone_Boundaries()
asong 2:824ed4ae8d52 2165 {
asong 2:824ed4ae8d52 2166 Set_Max_Bpm();
asong 2:824ed4ae8d52 2167 HR_Zone1[0] = Max_Bpm * .50; //Set Heart Rate Zone 1
asong 2:824ed4ae8d52 2168 HR_Zone1[1] = Max_Bpm * .60; //Set Heart Rate Zone 1
asong 2:824ed4ae8d52 2169 HR_Zone2[0] = HR_Zone1[1] + 1; //Set Heart Rate Zone 2
asong 2:824ed4ae8d52 2170 HR_Zone2[1] = Max_Bpm * .70; //Set Heart Rate Zone 2
asong 2:824ed4ae8d52 2171 HR_Zone3[0] = HR_Zone2[1] + 1; //Set Heart Rate Zone 3
asong 2:824ed4ae8d52 2172 HR_Zone3[1] = Max_Bpm * .80; //Set Heart Rate Zone 3
asong 2:824ed4ae8d52 2173 HR_Zone4[0] = HR_Zone3[1] + 1; //Set Heart Rate Zone 4
asong 2:824ed4ae8d52 2174 HR_Zone4[1] = Max_Bpm; //Set Heart Rate Zone 4
asong 2:824ed4ae8d52 2175 }
asong 2:824ed4ae8d52 2176
asong 2:824ed4ae8d52 2177 /*****************************************************************************
asong 2:824ed4ae8d52 2178 Name: Increment_Target_Zone
asong 2:824ed4ae8d52 2179 Purpose: Imcrements the user's target heart rate zone preference by 1
asong 2:824ed4ae8d52 2180 Inputs: None
asong 2:824ed4ae8d52 2181 Returns: None
asong 2:824ed4ae8d52 2182 ******************************************************************************/
asong 2:824ed4ae8d52 2183 void Increment_Target_Zone()
asong 2:824ed4ae8d52 2184 {
asong 2:824ed4ae8d52 2185 StartHaptic();
asong 2:824ed4ae8d52 2186 if(Target_Zone == 4) {
asong 2:824ed4ae8d52 2187 Target_Zone = 1;
asong 2:824ed4ae8d52 2188 } else {
asong 2:824ed4ae8d52 2189 Target_Zone += 1;
asong 2:824ed4ae8d52 2190 }
asong 2:824ed4ae8d52 2191 }
asong 2:824ed4ae8d52 2192
asong 2:824ed4ae8d52 2193 /*****************************************************************************
asong 2:824ed4ae8d52 2194 Name: Decrement_Target_Zone
asong 2:824ed4ae8d52 2195 Purpose: Decrements the user's target heart rate zone preference by 1
asong 2:824ed4ae8d52 2196 Inputs: None
asong 2:824ed4ae8d52 2197 Returns: None
asong 2:824ed4ae8d52 2198 ******************************************************************************/
asong 2:824ed4ae8d52 2199 void Decrement_Target_Zone()
asong 2:824ed4ae8d52 2200 {
asong 2:824ed4ae8d52 2201 StartHaptic();
asong 2:824ed4ae8d52 2202 if(Target_Zone == 1) {
asong 2:824ed4ae8d52 2203 Target_Zone = 4;
asong 2:824ed4ae8d52 2204 } else {
asong 2:824ed4ae8d52 2205 Target_Zone -= 1;
asong 2:824ed4ae8d52 2206 }
asong 2:824ed4ae8d52 2207 }
asong 2:824ed4ae8d52 2208
asong 2:824ed4ae8d52 2209 /*****************************************************************************
asong 2:824ed4ae8d52 2210 Name: Increment_HR_Vibr_Pref
asong 2:824ed4ae8d52 2211 Purpose: Increment the user's heart rate vibration preference by 1
asong 2:824ed4ae8d52 2212 Inputs: None
asong 2:824ed4ae8d52 2213 Returns: None
asong 2:824ed4ae8d52 2214 ******************************************************************************/
asong 2:824ed4ae8d52 2215 void Increment_HR_Vibr_Pref()
asong 2:824ed4ae8d52 2216 {
asong 2:824ed4ae8d52 2217 StartHaptic();
asong 2:824ed4ae8d52 2218 if(HR_Vibration == 3) {
asong 2:824ed4ae8d52 2219 HR_Vibration = 1;
asong 2:824ed4ae8d52 2220 } else {
asong 2:824ed4ae8d52 2221 HR_Vibration += 1;
asong 2:824ed4ae8d52 2222 }
asong 2:824ed4ae8d52 2223 }
asong 2:824ed4ae8d52 2224
asong 2:824ed4ae8d52 2225 /*****************************************************************************
asong 2:824ed4ae8d52 2226 Name: Decrement_HR_Vibr_Pref
asong 2:824ed4ae8d52 2227 Purpose: Decrement the user's heart rate vibration preference by 1
asong 2:824ed4ae8d52 2228 Inputs: None
asong 2:824ed4ae8d52 2229 Returns: None
asong 2:824ed4ae8d52 2230 ******************************************************************************/
asong 2:824ed4ae8d52 2231 void Decrement_HR_Vibr_Pref()
asong 2:824ed4ae8d52 2232 {
asong 2:824ed4ae8d52 2233 StartHaptic();
asong 2:824ed4ae8d52 2234 if(HR_Vibration == 1) {
asong 2:824ed4ae8d52 2235 HR_Vibration = 3;
asong 2:824ed4ae8d52 2236 } else {
asong 2:824ed4ae8d52 2237 HR_Vibration -= 1;
asong 2:824ed4ae8d52 2238 }
asong 2:824ed4ae8d52 2239 }
asong 2:824ed4ae8d52 2240
asong 2:824ed4ae8d52 2241 /*****************************************************************************
asong 2:824ed4ae8d52 2242 Name: Enable_Heart_Rate
asong 2:824ed4ae8d52 2243 Purpose: Turn on the HexiHeart heart rate function
asong 2:824ed4ae8d52 2244 Inputs: None
asong 2:824ed4ae8d52 2245 Returns: None
asong 2:824ed4ae8d52 2246 ******************************************************************************/
asong 2:824ed4ae8d52 2247 void Enable_Heart_Rate()
asong 2:824ed4ae8d52 2248 {
asong 2:824ed4ae8d52 2249 Heart_Rate_Mode = true;
asong 2:824ed4ae8d52 2250 Heart_Rate_Vibrations();
asong 2:824ed4ae8d52 2251 }
asong 2:824ed4ae8d52 2252
asong 2:824ed4ae8d52 2253 /*****************************************************************************
asong 2:824ed4ae8d52 2254 Name: Disable_Heart_Rate
asong 2:824ed4ae8d52 2255 Purpose: Turn off the HexiHeart heart rate function
asong 2:824ed4ae8d52 2256 Inputs: None
asong 2:824ed4ae8d52 2257 Returns: None
asong 2:824ed4ae8d52 2258 ******************************************************************************/
asong 2:824ed4ae8d52 2259 void Disable_Heart_Rate()
asong 2:824ed4ae8d52 2260 {
asong 2:824ed4ae8d52 2261 Heart_Rate_Mode = false;
asong 2:824ed4ae8d52 2262 Heart_Rate_Vibrations();
asong 2:824ed4ae8d52 2263 }
asong 2:824ed4ae8d52 2264
asong 2:824ed4ae8d52 2265 /*****************************************************************************
asong 2:824ed4ae8d52 2266 Name: Determine_Current_Zone
asong 2:824ed4ae8d52 2267 Purpose: Determines which zone the heart rate is in and assigns the curent
asong 2:824ed4ae8d52 2268 zone and previous zone
asong 2:824ed4ae8d52 2269 Inputs: None
asong 2:824ed4ae8d52 2270 Returns: None
asong 2:824ed4ae8d52 2271 ******************************************************************************/
asong 2:824ed4ae8d52 2272 void Determine_Current_Zone()
asong 2:824ed4ae8d52 2273 {
asong 2:824ed4ae8d52 2274 Prev_Zone = Current_Zone;
asong 2:824ed4ae8d52 2275
asong 2:824ed4ae8d52 2276 if(Heart_Rate >= HR_Zone1[0] && Heart_Rate <= HR_Zone1[1]) {
asong 2:824ed4ae8d52 2277 Current_Zone = 1;
asong 2:824ed4ae8d52 2278 } else if(Heart_Rate >= HR_Zone2[0] && Heart_Rate <= HR_Zone2[1]) {
asong 2:824ed4ae8d52 2279 Current_Zone = 2;
asong 2:824ed4ae8d52 2280 } else if(Heart_Rate >= HR_Zone3[0] && Heart_Rate <= HR_Zone3[1]) {
asong 2:824ed4ae8d52 2281 Current_Zone = 3;
asong 2:824ed4ae8d52 2282 } else if(Heart_Rate >= HR_Zone4[0] && Heart_Rate <= HR_Zone4[1]) {
asong 2:824ed4ae8d52 2283 Current_Zone = 4;
asong 2:824ed4ae8d52 2284 } else {
asong 2:824ed4ae8d52 2285 //error reading, don't change anything
asong 2:824ed4ae8d52 2286 }
asong 2:824ed4ae8d52 2287
asong 2:824ed4ae8d52 2288
asong 2:824ed4ae8d52 2289 }
asong 2:824ed4ae8d52 2290 /*****************************************************************************
asong 2:824ed4ae8d52 2291 Name: Run_Heart_Vibrations
asong 2:824ed4ae8d52 2292 Purpose: Performs the HexiHeart heart rate function
asong 2:824ed4ae8d52 2293 Inputs: None
asong 2:824ed4ae8d52 2294 Returns: None
asong 2:824ed4ae8d52 2295 ******************************************************************************/
asong 2:824ed4ae8d52 2296 void Heart_Rate_Vibrations()
asong 2:824ed4ae8d52 2297 {
asong 2:824ed4ae8d52 2298 if(Heart_Rate_Mode == true) {
asong 2:824ed4ae8d52 2299 if(HR_Vibration == 1) {
asong 2:824ed4ae8d52 2300 //All Pre-loaded vibrations enabled
asong 2:824ed4ae8d52 2301 if(Current_Zone == Prev_Zone) {
asong 2:824ed4ae8d52 2302 // Do nothing if no zone change
asong 2:824ed4ae8d52 2303 } else if(Current_Zone == Target_Zone) { //Changed to target zone
asong 2:824ed4ae8d52 2304 if(Target_Zone == LOWEST_ZONE || Prev_Zone > Target_Zone) { //must have entered from above
asong 2:824ed4ae8d52 2305 StartHaptic(ENTER_ABOVE);
asong 2:824ed4ae8d52 2306 } else if(Target_Zone == HIGHEST_ZONE || Prev_Zone < Target_Zone) { //must have entered from below
asong 2:824ed4ae8d52 2307 StartHaptic(ENTER_BELOW);
asong 2:824ed4ae8d52 2308 }
asong 2:824ed4ae8d52 2309 } else if(Current_Zone != Target_Zone && Prev_Zone == Target_Zone) {
asong 2:824ed4ae8d52 2310 if(Target_Zone == HIGHEST_ZONE || Current_Zone < Target_Zone) { //must have exited below
asong 2:824ed4ae8d52 2311 StartHaptic(EXIT_BELOW);
asong 2:824ed4ae8d52 2312 } else if(Target_Zone == LOWEST_ZONE || Current_Zone > Target_Zone) { //must have exited above
asong 2:824ed4ae8d52 2313 StartHaptic(EXIT_ABOVE);
asong 2:824ed4ae8d52 2314 }
asong 2:824ed4ae8d52 2315 }
asong 2:824ed4ae8d52 2316 } else if(HR_Vibration == 2) {
asong 2:824ed4ae8d52 2317 //Only Entering and Exiting target zone
asong 2:824ed4ae8d52 2318 if(Current_Zone == Prev_Zone) {
asong 2:824ed4ae8d52 2319 //do nothing
asong 2:824ed4ae8d52 2320 } else if(Current_Zone == Target_Zone) {
asong 2:824ed4ae8d52 2321 StartHaptic(VIB_OPT_2);
asong 2:824ed4ae8d52 2322 wait(0.1);
asong 2:824ed4ae8d52 2323 StartHaptic(VIB_OPT_2);
asong 2:824ed4ae8d52 2324 } else if(Current_Zone != Target_Zone && Prev_Zone == Target_Zone) {
asong 2:824ed4ae8d52 2325 StartHaptic(VIB_OPT_2);
asong 2:824ed4ae8d52 2326 wait(0.1);
asong 2:824ed4ae8d52 2327 StartHaptic(VIB_OPT_2);
asong 2:824ed4ae8d52 2328 wait(0.1);
asong 2:824ed4ae8d52 2329 StartHaptic(VIB_OPT_2);
asong 2:824ed4ae8d52 2330 }
asong 2:824ed4ae8d52 2331
asong 2:824ed4ae8d52 2332 } else if(HR_Vibration == 3) {
asong 2:824ed4ae8d52 2333 //No Vibrations
asong 2:824ed4ae8d52 2334
asong 2:824ed4ae8d52 2335 } else {
asong 2:824ed4ae8d52 2336 //Error, can only be choices 1-3
asong 2:824ed4ae8d52 2337 error_screen();
asong 2:824ed4ae8d52 2338 }
asong 2:824ed4ae8d52 2339 }
asong 2:824ed4ae8d52 2340 }
asong 2:824ed4ae8d52 2341
asong 2:824ed4ae8d52 2342 /*****************************************************************************
asong 2:824ed4ae8d52 2343 Name: Increment_Heart_Rate
asong 2:824ed4ae8d52 2344 Purpose: Manually increment the the heart rate measurement by 1 for testing
asong 2:824ed4ae8d52 2345 purposes
asong 2:824ed4ae8d52 2346 Inputs: None
asong 2:824ed4ae8d52 2347 Returns: None
asong 2:824ed4ae8d52 2348 ******************************************************************************/
asong 2:824ed4ae8d52 2349 void Increment_Heart_Rate()
asong 2:824ed4ae8d52 2350 {
asong 2:824ed4ae8d52 2351 //StartHaptic();
asong 2:824ed4ae8d52 2352 if(Heart_Rate == HR_Zone4[1]) {
asong 2:824ed4ae8d52 2353 Heart_Rate = HR_Zone1[0];
asong 2:824ed4ae8d52 2354 } else {
asong 2:824ed4ae8d52 2355 Heart_Rate += 1;
asong 2:824ed4ae8d52 2356 }
asong 2:824ed4ae8d52 2357 }
asong 2:824ed4ae8d52 2358
asong 2:824ed4ae8d52 2359 /*****************************************************************************
asong 2:824ed4ae8d52 2360 Name: Decrement_Heart_Rate
asong 2:824ed4ae8d52 2361 Purpose: Manually decrement the the heart rate measurement by 1 for testing
asong 2:824ed4ae8d52 2362 purposes
asong 2:824ed4ae8d52 2363 Inputs: None
asong 2:824ed4ae8d52 2364 Returns: None
asong 2:824ed4ae8d52 2365 ******************************************************************************/
asong 2:824ed4ae8d52 2366 void Decrement_Heart_Rate()
asong 2:824ed4ae8d52 2367 {
asong 2:824ed4ae8d52 2368 //StartHaptic();
asong 2:824ed4ae8d52 2369 if(Heart_Rate == HR_Zone1[0]) {
asong 2:824ed4ae8d52 2370 Heart_Rate = HR_Zone4[1];
asong 2:824ed4ae8d52 2371 } else {
asong 2:824ed4ae8d52 2372 Heart_Rate -= 1;
asong 2:824ed4ae8d52 2373 }
nbaker 4:0803151bc5e4 2374 } // end of Decrement_Heart_Rate
asong 2:824ed4ae8d52 2375
asong 2:824ed4ae8d52 2376 void Led_Zone_Indicator()
asong 2:824ed4ae8d52 2377 {
asong 2:824ed4ae8d52 2378 if(Led_Zones == true)
asong 2:824ed4ae8d52 2379 {
asong 2:824ed4ae8d52 2380 if(Current_Zone == 1)
asong 2:824ed4ae8d52 2381 {
asong 2:824ed4ae8d52 2382 BLU_Led = LED_OFF;
asong 2:824ed4ae8d52 2383 RED_Led = LED_ON;
asong 2:824ed4ae8d52 2384 GRN_Led = LED_ON;
asong 3:6792c1ba586c 2385
asong 3:6792c1ba586c 2386 wait(0.5);
asong 3:6792c1ba586c 2387 RED_Led = LED_OFF;
asong 3:6792c1ba586c 2388 GRN_Led = LED_OFF;
asong 2:824ed4ae8d52 2389 }
asong 2:824ed4ae8d52 2390 else if(Current_Zone == 2)
asong 2:824ed4ae8d52 2391 {
asong 2:824ed4ae8d52 2392 if(Prev_Zone == 1)
asong 2:824ed4ae8d52 2393 {
asong 2:824ed4ae8d52 2394 RED_Led = LED_OFF;
asong 2:824ed4ae8d52 2395 GRN_Led = LED_OFF;
asong 2:824ed4ae8d52 2396 }
asong 2:824ed4ae8d52 2397 else if(Prev_Zone == 3)
asong 2:824ed4ae8d52 2398 {
asong 2:824ed4ae8d52 2399 GRN_Led = LED_OFF;
asong 2:824ed4ae8d52 2400 }
asong 2:824ed4ae8d52 2401 BLU_Led = LED_ON;
asong 3:6792c1ba586c 2402 wait(0.5);
asong 3:6792c1ba586c 2403 BLU_Led = LED_OFF;
asong 2:824ed4ae8d52 2404 }
asong 2:824ed4ae8d52 2405 else if(Current_Zone == 3)
asong 2:824ed4ae8d52 2406 {
asong 2:824ed4ae8d52 2407 if(Prev_Zone == 2)
asong 2:824ed4ae8d52 2408 {
asong 2:824ed4ae8d52 2409 BLU_Led = LED_OFF;
asong 2:824ed4ae8d52 2410 }
asong 2:824ed4ae8d52 2411 else if(Prev_Zone == 4)
asong 2:824ed4ae8d52 2412 {
asong 2:824ed4ae8d52 2413 RED_Led = LED_OFF;
asong 2:824ed4ae8d52 2414 }
asong 2:824ed4ae8d52 2415 GRN_Led = LED_ON;
asong 3:6792c1ba586c 2416 wait(0.5);
asong 3:6792c1ba586c 2417 GRN_Led = LED_OFF;
asong 2:824ed4ae8d52 2418 }
asong 2:824ed4ae8d52 2419 else if(Current_Zone == 4)
asong 2:824ed4ae8d52 2420 {
asong 2:824ed4ae8d52 2421 GRN_Led = LED_OFF;
asong 2:824ed4ae8d52 2422 RED_Led = LED_ON;
asong 3:6792c1ba586c 2423 wait(0.5);
asong 3:6792c1ba586c 2424 RED_Led = LED_OFF;
asong 2:824ed4ae8d52 2425 }
nbaker 4:0803151bc5e4 2426 }
nbaker 4:0803151bc5e4 2427 }//end of Led_Zone_Indicator
jmr274 5:e1431272be79 2428
jmr274 5:e1431272be79 2429 /*****************************************************************************
jmr274 5:e1431272be79 2430 Name: Heat_Index_Calculation()
jmr274 5:e1431272be79 2431 Purpose: Calculates the heat index using the temperature and humidity sensors
jmr274 5:e1431272be79 2432 Inputs: None
jmr274 5:e1431272be79 2433 Returns: None
jmr274 5:e1431272be79 2434 ******************************************************************************/
jmr274 5:e1431272be79 2435 void Heat_Index_Calculation(){
jmr274 5:e1431272be79 2436 sample_ftemp = temphumid.sample_ftemp();
jmr274 5:e1431272be79 2437
jmr274 5:e1431272be79 2438 sample_humid = temphumid.sample_humid();
jmr274 5:e1431272be79 2439
nbaker 9:d2e39ee9fedd 2440 hi_calc = -42.379 +
jmr274 5:e1431272be79 2441 2.04901523 * sample_ftemp +
jmr274 5:e1431272be79 2442 10.14333127 * sample_humid -
jmr274 5:e1431272be79 2443 0.22475541 * sample_ftemp * sample_humid -
jmr274 5:e1431272be79 2444 0.00683783 * sample_ftemp * sample_ftemp -
jmr274 5:e1431272be79 2445 0.05481717 * sample_humid * sample_humid +
jmr274 5:e1431272be79 2446 0.00122874 * sample_ftemp * sample_ftemp * sample_humid +
jmr274 5:e1431272be79 2447 0.00085282 * sample_ftemp * sample_humid * sample_humid -
jmr274 5:e1431272be79 2448 0.00000199 * sample_ftemp * sample_ftemp * sample_humid * sample_humid;
nbaker 9:d2e39ee9fedd 2449
nbaker 9:d2e39ee9fedd 2450 if (sample_humid < 13 && sample_ftemp > 80 && sample_ftemp < 112){
nbaker 9:d2e39ee9fedd 2451 adjustment = ((13 - sample_humid) / 4) * sqrt((17-abs(sample_ftemp-95.0))/17);
nbaker 9:d2e39ee9fedd 2452 heat_index = hi_calc - adjustment;
nbaker 9:d2e39ee9fedd 2453 }
nbaker 9:d2e39ee9fedd 2454
nbaker 9:d2e39ee9fedd 2455 else if (sample_humid > 85 && sample_ftemp > 80 && sample_ftemp < 87){
nbaker 9:d2e39ee9fedd 2456 adjustment = ((sample_humid - 85) / 10) * ((87 - sample_ftemp)/5);
nbaker 9:d2e39ee9fedd 2457 heat_index = hi_calc + adjustment;
nbaker 9:d2e39ee9fedd 2458 }
nbaker 9:d2e39ee9fedd 2459
nbaker 9:d2e39ee9fedd 2460 else if (hi_calc < 80){
nbaker 9:d2e39ee9fedd 2461 heat_index = 0.5 * (sample_ftemp + 61.0 + ((sample_ftemp - 68.0) * 1.2) + (sample_humid * 0.094));
nbaker 9:d2e39ee9fedd 2462 }
nbaker 9:d2e39ee9fedd 2463
nbaker 9:d2e39ee9fedd 2464 else {heat_index = hi_calc;}
jmr274 5:e1431272be79 2465 }
jmr274 5:e1431272be79 2466
nbaker 4:0803151bc5e4 2467 /*****************************************************************************
nbaker 4:0803151bc5e4 2468 Name: fall_detect()
nbaker 4:0803151bc5e4 2469 Purpose: Interupt rutine called when accelerometer IC has detected a free-fall >= 0.5g
nbaker 4:0803151bc5e4 2470
nbaker 4:0803151bc5e4 2471 ******************************************************************************/
nbaker 4:0803151bc5e4 2472
nbaker 4:0803151bc5e4 2473 void fall_detect(){// fall detect interupt rutine
nbaker 4:0803151bc5e4 2474 if(Fall_Alert == 1){
nbaker 7:3d5a8aea0b63 2475 accel.acquire_accel_data_g(Accel_Data_Event);
nbaker 4:0803151bc5e4 2476 // for now just turn on display and give haptic feedback
nbaker 4:0803151bc5e4 2477 Screen_Timer.attach(&timout_timer,(SCRN_TIME));// Reset/restart ticker timer for OLED
nbaker 9:d2e39ee9fedd 2478
nbaker 4:0803151bc5e4 2479 if (OLED_ON == 0) {
nbaker 4:0803151bc5e4 2480 OLED_ON = 1; // Scree was off, set to On
nbaker 9:d2e39ee9fedd 2481 update_display();
nbaker 9:d2e39ee9fedd 2482 } // endif
nbaker 9:d2e39ee9fedd 2483 if (Screen_Num != 21){
nbaker 9:d2e39ee9fedd 2484 Screen_Num = 21; //Change to screen 21 (Fall diag screen)
nbaker 9:d2e39ee9fedd 2485 update_display();
nbaker 9:d2e39ee9fedd 2486 } // endif
nbaker 4:0803151bc5e4 2487
nbaker 4:0803151bc5e4 2488 //__disable_irq(); // Disable all Interrupts
nbaker 4:0803151bc5e4 2489 // oled.Label((uint8_t *)" Fall Detected ",05,70); // Display at x,y
nbaker 9:d2e39ee9fedd 2490
nbaker 9:d2e39ee9fedd 2491 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])));
nbaker 9:d2e39ee9fedd 2492 sprintf(text_1,"Free-Fall:%2.2fg",Accel_Mag);
nbaker 9:d2e39ee9fedd 2493 oled.Label((uint8_t *)text_1,2,5);// text_1 at x,y
nbaker 7:3d5a8aea0b63 2494
nbaker 4:0803151bc5e4 2495 BLU_Led = LED_ON; // LEDs default to on, need to turn off
nbaker 4:0803151bc5e4 2496 Led_clk2 = 1; // Turn LED2 on docking station on
nbaker 4:0803151bc5e4 2497 haptic = 1;
nbaker 4:0803151bc5e4 2498 Accel_INT1.rise(&fall_det_end); // Accel sensor's int#1 calls interupt routine
nbaker 4:0803151bc5e4 2499 //__enable_irq(); // Enable all Interrupts
nbaker 4:0803151bc5e4 2500 }// end if
nbaker 4:0803151bc5e4 2501 }//end fall_detect interupt routine
nbaker 4:0803151bc5e4 2502
nbaker 4:0803151bc5e4 2503
nbaker 4:0803151bc5e4 2504 void fall_detect_off(){// fall detect interupt rutine
nbaker 4:0803151bc5e4 2505 // for now just turn on display and give haptic feedback
nbaker 4:0803151bc5e4 2506 }//end fall_detect_off interupt routine
nbaker 4:0803151bc5e4 2507
nbaker 4:0803151bc5e4 2508 void fall_det_end(){
nbaker 4:0803151bc5e4 2509 haptic = 0; // Turn off Haptic
nbaker 4:0803151bc5e4 2510 BLU_Led = LED_OFF; // Turn off HexiHeart Blue LED
nbaker 4:0803151bc5e4 2511 Led_clk2 = 0; // Turn off LED2 on docking station on
nbaker 9:d2e39ee9fedd 2512 fall_config(21); // reads interrupts to clear old interupt
nbaker 8:a5c77b45008d 2513 // oled.Label((uint8_t *)" ",05,70); // clear display at x,y
nbaker 4:0803151bc5e4 2514 Accel_INT1.fall(&fall_detect); // Accel sensor's int#1 calls interupt routine
nbaker 4:0803151bc5e4 2515 } //end fall_det_end interupt routine
nbaker 4:0803151bc5e4 2516
nbaker 4:0803151bc5e4 2517 /*****************************************************************************
nbaker 4:0803151bc5e4 2518 Name: impact_detect()
nbaker 4:0803151bc5e4 2519 Purpose: Interupt rutine called when accelerometer IC has detected a vector
nbaker 4:0803151bc5e4 2520 magnitude acceleration >= 3.0g
nbaker 4:0803151bc5e4 2521
nbaker 4:0803151bc5e4 2522 ******************************************************************************/
nbaker 4:0803151bc5e4 2523
nbaker 4:0803151bc5e4 2524 void impact_detect(){
nbaker 7:3d5a8aea0b63 2525 if(Fall_Alert == 1){
nbaker 7:3d5a8aea0b63 2526 accel.acquire_accel_data_g(Accel_Data_Event);
nbaker 9:d2e39ee9fedd 2527 haptic = 1;
nbaker 9:d2e39ee9fedd 2528 Led_clk3 = 1; // Turn LED2 on docking station on
nbaker 9:d2e39ee9fedd 2529
nbaker 7:3d5a8aea0b63 2530 Screen_Timer.attach(&timout_timer,(SCRN_TIME));// Reset/restart ticker timer for OLED
nbaker 7:3d5a8aea0b63 2531 if (OLED_ON == 0) {
nbaker 9:d2e39ee9fedd 2532 OLED_ON = 1; // Screen was off, set to On
nbaker 9:d2e39ee9fedd 2533 update_display();
nbaker 9:d2e39ee9fedd 2534 } // endif
nbaker 9:d2e39ee9fedd 2535
nbaker 9:d2e39ee9fedd 2536 if (Screen_Num != 21){
nbaker 9:d2e39ee9fedd 2537 Screen_Num = 21; //Change to screen 21 (Fall diag screen)
nbaker 9:d2e39ee9fedd 2538 update_display();
nbaker 9:d2e39ee9fedd 2539 } // endif
nbaker 9:d2e39ee9fedd 2540 accel.acquire_accel_data_g(Accel_Data);
nbaker 9:d2e39ee9fedd 2541 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])));
nbaker 9:d2e39ee9fedd 2542 sprintf(text_1,"Impact:%2.2fg",Accel_Mag);
nbaker 9:d2e39ee9fedd 2543 oled.Label((uint8_t *)text_1,3,20);// text_1 at x,y
nbaker 9:d2e39ee9fedd 2544 wait(0.1);
nbaker 9:d2e39ee9fedd 2545 Led_clk3 = 0; // Turn LED2 off docking station on
nbaker 9:d2e39ee9fedd 2546 haptic = 0;
nbaker 7:3d5a8aea0b63 2547 }// end if
nbaker 4:0803151bc5e4 2548 }//end impact_detect interupt routine
nbaker 4:0803151bc5e4 2549
nbaker 4:0803151bc5e4 2550 /*****************************************************************************
nbaker 9:d2e39ee9fedd 2551 Name: motion_detect()
nbaker 9:d2e39ee9fedd 2552 Purpose: Interupt rutine called when gyro IC has detected motion >= 50 deg/sec
nbaker 9:d2e39ee9fedd 2553 in order to see if fall-impact resulted in motion-less person.
nbaker 9:d2e39ee9fedd 2554 ******************************************************************************/
nbaker 9:d2e39ee9fedd 2555 void motion_detect(){
nbaker 9:d2e39ee9fedd 2556 float Gyro_Data_Event[3]; // store right away to see what it was
nbaker 9:d2e39ee9fedd 2557 if(Fall_Alert == 1 && Fall_Alert_Mode > 2){// only service interupt if automatic fall detect is selected by user
nbaker 9:d2e39ee9fedd 2558 gyro.acquire_gyro_data_dps(Gyro_Data_Event);
nbaker 9:d2e39ee9fedd 2559 Gyro_Mag = (abs(Gyro_Data_Event[0])+abs(Gyro_Data_Event[1])+abs(Gyro_Data_Event[2]));
nbaker 9:d2e39ee9fedd 2560 haptic = 1;
nbaker 9:d2e39ee9fedd 2561 Led_clk1 = 1; // Turn LED1 on docking station on
nbaker 9:d2e39ee9fedd 2562
nbaker 9:d2e39ee9fedd 2563 Screen_Timer.attach(&timout_timer,(SCRN_TIME));// Reset/restart ticker timer for OLED
nbaker 9:d2e39ee9fedd 2564 if (OLED_ON == 0) {
nbaker 9:d2e39ee9fedd 2565 OLED_ON = 1; // Screen was off, set to On
nbaker 9:d2e39ee9fedd 2566 update_display();
nbaker 9:d2e39ee9fedd 2567 } // endif
nbaker 9:d2e39ee9fedd 2568
nbaker 9:d2e39ee9fedd 2569 if (Screen_Num != 21){
nbaker 9:d2e39ee9fedd 2570 Screen_Num = 21; //Change to screen 21 (Fall diag screen)
nbaker 9:d2e39ee9fedd 2571 update_display();
nbaker 9:d2e39ee9fedd 2572 } // endif
nbaker 9:d2e39ee9fedd 2573 sprintf(text_1,"Motion:%4.0f d/s",Gyro_Mag);
nbaker 9:d2e39ee9fedd 2574 oled.Label((uint8_t *)text_1,3,20);// text_1 at x,y
nbaker 9:d2e39ee9fedd 2575 wait(0.1);
nbaker 9:d2e39ee9fedd 2576 Led_clk1 = 0; // Turn LED1 off docking station on
nbaker 9:d2e39ee9fedd 2577 haptic = 0;
nbaker 9:d2e39ee9fedd 2578 }// end if
nbaker 9:d2e39ee9fedd 2579 }//end motion_detect interupt routine
nbaker 9:d2e39ee9fedd 2580
nbaker 9:d2e39ee9fedd 2581 /*****************************************************************************
nbaker 4:0803151bc5e4 2582 Name: fall_config()
nbaker 4:0803151bc5e4 2583 Purpose: Used to set accelerometer IC's internal registers to set up chip level
nbaker 4:0803151bc5e4 2584 interrupts
nbaker 4:0803151bc5e4 2585 Inputs: int value from 0 to 256
nbaker 4:0803151bc5e4 2586 Returns: None
nbaker 4:0803151bc5e4 2587 ******************************************************************************/
nbaker 4:0803151bc5e4 2588
nbaker 9:d2e39ee9fedd 2589 void fall_config(uint8_t Num){ // this is more than just accel config
nbaker 4:0803151bc5e4 2590 // use case switches here to configure for
nbaker 8:a5c77b45008d 2591 switch(Num) {
nbaker 8:a5c77b45008d 2592 case 0: {// put in standby
nbaker 4:0803151bc5e4 2593 char d[2];
nbaker 4:0803151bc5e4 2594 d[0] = FXOS8700_CTRL_REG1; //Puts device in Standby mode
nbaker 4:0803151bc5e4 2595 d[1] = 0x00;
nbaker 9:d2e39ee9fedd 2596 i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2);
nbaker 8:a5c77b45008d 2597 /*For lowest power ~8uA, set ODR-12.5Hz,(low-pwr accel mode) or 2uA in standby mode */
nbaker 8:a5c77b45008d 2598 break;
nbaker 8:a5c77b45008d 2599 }// end of case 0
nbaker 8:a5c77b45008d 2600
nbaker 8:a5c77b45008d 2601 case 1: {// configure for free-fall int only
nbaker 4:0803151bc5e4 2602 char d[2];
nbaker 8:a5c77b45008d 2603 d[0] = 0x2a; //0x2a Config reg1
nbaker 4:0803151bc5e4 2604 d[1] = 0x00; //Put device in Standby mode
nbaker 4:0803151bc5e4 2605 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2606 oled.Label((uint8_t *)"Acc1a err",30,05); // Display "error" at x,y
nbaker 4:0803151bc5e4 2607 wait(3.0); // display for 3 seconds
nbaker 4:0803151bc5e4 2608 }//end if
nbaker 4:0803151bc5e4 2609
nbaker 4:0803151bc5e4 2610 d[0] = 0x0e; //XYZ_DATA_CFG (set full-scall range)
nbaker 8:a5c77b45008d 2611 d[1] = 0b00000001; //Set data to default range of +/-2g for full range (2x0.488mg/LSB), High-pass filter off
nbaker 4:0803151bc5e4 2612 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2613 oled.Label((uint8_t *)"Acc1b err",30,05); // Display "error" at x,y
nbaker 4:0803151bc5e4 2614 wait(3.0); // display for 3 seconds
nbaker 4:0803151bc5e4 2615 }//end if
nbaker 8:a5c77b45008d 2616 /*
nbaker 8:a5c77b45008d 2617 d[0] = 0x0a; //TRIG_CFG (address of FIFO trigger config reg)
nbaker 4:0803151bc5e4 2618 d[1] = 0b00000100; //Trigger on freefall
nbaker 4:0803151bc5e4 2619 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 4:0803151bc5e4 2620 oled.Label((uint8_t *)" Step2 error ",30,05); // Display "error" at x,y
nbaker 4:0803151bc5e4 2621 wait(3.0); // display for 3 seconds
nbaker 4:0803151bc5e4 2622 }//end if
nbaker 8:a5c77b45008d 2623 */
nbaker 4:0803151bc5e4 2624 d[0] = 0x15; //A_FFMT_CFG (address of Free fall trigger config reg), write in Standby only
nbaker 4:0803151bc5e4 2625 d[1] = 0b00111000; //set to freefall, and look at all axis.
nbaker 4:0803151bc5e4 2626 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2627 oled.Label((uint8_t *)"Acc1c err",30,05); // Display "error" at x,y
nbaker 4:0803151bc5e4 2628 wait(3.0); // display for 3 seconds
nbaker 4:0803151bc5e4 2629 }//end if
nbaker 4:0803151bc5e4 2630
nbaker 4:0803151bc5e4 2631 d[0] = 0x17; //A_FFMT_THS (address of Free fall threshold reg), write in Active or Standby
nbaker 9:d2e39ee9fedd 2632 // d[1] = 0b00001000; //set freefall threshold to about 756mg for now
nbaker 9:d2e39ee9fedd 2633 d[1] = (uint8_t)(1000*Fall_Thresh/63); //set freefall threshold - Resolution is 63mg/LSB, 0b111_1111 is maximum value
nbaker 4:0803151bc5e4 2634 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2635 oled.Label((uint8_t *)"Acc1d err",30,05); // Display "error" at x,y
nbaker 4:0803151bc5e4 2636 wait(3.0); // display for 3 seconds
nbaker 4:0803151bc5e4 2637 }//end if
nbaker 4:0803151bc5e4 2638
nbaker 4:0803151bc5e4 2639 d[0] = 0x18; //A_FFMT_COUNT (address of Free fall debounce counter), write in Active or Standby
nbaker 4:0803151bc5e4 2640 d[1] = 0b00000110; //with ODR at 100Hz, should equal 60mS debounce time or 120mS in Sleep
nbaker 4:0803151bc5e4 2641 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2642 oled.Label((uint8_t *)"Acc1e err",30,05); // Display "error" at x,y
nbaker 4:0803151bc5e4 2643 wait(3.0); // display for 3 seconds
nbaker 4:0803151bc5e4 2644 }//end if
nbaker 4:0803151bc5e4 2645
nbaker 4:0803151bc5e4 2646 d[0] = 0x2b; //CTRL_REG2 (address of control reg), write in Standby only
nbaker 9:d2e39ee9fedd 2647 // d[1] = 0b00001101; //Turns Auto-Sleep mode on and low-noise, low power
nbaker 9:d2e39ee9fedd 2648 d[1] = 0b00001001; //Turns Auto-Sleep mode off (b/c it wasn't waking on int) and low-noise, low power
nbaker 4:0803151bc5e4 2649 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2650 oled.Label((uint8_t *)"Acc1f err",30,05); // Display "error" at x,y
nbaker 4:0803151bc5e4 2651 wait(3.0); // display for 3 seconds
nbaker 4:0803151bc5e4 2652 }//end if
nbaker 4:0803151bc5e4 2653
nbaker 4:0803151bc5e4 2654 d[0] = 0x2c; //CTRL_REG3 (address of Int control reg), write in Standby only
nbaker 4:0803151bc5e4 2655 d[1] = 0b00001000; //FFMT will wake chip from sleep, int are active high
nbaker 4:0803151bc5e4 2656 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2657 oled.Label((uint8_t *)"Acc1g err",30,05); // Display "error" at x,y
nbaker 4:0803151bc5e4 2658 wait(3.0); // display for 3 seconds
nbaker 4:0803151bc5e4 2659 }//end if
nbaker 4:0803151bc5e4 2660
nbaker 4:0803151bc5e4 2661 d[0] = 0x2d; //CTRL_REG4 (address of Int enable reg), write in Standby only
nbaker 9:d2e39ee9fedd 2662 d[1] = 0b10000100; // FFMT int enabled and for debug I'm using a sleep int
nbaker 4:0803151bc5e4 2663 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2664 oled.Label((uint8_t *)"Acc1h err",30,05); // Display "error" at x,y
nbaker 4:0803151bc5e4 2665 wait(3.0); // display for 3 seconds
nbaker 4:0803151bc5e4 2666 }//end if
nbaker 8:a5c77b45008d 2667
nbaker 4:0803151bc5e4 2668 d[0] = 0x2e; //CTRL_REG5 (Int routing reg), write in Standby only
nbaker 4:0803151bc5e4 2669 d[1] = 0b00000100; // Make FFMT int output on pin INT1(PTC1)
nbaker 4:0803151bc5e4 2670 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2671 oled.Label((uint8_t *)"Acc1i err",30,05); // Display "error" at x,y
nbaker 4:0803151bc5e4 2672 wait(3.0); // display for 3 seconds
nbaker 4:0803151bc5e4 2673 }//end if
nbaker 4:0803151bc5e4 2674
nbaker 9:d2e39ee9fedd 2675 d[0] = 0x29; //ASLP_Count (counter used to go to sleep reg), write in Standby only
nbaker 9:d2e39ee9fedd 2676 d[1] = 0b00001010; // 10*320mS=3.2S of no inturrupts to go to sleep
nbaker 9:d2e39ee9fedd 2677 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2678 oled.Label((uint8_t *)"Acc1j err",30,05); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 2679 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 2680 }//end if
nbaker 9:d2e39ee9fedd 2681
nbaker 8:a5c77b45008d 2682 d[0] = 0x2a; //0x2a Config reg1, write in Standby only except for bit[0]
nbaker 4:0803151bc5e4 2683 d[1] = 0b00011001; //Auto-Sleep mode on set to 50Hz, ODR set to 100Hz Puts device back into Active mode
nbaker 4:0803151bc5e4 2684 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2685 oled.Label((uint8_t *)"Acc1k err",30,05); // Display "error" at x,y
nbaker 4:0803151bc5e4 2686 wait(3.0); // display for 3 seconds
nbaker 4:0803151bc5e4 2687 }//end if
nbaker 9:d2e39ee9fedd 2688
nbaker 4:0803151bc5e4 2689 break;
nbaker 7:3d5a8aea0b63 2690 }// end of case 1
nbaker 7:3d5a8aea0b63 2691
nbaker 8:a5c77b45008d 2692 case 2: {// configure for vector impact only
nbaker 7:3d5a8aea0b63 2693 char d[2];
nbaker 7:3d5a8aea0b63 2694
nbaker 7:3d5a8aea0b63 2695 d[0] = FXOS8700_CTRL_REG1; //Config reg1 0x2a
nbaker 7:3d5a8aea0b63 2696 d[1] = 0x00; //Put device in Standby mode
nbaker 7:3d5a8aea0b63 2697 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2698 oled.Label((uint8_t *)"Acc2a err",30,05); // Display "error" at x,y
nbaker 7:3d5a8aea0b63 2699 wait(3.0); // display for 3 seconds
nbaker 7:3d5a8aea0b63 2700 }//end if
nbaker 7:3d5a8aea0b63 2701
nbaker 7:3d5a8aea0b63 2702 d[0] = 0x0e; //XYZ_DATA_CFG (set full-scall range)
nbaker 7:3d5a8aea0b63 2703 d[1] = 0b00000001; //Set data to +/-4g for full range (0.488mg/LSB), High-pass filter off
nbaker 7:3d5a8aea0b63 2704 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2705 oled.Label((uint8_t *)"Acc2b err",30,05); // Display "error" at x,y
nbaker 7:3d5a8aea0b63 2706 wait(3.0); // display for 3 seconds
nbaker 7:3d5a8aea0b63 2707 }//end if
nbaker 8:a5c77b45008d 2708 /*
nbaker 8:a5c77b45008d 2709 d[0] = 0x0a; //TRIG_CFG (address of FIFO trigger config reg)
nbaker 7:3d5a8aea0b63 2710 d[1] = 0b00000110; //Trigger on freefall and on Vector
nbaker 7:3d5a8aea0b63 2711 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 7:3d5a8aea0b63 2712 oled.Label((uint8_t *)" Step2 error ",30,05); // Display "error" at x,y
nbaker 7:3d5a8aea0b63 2713 wait(3.0); // display for 3 seconds
nbaker 7:3d5a8aea0b63 2714 }//end if
nbaker 8:a5c77b45008d 2715 */
nbaker 8:a5c77b45008d 2716 d[0] = 0x5f; //A_VECM_CFG (address of Vector config reg), write in Standby only
nbaker 8:a5c77b45008d 2717 d[1] = 0b00111000; //Use reference values, don't update ref, enable.
nbaker 8:a5c77b45008d 2718 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2719 oled.Label((uint8_t *)"Acc2c err",30,05); // Display "error" at x,y
nbaker 8:a5c77b45008d 2720 wait(3.0); // display for 3 seconds
nbaker 8:a5c77b45008d 2721 }//end if
nbaker 8:a5c77b45008d 2722
nbaker 8:a5c77b45008d 2723 d[0] = 0x60; //A_VECM_MSB (address of Vector threshold reg), write in Active or Standby
nbaker 9:d2e39ee9fedd 2724 // d[1] = 0b00000111; //set impact threshold to less than 1g for now
nbaker 9:d2e39ee9fedd 2725 d[1] = (uint8_t)((1000*Impact_Thresh/0.488f)/256); //set MSB Impact threshold - Resolution is 0.488mg/LSB so 0.5g=1024.6 => MSB=0b00000100 LSB=0b00000000
nbaker 8:a5c77b45008d 2726 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2727 oled.Label((uint8_t *)"Acc2d err",30,05); // Display "error" at x,y
nbaker 8:a5c77b45008d 2728 wait(3.0); // display for 3 seconds
nbaker 8:a5c77b45008d 2729 }//end if
nbaker 8:a5c77b45008d 2730
nbaker 8:a5c77b45008d 2731 d[0] = 0x61; //A_VECM_LSB (address of Vector threshold reg), write in Active or Standby
nbaker 9:d2e39ee9fedd 2732 // d[1] = 0b00000011; //set impact threshold to less than 1g for now
nbaker 9:d2e39ee9fedd 2733 d[1] = (uint8_t)(1000*Impact_Thresh/0.488f);
nbaker 9:d2e39ee9fedd 2734 d[1] = (uint8_t)(d[1]%256); //set MSB Impact threshold - Resolution 0.488mg/LSB so 0.5g=1024.6 => MSB=0b00000100 LSB=0b00000000
nbaker 8:a5c77b45008d 2735 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2736 oled.Label((uint8_t *)"Acc2e err",30,05); // Display "error" at x,y
nbaker 8:a5c77b45008d 2737 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 2738 }//end if
nbaker 8:a5c77b45008d 2739
nbaker 8:a5c77b45008d 2740 d[0] = 0x62; //A_VECM_COUNT (address of Vector debounce counter), write in Active or Standby
nbaker 8:a5c77b45008d 2741 d[1] = 0b00000110; //with ODR at 100Hz, should equal ??mS debounce time or ??mS in Sleep
nbaker 8:a5c77b45008d 2742 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2743 oled.Label((uint8_t *)"Acc2f err",30,05); // Display "error" at x,y
nbaker 8:a5c77b45008d 2744 wait(3.0); // display for 3 seconds
nbaker 8:a5c77b45008d 2745 }//end if
nbaker 8:a5c77b45008d 2746
nbaker 8:a5c77b45008d 2747 // Registers 0x63 - 0x68 are vector reference values which I'm leaving set to 0 because we want absolute measurements
nbaker 8:a5c77b45008d 2748
nbaker 8:a5c77b45008d 2749 d[0] = 0x2b; //CTRL_REG2 (address of control reg), write in Standby only
nbaker 9:d2e39ee9fedd 2750 // d[1] = 0b00001101; //Turns Auto-Sleep mode on and low-noise, low power
nbaker 9:d2e39ee9fedd 2751 d[1] = 0b00001001; //Turns Auto-Sleep mode off (b/c it wasn't waking on int) and low-noise, low power
nbaker 8:a5c77b45008d 2752 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2753 oled.Label((uint8_t *)"Acc2g err",30,05); // Display "error" at x,y
nbaker 8:a5c77b45008d 2754 wait(3.0); // display for 3 seconds
nbaker 8:a5c77b45008d 2755 }//end if
nbaker 7:3d5a8aea0b63 2756
nbaker 8:a5c77b45008d 2757 d[0] = 0x2c; //CTRL_REG3 (address of Int control reg), write in Standby only
nbaker 8:a5c77b45008d 2758 d[1] = 0b00000100; //Vector will wake chip from sleep, int are active high
nbaker 8:a5c77b45008d 2759 // d[1] = 0b00001000; //FFMT will wake chip from sleep, int are active high
nbaker 8:a5c77b45008d 2760 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2761 oled.Label((uint8_t *)"Acc2h err",30,05); // Display "error" at x,y
nbaker 8:a5c77b45008d 2762 wait(3.0); // display for 3 seconds
nbaker 8:a5c77b45008d 2763 }//end if
nbaker 8:a5c77b45008d 2764
nbaker 8:a5c77b45008d 2765 d[0] = 0x2d; //CTRL_REG4 (address of Int enable reg), write in Standby only
nbaker 9:d2e39ee9fedd 2766 d[1] = 0b10000010; // Vector int enabled
nbaker 8:a5c77b45008d 2767 // d[1] = 0b00000100; // FFMT int enabled
nbaker 8:a5c77b45008d 2768 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2769 oled.Label((uint8_t *)"Acc2i err",30,05); // Display "error" at x,y
nbaker 8:a5c77b45008d 2770 wait(3.0); // display for 3 seconds
nbaker 8:a5c77b45008d 2771 }//end if
nbaker 9:d2e39ee9fedd 2772 //wait(0.2); // people have had a problem here and needed a delay
nbaker 9:d2e39ee9fedd 2773
nbaker 8:a5c77b45008d 2774 d[0] = 0x2e; //CTRL_REG5 (Int routing reg), write in Standby only
nbaker 8:a5c77b45008d 2775 d[1] = 0b00000100; // Make FFMT int output on pin INT1(PTC1) and Vector on INT2(PTD13)
nbaker 8:a5c77b45008d 2776 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2777 oled.Label((uint8_t *)"Acc2j err",30,05); // Display "error" at x,y
nbaker 8:a5c77b45008d 2778 wait(3.0); // display for 3 seconds
nbaker 8:a5c77b45008d 2779 }//end if
nbaker 8:a5c77b45008d 2780
nbaker 9:d2e39ee9fedd 2781 d[0] = 0x29; //ASLP_Count (counter used to go to sleep reg), write in Standby only
nbaker 9:d2e39ee9fedd 2782 d[1] = 0b00001010; // 10*320mS=3.2S of no inturrupts to go to sleep
nbaker 9:d2e39ee9fedd 2783 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2784 oled.Label((uint8_t *)"Acc2k err",30,05); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 2785 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 2786 }//end if
nbaker 9:d2e39ee9fedd 2787
nbaker 8:a5c77b45008d 2788 d[0] = FXOS8700_CTRL_REG1; //CTRL_REG1, write in Standby only except for bit[0]
nbaker 8:a5c77b45008d 2789 d[1] = 0b00011001; //Auto-Sleep mode on set to 50Hz, ODR set to 100Hz Puts device back into Active mode
nbaker 8:a5c77b45008d 2790 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2791 oled.Label((uint8_t *)"Acc2L err",30,05); // Display "error" at x,y
nbaker 8:a5c77b45008d 2792 wait(3.0); // display for 3 seconds
nbaker 8:a5c77b45008d 2793 }//end if
nbaker 8:a5c77b45008d 2794 break;
nbaker 8:a5c77b45008d 2795 }// end of case 2
nbaker 9:d2e39ee9fedd 2796
nbaker 9:d2e39ee9fedd 2797 case 3: {// configure for motion int only
nbaker 8:a5c77b45008d 2798 char d[2];
nbaker 9:d2e39ee9fedd 2799 d[0] = 0x2a; //0x2a Config reg1
nbaker 9:d2e39ee9fedd 2800 d[1] = 0x00; //Put device in Standby mode
nbaker 9:d2e39ee9fedd 2801 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2802 oled.Label((uint8_t *)"Acc3a err",30,05); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 2803 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 2804 }//end if
nbaker 8:a5c77b45008d 2805
nbaker 9:d2e39ee9fedd 2806 d[0] = 0x0e; //XYZ_DATA_CFG (set full-scall range)
nbaker 9:d2e39ee9fedd 2807 d[1] = 0b00000001; //Set data to default range of +/-2g for full range (2x0.488mg/LSB), High-pass filter off
nbaker 9:d2e39ee9fedd 2808 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2809 oled.Label((uint8_t *)"Acc3b err",30,05); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 2810 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 2811 }//end if
nbaker 9:d2e39ee9fedd 2812
nbaker 9:d2e39ee9fedd 2813 d[0] = 0x2a; //0x2a Config reg1, write in Standby only except for bit[0]
nbaker 9:d2e39ee9fedd 2814 d[1] = 0b00011001; //Auto-Sleep mode on set to 50Hz, ODR set to 100Hz Puts device back into Active mode
nbaker 9:d2e39ee9fedd 2815 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2816 oled.Label((uint8_t *)"Acc3c err",30,05); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 2817 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 2818 }//end if
nbaker 9:d2e39ee9fedd 2819 break;
nbaker 9:d2e39ee9fedd 2820 }// end of case 3
nbaker 9:d2e39ee9fedd 2821
nbaker 9:d2e39ee9fedd 2822 case 4: {// configure FFMT for free-fall event AND config for vector impact
nbaker 9:d2e39ee9fedd 2823 char d[2];
nbaker 8:a5c77b45008d 2824 d[0] = 0x2a; //0x2a Config reg1,
nbaker 8:a5c77b45008d 2825 d[1] = 0x00; //Put device in Standby mode
nbaker 8:a5c77b45008d 2826 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2827 oled.Label((uint8_t *)"Acc4a err",30,05); // Display "error" at x,y
nbaker 8:a5c77b45008d 2828 wait(3.0); // display for 3 seconds
nbaker 8:a5c77b45008d 2829 }//end if
nbaker 8:a5c77b45008d 2830
nbaker 8:a5c77b45008d 2831 d[0] = 0x0e; //XYZ_DATA_CFG (set full-scall range)
nbaker 8:a5c77b45008d 2832 d[1] = 0b00000001; //Set data to +/-4g for full range (0.488mg/LSB), High-pass filter off
nbaker 8:a5c77b45008d 2833 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2834 oled.Label((uint8_t *)"Acc4b err",30,05); // Display "error" at x,y
nbaker 8:a5c77b45008d 2835 wait(3.0); // display for 3 seconds
nbaker 8:a5c77b45008d 2836 }//end if
nbaker 8:a5c77b45008d 2837 /*
nbaker 8:a5c77b45008d 2838 d[0] = 0x0a; //TRIG_CFG (address of FIFO trigger config reg)
nbaker 8:a5c77b45008d 2839 d[1] = 0b00000110; //Trigger on freefall and on Vector
nbaker 8:a5c77b45008d 2840 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 8:a5c77b45008d 2841 oled.Label((uint8_t *)" Step2 error ",30,05); // Display "error" at x,y
nbaker 8:a5c77b45008d 2842 wait(3.0); // display for 3 seconds
nbaker 8:a5c77b45008d 2843 }//end if
nbaker 8:a5c77b45008d 2844 */
nbaker 7:3d5a8aea0b63 2845 d[0] = 0x15; //A_FFMT_CFG (address of Free fall trigger config reg), write in Standby only
nbaker 7:3d5a8aea0b63 2846 d[1] = 0b00111000; //set to freefall, and look at all axis.
nbaker 7:3d5a8aea0b63 2847 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2848 oled.Label((uint8_t *)"Acc4c err",30,05); // Display "error" at x,y
nbaker 7:3d5a8aea0b63 2849 wait(3.0); // display for 3 seconds
nbaker 7:3d5a8aea0b63 2850 }//end if
nbaker 7:3d5a8aea0b63 2851
nbaker 7:3d5a8aea0b63 2852 d[0] = 0x17; //A_FFMT_THS (address of Free fall threshold reg), write in Active or Standby
nbaker 9:d2e39ee9fedd 2853 // d[1] = 0b00001000; //set freefall threshold to about 756mg for now
nbaker 9:d2e39ee9fedd 2854 d[1] = (uint8_t)(1000*Fall_Thresh/63); //set freefall threshold - Resolution is 63mg/LSB, 0b111_1111 is maximum value
nbaker 7:3d5a8aea0b63 2855 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2856 oled.Label((uint8_t *)"Acc4d err",30,05); // Display "error" at x,y
nbaker 7:3d5a8aea0b63 2857 wait(3.0); // display for 3 seconds
nbaker 7:3d5a8aea0b63 2858 }//end if
nbaker 7:3d5a8aea0b63 2859
nbaker 7:3d5a8aea0b63 2860 d[0] = 0x18; //A_FFMT_COUNT (address of Free fall debounce counter), write in Active or Standby
nbaker 7:3d5a8aea0b63 2861 d[1] = 0b00000110; //with ODR at 100Hz, should equal 60mS debounce time or 120mS in Sleep
nbaker 7:3d5a8aea0b63 2862 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2863 oled.Label((uint8_t *)"Acc4e err",30,05); // Display "error" at x,y
nbaker 7:3d5a8aea0b63 2864 wait(3.0); // display for 3 seconds
nbaker 7:3d5a8aea0b63 2865 }//end if
nbaker 7:3d5a8aea0b63 2866
nbaker 7:3d5a8aea0b63 2867 d[0] = 0x5f; //A_VECM_CFG (address of Vector config reg), write in Standby only
nbaker 7:3d5a8aea0b63 2868 d[1] = 0b00111000; //Use reference values, don't update ref, enable.
nbaker 7:3d5a8aea0b63 2869 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2870 oled.Label((uint8_t *)"Acc4f err",30,05); // Display "error" at x,y
nbaker 7:3d5a8aea0b63 2871 wait(3.0); // display for 3 seconds
nbaker 7:3d5a8aea0b63 2872 }//end if
nbaker 7:3d5a8aea0b63 2873
nbaker 7:3d5a8aea0b63 2874 d[0] = 0x60; //A_VECM_MSB (address of Vector threshold reg), write in Active or Standby
nbaker 9:d2e39ee9fedd 2875 // d[1] = 0b00000111; //set impact threshold to less than 1g for now
nbaker 9:d2e39ee9fedd 2876 d[1] = (uint8_t)((1000*Impact_Thresh/0.488f)/256); //set MSB Impact threshold - Resolution is 0.488mg/LSB so 0.5g=1024.6 => MSB=0b00000100 LSB=0b00000000
nbaker 7:3d5a8aea0b63 2877 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2878 oled.Label((uint8_t *)"Acc4g err",30,05); // Display "error" at x,y
nbaker 7:3d5a8aea0b63 2879 wait(3.0); // display for 3 seconds
nbaker 7:3d5a8aea0b63 2880 }//end if
nbaker 7:3d5a8aea0b63 2881
nbaker 7:3d5a8aea0b63 2882 d[0] = 0x61; //A_VECM_LSB (address of Vector threshold reg), write in Active or Standby
nbaker 9:d2e39ee9fedd 2883 // d[1] = 0b00000011; //set impact threshold to less than 1g for now
nbaker 9:d2e39ee9fedd 2884 d[1] = (uint8_t)(1000*Impact_Thresh/0.488f);
nbaker 9:d2e39ee9fedd 2885 d[1] = (uint8_t)(d[1]%256); //set MSB Impact threshold - Resolution 0.488mg/LSB so 0.5g=1024.6 => MSB=0b00000100 LSB=0b00000000
nbaker 7:3d5a8aea0b63 2886 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2887 oled.Label((uint8_t *)"Acc4h err",30,05); // Display "error" at x,y
nbaker 7:3d5a8aea0b63 2888 wait(3.0); // display for 3 seconds
nbaker 7:3d5a8aea0b63 2889 }//end if
nbaker 7:3d5a8aea0b63 2890
nbaker 7:3d5a8aea0b63 2891 d[0] = 0x62; //A_VECM_COUNT (address of Vector debounce counter), write in Active or Standby
nbaker 9:d2e39ee9fedd 2892 d[1] = 0b00000100; //with ODR at 100Hz, 0x04 should equal 40mS debounce time or 80mS in 50Hz Sleep
nbaker 7:3d5a8aea0b63 2893 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2894 oled.Label((uint8_t *)"Acc4i err",30,05); // Display "error" at x,y
nbaker 7:3d5a8aea0b63 2895 wait(3.0); // display for 3 seconds
nbaker 7:3d5a8aea0b63 2896 }//end if
nbaker 7:3d5a8aea0b63 2897
nbaker 7:3d5a8aea0b63 2898 // Registers 0x63 - 0x68 are vector reference values which I'm leaving set to 0 because we want absolute measurements
nbaker 7:3d5a8aea0b63 2899
nbaker 7:3d5a8aea0b63 2900 d[0] = 0x2b; //CTRL_REG2 (address of control reg), write in Standby only
nbaker 9:d2e39ee9fedd 2901 // d[1] = 0b00001101; //Turns Auto-Sleep mode on and low-noise, low power
nbaker 9:d2e39ee9fedd 2902 d[1] = 0b00001001; //Turns Auto-Sleep mode off (b/c it wasn't waking on int) and low-noise, low power
nbaker 7:3d5a8aea0b63 2903 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2904 oled.Label((uint8_t *)"Acc4jerr",30,05); // Display "error" at x,y
nbaker 7:3d5a8aea0b63 2905 wait(3.0); // display for 3 seconds
nbaker 7:3d5a8aea0b63 2906 }//end if
nbaker 7:3d5a8aea0b63 2907
nbaker 7:3d5a8aea0b63 2908 d[0] = 0x2c; //CTRL_REG3 (address of Int control reg), write in Standby only
nbaker 7:3d5a8aea0b63 2909 d[1] = 0b00001100; //FFMT or Vector will wake chip from sleep, int are active high
nbaker 7:3d5a8aea0b63 2910 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2911 oled.Label((uint8_t *)"Acc4k err",30,05); // Display "error" at x,y
nbaker 7:3d5a8aea0b63 2912 wait(3.0); // display for 3 seconds
nbaker 7:3d5a8aea0b63 2913 }//end if
nbaker 7:3d5a8aea0b63 2914
nbaker 7:3d5a8aea0b63 2915 d[0] = 0x2d; //CTRL_REG4 (address of Int enable reg), write in Standby only
nbaker 9:d2e39ee9fedd 2916 d[1] = 0b10000110; // FFMT and Vector int enabled
nbaker 7:3d5a8aea0b63 2917 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2918 oled.Label((uint8_t *)"Acc4L err",30,05); // Display "error" at x,y
nbaker 7:3d5a8aea0b63 2919 wait(3.0); // display for 3 seconds
nbaker 7:3d5a8aea0b63 2920 }//end if
nbaker 9:d2e39ee9fedd 2921 // wait(0.2); // people have had a problem here and needed a delay
nbaker 8:a5c77b45008d 2922
nbaker 7:3d5a8aea0b63 2923 d[0] = 0x2e; //CTRL_REG5 (Int routing reg), write in Standby only
nbaker 7:3d5a8aea0b63 2924 d[1] = 0b00000100; // Make FFMT int output on pin INT1(PTC1) and Vector on INT2(PTD13)
nbaker 7:3d5a8aea0b63 2925 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2926 oled.Label((uint8_t *)"Acc4m err",30,05); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 2927 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 2928 }//end if
nbaker 9:d2e39ee9fedd 2929
nbaker 9:d2e39ee9fedd 2930 d[0] = 0x29; //ASLP_Count (counter used to go to sleep reg), write in Standby only
nbaker 9:d2e39ee9fedd 2931 d[1] = 0b00001010; // 10*320mS=3.2S of no inturrupts to go to sleep
nbaker 9:d2e39ee9fedd 2932 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2933 oled.Label((uint8_t *)"Acc4n err",30,05); // Display "error" at x,y
nbaker 7:3d5a8aea0b63 2934 wait(3.0); // display for 3 seconds
nbaker 7:3d5a8aea0b63 2935 }//end if
nbaker 7:3d5a8aea0b63 2936
nbaker 8:a5c77b45008d 2937 d[0] = 0x2a; //0x2a Config reg1, write in Standby only except for bit[0]
nbaker 7:3d5a8aea0b63 2938 d[1] = 0b00011001; //Auto-Sleep mode on set to 50Hz, ODR set to 100Hz Puts device back into Active mode
nbaker 7:3d5a8aea0b63 2939 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2940 oled.Label((uint8_t *)"Acc4o err",30,05); // Display "error" at x,y
nbaker 7:3d5a8aea0b63 2941 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 2942 }//end if
nbaker 7:3d5a8aea0b63 2943 break;
nbaker 9:d2e39ee9fedd 2944 }// end of case 4
nbaker 7:3d5a8aea0b63 2945
nbaker 7:3d5a8aea0b63 2946 case 10: {// reset IC
nbaker 7:3d5a8aea0b63 2947 char d[2];
nbaker 8:a5c77b45008d 2948 d[0] = 0x2a; //0x2a Config reg1
nbaker 8:a5c77b45008d 2949 d[1] = 0x00; //Put device in Standby mode
nbaker 8:a5c77b45008d 2950 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 2951 oled.Label((uint8_t *)" Step10a err",30,05); // Display "error" at x,y
nbaker 8:a5c77b45008d 2952 wait(3.0); // display for 3 seconds
nbaker 8:a5c77b45008d 2953 }//end if
nbaker 8:a5c77b45008d 2954
nbaker 7:3d5a8aea0b63 2955 d[0] = 0x2b; //CTRL_REG2
nbaker 7:3d5a8aea0b63 2956 d[1] = 0b01000000; // set bit to force reset of FXOS8700
nbaker 7:3d5a8aea0b63 2957 if(i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2) ==1){
nbaker 7:3d5a8aea0b63 2958 oled.Label((uint8_t *)" Reset error ",30,05); // Display "error" at x,y
nbaker 7:3d5a8aea0b63 2959 wait(3.0); // display for 3 seconds
nbaker 7:3d5a8aea0b63 2960 }//end if
nbaker 9:d2e39ee9fedd 2961 oled.Label((uint8_t *)"Acc_Reset",20,60); // Display "reset" at x,y
nbaker 7:3d5a8aea0b63 2962 break;
nbaker 7:3d5a8aea0b63 2963 }// end case 10
nbaker 7:3d5a8aea0b63 2964
nbaker 9:d2e39ee9fedd 2965 case 11: {// wake for simple data read, was in stanby
nbaker 8:a5c77b45008d 2966 char d[2];
nbaker 8:a5c77b45008d 2967 d[0] = FXOS8700_CTRL_REG1; //Puts device in Standby mode just in case
nbaker 8:a5c77b45008d 2968 d[1] = 0x00;
nbaker 8:a5c77b45008d 2969 i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2);
nbaker 8:a5c77b45008d 2970
nbaker 8:a5c77b45008d 2971 d[0] = 0x0e; //XYZ_DATA_CFG (set full-scall range)
nbaker 8:a5c77b45008d 2972 d[1] = 0b00000001; //Set data to +/-4g for full range (0.488mg/LSB), High-pass filter off
nbaker 8:a5c77b45008d 2973 i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d,2);
nbaker 8:a5c77b45008d 2974
nbaker 8:a5c77b45008d 2975 /*For lowest power ~8uA, set ODR-12.5Hz,(low-pwr accel mode) or 2uA in standby mode */
nbaker 8:a5c77b45008d 2976 d[0] = 0x2a; //0x2a Config reg1, write in Standby only except for bit[0]
nbaker 8:a5c77b45008d 2977 d[1] = 0b00011001; //Auto-Sleep mode on set to 50Hz, ODR set to 100Hz Puts device back into Active mode
nbaker 8:a5c77b45008d 2978 i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d, 2);
nbaker 8:a5c77b45008d 2979 break;
nbaker 8:a5c77b45008d 2980 }// end of case 11
nbaker 8:a5c77b45008d 2981
nbaker 9:d2e39ee9fedd 2982 case 12: {// put into standby for low power
nbaker 8:a5c77b45008d 2983 char d[2];
nbaker 8:a5c77b45008d 2984 d[0] = FXOS8700_CTRL_REG1; //Puts device in Standby mode
nbaker 8:a5c77b45008d 2985 d[1] = 0x00;
nbaker 9:d2e39ee9fedd 2986 i2c_bus1.write(FXOS8700_I2C_ADDRESS_, d, 2);
nbaker 8:a5c77b45008d 2987 /*For lowest power ~8uA, set ODR-12.5Hz,(low-pwr accel mode) or 2uA in standby mode */
nbaker 8:a5c77b45008d 2988 break;
nbaker 8:a5c77b45008d 2989 }// end of case 11
nbaker 8:a5c77b45008d 2990
nbaker 9:d2e39ee9fedd 2991 case 20: {// read INT_Source to clear VECM int, shouldn't have to do this
nbaker 9:d2e39ee9fedd 2992 // This was not working for me but it was due to me using the wrong FXOS8700_I2C_ADDRESS_
nbaker 9:d2e39ee9fedd 2993 char d[2];//, data_byte_[1];
nbaker 9:d2e39ee9fedd 2994 d[0] = 0x0c; // 0x0c is INT_Source Reg
nbaker 9:d2e39ee9fedd 2995 i2c_bus1.write(FXOS8700_I2C_ADDRESS_,d,1,true); // "true" is needed to prevent stop
nbaker 9:d2e39ee9fedd 2996 wait(0.01);
nbaker 9:d2e39ee9fedd 2997 if(i2c_bus1.read(FXOS8700_I2C_ADDRESS_,d,1) == 1){ // read Who am I Reg for debug
nbaker 9:d2e39ee9fedd 2998 sprintf(text_1," INT_Read_Err ");
nbaker 9:d2e39ee9fedd 2999 oled.Label((uint8_t *)text_1,5,50); // Display error at x,y
nbaker 9:d2e39ee9fedd 3000 wait(1); // wait 1 seconds
nbaker 9:d2e39ee9fedd 3001 }//endif
nbaker 9:d2e39ee9fedd 3002 break;
nbaker 9:d2e39ee9fedd 3003 }// end of case 20
nbaker 9:d2e39ee9fedd 3004
nbaker 9:d2e39ee9fedd 3005 case 21: {// read A_FFMT_SRC reg to clear FFMT int, shouldn't have to do this
nbaker 9:d2e39ee9fedd 3006 // This was not working for me but it was due to me using the wrong FXOS8700_I2C_ADDRESS_
nbaker 9:d2e39ee9fedd 3007 char d[2];//, data_byte_[1];
nbaker 9:d2e39ee9fedd 3008 d[0] = 0x16; // 0x16 is A_FFMT_SRC Reg
nbaker 9:d2e39ee9fedd 3009 i2c_bus1.write(FXOS8700_I2C_ADDRESS_,d,1,true); // "true" is needed to prevent stop
nbaker 9:d2e39ee9fedd 3010 wait(0.01);
nbaker 9:d2e39ee9fedd 3011 if(i2c_bus1.read(FXOS8700_I2C_ADDRESS_,d,1) == 1){ // read Who am I Reg for debug
nbaker 9:d2e39ee9fedd 3012 sprintf(text_1," INT_Read_Err ");
nbaker 9:d2e39ee9fedd 3013 oled.Label((uint8_t *)text_1,5,50); // Display error at x,y
nbaker 9:d2e39ee9fedd 3014 wait(1); // wait 1 seconds
nbaker 9:d2e39ee9fedd 3015 }//endif
nbaker 9:d2e39ee9fedd 3016 break;
nbaker 9:d2e39ee9fedd 3017 }// end of case 21
nbaker 8:a5c77b45008d 3018
nbaker 4:0803151bc5e4 3019 default: {
nbaker 9:d2e39ee9fedd 3020 oled.Label((uint8_t *)" Mode? ",30,60); // Display "mode" at x,y
nbaker 4:0803151bc5e4 3021 // unknown config
nbaker 4:0803151bc5e4 3022 break;
nbaker 4:0803151bc5e4 3023 }
nbaker 4:0803151bc5e4 3024 }// end switch
nbaker 4:0803151bc5e4 3025
nbaker 4:0803151bc5e4 3026 }// end Fall_config
nbaker 4:0803151bc5e4 3027
nbaker 8:a5c77b45008d 3028 /*****************************************************************************
nbaker 9:d2e39ee9fedd 3029 Name: gyro_sensor_config()
nbaker 9:d2e39ee9fedd 3030 Purpose: Used to set gyro IC's internal registers for chip level
nbaker 9:d2e39ee9fedd 3031 interrupts and power modes
nbaker 9:d2e39ee9fedd 3032 Inputs: int value from 0 to 256
nbaker 9:d2e39ee9fedd 3033 Returns: None
nbaker 9:d2e39ee9fedd 3034 ******************************************************************************/
nbaker 9:d2e39ee9fedd 3035
nbaker 9:d2e39ee9fedd 3036 void gyro_sensor_config(uint8_t Num){
nbaker 9:d2e39ee9fedd 3037 // use case switches here to configure for
nbaker 9:d2e39ee9fedd 3038 switch(Num) {
nbaker 9:d2e39ee9fedd 3039 case 0: {// put in standby
nbaker 9:d2e39ee9fedd 3040 /*For lowest power ~2.8uA in standby mode */
nbaker 9:d2e39ee9fedd 3041 char d[2];
nbaker 9:d2e39ee9fedd 3042 d[0] = FXAS21002_CTRL_REG1; //CTRL_REG1=0x13
nbaker 9:d2e39ee9fedd 3043 d[1] = 0x08; //Puts device in standby mode
nbaker 9:d2e39ee9fedd 3044 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3045 oled.Label((uint8_t *)"gyr_err0a",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3046 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3047 }//end if
nbaker 9:d2e39ee9fedd 3048 break;
nbaker 9:d2e39ee9fedd 3049 }// end of case 0
nbaker 9:d2e39ee9fedd 3050
nbaker 9:d2e39ee9fedd 3051 case 1: {// Fall_Alert mode=1 or 2, put in active mode se we can read gyro measurments
nbaker 9:d2e39ee9fedd 3052 char d[2];
nbaker 9:d2e39ee9fedd 3053 d[0] = FXAS21002_CTRL_REG1; //CTRL_REG1=0x13
nbaker 9:d2e39ee9fedd 3054 d[1] = 0x00; //Puts device in standby mode
nbaker 9:d2e39ee9fedd 3055 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3056 oled.Label((uint8_t *)"gyr_err1a",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3057 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3058 }//end if
nbaker 9:d2e39ee9fedd 3059 d[0] = FXAS21002_CTRL_REG0; //CTRL_REG0=0x0d
nbaker 9:d2e39ee9fedd 3060 d[1] = 0x00; //sets FS =+/- 2000 dps
nbaker 9:d2e39ee9fedd 3061 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3062 oled.Label((uint8_t *)"gyr_err1b",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3063 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3064 }//end if
nbaker 9:d2e39ee9fedd 3065 d[0] = FXAS21002_CTRL_REG1; //CTRL_REG1=0x13
nbaker 9:d2e39ee9fedd 3066 d[1] = 0x0e; //0x0e puts device in active mode with ODR = 100Hz
nbaker 9:d2e39ee9fedd 3067 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3068 oled.Label((uint8_t *)"gyr_err1c",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3069 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3070 }//end if
nbaker 9:d2e39ee9fedd 3071 break;
nbaker 9:d2e39ee9fedd 3072 }// end of case 1
nbaker 9:d2e39ee9fedd 3073
nbaker 9:d2e39ee9fedd 3074 case 2: {// Fall_Alert mode=1 or 2, put in active mode se we can read gyro measurments
nbaker 9:d2e39ee9fedd 3075 char d[2];
nbaker 9:d2e39ee9fedd 3076 d[0] = FXAS21002_CTRL_REG1; //CTRL_REG1=0x13
nbaker 9:d2e39ee9fedd 3077 d[1] = 0x00; //Puts device in standby mode
nbaker 9:d2e39ee9fedd 3078 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3079 oled.Label((uint8_t *)"gyr_err2a",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3080 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3081 }//end if
nbaker 9:d2e39ee9fedd 3082 d[0] = FXAS21002_CTRL_REG0; //CTRL_REG0=0x0d
nbaker 9:d2e39ee9fedd 3083 d[1] = 0x00; //sets FS =+/- 2000 dps
nbaker 9:d2e39ee9fedd 3084 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3085 oled.Label((uint8_t *)"gyr_err2b",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3086 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3087 }//end if
nbaker 9:d2e39ee9fedd 3088 d[0] = FXAS21002_CTRL_REG1; //CTRL_REG1=0x13
nbaker 9:d2e39ee9fedd 3089 d[1] = 0x0e; //0x0e puts device in active mode with ODR = 100Hz
nbaker 9:d2e39ee9fedd 3090 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3091 oled.Label((uint8_t *)"gyr_err2c",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3092 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3093 }//end if
nbaker 9:d2e39ee9fedd 3094 break;
nbaker 9:d2e39ee9fedd 3095 }// end of case 2
nbaker 9:d2e39ee9fedd 3096
nbaker 9:d2e39ee9fedd 3097 case 3: {// Fall_Alert mode 3 or 4, set up interupt, put in active mode
nbaker 9:d2e39ee9fedd 3098 char d[2];
nbaker 9:d2e39ee9fedd 3099 d[0] = FXAS21002_CTRL_REG1; //CTRL_REG1=0x13
nbaker 9:d2e39ee9fedd 3100 d[1] = 0x00; //0x08 puts device in standby mode
nbaker 9:d2e39ee9fedd 3101 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3102 oled.Label((uint8_t *)"gyr_err3",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3103 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3104 }//end if
nbaker 9:d2e39ee9fedd 3105
nbaker 9:d2e39ee9fedd 3106 // set RT_CFG reg 0x0e - Rate int config
nbaker 9:d2e39ee9fedd 3107 d[0] = 0x0e; //set RT_CFG reg 0x0e - Rate int config
nbaker 9:d2e39ee9fedd 3108 d[1] = 0b00000111; // enable x,y,z axis
nbaker 9:d2e39ee9fedd 3109 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3110 oled.Label((uint8_t *)"gyr_err3a",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3111 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3112 }//end if
nbaker 9:d2e39ee9fedd 3113
nbaker 9:d2e39ee9fedd 3114 // set RT_THS reg 0x10 - Rate Threshold value
nbaker 9:d2e39ee9fedd 3115 d[0] = 0x10; //set RT_THS reg 0x10 - Rate Threshold config
nbaker 9:d2e39ee9fedd 3116 // d[1] = 0b00000111; // bit7=couter mode(1=clr,0=dec), rate Tresh(dps)=(THS+1)*Sensitivity(dps/LSB
nbaker 9:d2e39ee9fedd 3117 // Sensitivity(dps/LSB), we should have mdps/LSB=62.50 or a full range of +/- 2000 dps
nbaker 9:d2e39ee9fedd 3118 // Movement_Thresh 50 dps=(THS+1)*256*Sensitivity(dps/LSB) => THS = Movement_Thresh/(16.0f)-1
nbaker 9:d2e39ee9fedd 3119 // We specified that 50 dps was the magnitude some of all 3 axis so THS is 1/3 of that
nbaker 9:d2e39ee9fedd 3120 d[1] = (uint8_t)((Movement_Thresh/(3*16.0f))-1); // Movement_Thresh 50 dps setting Tresh(dps)=(THS+1)*256*Sensitivity(dps/LSB)
nbaker 9:d2e39ee9fedd 3121 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3122 oled.Label((uint8_t *)"gyr_err3b",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3123 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3124 }//end if
nbaker 9:d2e39ee9fedd 3125
nbaker 9:d2e39ee9fedd 3126 // set RT_COUNT reg 0x11 - Rate Threshold counter
nbaker 9:d2e39ee9fedd 3127 d[0] = 0x11; //set RT_COUNT reg 0x11 - Rate Threshold counter
nbaker 9:d2e39ee9fedd 3128 // d[1] = 0b10000000; // debounce count value (Count=10, ODR=100Hz => 100mS)
nbaker 9:d2e39ee9fedd 3129 d[1] = (uint8_t)(Min_Movement_Time/0.01f); // debounce count value (at ODR=100Hz, each count = 10mS) 2.55s=255
nbaker 9:d2e39ee9fedd 3130 // need to calculate and store this value
nbaker 9:d2e39ee9fedd 3131 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3132 oled.Label((uint8_t *)"gyr_err3c",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3133 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3134 }//end if
nbaker 9:d2e39ee9fedd 3135
nbaker 9:d2e39ee9fedd 3136 // set CTRL_REG2 reg 0x14 - Int config
nbaker 9:d2e39ee9fedd 3137 d[0] = 0x14; //set CTRL_REG2 reg 0x14 - Int config
nbaker 9:d2e39ee9fedd 3138 d[1] = 0b01110000; // enable RT &FIFO interupts, int=act_low, push/pull
nbaker 9:d2e39ee9fedd 3139 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3140 oled.Label((uint8_t *)"gyr_err3d",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3141 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3142 }//end if
nbaker 9:d2e39ee9fedd 3143
nbaker 9:d2e39ee9fedd 3144 // set CTRL_REG3 reg 0x15 - Auto inc config, external power, FSR <=don't need?
nbaker 9:d2e39ee9fedd 3145 d[0] = 0x15; //CTRL_REG3 reg 0x15
nbaker 9:d2e39ee9fedd 3146 d[1] = 0x00; //Auto inc config, external power, FSR
nbaker 9:d2e39ee9fedd 3147 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3148 oled.Label((uint8_t *)"gyr_err3e",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3149 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3150 }//end if
nbaker 9:d2e39ee9fedd 3151
nbaker 9:d2e39ee9fedd 3152 d[0] = FXAS21002_CTRL_REG0; //CTRL_REG0=0x0d
nbaker 9:d2e39ee9fedd 3153 d[1] = 0x00; //sets FS=0,mdps/LSB=62.50 => +/- 2000 dps
nbaker 9:d2e39ee9fedd 3154 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3155 oled.Label((uint8_t *)"gyr_err3f",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3156 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3157 }//end if
nbaker 9:d2e39ee9fedd 3158 d[0] = FXAS21002_CTRL_REG1; //CTRL_REG1 0x13 - Op mode, ODR selection, reset
nbaker 9:d2e39ee9fedd 3159 d[1] = 0b00001110; //0x0e puts device in active mode and sets ODR to 100Hz
nbaker 9:d2e39ee9fedd 3160 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3161 oled.Label((uint8_t *)"gyr_err3g",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3162 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3163 }//end if
nbaker 9:d2e39ee9fedd 3164 break;
nbaker 9:d2e39ee9fedd 3165 }// end of case 2
nbaker 9:d2e39ee9fedd 3166
nbaker 9:d2e39ee9fedd 3167 case 4: {// Fall_Alert mode 3 or 4, set up interupt, put in active mode
nbaker 9:d2e39ee9fedd 3168 char d[2];
nbaker 9:d2e39ee9fedd 3169 d[0] = FXAS21002_CTRL_REG1; //CTRL_REG1=0x13
nbaker 9:d2e39ee9fedd 3170 d[1] = 0x00; //0x08 puts device in standby mode
nbaker 9:d2e39ee9fedd 3171 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3172 oled.Label((uint8_t *)"gyr_err4",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3173 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3174 }//end if
nbaker 9:d2e39ee9fedd 3175
nbaker 9:d2e39ee9fedd 3176 // set RT_CFG reg 0x0e - Rate int config
nbaker 9:d2e39ee9fedd 3177 d[0] = 0x0e; //set RT_CFG reg 0x0e - Rate int config
nbaker 9:d2e39ee9fedd 3178 d[1] = 0b00000111; // enable x,y,z axis
nbaker 9:d2e39ee9fedd 3179 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3180 oled.Label((uint8_t *)"gyr_err4a",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3181 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3182 }//end if
nbaker 9:d2e39ee9fedd 3183
nbaker 9:d2e39ee9fedd 3184 // set RT_THS reg 0x10 - Rate Threshold value
nbaker 9:d2e39ee9fedd 3185 d[0] = 0x10; //set RT_THS reg 0x10 - Rate Threshold config
nbaker 9:d2e39ee9fedd 3186 // d[1] = 0b00000111; // bit7=couter mode(1=clr,0=dec), rate Tresh(dps)=(THS+1)*Sensitivity(dps/LSB
nbaker 9:d2e39ee9fedd 3187 // Sensitivity(dps/LSB), we should have mdps/LSB=62.50 or a full range of +/- 2000 dps
nbaker 9:d2e39ee9fedd 3188 // Movement_Thresh 50 dps=(THS+1)*256*Sensitivity(dps/LSB) => THS = Movement_Thresh/(16.0f)-1
nbaker 9:d2e39ee9fedd 3189 // We specified that 50 dps was the magnitude some of all 3 axis so THS is 1/3 of that
nbaker 9:d2e39ee9fedd 3190 d[1] = (uint8_t)((Movement_Thresh/(3*16.0f))-1); // Movement_Thresh 50 dps setting Tresh(dps)=(THS+1)*256*Sensitivity(dps/LSB)
nbaker 9:d2e39ee9fedd 3191 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3192 oled.Label((uint8_t *)"gyr_err4b",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3193 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3194 }//end if
nbaker 9:d2e39ee9fedd 3195
nbaker 9:d2e39ee9fedd 3196 // set RT_COUNT reg 0x11 - Rate Threshold counter
nbaker 9:d2e39ee9fedd 3197 d[0] = 0x11; //set RT_COUNT reg 0x11 - Rate Threshold counter
nbaker 9:d2e39ee9fedd 3198 // d[1] = 0b10000000; // debounce count value (Count=10, ODR=100Hz => 100mS)
nbaker 9:d2e39ee9fedd 3199 d[1] = (uint8_t)(Min_Movement_Time/0.01f); // debounce count value (at ODR=100Hz, each count = 10mS) 2.55s=255
nbaker 9:d2e39ee9fedd 3200 // need to calculate and store this value
nbaker 9:d2e39ee9fedd 3201 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3202 oled.Label((uint8_t *)"gyr_err4c",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3203 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3204 }//end if
nbaker 9:d2e39ee9fedd 3205
nbaker 9:d2e39ee9fedd 3206 // set CTRL_REG2 reg 0x14 - Int config
nbaker 9:d2e39ee9fedd 3207 d[0] = 0x14; //set CTRL_REG2 reg 0x14 - Int config
nbaker 9:d2e39ee9fedd 3208 d[1] = 0b01110000; // enable RT &FIFO interupts, int=act_low, push/pull
nbaker 9:d2e39ee9fedd 3209 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3210 oled.Label((uint8_t *)"gyr_err4d",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3211 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3212 }//end if
nbaker 9:d2e39ee9fedd 3213
nbaker 9:d2e39ee9fedd 3214 // set CTRL_REG3 reg 0x15 - Auto inc config, external power, FSR <=don't need?
nbaker 9:d2e39ee9fedd 3215 d[0] = 0x15; //CTRL_REG3 reg 0x15
nbaker 9:d2e39ee9fedd 3216 d[1] = 0x00; //Auto inc config, external power, FSR
nbaker 9:d2e39ee9fedd 3217 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3218 oled.Label((uint8_t *)"gyr_err4e",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3219 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3220 }//end if
nbaker 9:d2e39ee9fedd 3221
nbaker 9:d2e39ee9fedd 3222 d[0] = FXAS21002_CTRL_REG0; //CTRL_REG0=0x0d
nbaker 9:d2e39ee9fedd 3223 d[1] = 0x00; //sets FS=0,mdps/LSB=62.50 => +/- 2000 dps
nbaker 9:d2e39ee9fedd 3224 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3225 oled.Label((uint8_t *)"gyr_err4f",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3226 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3227 }//end if
nbaker 9:d2e39ee9fedd 3228 d[0] = FXAS21002_CTRL_REG1; //CTRL_REG1 0x13 - Op mode, ODR selection, reset
nbaker 9:d2e39ee9fedd 3229 d[1] = 0b00001110; //0x0e puts device in active mode and sets ODR to 100Hz
nbaker 9:d2e39ee9fedd 3230 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3231 oled.Label((uint8_t *)"gyr_err4g",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3232 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3233 }//end if
nbaker 9:d2e39ee9fedd 3234 break;
nbaker 9:d2e39ee9fedd 3235 }// end of case 4
nbaker 9:d2e39ee9fedd 3236
nbaker 9:d2e39ee9fedd 3237
nbaker 9:d2e39ee9fedd 3238 case 10: {// reset Gyro IC
nbaker 9:d2e39ee9fedd 3239 char d[2];
nbaker 9:d2e39ee9fedd 3240 d[0] = FXAS21002_CTRL_REG1; //CTRL_REG1 0x13 - Op mode, ODR selection, reset
nbaker 9:d2e39ee9fedd 3241 d[1] = 0b01000000; //resets IC
nbaker 9:d2e39ee9fedd 3242 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3243 oled.Label((uint8_t *)"gyr_err10a",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3244 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3245 }//end if
nbaker 9:d2e39ee9fedd 3246 oled.Label((uint8_t *)"G_Reset ",30,45); // Display "reset" at x,y
nbaker 9:d2e39ee9fedd 3247 break;
nbaker 9:d2e39ee9fedd 3248 }// end case 10
nbaker 9:d2e39ee9fedd 3249
nbaker 9:d2e39ee9fedd 3250 case 11: {// read gyro measurments
nbaker 9:d2e39ee9fedd 3251 char d[2];
nbaker 9:d2e39ee9fedd 3252 d[0] = FXAS21002_CTRL_REG1; //CTRL_REG1=0x13
nbaker 9:d2e39ee9fedd 3253 d[1] = 0x0e; //0x0e puts device in active mode with ODR = 100Hz
nbaker 9:d2e39ee9fedd 3254 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3255 oled.Label((uint8_t *)"gyr_err11a",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3256 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3257 }//end if
nbaker 9:d2e39ee9fedd 3258 break;
nbaker 9:d2e39ee9fedd 3259 }// end of case 11
nbaker 9:d2e39ee9fedd 3260
nbaker 9:d2e39ee9fedd 3261 case 12: {// put in standby
nbaker 9:d2e39ee9fedd 3262 /*For lowest power ~2.8uA in standby mode */
nbaker 9:d2e39ee9fedd 3263 char d[2];
nbaker 9:d2e39ee9fedd 3264 d[0] = FXAS21002_CTRL_REG1; //CTRL_REG1=0x13
nbaker 9:d2e39ee9fedd 3265 d[1] = 0x08; //Puts device in standby mode
nbaker 9:d2e39ee9fedd 3266 if(i2c_bus1.write(FXAS21002_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3267 oled.Label((uint8_t *)"gyr_err12a",20,45); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3268 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3269 }//end if
nbaker 9:d2e39ee9fedd 3270 break;
nbaker 9:d2e39ee9fedd 3271 }// end of case 12
nbaker 9:d2e39ee9fedd 3272
nbaker 9:d2e39ee9fedd 3273 default: {
nbaker 9:d2e39ee9fedd 3274 oled.Label((uint8_t *)"Gyro_Mode?",20,45); // Display "mode" at x,y
nbaker 9:d2e39ee9fedd 3275 // unknown config
nbaker 9:d2e39ee9fedd 3276 break;
nbaker 9:d2e39ee9fedd 3277 }
nbaker 9:d2e39ee9fedd 3278 }// end switch
nbaker 9:d2e39ee9fedd 3279 }// end gyro_sensor_config
nbaker 9:d2e39ee9fedd 3280
nbaker 9:d2e39ee9fedd 3281 /*****************************************************************************
nbaker 9:d2e39ee9fedd 3282 Name: press_config()
nbaker 9:d2e39ee9fedd 3283 Purpose: Used to set pressure sensor's internal registers for power modes
nbaker 9:d2e39ee9fedd 3284 Inputs: int value from 0 to 256
nbaker 9:d2e39ee9fedd 3285 Returns: None
nbaker 9:d2e39ee9fedd 3286 ******************************************************************************/
nbaker 9:d2e39ee9fedd 3287
nbaker 9:d2e39ee9fedd 3288 void press_config(uint8_t Num){
nbaker 9:d2e39ee9fedd 3289 // use case switches here to configure
nbaker 9:d2e39ee9fedd 3290 switch(Num) {
nbaker 9:d2e39ee9fedd 3291 case 0: {// put in standby (AKA powered down) mode
nbaker 9:d2e39ee9fedd 3292 //For lowest power ~2.8uA in standby mode, sensor should default to this after reset
nbaker 9:d2e39ee9fedd 3293 char d[2];
nbaker 9:d2e39ee9fedd 3294 d[0] = 0x26; //CTRL_REG1=0x26
nbaker 9:d2e39ee9fedd 3295 d[1] = 0x00; //Puts device in powered down mode
nbaker 9:d2e39ee9fedd 3296 if(i2c_bus1.write(0xC0, d,2) ==1){ // 0xc0 is MPL3115A2 address
nbaker 9:d2e39ee9fedd 3297 oled.Label((uint8_t *)"press_err0a",20,30); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3298 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3299 }//end if
nbaker 9:d2e39ee9fedd 3300 break;
nbaker 9:d2e39ee9fedd 3301 }// end of case 0
nbaker 9:d2e39ee9fedd 3302
nbaker 9:d2e39ee9fedd 3303 default: {
nbaker 9:d2e39ee9fedd 3304 oled.Label((uint8_t *)"PRESS_Mode?",20,45); // Display "mode" at x,y
nbaker 9:d2e39ee9fedd 3305 // unknown config
nbaker 9:d2e39ee9fedd 3306 break;
nbaker 9:d2e39ee9fedd 3307 }
nbaker 9:d2e39ee9fedd 3308 }// end switch
nbaker 9:d2e39ee9fedd 3309 }// end press_config
nbaker 9:d2e39ee9fedd 3310
nbaker 9:d2e39ee9fedd 3311 /*****************************************************************************
nbaker 9:d2e39ee9fedd 3312 Name: MAX30101_test_config()
nbaker 9:d2e39ee9fedd 3313 Purpose: Used to test operation of the MAX30101 heart-rate sensor
nbaker 9:d2e39ee9fedd 3314 Inputs: int value from 0 to 256
nbaker 9:d2e39ee9fedd 3315 Returns: None
nbaker 9:d2e39ee9fedd 3316 ******************************************************************************/
nbaker 9:d2e39ee9fedd 3317 void MAX30101_test_config(uint8_t Num){
nbaker 9:d2e39ee9fedd 3318 // use case switches here to configure
nbaker 9:d2e39ee9fedd 3319 switch(Num) {
nbaker 9:d2e39ee9fedd 3320 case 0: {// test
nbaker 9:d2e39ee9fedd 3321 char d[2] = {0xfe, 0x07};
nbaker 9:d2e39ee9fedd 3322 if(i2c_bus0.read(0xae, d, 2) == 1){ // read RevID value 0-255
nbaker 9:d2e39ee9fedd 3323 sprintf(text_1,"M_R_Er %i %i",d[0],d[1]);
nbaker 9:d2e39ee9fedd 3324 oled.Label((uint8_t *)text_1,5,16); // Display error at x,y
nbaker 9:d2e39ee9fedd 3325 }//end if
nbaker 9:d2e39ee9fedd 3326 else{
nbaker 9:d2e39ee9fedd 3327 sprintf(text_1,"M_R_data %i %i",d[0],d[1]);
nbaker 9:d2e39ee9fedd 3328 oled.Label((uint8_t *)text_1,5,16); // Display good data at x,y
nbaker 9:d2e39ee9fedd 3329 }
nbaker 9:d2e39ee9fedd 3330 wait(1); // wait 1 seconds
nbaker 9:d2e39ee9fedd 3331 d[0] = 0x09; // Mod_conf reg - SHDN, reset, modes
nbaker 9:d2e39ee9fedd 3332 d[1] = 0b00000111; // set mode to red, green and/or IR LEDs
nbaker 9:d2e39ee9fedd 3333 if(i2c_bus0.write(0xaf, d, 1) ==1){; // "true" is needed to prevent stop, MAX30101 address is 0xae but left shifted
nbaker 9:d2e39ee9fedd 3334 oled.Label((uint8_t *)"MAX_W_err0a",5,30); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3335 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3336 }//end if
nbaker 9:d2e39ee9fedd 3337 wait(5); // wait 5 seconds
nbaker 9:d2e39ee9fedd 3338
nbaker 9:d2e39ee9fedd 3339 /*
nbaker 9:d2e39ee9fedd 3340 d[0] = 0xfe; //lets try to read revID value 0-255
nbaker 9:d2e39ee9fedd 3341 d[1] = 0x00; //Puts device in powered down mode
nbaker 9:d2e39ee9fedd 3342 if(i2c_bus0.write(0xae<<1, d,2) ==1){ // MAX30101 address is 0xae but left shifted
nbaker 9:d2e39ee9fedd 3343 oled.Label((uint8_t *)"Max_err0a",20,30); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3344 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3345 }//end if
nbaker 9:d2e39ee9fedd 3346 */
nbaker 9:d2e39ee9fedd 3347 break;
nbaker 9:d2e39ee9fedd 3348 }// end of case 0
nbaker 9:d2e39ee9fedd 3349
nbaker 9:d2e39ee9fedd 3350
nbaker 9:d2e39ee9fedd 3351 case 10: {// reset
nbaker 9:d2e39ee9fedd 3352 char d[2];
nbaker 9:d2e39ee9fedd 3353 d[0] = 0x09; // Mod_conf reg - SHDN, reset, modes
nbaker 9:d2e39ee9fedd 3354 d[1] = 0b01000000; //resets IC
nbaker 9:d2e39ee9fedd 3355 if(i2c_bus0.write(0xaf, d, 2) ==1){
nbaker 9:d2e39ee9fedd 3356 oled.Label((uint8_t *)"MAX_W_Err10a",5,1); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3357 }//end if
nbaker 9:d2e39ee9fedd 3358 else {
nbaker 9:d2e39ee9fedd 3359 oled.Label((uint8_t *)"MAX_Reset",20,30); // Display "reset" at x,y
nbaker 9:d2e39ee9fedd 3360 }
nbaker 9:d2e39ee9fedd 3361 wait(0.1); // wait 5 seconds
nbaker 9:d2e39ee9fedd 3362 break;
nbaker 9:d2e39ee9fedd 3363 }// end of case 10
nbaker 9:d2e39ee9fedd 3364
nbaker 9:d2e39ee9fedd 3365 default: {
nbaker 9:d2e39ee9fedd 3366 oled.Label((uint8_t *)"MAX_Mode?",20,45); // Display "mode" at x,y
nbaker 9:d2e39ee9fedd 3367 // unknown config
nbaker 9:d2e39ee9fedd 3368 break;
nbaker 9:d2e39ee9fedd 3369 }
nbaker 9:d2e39ee9fedd 3370 }// end switch
nbaker 9:d2e39ee9fedd 3371 }// end light_config
nbaker 9:d2e39ee9fedd 3372
nbaker 9:d2e39ee9fedd 3373 /*****************************************************************************
nbaker 9:d2e39ee9fedd 3374 Name: light_config()
nbaker 9:d2e39ee9fedd 3375 Purpose: Used to set ambient light sensor's internal registers for power modes
nbaker 9:d2e39ee9fedd 3376 Inputs: int value from 0 to 256
nbaker 9:d2e39ee9fedd 3377 Returns: None
nbaker 9:d2e39ee9fedd 3378 ******************************************************************************/
nbaker 9:d2e39ee9fedd 3379 /*
nbaker 9:d2e39ee9fedd 3380 void light_config(uint8_t Num){
nbaker 9:d2e39ee9fedd 3381 // use case switches here to configure
nbaker 9:d2e39ee9fedd 3382 switch(Num) {
nbaker 9:d2e39ee9fedd 3383 case 0: {// put in standby (AKA powered down) mode
nbaker 9:d2e39ee9fedd 3384 //For lowest power ~2.8uA in standby mode, sensor should default to this after reset
nbaker 9:d2e39ee9fedd 3385 char d[2];
nbaker 9:d2e39ee9fedd 3386 d[0] = TSL2561_CONTROL; //CTRL_REG0=0x00
nbaker 9:d2e39ee9fedd 3387 d[1] = 0x00; //Puts device in powered down mode
nbaker 9:d2e39ee9fedd 3388 if(i2c_bus0.write(TSL2561_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3389 oled.Label((uint8_t *)"light_err0a",20,30); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3390 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3391 }//end if
nbaker 9:d2e39ee9fedd 3392 break;
nbaker 9:d2e39ee9fedd 3393 }// end of case 0
nbaker 9:d2e39ee9fedd 3394
nbaker 9:d2e39ee9fedd 3395 case 1: {// put in active
nbaker 9:d2e39ee9fedd 3396 char d[2];
nbaker 9:d2e39ee9fedd 3397 d[0] = TSL2561_CONTROL; //CTRL_REG=0x00
nbaker 9:d2e39ee9fedd 3398 d[1] = 0x03; //Puts device in powered up mode
nbaker 9:d2e39ee9fedd 3399 if(i2c_bus0.write(TSL2561_I2C_ADDRESS_, d,2) ==1){
nbaker 9:d2e39ee9fedd 3400 oled.Label((uint8_t *)"light_err0a",20,30); // Display "error" at x,y
nbaker 9:d2e39ee9fedd 3401 wait(3.0); // display for 3 seconds
nbaker 9:d2e39ee9fedd 3402 }//end if
nbaker 9:d2e39ee9fedd 3403 break;
nbaker 9:d2e39ee9fedd 3404 }// end of case 1
nbaker 9:d2e39ee9fedd 3405
nbaker 9:d2e39ee9fedd 3406 default: {
nbaker 9:d2e39ee9fedd 3407 oled.Label((uint8_t *)"LGHT_Mode?",20,45); // Display "mode" at x,y
nbaker 9:d2e39ee9fedd 3408 // unknown config
nbaker 9:d2e39ee9fedd 3409 break;
nbaker 9:d2e39ee9fedd 3410 }
nbaker 9:d2e39ee9fedd 3411 }// end switch
nbaker 9:d2e39ee9fedd 3412 }// end light_config
nbaker 9:d2e39ee9fedd 3413 */
nbaker 9:d2e39ee9fedd 3414
nbaker 9:d2e39ee9fedd 3415 /*****************************************************************************
nbaker 8:a5c77b45008d 3416 Name: update_display_date
nbaker 8:a5c77b45008d 3417 Purpose: Updating display data without updating any data labels. This keeps
nbaker 8:a5c77b45008d 3418 measurements and time values current while reducing screen flicker.
nbaker 8:a5c77b45008d 3419 ******************************************************************************/
nbaker 8:a5c77b45008d 3420 void update_display_date(void)
nbaker 8:a5c77b45008d 3421 {
nbaker 8:a5c77b45008d 3422 oled_text_properties_t textProperties = {0}; // Need these to change font color
nbaker 8:a5c77b45008d 3423 oled.GetTextProperties(&textProperties); // Need these to change font color
nbaker 8:a5c77b45008d 3424 __disable_irq(); // Disable all Interrupts
nbaker 8:a5c77b45008d 3425
nbaker 8:a5c77b45008d 3426 switch(Screen_Num) {
nbaker 8:a5c77b45008d 3427 case 0: {// Main Screen
nbaker 8:a5c77b45008d 3428 HexiwearBattery battery;
nbaker 8:a5c77b45008d 3429 battery.sensorOn();
nbaker 8:a5c77b45008d 3430 if (battery.isBatteryCharging()) {
nbaker 8:a5c77b45008d 3431 textProperties.fontColor = COLOR_GREEN;
nbaker 8:a5c77b45008d 3432 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 3433
nbaker 8:a5c77b45008d 3434 sprintf(text_1, "%i%%+", (uint8_t)battery.readLevelPercent());
nbaker 8:a5c77b45008d 3435 // Screen_Timer.attach(&timout_timer,(SCRN_TIME));// Reset/restart ticker timer for OLED while fully charged
nbaker 8:a5c77b45008d 3436 } else {
nbaker 8:a5c77b45008d 3437 sprintf(text_1, "%i%%", (uint8_t)battery.readLevelPercent());
nbaker 8:a5c77b45008d 3438 }
nbaker 8:a5c77b45008d 3439 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
nbaker 8:a5c77b45008d 3440
nbaker 8:a5c77b45008d 3441 textProperties.fontColor = COLOR_WHITE;
nbaker 8:a5c77b45008d 3442 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 3443
nbaker 8:a5c77b45008d 3444 // added real time and date information
nbaker 8:a5c77b45008d 3445 char buffer[32];
nbaker 8:a5c77b45008d 3446 time_t seconds = time(NULL);
nbaker 8:a5c77b45008d 3447 strftime(buffer,32, "%a,%d %m %Y.%H:%M:%S\r", localtime(&seconds));
nbaker 8:a5c77b45008d 3448 // 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]);
nbaker 8:a5c77b45008d 3449 // oled.Label((uint8_t *)text_1,20,20);// Date at x,y
nbaker 8:a5c77b45008d 3450 sprintf(text_1,"%c%c:%c%c:%c%c ",buffer[15],buffer[16],buffer[18],buffer[19],buffer[21],buffer[22]);
nbaker 9:d2e39ee9fedd 3451
nbaker 9:d2e39ee9fedd 3452
nbaker 9:d2e39ee9fedd 3453 textProperties.font = OpenSans_12x18_Regular; // Max Width of Character = 12px, Max Height of Character = 18px
nbaker 9:d2e39ee9fedd 3454 textProperties.fontColor = COLOR_WHITE;
nbaker 9:d2e39ee9fedd 3455 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 3456 oled.Label((uint8_t *)text_1,25,40);// Time at x,y
nbaker 9:d2e39ee9fedd 3457 textProperties.font = OpenSans_10x15_Regular; // Max Width of Character = 10px, Max Height of Character = 15px
nbaker 9:d2e39ee9fedd 3458 textProperties.fontColor = COLOR_WHITE;
nbaker 9:d2e39ee9fedd 3459 oled.SetTextProperties(&textProperties);
nbaker 9:d2e39ee9fedd 3460
nbaker 8:a5c77b45008d 3461 Heat_Index_Calculation();
nbaker 8:a5c77b45008d 3462 sprintf(text,"%i",heat_index);
nbaker 8:a5c77b45008d 3463 oled.TextBox((uint8_t *)text,3,80,15,15); //show HI in a 15px by 15px text box at x=3, y=80
nbaker 8:a5c77b45008d 3464 break;
nbaker 8:a5c77b45008d 3465 }// end case 0
nbaker 8:a5c77b45008d 3466
nbaker 8:a5c77b45008d 3467 case 21: {// Fall Alert Diagnostic Screen
nbaker 8:a5c77b45008d 3468 if(Fall_Alert_Mode == 0){
nbaker 9:d2e39ee9fedd 3469 fall_config(11); // turn accel sensor to active mode to take a reading, may take 80mS to 300mS
nbaker 8:a5c77b45008d 3470 }
nbaker 8:a5c77b45008d 3471 textProperties.fontColor = COLOR_WHITE;
nbaker 8:a5c77b45008d 3472 oled.SetTextProperties(&textProperties);
nbaker 8:a5c77b45008d 3473 gyro.acquire_gyro_data_dps(Gyro_Data);
nbaker 8:a5c77b45008d 3474 Gyro_Mag = (abs(Gyro_Data[0])+abs(Gyro_Data[1])+abs(Gyro_Data[2]));
nbaker 8:a5c77b45008d 3475 sprintf(text_1," %4.0f D/S ",Gyro_Mag);
nbaker 9:d2e39ee9fedd 3476 oled.Label((uint8_t *)text_1,37,60);// text_1 at x,y
nbaker 8:a5c77b45008d 3477
nbaker 8:a5c77b45008d 3478 accel.acquire_accel_data_g(Accel_Data);
nbaker 8:a5c77b45008d 3479 if(Fall_Alert_Mode == 0){
nbaker 8:a5c77b45008d 3480 fall_config(12); // turn accel sensor back to standby
nbaker 8:a5c77b45008d 3481 }
nbaker 8:a5c77b45008d 3482 Accel_Mag = 2*sqrt(((Accel_Data[0]*Accel_Data[0])+(Accel_Data[1]*Accel_Data[1])+(Accel_Data[2]*Accel_Data[2])));
nbaker 8:a5c77b45008d 3483 sprintf(text_1," %2.2f g ",Accel_Mag);
nbaker 9:d2e39ee9fedd 3484 oled.Label((uint8_t *)text_1,39,40);// text_1 at x,y
nbaker 9:d2e39ee9fedd 3485 if(Accel_Mag > Fall_Thresh + 0.05f && Led_clk2 == 1){// are we stuck in limbo?
nbaker 8:a5c77b45008d 3486 fall_det_end();
nbaker 8:a5c77b45008d 3487 }
nbaker 8:a5c77b45008d 3488 break;
nbaker 8:a5c77b45008d 3489 }//end case 21
nbaker 8:a5c77b45008d 3490
nbaker 8:a5c77b45008d 3491 default: {
nbaker 8:a5c77b45008d 3492 // do nothing for other screens
nbaker 8:a5c77b45008d 3493 break;
nbaker 8:a5c77b45008d 3494 }
nbaker 8:a5c77b45008d 3495 }// end switch
nbaker 8:a5c77b45008d 3496 __enable_irq(); // Enable all Interrupts
nbaker 8:a5c77b45008d 3497 }// end of update_display_date
nbaker 8:a5c77b45008d 3498
nbaker 8:a5c77b45008d 3499
nbaker 8:a5c77b45008d 3500 /*****************************************************************************
nbaker 8:a5c77b45008d 3501 Name: BLUETOOTH
nbaker 8:a5c77b45008d 3502 Purpose: HexiHeart Connecction
nbaker 8:a5c77b45008d 3503 Inputs: None
nbaker 8:a5c77b45008d 3504 Returns: None
nbaker 8:a5c77b45008d 3505 ******************************************************************************/
nbaker 8:a5c77b45008d 3506
nbaker 8:a5c77b45008d 3507
nbaker 8:a5c77b45008d 3508 void txTask(void)
nbaker 8:a5c77b45008d 3509 {
nbaker 8:a5c77b45008d 3510
nbaker 8:a5c77b45008d 3511 while (true) {
nbaker 8:a5c77b45008d 3512 /*Notify Hexiwear App that it is running Sensor Tag mode*/
nbaker 8:a5c77b45008d 3513 /* This part was not compiling
nbaker 8:a5c77b45008d 3514 kw40z_device.SendSetApplicationMode(GUI_CURRENT_APP_SENSOR_TAG);
nbaker 8:a5c77b45008d 3515 */
nbaker 8:a5c77b45008d 3516 }
nbaker 8:a5c77b45008d 3517 }