Code to be run for the project Group Fitness

Dependencies:   FXOS8700 Hexi_KW40Z Hexi_OLED_SSD1351 MAX30101

Fork of final_project_ee119 by Wenfei Lu

Committer:
trhackett
Date:
Fri Jun 15 05:59:16 2018 +0000
Revision:
7:e5fcb30509ea
Parent:
6:328ef7a29083
Child:
8:f5a21cfd3833
done

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xihan94 0:33686dd26bf9 1 #include "mbed.h"
xihan94 0:33686dd26bf9 2 #include "mbed_events.h"
catchvibes95 4:eb89733b8642 3 #include "Hexi_KW40Z.h"
catchvibes95 4:eb89733b8642 4 #include "Hexi_OLED_SSD1351.h"
catchvibes95 4:eb89733b8642 5 #include "OLED_types.h"
catchvibes95 4:eb89733b8642 6 #include "OpenSans_Font.h"
catchvibes95 4:eb89733b8642 7 #include "string.h"
catchvibes95 4:eb89733b8642 8 #include "FXOS8700.h"
catchvibes95 4:eb89733b8642 9
angelasnail 6:328ef7a29083 10 void StartHaptic(void);
angelasnail 6:328ef7a29083 11 void StopHaptic(void const *n);
angelasnail 6:328ef7a29083 12 float Filter(int s);
angelasnail 6:328ef7a29083 13 void AlertReceived(uint8_t *data, uint8_t length);
trhackett 7:e5fcb30509ea 14 void clearScreen();
angelasnail 6:328ef7a29083 15
trhackett 7:e5fcb30509ea 16 void displayString();
catchvibes95 4:eb89733b8642 17 void UpdateSensorData(void);
trhackett 7:e5fcb30509ea 18 void BTTask(void);
trhackett 7:e5fcb30509ea 19 void dataTask(void);
trhackett 7:e5fcb30509ea 20
trhackett 7:e5fcb30509ea 21 void ButtonLeft();
trhackett 7:e5fcb30509ea 22 void ButtonRight();
trhackett 7:e5fcb30509ea 23 void ButtonDown();
trhackett 7:e5fcb30509ea 24 void ButtonUp();
trhackett 7:e5fcb30509ea 25 void ButtonLeft(void);
catchvibes95 4:eb89733b8642 26
catchvibes95 4:eb89733b8642 27 FXOS8700 accel(PTC11, PTC10);
catchvibes95 4:eb89733b8642 28
catchvibes95 4:eb89733b8642 29 /* Instantiate the Hexi KW40Z Driver (UART TX, UART RX) */
catchvibes95 4:eb89733b8642 30 KW40Z kw40z_device(PTE24, PTE25);
catchvibes95 4:eb89733b8642 31
catchvibes95 4:eb89733b8642 32 /* Instantiate the SSD1351 OLED Driver */
trhackett 7:e5fcb30509ea 33 SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15);
trhackett 7:e5fcb30509ea 34
trhackett 7:e5fcb30509ea 35 RtosTimer hapticTimer(StopHaptic, osTimerOnce);
trhackett 7:e5fcb30509ea 36 DigitalOut haptic(PTB9);
catchvibes95 4:eb89733b8642 37
trhackett 7:e5fcb30509ea 38 /* Create a Thread to handle sending BLE Sensor Data */
trhackett 7:e5fcb30509ea 39 Thread bluetoothThread;
trhackett 7:e5fcb30509ea 40 Thread dataThread;
catchvibes95 4:eb89733b8642 41
trhackett 7:e5fcb30509ea 42 Thread displayThread;
trhackett 7:e5fcb30509ea 43 EventQueue displayEventQueue;
xihan94 0:33686dd26bf9 44
catchvibes95 4:eb89733b8642 45 char text[20];
catchvibes95 4:eb89733b8642 46
catchvibes95 4:eb89733b8642 47 // Variables
catchvibes95 4:eb89733b8642 48 float accel_data[3]; // Storage for the data from the sensor
catchvibes95 4:eb89733b8642 49 float accel_rms=0.0; // RMS value from the sensor
catchvibes95 4:eb89733b8642 50 float ax, ay, az; // Integer value from the sensor to be displayed
catchvibes95 4:eb89733b8642 51 const uint8_t *image1; // Pointer for the image1 to be displayed
catchvibes95 4:eb89733b8642 52 char text1[20]; // Text Buffer for dynamic value displayed
catchvibes95 4:eb89733b8642 53 char text2[20]; // Text Buffer for dynamic value displayed
catchvibes95 4:eb89733b8642 54 char text3[20]; // Text Buffer for dynamic value displayed
catchvibes95 4:eb89733b8642 55 float dot;
catchvibes95 4:eb89733b8642 56 float old_acc=0;
catchvibes95 4:eb89733b8642 57 float new_acc=0;
catchvibes95 4:eb89733b8642 58 float old_accx, old_accy, old_accz, old_dot=0.0;
catchvibes95 4:eb89733b8642 59 uint8_t StepNum = 0, StepNumber = 0;
catchvibes95 4:eb89733b8642 60
catchvibes95 4:eb89733b8642 61 float filter_buf[75];
catchvibes95 4:eb89733b8642 62
trhackett 7:e5fcb30509ea 63 uint8_t result[1]={0};
angelasnail 6:328ef7a29083 64
catchvibes95 4:eb89733b8642 65
trhackett 7:e5fcb30509ea 66 // variable to assist with viewing the other users' data
trhackett 7:e5fcb30509ea 67 char user[2];
trhackett 7:e5fcb30509ea 68 char mean[4];
trhackett 7:e5fcb30509ea 69 char max[4];
trhackett 7:e5fcb30509ea 70 char min[4];
trhackett 7:e5fcb30509ea 71 char steps[6];
trhackett 7:e5fcb30509ea 72 // boolean flag that says whether or not we've processed new data from pi
trhackett 7:e5fcb30509ea 73 // default to true because not data from pi until we ask for it
trhackett 7:e5fcb30509ea 74 bool processedReceivedData = true;
catchvibes95 4:eb89733b8642 75
trhackett 7:e5fcb30509ea 76 int flag = 0;
trhackett 7:e5fcb30509ea 77 int userChosen = flag;
catchvibes95 4:eb89733b8642 78
trhackett 5:a2f68bbb5400 79 // main() runs in its own thread in the OS
trhackett 5:a2f68bbb5400 80 int main() {
trhackett 7:e5fcb30509ea 81 kw40z_device.attach_buttonLeft(&ButtonLeft);
trhackett 7:e5fcb30509ea 82 kw40z_device.attach_buttonRight(&ButtonRight);
trhackett 7:e5fcb30509ea 83 kw40z_device.attach_buttonDown(&ButtonDown);
trhackett 7:e5fcb30509ea 84 kw40z_device.attach_buttonUp(&ButtonUp);
trhackett 7:e5fcb30509ea 85 kw40z_device.attach_alert(&AlertReceived);
trhackett 7:e5fcb30509ea 86
trhackett 5:a2f68bbb5400 87 accel.accel_config();
catchvibes95 4:eb89733b8642 88
trhackett 7:e5fcb30509ea 89 // open up the display queue so that at any point in the program,
trhackett 7:e5fcb30509ea 90 // we can put things inside of it and they'll be executed eventually
trhackett 7:e5fcb30509ea 91 displayThread.start(callback(&displayEventQueue, &EventQueue::dispatch_forever));
trhackett 7:e5fcb30509ea 92 displayEventQueue.call(&clearScreen);
catchvibes95 4:eb89733b8642 93
trhackett 7:e5fcb30509ea 94 dataThread.start(BTTask);
trhackett 7:e5fcb30509ea 95 bluetoothThread.start(dataTask);
trhackett 7:e5fcb30509ea 96
trhackett 7:e5fcb30509ea 97 wait(osWaitForever);
catchvibes95 4:eb89733b8642 98 }
xihan94 0:33686dd26bf9 99
trhackett 7:e5fcb30509ea 100 void BTTask(void){
catchvibes95 4:eb89733b8642 101
catchvibes95 4:eb89733b8642 102 while (true)
catchvibes95 4:eb89733b8642 103 {
angelasnail 6:328ef7a29083 104 if (kw40z_device.GetLinkState() == 0) {
angelasnail 6:328ef7a29083 105 kw40z_device.ToggleAdvertisementMode();
angelasnail 6:328ef7a29083 106 }
angelasnail 6:328ef7a29083 107
catchvibes95 4:eb89733b8642 108 /*Notify Hexiwear App that it is running Sensor Tag mode*/
catchvibes95 4:eb89733b8642 109 kw40z_device.SendSetApplicationMode(GUI_CURRENT_APP_SENSOR_TAG);
angelasnail 6:328ef7a29083 110
angelasnail 6:328ef7a29083 111 kw40z_device.SendAlert(result, 2);
catchvibes95 4:eb89733b8642 112 kw40z_device.SendBatteryLevel(StepNumber);
catchvibes95 4:eb89733b8642 113
trhackett 7:e5fcb30509ea 114 Thread::wait(1000);
catchvibes95 4:eb89733b8642 115 }
catchvibes95 4:eb89733b8642 116 }
catchvibes95 4:eb89733b8642 117
trhackett 7:e5fcb30509ea 118 void dataTask(void) {
trhackett 7:e5fcb30509ea 119 while (true) {
trhackett 7:e5fcb30509ea 120 if(flag == 1) {
trhackett 7:e5fcb30509ea 121 result[1] = 1;
trhackett 7:e5fcb30509ea 122 flag = 0;
trhackett 7:e5fcb30509ea 123 userChosen = 1;
trhackett 7:e5fcb30509ea 124 }
trhackett 7:e5fcb30509ea 125
trhackett 7:e5fcb30509ea 126 if(flag == 2) {
trhackett 7:e5fcb30509ea 127 result[1] = 2;
trhackett 7:e5fcb30509ea 128 flag = 0;
trhackett 7:e5fcb30509ea 129 userChosen = 2;
trhackett 7:e5fcb30509ea 130 }
trhackett 7:e5fcb30509ea 131
trhackett 7:e5fcb30509ea 132 if(flag == 3){
trhackett 7:e5fcb30509ea 133 result[1] = 3;
trhackett 7:e5fcb30509ea 134 flag = 0;
trhackett 7:e5fcb30509ea 135 userChosen = 3;
trhackett 7:e5fcb30509ea 136 }
trhackett 7:e5fcb30509ea 137
trhackett 7:e5fcb30509ea 138 accel.acquire_accel_data_g(accel_data);
trhackett 7:e5fcb30509ea 139 ax = Filter(0);
trhackett 7:e5fcb30509ea 140 ay = Filter(1);
trhackett 7:e5fcb30509ea 141 az = Filter(2);
trhackett 7:e5fcb30509ea 142 wait(0.02);
trhackett 7:e5fcb30509ea 143 accel_rms = sqrt((ax*ax)+(ay*ay)+(az*az)/3);
trhackett 7:e5fcb30509ea 144 dot = (old_accx * ax)+(old_accy * ay)+(old_accz * az);
trhackett 7:e5fcb30509ea 145 old_acc = abs(sqrt(old_accx*old_accx+old_accy*old_accy+old_accz*old_accz));
trhackett 7:e5fcb30509ea 146 new_acc = abs(sqrt(ax*ax+ay*ay+az*az));
trhackett 7:e5fcb30509ea 147 dot /= (old_acc * new_acc);
trhackett 7:e5fcb30509ea 148
trhackett 7:e5fcb30509ea 149 /* Display Legends */
trhackett 7:e5fcb30509ea 150 StepNum = StepNumber;
trhackett 7:e5fcb30509ea 151 if(abs(dot - old_dot) >= 0.05 && abs(dot - old_dot) <= 0.10) {
trhackett 7:e5fcb30509ea 152 StepNumber += 1;
trhackett 7:e5fcb30509ea 153 }
trhackett 7:e5fcb30509ea 154
trhackett 7:e5fcb30509ea 155 old_accx = ax;
trhackett 7:e5fcb30509ea 156 old_accy = ay;
trhackett 7:e5fcb30509ea 157 old_accz = az;
trhackett 7:e5fcb30509ea 158 old_dot = dot;
trhackett 7:e5fcb30509ea 159
trhackett 7:e5fcb30509ea 160 Thread::wait(250);
angelasnail 6:328ef7a29083 161 }
angelasnail 6:328ef7a29083 162 }
angelasnail 6:328ef7a29083 163
angelasnail 6:328ef7a29083 164 void StartHaptic(void) {
angelasnail 6:328ef7a29083 165 hapticTimer.start(50);
angelasnail 6:328ef7a29083 166 haptic = 1;
angelasnail 6:328ef7a29083 167 }
angelasnail 6:328ef7a29083 168
angelasnail 6:328ef7a29083 169 void StopHaptic(void const *n) {
angelasnail 6:328ef7a29083 170 haptic = 0;
angelasnail 6:328ef7a29083 171 hapticTimer.stop();
angelasnail 6:328ef7a29083 172 }
angelasnail 6:328ef7a29083 173
angelasnail 6:328ef7a29083 174 float Filter(int s) {
angelasnail 6:328ef7a29083 175 accel.acquire_accel_data_g(accel_data);
angelasnail 6:328ef7a29083 176 float filter_sum = 0.0;
angelasnail 6:328ef7a29083 177 //printf("%d\n\r",s);
angelasnail 6:328ef7a29083 178 for(int i = 0; i < 75; i++)
angelasnail 6:328ef7a29083 179 {
angelasnail 6:328ef7a29083 180 filter_buf[i] = accel_data[s];
angelasnail 6:328ef7a29083 181 //printf("%4.2f\n\r",filter_buf[i]);
angelasnail 6:328ef7a29083 182 filter_sum += filter_buf[i];
angelasnail 6:328ef7a29083 183 }
angelasnail 6:328ef7a29083 184 return (float)(filter_sum / 75);
angelasnail 6:328ef7a29083 185 }
angelasnail 6:328ef7a29083 186
angelasnail 6:328ef7a29083 187 // Key modification: use the alert functionality enabled by the host-ble interface
angelasnail 6:328ef7a29083 188 // to define our own command.
angelasnail 6:328ef7a29083 189 void AlertReceived(uint8_t *data, uint8_t length) {
angelasnail 6:328ef7a29083 190
angelasnail 6:328ef7a29083 191 StartHaptic();
angelasnail 6:328ef7a29083 192 data[19] = 0;
angelasnail 6:328ef7a29083 193
angelasnail 6:328ef7a29083 194 user[0] = '0' + userChosen;
angelasnail 6:328ef7a29083 195
angelasnail 6:328ef7a29083 196 mean[0] = data[0];
angelasnail 6:328ef7a29083 197 mean[1] = data[1];
angelasnail 6:328ef7a29083 198 mean[2] = data[2];
angelasnail 6:328ef7a29083 199
angelasnail 6:328ef7a29083 200 max[0] = data[5];
angelasnail 6:328ef7a29083 201 max[1] = data[6];
angelasnail 6:328ef7a29083 202 max[2] = data[7];
angelasnail 6:328ef7a29083 203
angelasnail 6:328ef7a29083 204 min[0] = data[10];
angelasnail 6:328ef7a29083 205 min[1] = data[11];
angelasnail 6:328ef7a29083 206 min[2] = data[12];
angelasnail 6:328ef7a29083 207
angelasnail 6:328ef7a29083 208 steps[0] = data[15];
angelasnail 6:328ef7a29083 209 steps[1] = data[16];
angelasnail 6:328ef7a29083 210 steps[2] = data[17];
angelasnail 6:328ef7a29083 211 steps[3] = data[18];
angelasnail 6:328ef7a29083 212 steps[4] = data[19];
angelasnail 6:328ef7a29083 213
angelasnail 6:328ef7a29083 214 user[1] = 0;
angelasnail 6:328ef7a29083 215 mean[3] = 0;
angelasnail 6:328ef7a29083 216 max[3] = 0;
angelasnail 6:328ef7a29083 217 min[3] = 0;
angelasnail 6:328ef7a29083 218 steps[5] = 0;
angelasnail 6:328ef7a29083 219
angelasnail 6:328ef7a29083 220 // if you haven't yet processed the data that pi sent
angelasnail 6:328ef7a29083 221 // you in the past, then don't do anything.
angelasnail 6:328ef7a29083 222
angelasnail 6:328ef7a29083 223 // 2: queue up the displaying of that string
angelasnail 6:328ef7a29083 224 displayEventQueue.call(&displayString);
trhackett 7:e5fcb30509ea 225 }
trhackett 7:e5fcb30509ea 226
trhackett 7:e5fcb30509ea 227
trhackett 7:e5fcb30509ea 228 /****************************Call Back Functions*******************************/
trhackett 7:e5fcb30509ea 229
trhackett 7:e5fcb30509ea 230 // just write the received data to the screen
trhackett 7:e5fcb30509ea 231 void displayString() {
trhackett 7:e5fcb30509ea 232 if (!processedReceivedData) {
trhackett 7:e5fcb30509ea 233 clearScreen();
trhackett 7:e5fcb30509ea 234
trhackett 7:e5fcb30509ea 235 processedReceivedData = true;
trhackett 7:e5fcb30509ea 236 oled_text_properties_t textProperties = {0};
trhackett 7:e5fcb30509ea 237 oled.GetTextProperties(&textProperties);
trhackett 7:e5fcb30509ea 238
trhackett 7:e5fcb30509ea 239 textProperties.fontColor = COLOR_BLUE;
trhackett 7:e5fcb30509ea 240 oled.SetTextProperties(&textProperties);
trhackett 7:e5fcb30509ea 241
trhackett 7:e5fcb30509ea 242 sprintf(text, "USER: %s\0",user);
trhackett 7:e5fcb30509ea 243 oled.Label((uint8_t*)text,0,0);
trhackett 7:e5fcb30509ea 244
trhackett 7:e5fcb30509ea 245 sprintf(text, "MEAN HR: %s\0",mean);
trhackett 7:e5fcb30509ea 246 oled.Label((uint8_t*)text,0,15);
trhackett 7:e5fcb30509ea 247
trhackett 7:e5fcb30509ea 248 sprintf(text, "MAX HR: %s\0",max);
trhackett 7:e5fcb30509ea 249 oled.Label((uint8_t*)text,0,30);
trhackett 7:e5fcb30509ea 250
trhackett 7:e5fcb30509ea 251 sprintf(text, "MIN HR: %s\0",min);
trhackett 7:e5fcb30509ea 252 oled.Label((uint8_t*)text,0,45);
trhackett 7:e5fcb30509ea 253
trhackett 7:e5fcb30509ea 254 sprintf(text, "STEPS: %s\0",steps);
trhackett 7:e5fcb30509ea 255 oled.Label((uint8_t*)text,0,60);
trhackett 7:e5fcb30509ea 256 }
trhackett 7:e5fcb30509ea 257 }
trhackett 7:e5fcb30509ea 258
trhackett 7:e5fcb30509ea 259 void ButtonUp(void) {
trhackett 7:e5fcb30509ea 260 StartHaptic();
trhackett 7:e5fcb30509ea 261 flag = 1;
trhackett 7:e5fcb30509ea 262 }
trhackett 7:e5fcb30509ea 263
trhackett 7:e5fcb30509ea 264 void ButtonDown(void) {
trhackett 7:e5fcb30509ea 265 StartHaptic();
trhackett 7:e5fcb30509ea 266 flag = 2;
trhackett 7:e5fcb30509ea 267 }
trhackett 7:e5fcb30509ea 268
trhackett 7:e5fcb30509ea 269 void ButtonRight(void) {
trhackett 7:e5fcb30509ea 270 StartHaptic();
trhackett 7:e5fcb30509ea 271 flag = 3;
trhackett 7:e5fcb30509ea 272 }
trhackett 7:e5fcb30509ea 273
trhackett 7:e5fcb30509ea 274 void ButtonLeft(void) {
trhackett 7:e5fcb30509ea 275 StartHaptic();
trhackett 7:e5fcb30509ea 276 kw40z_device.ToggleAdvertisementMode();
trhackett 7:e5fcb30509ea 277 }
trhackett 7:e5fcb30509ea 278
trhackett 7:e5fcb30509ea 279
trhackett 7:e5fcb30509ea 280
trhackett 7:e5fcb30509ea 281 // initialize the screen to black
trhackett 7:e5fcb30509ea 282 void clearScreen() {
trhackett 7:e5fcb30509ea 283 oled.FillScreen(COLOR_BLACK);
trhackett 5:a2f68bbb5400 284 }