hexi

Dependencies:   Hexi_KW40Z Hexi_OLED_SSD1351

Fork of Hexi_BLE_Example_Modified by Xi Han

Committer:
catchvibes95
Date:
Tue Jun 12 21:24:01 2018 +0000
Revision:
5:52965830cd7c
Parent:
4:20d4eebfa986
q2

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
cotigac 3:c2ab3a0de448 10
cotigac 3:c2ab3a0de448 11 void UpdateSensorData(void);
khuang 0:c80666325948 12 void StartHaptic(void);
khuang 0:c80666325948 13 void StopHaptic(void const *n);
khuang 1:a0d9eeedb771 14 void txTask(void);
khuang 0:c80666325948 15
xihan94 4:20d4eebfa986 16 Serial pc(USBTX, USBRX);
xihan94 4:20d4eebfa986 17
khuang 0:c80666325948 18 DigitalOut redLed(LED1,1);
khuang 0:c80666325948 19 DigitalOut greenLed(LED2,1);
khuang 0:c80666325948 20 DigitalOut blueLed(LED3,1);
khuang 0:c80666325948 21 DigitalOut haptic(PTB9);
khuang 0:c80666325948 22
khuang 0:c80666325948 23 /* Define timer for haptic feedback */
khuang 0:c80666325948 24 RtosTimer hapticTimer(StopHaptic, osTimerOnce);
khuang 0:c80666325948 25
khuang 0:c80666325948 26 /* Instantiate the Hexi KW40Z Driver (UART TX, UART RX) */
khuang 0:c80666325948 27 KW40Z kw40z_device(PTE24, PTE25);
khuang 0:c80666325948 28
khuang 0:c80666325948 29 /* Instantiate the SSD1351 OLED Driver */
khuang 0:c80666325948 30 SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); /* (MOSI,SCLK,POWER,CS,RST,DC) */
khuang 0:c80666325948 31
khuang 1:a0d9eeedb771 32 /*Create a Thread to handle sending BLE Sensor Data */
khuang 1:a0d9eeedb771 33 Thread txThread;
khuang 0:c80666325948 34
khuang 1:a0d9eeedb771 35 /* Text Buffer */
khuang 1:a0d9eeedb771 36 char text[20];
khuang 1:a0d9eeedb771 37
cotigac 3:c2ab3a0de448 38 uint8_t battery = 100;
cotigac 3:c2ab3a0de448 39 uint8_t light = 0;
cotigac 3:c2ab3a0de448 40 uint16_t humidity = 4500;
cotigac 3:c2ab3a0de448 41 uint16_t temperature = 2000;
cotigac 3:c2ab3a0de448 42 uint16_t pressure = 9000;
cotigac 3:c2ab3a0de448 43 uint16_t x = 0;
cotigac 3:c2ab3a0de448 44 uint16_t y = 5000;
cotigac 3:c2ab3a0de448 45 uint16_t z = 10000;
cotigac 3:c2ab3a0de448 46
catchvibes95 5:52965830cd7c 47
catchvibes95 5:52965830cd7c 48 void attach_buttonSlide(button_t btnFct);
catchvibes95 5:52965830cd7c 49
catchvibes95 5:52965830cd7c 50 int flag=0;
catchvibes95 5:52965830cd7c 51
khuang 1:a0d9eeedb771 52 /****************************Call Back Functions*******************************/
khuang 0:c80666325948 53 void ButtonRight(void)
khuang 0:c80666325948 54 {
khuang 0:c80666325948 55 StartHaptic();
catchvibes95 5:52965830cd7c 56 flag=4;
catchvibes95 5:52965830cd7c 57 //kw40z_device.ToggleAdvertisementMode();
catchvibes95 5:52965830cd7c 58 }
catchvibes95 5:52965830cd7c 59
catchvibes95 5:52965830cd7c 60 void ButtonUp(void)
catchvibes95 5:52965830cd7c 61 {
catchvibes95 5:52965830cd7c 62 StartHaptic();
catchvibes95 5:52965830cd7c 63 flag=1;
catchvibes95 5:52965830cd7c 64 //kw40z_device.ToggleAdvertisementMode();
khuang 0:c80666325948 65 }
khuang 0:c80666325948 66
khuang 0:c80666325948 67 void ButtonLeft(void)
khuang 0:c80666325948 68 {
khuang 0:c80666325948 69 StartHaptic();
catchvibes95 5:52965830cd7c 70 flag=3;
catchvibes95 5:52965830cd7c 71 //kw40z_device.ToggleAdvertisementMode();
khuang 0:c80666325948 72 }
catchvibes95 5:52965830cd7c 73 void ButtonDown(void)
catchvibes95 5:52965830cd7c 74 {
catchvibes95 5:52965830cd7c 75 StartHaptic();
catchvibes95 5:52965830cd7c 76 flag=2;
catchvibes95 5:52965830cd7c 77 }
catchvibes95 5:52965830cd7c 78
khuang 0:c80666325948 79
khuang 0:c80666325948 80 void PassKey(void)
khuang 0:c80666325948 81 {
khuang 0:c80666325948 82 StartHaptic();
khuang 0:c80666325948 83 strcpy((char *) text,"PAIR CODE");
khuang 1:a0d9eeedb771 84 oled.TextBox((uint8_t *)text,0,25,95,18);
khuang 0:c80666325948 85
khuang 0:c80666325948 86 /* Display Bond Pass Key in a 95px by 18px textbox at x=0,y=40 */
khuang 0:c80666325948 87 sprintf(text,"%d", kw40z_device.GetPassKey());
khuang 0:c80666325948 88 oled.TextBox((uint8_t *)text,0,40,95,18);
khuang 0:c80666325948 89 }
khuang 1:a0d9eeedb771 90
xihan94 4:20d4eebfa986 91 // Key modification: use the alert functionality enabled by the host-ble interface
xihan94 4:20d4eebfa986 92 // to define our own command.
xihan94 4:20d4eebfa986 93 void AlertReceived(uint8_t *data, uint8_t length)
xihan94 4:20d4eebfa986 94 {
xihan94 4:20d4eebfa986 95 StartHaptic();
xihan94 4:20d4eebfa986 96 data[19] = 0;
xihan94 4:20d4eebfa986 97 pc.printf("%s\n\r", data);
xihan94 4:20d4eebfa986 98
xihan94 4:20d4eebfa986 99 // data (our command) must 20 bytes long.
xihan94 4:20d4eebfa986 100 // CMD for turning on: 'ledonledonledonledon'
xihan94 4:20d4eebfa986 101 if (data[4] == 'n') {
xihan94 4:20d4eebfa986 102 greenLed = LED_ON;
xihan94 4:20d4eebfa986 103 redLed = LED_ON;
xihan94 4:20d4eebfa986 104 blueLed = LED_ON;
xihan94 4:20d4eebfa986 105 pc.printf("on\n\r", data);
xihan94 4:20d4eebfa986 106
xihan94 4:20d4eebfa986 107 // CMD for turning off: 'ledoffledoffledoffled'
xihan94 4:20d4eebfa986 108 } else if (data[4] == 'f') {
xihan94 4:20d4eebfa986 109 greenLed = LED_OFF;
xihan94 4:20d4eebfa986 110 redLed = LED_OFF;
xihan94 4:20d4eebfa986 111 blueLed = LED_OFF;
xihan94 4:20d4eebfa986 112 pc.printf("off\n\r", data);
xihan94 4:20d4eebfa986 113 }
xihan94 4:20d4eebfa986 114 }
khuang 1:a0d9eeedb771 115 /***********************End of Call Back Functions*****************************/
khuang 1:a0d9eeedb771 116
khuang 1:a0d9eeedb771 117 /********************************Main******************************************/
khuang 1:a0d9eeedb771 118
khuang 0:c80666325948 119 int main()
khuang 0:c80666325948 120 {
cotigac 3:c2ab3a0de448 121 /* Register callbacks to application functions */
cotigac 3:c2ab3a0de448 122 kw40z_device.attach_buttonLeft(&ButtonLeft);
cotigac 3:c2ab3a0de448 123 kw40z_device.attach_buttonRight(&ButtonRight);
catchvibes95 5:52965830cd7c 124 kw40z_device.attach_buttonDown(&ButtonDown);
catchvibes95 5:52965830cd7c 125 kw40z_device.attach_buttonUp(&ButtonUp);
catchvibes95 5:52965830cd7c 126 // kw40z_device.attach_buttonSlide(&buttonSlide);
cotigac 3:c2ab3a0de448 127 kw40z_device.attach_passkey(&PassKey);
xihan94 4:20d4eebfa986 128 kw40z_device.attach_alert(&AlertReceived);
khuang 0:c80666325948 129
xihan94 4:20d4eebfa986 130 pc.printf("hello\n\r");
xihan94 4:20d4eebfa986 131
khuang 0:c80666325948 132 /* Turn on the backlight of the OLED Display */
khuang 0:c80666325948 133 oled.DimScreenON();
khuang 0:c80666325948 134
khuang 0:c80666325948 135 /* Fills the screen with solid black */
khuang 0:c80666325948 136 oled.FillScreen(COLOR_BLACK);
cotigac 3:c2ab3a0de448 137
cotigac 3:c2ab3a0de448 138 /* Get OLED Class Default Text Properties */
cotigac 3:c2ab3a0de448 139 oled_text_properties_t textProperties = {0};
cotigac 3:c2ab3a0de448 140 oled.GetTextProperties(&textProperties);
khuang 0:c80666325948 141
khuang 0:c80666325948 142 /* Change font color to Blue */
khuang 0:c80666325948 143 textProperties.fontColor = COLOR_BLUE;
khuang 0:c80666325948 144 oled.SetTextProperties(&textProperties);
khuang 0:c80666325948 145
khuang 0:c80666325948 146 /* Display Bluetooth Label at x=17,y=65 */
khuang 0:c80666325948 147 strcpy((char *) text,"BLUETOOTH");
khuang 0:c80666325948 148 oled.Label((uint8_t *)text,17,65);
khuang 0:c80666325948 149
khuang 0:c80666325948 150 /* Change font color to white */
khuang 0:c80666325948 151 textProperties.fontColor = COLOR_WHITE;
khuang 0:c80666325948 152 textProperties.alignParam = OLED_TEXT_ALIGN_CENTER;
khuang 0:c80666325948 153 oled.SetTextProperties(&textProperties);
khuang 0:c80666325948 154
khuang 1:a0d9eeedb771 155 /* Display Label at x=22,y=80 */
khuang 0:c80666325948 156 strcpy((char *) text,"Tap Below");
khuang 0:c80666325948 157 oled.Label((uint8_t *)text,22,80);
khuang 0:c80666325948 158
khuang 1:a0d9eeedb771 159 uint8_t prevLinkState = 0;
cotigac 3:c2ab3a0de448 160 uint8_t currLinkState = 0;
cotigac 3:c2ab3a0de448 161
khuang 1:a0d9eeedb771 162 txThread.start(txTask); /*Start transmitting Sensor Tag Data */
khuang 0:c80666325948 163
khuang 1:a0d9eeedb771 164 while (true)
khuang 1:a0d9eeedb771 165 {
xihan94 4:20d4eebfa986 166 // blueLed = !kw40z_device.GetAdvertisementMode(); /*Indicate BLE Advertisment Mode*/
khuang 1:a0d9eeedb771 167 Thread::wait(50);
khuang 1:a0d9eeedb771 168 }
khuang 1:a0d9eeedb771 169 }
khuang 1:a0d9eeedb771 170
khuang 1:a0d9eeedb771 171 /******************************End of Main*************************************/
khuang 1:a0d9eeedb771 172
khuang 1:a0d9eeedb771 173
khuang 1:a0d9eeedb771 174 /* txTask() transmits the sensor data */
khuang 1:a0d9eeedb771 175 void txTask(void){
khuang 1:a0d9eeedb771 176
khuang 1:a0d9eeedb771 177 while (true)
khuang 1:a0d9eeedb771 178 {
catchvibes95 5:52965830cd7c 179 if (kw40z_device.GetLinkState() == 0)
catchvibes95 5:52965830cd7c 180 {
catchvibes95 5:52965830cd7c 181 pc.printf("toggling advert mode\r\n");
catchvibes95 5:52965830cd7c 182 kw40z_device.ToggleAdvertisementMode();
catchvibes95 5:52965830cd7c 183 }
catchvibes95 5:52965830cd7c 184
cotigac 3:c2ab3a0de448 185 UpdateSensorData();
khuang 0:c80666325948 186
khuang 1:a0d9eeedb771 187 /*Notify Hexiwear App that it is running Sensor Tag mode*/
khuang 0:c80666325948 188 kw40z_device.SendSetApplicationMode(GUI_CURRENT_APP_SENSOR_TAG);
khuang 0:c80666325948 189
cotigac 3:c2ab3a0de448 190 kw40z_device.SendBatteryLevel(battery);
khuang 0:c80666325948 191
khuang 0:c80666325948 192 /*Send Ambient Light Level at 50% */
catchvibes95 5:52965830cd7c 193 //kw40z_device.SendAmbientLight(light);
khuang 0:c80666325948 194
khuang 0:c80666325948 195 /*Send Humidity at 90% */
catchvibes95 5:52965830cd7c 196 //kw40z_device.SendHumidity(humidity);
khuang 0:c80666325948 197
khuang 0:c80666325948 198 /*Send Temperature at 25 degrees Celsius */
catchvibes95 5:52965830cd7c 199 //kw40z_device.SendTemperature(temperature);
khuang 0:c80666325948 200
khuang 0:c80666325948 201 /*Send Pressure at 100kPA */
catchvibes95 5:52965830cd7c 202 //kw40z_device.SendPressure(pressure);
khuang 0:c80666325948 203
khuang 1:a0d9eeedb771 204 /*Send Mag,Accel,Gyro Data. */
catchvibes95 5:52965830cd7c 205 //kw40z_device.SendGyro(x,y,z);
catchvibes95 5:52965830cd7c 206 //kw40z_device.SendAccel(z,x,y);
catchvibes95 5:52965830cd7c 207 //kw40z_device.SendMag(y,z,x);
cotigac 3:c2ab3a0de448 208
khuang 1:a0d9eeedb771 209 Thread::wait(1000);
khuang 0:c80666325948 210 }
khuang 0:c80666325948 211 }
khuang 0:c80666325948 212
cotigac 3:c2ab3a0de448 213 void UpdateSensorData(void)
cotigac 3:c2ab3a0de448 214 {
catchvibes95 5:52965830cd7c 215 //battery -= 5;
catchvibes95 5:52965830cd7c 216 if(flag==1)
catchvibes95 5:52965830cd7c 217 {
catchvibes95 5:52965830cd7c 218 battery = 1;
catchvibes95 5:52965830cd7c 219 flag=0;
catchvibes95 5:52965830cd7c 220 }
catchvibes95 5:52965830cd7c 221 if(flag==2)
catchvibes95 5:52965830cd7c 222 {
catchvibes95 5:52965830cd7c 223 battery = 2;
catchvibes95 5:52965830cd7c 224 flag=0;
catchvibes95 5:52965830cd7c 225 }
catchvibes95 5:52965830cd7c 226 if(flag==3)
catchvibes95 5:52965830cd7c 227 {
catchvibes95 5:52965830cd7c 228 battery = 3;
catchvibes95 5:52965830cd7c 229 flag=0;
catchvibes95 5:52965830cd7c 230 }
catchvibes95 5:52965830cd7c 231 if(flag==4)
catchvibes95 5:52965830cd7c 232 {
catchvibes95 5:52965830cd7c 233 battery = 4;
catchvibes95 5:52965830cd7c 234 flag=5;
catchvibes95 5:52965830cd7c 235 }
cotigac 3:c2ab3a0de448 236
catchvibes95 5:52965830cd7c 237 //if(light > 100) light = 0;
catchvibes95 5:52965830cd7c 238
catchvibes95 5:52965830cd7c 239 // humidity += 500;
catchvibes95 5:52965830cd7c 240 //if(humidity > 8000) humidity = 2000;
cotigac 3:c2ab3a0de448 241
catchvibes95 5:52965830cd7c 242 //temperature -= 200;
catchvibes95 5:52965830cd7c 243 //if(temperature < 200) temperature = 4200;
cotigac 3:c2ab3a0de448 244
catchvibes95 5:52965830cd7c 245 //pressure += 300;
catchvibes95 5:52965830cd7c 246 //if(pressure > 10300) pressure = 7500;
catchvibes95 5:52965830cd7c 247
catchvibes95 5:52965830cd7c 248 //x += 1400;
catchvibes95 5:52965830cd7c 249 //y -= 2300;
catchvibes95 5:52965830cd7c 250 //z += 1700;
cotigac 3:c2ab3a0de448 251 }
cotigac 3:c2ab3a0de448 252
khuang 1:a0d9eeedb771 253 void StartHaptic(void) {
khuang 0:c80666325948 254 hapticTimer.start(50);
khuang 0:c80666325948 255 haptic = 1;
khuang 0:c80666325948 256 }
khuang 0:c80666325948 257
khuang 0:c80666325948 258 void StopHaptic(void const *n) {
khuang 0:c80666325948 259 haptic = 0;
khuang 0:c80666325948 260 hapticTimer.stop();
khuang 0:c80666325948 261 }
khuang 1:a0d9eeedb771 262