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:
Wed Mar 28 21:47:04 2018 +0000
Revision:
11:ccda4d44bd8e
Parent:
10:eaea844e763c
Child:
12:fd39a7983e06
v2.10 - Added BLE pairing code (need to test it), spoofing amb light sensor data for alert status.

Who changed what in which revision?

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