Hexiwear Code for Game Controls

Dependencies:   FXAS21002 FXOS8700 Hexi_KW40Z Hexi_OLED_SSD1351

Fork of Hexi_Final_Project by Destin Raymundo

Committer:
xihan94
Date:
Fri May 04 08:56:11 2018 +0000
Revision:
4:20d4eebfa986
Parent:
3:c2ab3a0de448
Child:
5:b479668a7373
Test program for ECE BLE project;

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
khuang 1:a0d9eeedb771 47 /****************************Call Back Functions*******************************/
khuang 0:c80666325948 48 void ButtonRight(void)
khuang 0:c80666325948 49 {
khuang 0:c80666325948 50 StartHaptic();
khuang 0:c80666325948 51 kw40z_device.ToggleAdvertisementMode();
khuang 0:c80666325948 52 }
khuang 0:c80666325948 53
khuang 0:c80666325948 54 void ButtonLeft(void)
khuang 0:c80666325948 55 {
khuang 0:c80666325948 56 StartHaptic();
khuang 0:c80666325948 57 kw40z_device.ToggleAdvertisementMode();
khuang 0:c80666325948 58 }
khuang 0:c80666325948 59
khuang 0:c80666325948 60 void PassKey(void)
khuang 0:c80666325948 61 {
khuang 0:c80666325948 62 StartHaptic();
khuang 0:c80666325948 63 strcpy((char *) text,"PAIR CODE");
khuang 1:a0d9eeedb771 64 oled.TextBox((uint8_t *)text,0,25,95,18);
khuang 0:c80666325948 65
khuang 0:c80666325948 66 /* Display Bond Pass Key in a 95px by 18px textbox at x=0,y=40 */
khuang 0:c80666325948 67 sprintf(text,"%d", kw40z_device.GetPassKey());
khuang 0:c80666325948 68 oled.TextBox((uint8_t *)text,0,40,95,18);
khuang 0:c80666325948 69 }
khuang 1:a0d9eeedb771 70
xihan94 4:20d4eebfa986 71 // Key modification: use the alert functionality enabled by the host-ble interface
xihan94 4:20d4eebfa986 72 // to define our own command.
xihan94 4:20d4eebfa986 73 void AlertReceived(uint8_t *data, uint8_t length)
xihan94 4:20d4eebfa986 74 {
xihan94 4:20d4eebfa986 75 StartHaptic();
xihan94 4:20d4eebfa986 76 data[19] = 0;
xihan94 4:20d4eebfa986 77 pc.printf("%s\n\r", data);
xihan94 4:20d4eebfa986 78
xihan94 4:20d4eebfa986 79 // data (our command) must 20 bytes long.
xihan94 4:20d4eebfa986 80 // CMD for turning on: 'ledonledonledonledon'
xihan94 4:20d4eebfa986 81 if (data[4] == 'n') {
xihan94 4:20d4eebfa986 82 greenLed = LED_ON;
xihan94 4:20d4eebfa986 83 redLed = LED_ON;
xihan94 4:20d4eebfa986 84 blueLed = LED_ON;
xihan94 4:20d4eebfa986 85 pc.printf("on\n\r", data);
xihan94 4:20d4eebfa986 86
xihan94 4:20d4eebfa986 87 // CMD for turning off: 'ledoffledoffledoffled'
xihan94 4:20d4eebfa986 88 } else if (data[4] == 'f') {
xihan94 4:20d4eebfa986 89 greenLed = LED_OFF;
xihan94 4:20d4eebfa986 90 redLed = LED_OFF;
xihan94 4:20d4eebfa986 91 blueLed = LED_OFF;
xihan94 4:20d4eebfa986 92 pc.printf("off\n\r", data);
xihan94 4:20d4eebfa986 93 }
xihan94 4:20d4eebfa986 94 }
khuang 1:a0d9eeedb771 95 /***********************End of Call Back Functions*****************************/
khuang 1:a0d9eeedb771 96
khuang 1:a0d9eeedb771 97 /********************************Main******************************************/
khuang 1:a0d9eeedb771 98
khuang 0:c80666325948 99 int main()
khuang 0:c80666325948 100 {
cotigac 3:c2ab3a0de448 101 /* Register callbacks to application functions */
cotigac 3:c2ab3a0de448 102 kw40z_device.attach_buttonLeft(&ButtonLeft);
cotigac 3:c2ab3a0de448 103 kw40z_device.attach_buttonRight(&ButtonRight);
cotigac 3:c2ab3a0de448 104 kw40z_device.attach_passkey(&PassKey);
xihan94 4:20d4eebfa986 105 kw40z_device.attach_alert(&AlertReceived);
khuang 0:c80666325948 106
xihan94 4:20d4eebfa986 107 pc.printf("hello\n\r");
xihan94 4:20d4eebfa986 108
khuang 0:c80666325948 109 /* Turn on the backlight of the OLED Display */
khuang 0:c80666325948 110 oled.DimScreenON();
khuang 0:c80666325948 111
khuang 0:c80666325948 112 /* Fills the screen with solid black */
khuang 0:c80666325948 113 oled.FillScreen(COLOR_BLACK);
cotigac 3:c2ab3a0de448 114
cotigac 3:c2ab3a0de448 115 /* Get OLED Class Default Text Properties */
cotigac 3:c2ab3a0de448 116 oled_text_properties_t textProperties = {0};
cotigac 3:c2ab3a0de448 117 oled.GetTextProperties(&textProperties);
khuang 0:c80666325948 118
khuang 0:c80666325948 119 /* Change font color to Blue */
khuang 0:c80666325948 120 textProperties.fontColor = COLOR_BLUE;
khuang 0:c80666325948 121 oled.SetTextProperties(&textProperties);
khuang 0:c80666325948 122
khuang 0:c80666325948 123 /* Display Bluetooth Label at x=17,y=65 */
khuang 0:c80666325948 124 strcpy((char *) text,"BLUETOOTH");
khuang 0:c80666325948 125 oled.Label((uint8_t *)text,17,65);
khuang 0:c80666325948 126
khuang 0:c80666325948 127 /* Change font color to white */
khuang 0:c80666325948 128 textProperties.fontColor = COLOR_WHITE;
khuang 0:c80666325948 129 textProperties.alignParam = OLED_TEXT_ALIGN_CENTER;
khuang 0:c80666325948 130 oled.SetTextProperties(&textProperties);
khuang 0:c80666325948 131
khuang 1:a0d9eeedb771 132 /* Display Label at x=22,y=80 */
khuang 0:c80666325948 133 strcpy((char *) text,"Tap Below");
khuang 0:c80666325948 134 oled.Label((uint8_t *)text,22,80);
khuang 0:c80666325948 135
khuang 1:a0d9eeedb771 136 uint8_t prevLinkState = 0;
cotigac 3:c2ab3a0de448 137 uint8_t currLinkState = 0;
cotigac 3:c2ab3a0de448 138
khuang 1:a0d9eeedb771 139 txThread.start(txTask); /*Start transmitting Sensor Tag Data */
khuang 0:c80666325948 140
khuang 1:a0d9eeedb771 141 while (true)
khuang 1:a0d9eeedb771 142 {
xihan94 4:20d4eebfa986 143 // blueLed = !kw40z_device.GetAdvertisementMode(); /*Indicate BLE Advertisment Mode*/
khuang 1:a0d9eeedb771 144 Thread::wait(50);
khuang 1:a0d9eeedb771 145 }
khuang 1:a0d9eeedb771 146 }
khuang 1:a0d9eeedb771 147
khuang 1:a0d9eeedb771 148 /******************************End of Main*************************************/
khuang 1:a0d9eeedb771 149
khuang 1:a0d9eeedb771 150
khuang 1:a0d9eeedb771 151 /* txTask() transmits the sensor data */
khuang 1:a0d9eeedb771 152 void txTask(void){
khuang 1:a0d9eeedb771 153
khuang 1:a0d9eeedb771 154 while (true)
khuang 1:a0d9eeedb771 155 {
cotigac 3:c2ab3a0de448 156 UpdateSensorData();
khuang 0:c80666325948 157
khuang 1:a0d9eeedb771 158 /*Notify Hexiwear App that it is running Sensor Tag mode*/
khuang 0:c80666325948 159 kw40z_device.SendSetApplicationMode(GUI_CURRENT_APP_SENSOR_TAG);
khuang 0:c80666325948 160
khuang 1:a0d9eeedb771 161 /*The following is sending dummy data over BLE. Replace with real data*/
khuang 1:a0d9eeedb771 162
khuang 0:c80666325948 163 /*Send Battery Level for 20% */
cotigac 3:c2ab3a0de448 164 kw40z_device.SendBatteryLevel(battery);
khuang 0:c80666325948 165
khuang 0:c80666325948 166 /*Send Ambient Light Level at 50% */
cotigac 3:c2ab3a0de448 167 kw40z_device.SendAmbientLight(light);
khuang 0:c80666325948 168
khuang 0:c80666325948 169 /*Send Humidity at 90% */
cotigac 3:c2ab3a0de448 170 kw40z_device.SendHumidity(humidity);
khuang 0:c80666325948 171
khuang 0:c80666325948 172 /*Send Temperature at 25 degrees Celsius */
cotigac 3:c2ab3a0de448 173 kw40z_device.SendTemperature(temperature);
khuang 0:c80666325948 174
khuang 0:c80666325948 175 /*Send Pressure at 100kPA */
cotigac 3:c2ab3a0de448 176 kw40z_device.SendPressure(pressure);
khuang 0:c80666325948 177
khuang 1:a0d9eeedb771 178 /*Send Mag,Accel,Gyro Data. */
cotigac 3:c2ab3a0de448 179 kw40z_device.SendGyro(x,y,z);
cotigac 3:c2ab3a0de448 180 kw40z_device.SendAccel(z,x,y);
cotigac 3:c2ab3a0de448 181 kw40z_device.SendMag(y,z,x);
cotigac 3:c2ab3a0de448 182
khuang 1:a0d9eeedb771 183 Thread::wait(1000);
khuang 0:c80666325948 184 }
khuang 0:c80666325948 185 }
khuang 0:c80666325948 186
cotigac 3:c2ab3a0de448 187 void UpdateSensorData(void)
cotigac 3:c2ab3a0de448 188 {
cotigac 3:c2ab3a0de448 189 battery -= 5;
cotigac 3:c2ab3a0de448 190 if(battery < 5) battery = 100;
cotigac 3:c2ab3a0de448 191
cotigac 3:c2ab3a0de448 192 light += 20;
cotigac 3:c2ab3a0de448 193 if(light > 100) light = 0;
cotigac 3:c2ab3a0de448 194
cotigac 3:c2ab3a0de448 195 humidity += 500;
cotigac 3:c2ab3a0de448 196 if(humidity > 8000) humidity = 2000;
cotigac 3:c2ab3a0de448 197
cotigac 3:c2ab3a0de448 198 temperature -= 200;
cotigac 3:c2ab3a0de448 199 if(temperature < 200) temperature = 4200;
cotigac 3:c2ab3a0de448 200
cotigac 3:c2ab3a0de448 201 pressure += 300;
cotigac 3:c2ab3a0de448 202 if(pressure > 10300) pressure = 7500;
cotigac 3:c2ab3a0de448 203
cotigac 3:c2ab3a0de448 204 x += 1400;
cotigac 3:c2ab3a0de448 205 y -= 2300;
cotigac 3:c2ab3a0de448 206 z += 1700;
cotigac 3:c2ab3a0de448 207 }
cotigac 3:c2ab3a0de448 208
khuang 1:a0d9eeedb771 209 void StartHaptic(void) {
khuang 0:c80666325948 210 hapticTimer.start(50);
khuang 0:c80666325948 211 haptic = 1;
khuang 0:c80666325948 212 }
khuang 0:c80666325948 213
khuang 0:c80666325948 214 void StopHaptic(void const *n) {
khuang 0:c80666325948 215 haptic = 0;
khuang 0:c80666325948 216 hapticTimer.stop();
khuang 0:c80666325948 217 }
khuang 1:a0d9eeedb771 218