POTATO

Dependencies:   Hexi_KW40Z Hexi_OLED_SSD1351

Committer:
natasha41575
Date:
Mon May 06 05:09:55 2019 +0000
Revision:
8:de0336411ac1
Parent:
7:3afe21b24e58
Child:
9:fe52fbcc6187
potato;

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