![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Here
Dependencies: Hexi_KW40Z Hexi_OLED_SSD1351 nRF24L01 FXOS8700
main.cpp
- Committer:
- tdh50
- Date:
- 2017-04-10
- Revision:
- 12:8db1b8fb5866
- Parent:
- 11:deecd2b72129
- Child:
- 14:9e6b87e322a2
- Child:
- 15:77b6655d401b
File content as of revision 12:8db1b8fb5866:
#include "mbed.h" #include "Hexi_KW40Z.h" #include "FXOS8700.h" #include "Hexi_OLED_SSD1351.h" #include "OLED_types.h" #include "OpenSans_Font.h" #include "nRF24L01P.h" #include "string.h" #include "images.h" #define NAME "RB" #define LED_ON 0 #define LED_OFF 1 #define NUM_OF_SCREENS 4 #define TRANSFER_SIZE 4 void StartHaptic(void); void StopHaptic(void const *n); void txTask(void); void accelero(void); void drawAccel(void); void displayHome(); void screenHandler(uint8_t screen); DigitalOut redLed(LED1,1); DigitalOut greenLed(LED2,1); DigitalOut blueLed(LED3,1); DigitalOut haptic(PTB9); // Define timer for haptic feedback RtosTimer hapticTimer(StopHaptic, osTimerOnce); // FXOS8700 accel(PTC11, PTC10); // Instantiate the Hexi KW40Z Driver (UART TX, UART RX) KW40Z kw40z_device(PTE24, PTE25); Serial pc(USBTX, USBRX); // Serial interface // Instantiate the SSD1351 OLED Driver SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); // (MOSI,SCLK,POWER,CS,RST,DC) oled_text_properties_t textProperties = {0}; /*Create a Thread to handle sending BLE Sensor Data */ Thread txThread; // Text Buffer char text1[20]; // Text Buffer for dynamic value displayed char text2[20]; // Text Buffer for dynamic value displayed char text3[20]; // Text Buffer for dynamic value displayed char text [20]; float accel_data[3]; // Storage for the data from the sensor float accel_rms=0.0; // RMS value from the sensor float ax, ay, az; // Integer value from the sensor to be displayed uint8_t timer = 30; uint8_t screenNum=0; bool prefix=0; bool accelerometer = false; bool sentMessageDisplayedFlag=0; char rxData[TRANSFER_SIZE]; char txData[TRANSFER_SIZE]; int16_t x=0,y=0,z=0; // Pointer for the image to be displayed const uint8_t *SafeBMP = HexiSafe96_bmp; const uint8_t *HeartBMP = HeartRate_bmp; const uint8_t *FallBMP = FallDet_bmp; const uint8_t *FallPageBMP = FallDetPage_bmp; const uint8_t *HomeBMP = Home_bmp; const uint8_t *HeartPageBMP = HeartRatePage_bmp; const uint8_t *AlertBMP = Alert_bmp; //***************************Call Back Functions****************************** //Enter Button void ButtonRight(void) { // All screens other than 1 have either and enter button // or a home buttom. if(screenNum != 1) { StartHaptic(); switch(screenNum) { case 0: { screenNum++; screenHandler(screenNum); break; } case 2: { screenNum = screenNum + 2; screenHandler(screenNum); break; } case 3: { screenNum = screenNum + 2; screenHandler(screenNum); break; } case 4: case 5: { accelerometer = false; screenNum = 0; break; } case 6: { screenNum = 0; break; } default: { break; } } screenHandler(screenNum); } } //Back Button void ButtonLeft(void) { StartHaptic(); if(screenNum > 0) { //Allow user to go back to correct screen based on srceen number //Refer to screenHandler for screen numbers if(screenNum == 3 || screenNum == 4 || screenNum == 5) { screenNum = screenNum - 2; accelerometer = false; } else { screenNum--; } } else { screenNum = 6; } screenHandler(screenNum); } //Advances to Heartrate only when user //is on Hexisafe screen void ButtonUp(void) { if (screenNum == 1) { StartHaptic(); screenNum++; screenHandler(screenNum); } } //Advances to Fall Detection only when user //is on Hexisafe screen void ButtonDown(void) { if (screenNum == 1) { StartHaptic(); screenNum= screenNum + 2; screenHandler(screenNum); } } void PassKey(void) { StartHaptic(); strcpy((char *) text,"PAIR CODE"); oled.TextBox((uint8_t *)text,0,25,95,18); /* Display Bond Pass Key in a 95px by 18px textbox at x=0,y=40 */ sprintf(text,"%d", kw40z_device.GetPassKey()); oled.TextBox((uint8_t *)text,0,40,95,18); } //**********************End of Call Back Functions**************************** //*******************************Main***************************************** int main() { // Wait Sequence in the beginning for board to be reset then placed in mini docking station accel.accel_config(); // Get OLED Class Default Text Properties oled.GetTextProperties(&textProperties); // Register callbacks to application functions kw40z_device.attach_buttonLeft(&ButtonLeft); kw40z_device.attach_buttonRight(&ButtonRight); kw40z_device.attach_buttonUp(&ButtonUp); kw40z_device.attach_buttonDown(&ButtonDown); oled_text_properties_t textProperties = {0}; oled.SetTextProperties(&textProperties); //Passcode kw40z_device.attach_passkey(&PassKey); // Change font color to white textProperties.fontColor = COLOR_WHITE; textProperties.alignParam = OLED_TEXT_ALIGN_CENTER; //txThread.start(txTask); /*Start transmitting Sensor Tag Data */ //Displays the Home Screen displayHome(); //bool trigger = 0; while (true) { accel.acquire_accel_data_g(accel_data); accel_rms = sqrt(((accel_data[0]*accel_data[0])+(accel_data[1]*accel_data[1])+(accel_data[2]*accel_data[2]))/3); x = accel_data[0] *10000; y = accel_data[1] *10000; z = accel_data[2] *10000; printf("x = %4.4f y = %4.4f z = %4.4f\n\rx = %i y = %i z = %i\n\r",accel_data[0],accel_data[1],accel_data[2],x,y,z); if(screenNum == 5) { drawAccel(); } Thread::wait(300); } } //*****************************End of Main************************************ //Intiates Vibration void StartHaptic(void) { hapticTimer.start(50); haptic = 1; } void StopHaptic(void const *n) { haptic = 0; hapticTimer.stop(); } void displayHome(void) { oled.DrawImage(HomeBMP,0,0); } void screenHandler(uint8_t screen) { //Switching screens switch(screen) { case 0: { displayHome(); break; } case 1: { //Switching to SafeBMP oled.DrawImage(SafeBMP,0,0); break; } case 2: { //Switching to HeartBMP oled.DrawImage(HeartBMP,0,0); break; } case 3: { //Switching to FallBMP oled.DrawImage(FallBMP,0,0); break; } case 4: { //Switching to HeartPageBMP oled.DrawImage(HeartPageBMP,0,0); break; } case 5: { //Switching to FallPageBMP oled.DrawBox (23,18,50 ,50 , COLOR_BLACK); break; } case 6: { //Switching to alarm oled.DrawImage(AlertBMP,0,0); break; } default: { break; } } //Append Initials to txData[2:3]. //strcat(txData,NAME); } void drawAccel(void) { textProperties.fontColor = COLOR_GREEN; textProperties.alignParam = OLED_TEXT_ALIGN_LEFT; oled.SetTextProperties(&textProperties); // Display Legends strcpy((char *) text1,"X-Axis (g):"); oled.Label((uint8_t *)text1,5,26); strcpy((char *) text2,"Y-Axis (g):"); oled.Label((uint8_t *)text2,5,43); strcpy((char *) text3,"Z-Axis (g):"); oled.Label((uint8_t *)text3,5,60); // Format the value sprintf(text1,"%4.2f", accel_data[0]); // Display time reading in 35px by 15px textbox at(x=55, y=40) oled.TextBox((uint8_t *)text1,70,26,20,15); //Increase textbox for more digits // Format the value sprintf(text2,"%4.2f",accel_data[1]); // Display time reading in 35px by 15px textbox at(x=55, y=40) oled.TextBox((uint8_t *)text2,70,43,20,15); //Increase textbox for more digits // Format the value sprintf(text3,"%4.2f", accel_data[2]); // Display time reading in 35px by 15px textbox at(x=55, y=40) oled.TextBox((uint8_t *)text3,70,60,20,15); //Increase textbox for more digits } // txTask() transmits the sensor data void txTask(void) { while (true) { //UpdateSensorData(); kw40z_device.SendSetApplicationMode(GUI_CURRENT_APP_SENSOR_TAG); //Send Accel Data. kw40z_device.SendAccel(x,y,z); } }