Hexiwear Bluetooth Low Energy Example. The device is configured to behave as a sensor tag. This example is to be used with the Hexiwear mobile app on iOS and Android.

Dependencies:   Hexi_KW40Z Hexi_OLED_SSD1351

Committer:
khuang
Date:
Tue Sep 20 22:40:39 2016 +0000
Revision:
1:a0d9eeedb771
Parent:
0:c80666325948
Child:
3:c2ab3a0de448
Moved Transmission of Sensor Tag Data from main thread to its own thread.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
khuang 0:c80666325948 1 #include "mbed.h"
khuang 0:c80666325948 2 #include "Hexi_KW40Z.h"
khuang 0:c80666325948 3 #include "Hexi_OLED_SSD1351.h"
khuang 0:c80666325948 4 #include "OLED_types.h"
khuang 0:c80666325948 5 #include "OpenSans_Font.h"
khuang 0:c80666325948 6 #include "string.h"
khuang 0:c80666325948 7
khuang 0:c80666325948 8 #define LED_ON 0
khuang 0:c80666325948 9 #define LED_OFF 1
khuang 0:c80666325948 10
khuang 0:c80666325948 11 void StartHaptic(void);
khuang 0:c80666325948 12 void StopHaptic(void const *n);
khuang 1:a0d9eeedb771 13 void txTask(void);
khuang 0:c80666325948 14
khuang 0:c80666325948 15 DigitalOut redLed(LED1,1);
khuang 0:c80666325948 16 DigitalOut greenLed(LED2,1);
khuang 0:c80666325948 17 DigitalOut blueLed(LED3,1);
khuang 0:c80666325948 18 DigitalOut haptic(PTB9);
khuang 0:c80666325948 19
khuang 0:c80666325948 20 /* Define timer for haptic feedback */
khuang 0:c80666325948 21 RtosTimer hapticTimer(StopHaptic, osTimerOnce);
khuang 0:c80666325948 22
khuang 0:c80666325948 23 /* Instantiate the Hexi KW40Z Driver (UART TX, UART RX) */
khuang 0:c80666325948 24 KW40Z kw40z_device(PTE24, PTE25);
khuang 0:c80666325948 25
khuang 0:c80666325948 26 /* Instantiate the SSD1351 OLED Driver */
khuang 0:c80666325948 27 SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); /* (MOSI,SCLK,POWER,CS,RST,DC) */
khuang 0:c80666325948 28
khuang 1:a0d9eeedb771 29 /*Create a Thread to handle sending BLE Sensor Data */
khuang 1:a0d9eeedb771 30 Thread txThread;
khuang 0:c80666325948 31
khuang 1:a0d9eeedb771 32 /* Text Buffer */
khuang 1:a0d9eeedb771 33 char text[20];
khuang 1:a0d9eeedb771 34
khuang 1:a0d9eeedb771 35 /****************************Call Back Functions*******************************/
khuang 0:c80666325948 36 void ButtonRight(void)
khuang 0:c80666325948 37 {
khuang 0:c80666325948 38 StartHaptic();
khuang 0:c80666325948 39 kw40z_device.ToggleAdvertisementMode();
khuang 0:c80666325948 40 }
khuang 0:c80666325948 41
khuang 0:c80666325948 42 void ButtonLeft(void)
khuang 0:c80666325948 43 {
khuang 0:c80666325948 44 StartHaptic();
khuang 0:c80666325948 45 kw40z_device.ToggleAdvertisementMode();
khuang 0:c80666325948 46 }
khuang 0:c80666325948 47
khuang 0:c80666325948 48 void PassKey(void)
khuang 0:c80666325948 49 {
khuang 0:c80666325948 50 StartHaptic();
khuang 0:c80666325948 51 strcpy((char *) text,"PAIR CODE");
khuang 1:a0d9eeedb771 52 oled.TextBox((uint8_t *)text,0,25,95,18);
khuang 0:c80666325948 53
khuang 0:c80666325948 54 /* Display Bond Pass Key in a 95px by 18px textbox at x=0,y=40 */
khuang 0:c80666325948 55 sprintf(text,"%d", kw40z_device.GetPassKey());
khuang 0:c80666325948 56 oled.TextBox((uint8_t *)text,0,40,95,18);
khuang 0:c80666325948 57 }
khuang 1:a0d9eeedb771 58
khuang 1:a0d9eeedb771 59 /***********************End of Call Back Functions*****************************/
khuang 1:a0d9eeedb771 60
khuang 1:a0d9eeedb771 61 /********************************Main******************************************/
khuang 1:a0d9eeedb771 62
khuang 0:c80666325948 63 int main()
khuang 0:c80666325948 64 {
khuang 0:c80666325948 65 /* Get OLED Class Default Text Properties */
khuang 0:c80666325948 66 oled_text_properties_t textProperties = {0};
khuang 0:c80666325948 67 oled.GetTextProperties(&textProperties);
khuang 0:c80666325948 68
khuang 0:c80666325948 69 /* Turn on the backlight of the OLED Display */
khuang 0:c80666325948 70 oled.DimScreenON();
khuang 0:c80666325948 71
khuang 0:c80666325948 72 /* Fills the screen with solid black */
khuang 0:c80666325948 73 oled.FillScreen(COLOR_BLACK);
khuang 0:c80666325948 74
khuang 0:c80666325948 75 /* Register callbacks to application functions */
khuang 0:c80666325948 76 kw40z_device.attach_buttonLeft(&ButtonLeft);
khuang 0:c80666325948 77 kw40z_device.attach_buttonRight(&ButtonRight);
khuang 0:c80666325948 78 kw40z_device.attach_passkey(&PassKey);
khuang 1:a0d9eeedb771 79
khuang 0:c80666325948 80 /* Change font color to Blue */
khuang 0:c80666325948 81 textProperties.fontColor = COLOR_BLUE;
khuang 0:c80666325948 82 oled.SetTextProperties(&textProperties);
khuang 0:c80666325948 83
khuang 0:c80666325948 84 /* Display Bluetooth Label at x=17,y=65 */
khuang 0:c80666325948 85 strcpy((char *) text,"BLUETOOTH");
khuang 0:c80666325948 86 oled.Label((uint8_t *)text,17,65);
khuang 0:c80666325948 87
khuang 0:c80666325948 88 /* Change font color to white */
khuang 0:c80666325948 89 textProperties.fontColor = COLOR_WHITE;
khuang 0:c80666325948 90 textProperties.alignParam = OLED_TEXT_ALIGN_CENTER;
khuang 0:c80666325948 91 oled.SetTextProperties(&textProperties);
khuang 0:c80666325948 92
khuang 1:a0d9eeedb771 93 /* Display Label at x=22,y=80 */
khuang 0:c80666325948 94 strcpy((char *) text,"Tap Below");
khuang 0:c80666325948 95 oled.Label((uint8_t *)text,22,80);
khuang 0:c80666325948 96
khuang 1:a0d9eeedb771 97 uint8_t prevLinkState = 0;
khuang 1:a0d9eeedb771 98 uint8_t currLinkState = 0;
khuang 1:a0d9eeedb771 99 txThread.start(txTask); /*Start transmitting Sensor Tag Data */
khuang 0:c80666325948 100
khuang 1:a0d9eeedb771 101 while (true)
khuang 1:a0d9eeedb771 102 {
khuang 1:a0d9eeedb771 103 blueLed = !kw40z_device.GetAdvertisementMode(); /*Indicate BLE Advertisment Mode*/
khuang 1:a0d9eeedb771 104 Thread::wait(50);
khuang 1:a0d9eeedb771 105 }
khuang 1:a0d9eeedb771 106 }
khuang 1:a0d9eeedb771 107
khuang 1:a0d9eeedb771 108 /******************************End of Main*************************************/
khuang 1:a0d9eeedb771 109
khuang 1:a0d9eeedb771 110
khuang 1:a0d9eeedb771 111 /* txTask() transmits the sensor data */
khuang 1:a0d9eeedb771 112 void txTask(void){
khuang 1:a0d9eeedb771 113
khuang 1:a0d9eeedb771 114 while (true)
khuang 1:a0d9eeedb771 115 {
khuang 0:c80666325948 116
khuang 1:a0d9eeedb771 117 /*Notify Hexiwear App that it is running Sensor Tag mode*/
khuang 0:c80666325948 118 kw40z_device.SendSetApplicationMode(GUI_CURRENT_APP_SENSOR_TAG);
khuang 0:c80666325948 119
khuang 1:a0d9eeedb771 120 /*The following is sending dummy data over BLE. Replace with real data*/
khuang 1:a0d9eeedb771 121
khuang 0:c80666325948 122 /*Send Battery Level for 20% */
khuang 0:c80666325948 123 kw40z_device.SendBatteryLevel(20);
khuang 0:c80666325948 124
khuang 0:c80666325948 125 /*Send Ambient Light Level at 50% */
khuang 0:c80666325948 126 kw40z_device.SendAmbientLight(50);
khuang 0:c80666325948 127
khuang 0:c80666325948 128 /*Send Humidity at 90% */
khuang 0:c80666325948 129 kw40z_device.SendHumidity(9000);
khuang 0:c80666325948 130
khuang 0:c80666325948 131 /*Send Temperature at 25 degrees Celsius */
khuang 0:c80666325948 132 kw40z_device.SendTemperature(2500);
khuang 0:c80666325948 133
khuang 0:c80666325948 134 /*Send Pressure at 100kPA */
khuang 0:c80666325948 135 kw40z_device.SendPressure(10000);
khuang 0:c80666325948 136
khuang 1:a0d9eeedb771 137 /*Send Mag,Accel,Gyro Data. */
khuang 0:c80666325948 138 kw40z_device.SendGyro(0,0,0);
khuang 0:c80666325948 139 kw40z_device.SendAccel(0,0,0);
khuang 1:a0d9eeedb771 140 kw40z_device.SendMag(0,0,0);
khuang 1:a0d9eeedb771 141 Thread::wait(1000);
khuang 0:c80666325948 142 }
khuang 0:c80666325948 143 }
khuang 0:c80666325948 144
khuang 1:a0d9eeedb771 145 void StartHaptic(void) {
khuang 0:c80666325948 146 hapticTimer.start(50);
khuang 0:c80666325948 147 haptic = 1;
khuang 0:c80666325948 148 }
khuang 0:c80666325948 149
khuang 0:c80666325948 150 void StopHaptic(void const *n) {
khuang 0:c80666325948 151 haptic = 0;
khuang 0:c80666325948 152 hapticTimer.stop();
khuang 0:c80666325948 153 }
khuang 1:a0d9eeedb771 154