Hexiwear Code for Game Controls

Dependencies:   FXAS21002 FXOS8700 Hexi_KW40Z Hexi_OLED_SSD1351

Fork of Hexi_Final_Project by Destin Raymundo

Committer:
calvinha721
Date:
Fri Jun 15 16:01:27 2018 +0000
Revision:
7:bf37cb7bbffc
Parent:
6:8a9b0eb4835d
Hexi Final

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"
adrayv 5:b479668a7373 7 #include "FXAS21002.h"
adrayv 5:b479668a7373 8 #include "FXOS8700.h"
adrayv 5:b479668a7373 9 #include <cmath>
khuang 0:c80666325948 10
khuang 0:c80666325948 11 #define LED_ON 0
khuang 0:c80666325948 12 #define LED_OFF 1
cotigac 3:c2ab3a0de448 13
cotigac 3:c2ab3a0de448 14 void UpdateSensorData(void);
adrayv 5:b479668a7373 15 void GetSensorData(void);
khuang 0:c80666325948 16 void StartHaptic(void);
khuang 0:c80666325948 17 void StopHaptic(void const *n);
khuang 1:a0d9eeedb771 18 void txTask(void);
adrayv 5:b479668a7373 19 FXOS8700 accel(PTC11, PTC10);
khuang 0:c80666325948 20
xihan94 4:20d4eebfa986 21 Serial pc(USBTX, USBRX);
xihan94 4:20d4eebfa986 22
khuang 0:c80666325948 23 DigitalOut redLed(LED1,1);
khuang 0:c80666325948 24 DigitalOut greenLed(LED2,1);
khuang 0:c80666325948 25 DigitalOut blueLed(LED3,1);
khuang 0:c80666325948 26 DigitalOut haptic(PTB9);
khuang 0:c80666325948 27
khuang 0:c80666325948 28 /* Define timer for haptic feedback */
khuang 0:c80666325948 29 RtosTimer hapticTimer(StopHaptic, osTimerOnce);
khuang 0:c80666325948 30
khuang 0:c80666325948 31 /* Instantiate the Hexi KW40Z Driver (UART TX, UART RX) */
khuang 0:c80666325948 32 KW40Z kw40z_device(PTE24, PTE25);
khuang 0:c80666325948 33
khuang 0:c80666325948 34 /* Instantiate the SSD1351 OLED Driver */
khuang 0:c80666325948 35 SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); /* (MOSI,SCLK,POWER,CS,RST,DC) */
khuang 0:c80666325948 36
khuang 1:a0d9eeedb771 37 /*Create a Thread to handle sending BLE Sensor Data */
khuang 1:a0d9eeedb771 38 Thread txThread;
khuang 0:c80666325948 39
khuang 1:a0d9eeedb771 40 /* Text Buffer */
khuang 1:a0d9eeedb771 41 char text[20];
khuang 1:a0d9eeedb771 42
cotigac 3:c2ab3a0de448 43 uint8_t battery = 100;
adrayv 5:b479668a7373 44 int16_t x = 0;
adrayv 5:b479668a7373 45 int16_t y = 0;
adrayv 5:b479668a7373 46 int16_t z = 0;
adrayv 5:b479668a7373 47
adrayv 5:b479668a7373 48 uint8_t abs_x = 0;
adrayv 5:b479668a7373 49 uint8_t abs_y = 0;
adrayv 5:b479668a7373 50 uint8_t abs_z = 0;
adrayv 5:b479668a7373 51 float accel_data[3];
cotigac 3:c2ab3a0de448 52
khuang 1:a0d9eeedb771 53 /****************************Call Back Functions*******************************/
khuang 0:c80666325948 54 void ButtonRight(void)
khuang 0:c80666325948 55 {
khuang 0:c80666325948 56 StartHaptic();
calvinha721 7:bf37cb7bbffc 57 //kw40z_device.ToggleAdvertisementMode();
calvinha721 7:bf37cb7bbffc 58 kw40z_device.SendBatteryLevel(0);
khuang 0:c80666325948 59 }
khuang 0:c80666325948 60
khuang 0:c80666325948 61 void ButtonLeft(void)
khuang 0:c80666325948 62 {
khuang 0:c80666325948 63 StartHaptic();
calvinha721 7:bf37cb7bbffc 64 //kw40z_device.ToggleAdvertisementMode();
calvinha721 7:bf37cb7bbffc 65 kw40z_device.SendBatteryLevel(1);
calvinha721 7:bf37cb7bbffc 66 }
calvinha721 7:bf37cb7bbffc 67 void ButtonUp(void)
calvinha721 7:bf37cb7bbffc 68 {
calvinha721 7:bf37cb7bbffc 69 StartHaptic();
calvinha721 7:bf37cb7bbffc 70 //kw40z_device.ToggleAdvertisementMode();
calvinha721 7:bf37cb7bbffc 71 kw40z_device.SendBatteryLevel(2);
calvinha721 7:bf37cb7bbffc 72 }
calvinha721 7:bf37cb7bbffc 73
calvinha721 7:bf37cb7bbffc 74 void ButtonDown(void)
calvinha721 7:bf37cb7bbffc 75 {
calvinha721 7:bf37cb7bbffc 76 StartHaptic();
calvinha721 7:bf37cb7bbffc 77 //kw40z_device.ToggleAdvertisementMode();
calvinha721 7:bf37cb7bbffc 78 kw40z_device.SendBatteryLevel(3);
khuang 0:c80666325948 79 }
khuang 0:c80666325948 80
khuang 0:c80666325948 81 void PassKey(void)
khuang 0:c80666325948 82 {
khuang 0:c80666325948 83 StartHaptic();
khuang 0:c80666325948 84 strcpy((char *) text,"PAIR CODE");
khuang 1:a0d9eeedb771 85 oled.TextBox((uint8_t *)text,0,25,95,18);
khuang 0:c80666325948 86
khuang 0:c80666325948 87 /* Display Bond Pass Key in a 95px by 18px textbox at x=0,y=40 */
khuang 0:c80666325948 88 sprintf(text,"%d", kw40z_device.GetPassKey());
khuang 0:c80666325948 89 oled.TextBox((uint8_t *)text,0,40,95,18);
khuang 0:c80666325948 90 }
khuang 1:a0d9eeedb771 91
xihan94 4:20d4eebfa986 92 // Key modification: use the alert functionality enabled by the host-ble interface
xihan94 4:20d4eebfa986 93 // to define our own command.
xihan94 4:20d4eebfa986 94 void AlertReceived(uint8_t *data, uint8_t length)
xihan94 4:20d4eebfa986 95 {
xihan94 4:20d4eebfa986 96 StartHaptic();
xihan94 4:20d4eebfa986 97 data[19] = 0;
xihan94 4:20d4eebfa986 98 pc.printf("%s\n\r", data);
xihan94 4:20d4eebfa986 99
xihan94 4:20d4eebfa986 100 // data (our command) must 20 bytes long.
xihan94 4:20d4eebfa986 101 // CMD for turning on: 'ledonledonledonledon'
xihan94 4:20d4eebfa986 102 if (data[4] == 'n') {
xihan94 4:20d4eebfa986 103 greenLed = LED_ON;
xihan94 4:20d4eebfa986 104 redLed = LED_ON;
xihan94 4:20d4eebfa986 105 blueLed = LED_ON;
xihan94 4:20d4eebfa986 106 pc.printf("on\n\r", data);
xihan94 4:20d4eebfa986 107
xihan94 4:20d4eebfa986 108 // CMD for turning off: 'ledoffledoffledoffled'
xihan94 4:20d4eebfa986 109 } else if (data[4] == 'f') {
xihan94 4:20d4eebfa986 110 greenLed = LED_OFF;
xihan94 4:20d4eebfa986 111 redLed = LED_OFF;
xihan94 4:20d4eebfa986 112 blueLed = LED_OFF;
xihan94 4:20d4eebfa986 113 pc.printf("off\n\r", data);
xihan94 4:20d4eebfa986 114 }
xihan94 4:20d4eebfa986 115 }
khuang 1:a0d9eeedb771 116 /***********************End of Call Back Functions*****************************/
khuang 1:a0d9eeedb771 117
khuang 1:a0d9eeedb771 118 /********************************Main******************************************/
khuang 1:a0d9eeedb771 119
khuang 0:c80666325948 120 int main()
khuang 0:c80666325948 121 {
cotigac 3:c2ab3a0de448 122 /* Register callbacks to application functions */
cotigac 3:c2ab3a0de448 123 kw40z_device.attach_buttonLeft(&ButtonLeft);
cotigac 3:c2ab3a0de448 124 kw40z_device.attach_buttonRight(&ButtonRight);
calvinha721 7:bf37cb7bbffc 125 kw40z_device.attach_buttonUp(&ButtonUp);
calvinha721 7:bf37cb7bbffc 126 kw40z_device.attach_buttonDown(&ButtonDown);
cotigac 3:c2ab3a0de448 127 kw40z_device.attach_passkey(&PassKey);
xihan94 4:20d4eebfa986 128 kw40z_device.attach_alert(&AlertReceived);
adrayv 5:b479668a7373 129
adrayv 5:b479668a7373 130 accel.accel_config();
khuang 0:c80666325948 131
xihan94 4:20d4eebfa986 132 pc.printf("hello\n\r");
xihan94 4:20d4eebfa986 133
khuang 0:c80666325948 134 /* Turn on the backlight of the OLED Display */
khuang 0:c80666325948 135 oled.DimScreenON();
khuang 0:c80666325948 136
khuang 0:c80666325948 137 /* Fills the screen with solid black */
khuang 0:c80666325948 138 oled.FillScreen(COLOR_BLACK);
cotigac 3:c2ab3a0de448 139
cotigac 3:c2ab3a0de448 140 /* Get OLED Class Default Text Properties */
cotigac 3:c2ab3a0de448 141 oled_text_properties_t textProperties = {0};
cotigac 3:c2ab3a0de448 142 oled.GetTextProperties(&textProperties);
khuang 0:c80666325948 143
khuang 0:c80666325948 144 /* Change font color to Blue */
khuang 0:c80666325948 145 textProperties.fontColor = COLOR_BLUE;
khuang 0:c80666325948 146 oled.SetTextProperties(&textProperties);
khuang 0:c80666325948 147
khuang 0:c80666325948 148 /* Display Bluetooth Label at x=17,y=65 */
khuang 0:c80666325948 149 strcpy((char *) text,"BLUETOOTH");
khuang 0:c80666325948 150 oled.Label((uint8_t *)text,17,65);
khuang 0:c80666325948 151
khuang 0:c80666325948 152 /* Change font color to white */
khuang 0:c80666325948 153 textProperties.fontColor = COLOR_WHITE;
khuang 0:c80666325948 154 textProperties.alignParam = OLED_TEXT_ALIGN_CENTER;
khuang 0:c80666325948 155 oled.SetTextProperties(&textProperties);
khuang 0:c80666325948 156
khuang 1:a0d9eeedb771 157 /* Display Label at x=22,y=80 */
khuang 0:c80666325948 158 strcpy((char *) text,"Tap Below");
khuang 0:c80666325948 159 oled.Label((uint8_t *)text,22,80);
khuang 0:c80666325948 160
khuang 1:a0d9eeedb771 161 uint8_t prevLinkState = 0;
cotigac 3:c2ab3a0de448 162 uint8_t currLinkState = 0;
cotigac 3:c2ab3a0de448 163
khuang 1:a0d9eeedb771 164 txThread.start(txTask); /*Start transmitting Sensor Tag Data */
khuang 0:c80666325948 165
khuang 1:a0d9eeedb771 166 while (true)
khuang 1:a0d9eeedb771 167 {
xihan94 4:20d4eebfa986 168 // blueLed = !kw40z_device.GetAdvertisementMode(); /*Indicate BLE Advertisment Mode*/
khuang 1:a0d9eeedb771 169 Thread::wait(50);
khuang 1:a0d9eeedb771 170 }
khuang 1:a0d9eeedb771 171 }
khuang 1:a0d9eeedb771 172
khuang 1:a0d9eeedb771 173 /******************************End of Main*************************************/
khuang 1:a0d9eeedb771 174
khuang 1:a0d9eeedb771 175 /* txTask() transmits the sensor data */
khuang 1:a0d9eeedb771 176 void txTask(void){
khuang 1:a0d9eeedb771 177
khuang 1:a0d9eeedb771 178 while (true)
khuang 1:a0d9eeedb771 179 {
adrayv 5:b479668a7373 180 GetSensorData();
khuang 0:c80666325948 181
khuang 1:a0d9eeedb771 182 /*Notify Hexiwear App that it is running Sensor Tag mode*/
khuang 0:c80666325948 183 kw40z_device.SendSetApplicationMode(GUI_CURRENT_APP_SENSOR_TAG);
khuang 0:c80666325948 184
khuang 1:a0d9eeedb771 185 /*The following is sending dummy data over BLE. Replace with real data*/
khuang 1:a0d9eeedb771 186
khuang 0:c80666325948 187 /*Send Battery Level for 20% */
adrayv 6:8a9b0eb4835d 188 // SendAccel does not work and is not stable over bluetooth
adrayv 6:8a9b0eb4835d 189 // So we will use SendBattery
adrayv 6:8a9b0eb4835d 190 // But since SendBattery cannot send multiple values at a time
adrayv 6:8a9b0eb4835d 191 // We will have to advertise to Pi what value it should expect next
calvinha721 7:bf37cb7bbffc 192 if(abs_x >50 && abs_z< 50){
calvinha721 7:bf37cb7bbffc 193 StartHaptic();
calvinha721 7:bf37cb7bbffc 194 kw40z_device.SendBatteryLevel(4);
calvinha721 7:bf37cb7bbffc 195 /* //Code for sending raw orientation data below
adrayv 5:b479668a7373 196 kw40z_device.SendBatteryLevel('x');
adrayv 5:b479668a7373 197 kw40z_device.SendBatteryLevel(abs_x);
adrayv 5:b479668a7373 198 kw40z_device.SendBatteryLevel('y');
adrayv 5:b479668a7373 199 kw40z_device.SendBatteryLevel(abs_y);
adrayv 5:b479668a7373 200 kw40z_device.SendBatteryLevel('z');
adrayv 5:b479668a7373 201 kw40z_device.SendBatteryLevel(abs_z);
calvinha721 7:bf37cb7bbffc 202 */
calvinha721 7:bf37cb7bbffc 203 }
khuang 1:a0d9eeedb771 204 Thread::wait(1000);
khuang 0:c80666325948 205 }
khuang 0:c80666325948 206 }
khuang 0:c80666325948 207
adrayv 5:b479668a7373 208 void GetSensorData(void) {
adrayv 5:b479668a7373 209 accel.acquire_accel_data_g(accel_data);
adrayv 6:8a9b0eb4835d 210
adrayv 6:8a9b0eb4835d 211 // get x,y,z data and amplify them by 100
adrayv 6:8a9b0eb4835d 212 // convert x,y,z data to positive numbers since SendBattery only supports unsigned ints
adrayv 5:b479668a7373 213 x = (int16_t)(accel_data[0] * 100);
adrayv 5:b479668a7373 214 y = (int16_t)(accel_data[1] * 100);
adrayv 5:b479668a7373 215 z = (int16_t)(accel_data[2] * 100);
adrayv 5:b479668a7373 216 abs_x = abs(x);
adrayv 5:b479668a7373 217 abs_y = abs(y);
adrayv 5:b479668a7373 218 abs_z = abs(z);
adrayv 5:b479668a7373 219 printf("ACCEL (x100)(ABS): X:%d Y:%d Z:%d\n",abs_x,abs_y,abs_z);
cotigac 3:c2ab3a0de448 220 }
cotigac 3:c2ab3a0de448 221
khuang 1:a0d9eeedb771 222 void StartHaptic(void) {
khuang 0:c80666325948 223 hapticTimer.start(50);
khuang 0:c80666325948 224 haptic = 1;
khuang 0:c80666325948 225 }
khuang 0:c80666325948 226
khuang 0:c80666325948 227 void StopHaptic(void const *n) {
khuang 0:c80666325948 228 haptic = 0;
khuang 0:c80666325948 229 hapticTimer.stop();
khuang 0:c80666325948 230 }
khuang 1:a0d9eeedb771 231