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:
angelasnail
Date:
Fri Jun 15 03:38:32 2018 +0000
Revision:
6:328ef7a29083
Parent:
5:a2f68bbb5400
Child:
7:e5fcb30509ea
work in progress

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);
angelasnail 6:328ef7a29083 14
catchvibes95 4:eb89733b8642 15 void UpdateSensorData(void);
catchvibes95 4:eb89733b8642 16 void txTask(void);
catchvibes95 4:eb89733b8642 17
catchvibes95 4:eb89733b8642 18 FXOS8700 accel(PTC11, PTC10);
catchvibes95 4:eb89733b8642 19
catchvibes95 4:eb89733b8642 20 /* Instantiate the Hexi KW40Z Driver (UART TX, UART RX) */
catchvibes95 4:eb89733b8642 21 KW40Z kw40z_device(PTE24, PTE25);
catchvibes95 4:eb89733b8642 22
catchvibes95 4:eb89733b8642 23 /* Instantiate the SSD1351 OLED Driver */
catchvibes95 4:eb89733b8642 24 SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); /* (MOSI,SCLK,POWER,CS,RST,DC) */
catchvibes95 4:eb89733b8642 25
catchvibes95 4:eb89733b8642 26 /*Create a Thread to handle sending BLE Sensor Data */
catchvibes95 4:eb89733b8642 27 Thread txThread;
catchvibes95 4:eb89733b8642 28
xihan94 0:33686dd26bf9 29 Thread t;
xihan94 0:33686dd26bf9 30
catchvibes95 4:eb89733b8642 31 char text[20];
catchvibes95 4:eb89733b8642 32
catchvibes95 4:eb89733b8642 33 // Variables
catchvibes95 4:eb89733b8642 34 float accel_data[3]; // Storage for the data from the sensor
catchvibes95 4:eb89733b8642 35 float accel_rms=0.0; // RMS value from the sensor
catchvibes95 4:eb89733b8642 36 float ax, ay, az; // Integer value from the sensor to be displayed
catchvibes95 4:eb89733b8642 37 const uint8_t *image1; // Pointer for the image1 to be displayed
catchvibes95 4:eb89733b8642 38 char text1[20]; // Text Buffer for dynamic value displayed
catchvibes95 4:eb89733b8642 39 char text2[20]; // Text Buffer for dynamic value displayed
catchvibes95 4:eb89733b8642 40 char text3[20]; // Text Buffer for dynamic value displayed
catchvibes95 4:eb89733b8642 41 float dot;
catchvibes95 4:eb89733b8642 42 float old_acc=0;
catchvibes95 4:eb89733b8642 43 float new_acc=0;
catchvibes95 4:eb89733b8642 44 float old_accx, old_accy, old_accz, old_dot=0.0;
catchvibes95 4:eb89733b8642 45 uint8_t StepNum = 0, StepNumber = 0;
catchvibes95 4:eb89733b8642 46
catchvibes95 4:eb89733b8642 47 float filter_buf[75];
catchvibes95 4:eb89733b8642 48
angelasnail 6:328ef7a29083 49
angelasnail 6:328ef7a29083 50
catchvibes95 4:eb89733b8642 51 /****************************Call Back Functions*******************************/
angelasnail 6:328ef7a29083 52 void ButtonUp(void) {
angelasnail 6:328ef7a29083 53 StartHaptic();
angelasnail 6:328ef7a29083 54 flag=1;
angelasnail 6:328ef7a29083 55 }
angelasnail 6:328ef7a29083 56
angelasnail 6:328ef7a29083 57 void ButtonDown(void) {
angelasnail 6:328ef7a29083 58 StartHaptic();
angelasnail 6:328ef7a29083 59 flag=2;
angelasnail 6:328ef7a29083 60 }
angelasnail 6:328ef7a29083 61
angelasnail 6:328ef7a29083 62 void ButtonRight(void) {
angelasnail 6:328ef7a29083 63 StartHaptic();
angelasnail 6:328ef7a29083 64 flag=3;
angelasnail 6:328ef7a29083 65 }
angelasnail 6:328ef7a29083 66
catchvibes95 4:eb89733b8642 67
angelasnail 6:328ef7a29083 68 // just write the received data to the screen
angelasnail 6:328ef7a29083 69 void displayString() {
angelasnail 6:328ef7a29083 70 if (!processedReceivedData) {
angelasnail 6:328ef7a29083 71 clearScreen();
angelasnail 6:328ef7a29083 72
angelasnail 6:328ef7a29083 73 processedReceivedData = true;
angelasnail 6:328ef7a29083 74 oled_text_properties_t textProperties = {0};
angelasnail 6:328ef7a29083 75 oled.GetTextProperties(&textProperties);
angelasnail 6:328ef7a29083 76
angelasnail 6:328ef7a29083 77 textProperties.fontColor = COLOR_BLUE;
angelasnail 6:328ef7a29083 78 oled.SetTextProperties(&textProperties);
angelasnail 6:328ef7a29083 79
angelasnail 6:328ef7a29083 80 sprintf(text, "USER: %s\0",user);
angelasnail 6:328ef7a29083 81 oled.Label((uint8_t*)text,0,0);
angelasnail 6:328ef7a29083 82
angelasnail 6:328ef7a29083 83 sprintf(text, "MEAN HR: %s\0",mean);
angelasnail 6:328ef7a29083 84 oled.Label((uint8_t*)text,0,15);
angelasnail 6:328ef7a29083 85
angelasnail 6:328ef7a29083 86 sprintf(text, "MAX HR: %s\0",max);
angelasnail 6:328ef7a29083 87 oled.Label((uint8_t*)text,0,30);
angelasnail 6:328ef7a29083 88
angelasnail 6:328ef7a29083 89 sprintf(text, "MIN HR: %s\0",min);
angelasnail 6:328ef7a29083 90 oled.Label((uint8_t*)text,0,45);
angelasnail 6:328ef7a29083 91
angelasnail 6:328ef7a29083 92 sprintf(text, "STEPS: %s\0",steps);
angelasnail 6:328ef7a29083 93 oled.Label((uint8_t*)text,0,60);
catchvibes95 4:eb89733b8642 94 }
catchvibes95 4:eb89733b8642 95 }
catchvibes95 4:eb89733b8642 96
catchvibes95 4:eb89733b8642 97
trhackett 5:a2f68bbb5400 98 // main() runs in its own thread in the OS
trhackett 5:a2f68bbb5400 99 int main() {
trhackett 5:a2f68bbb5400 100 accel.accel_config();
catchvibes95 4:eb89733b8642 101
trhackett 5:a2f68bbb5400 102 txThread.start(txTask); /*Start transmitting Sensor Tag Data */
catchvibes95 4:eb89733b8642 103
trhackett 5:a2f68bbb5400 104 while (true) {
trhackett 5:a2f68bbb5400 105 Thread::wait(50);
catchvibes95 4:eb89733b8642 106 }
catchvibes95 4:eb89733b8642 107 }
xihan94 0:33686dd26bf9 108
catchvibes95 4:eb89733b8642 109 void txTask(void){
catchvibes95 4:eb89733b8642 110
catchvibes95 4:eb89733b8642 111 while (true)
catchvibes95 4:eb89733b8642 112 {
angelasnail 6:328ef7a29083 113 if (kw40z_device.GetLinkState() == 0) {
angelasnail 6:328ef7a29083 114 kw40z_device.ToggleAdvertisementMode();
angelasnail 6:328ef7a29083 115 }
angelasnail 6:328ef7a29083 116
catchvibes95 4:eb89733b8642 117 UpdateSensorData();
catchvibes95 4:eb89733b8642 118
catchvibes95 4:eb89733b8642 119 /*Notify Hexiwear App that it is running Sensor Tag mode*/
catchvibes95 4:eb89733b8642 120 kw40z_device.SendSetApplicationMode(GUI_CURRENT_APP_SENSOR_TAG);
angelasnail 6:328ef7a29083 121
angelasnail 6:328ef7a29083 122 kw40z_device.SendAlert(result, 2);
catchvibes95 4:eb89733b8642 123 kw40z_device.SendBatteryLevel(StepNumber);
catchvibes95 4:eb89733b8642 124
catchvibes95 4:eb89733b8642 125 Thread::wait(10);
catchvibes95 4:eb89733b8642 126 }
catchvibes95 4:eb89733b8642 127 }
catchvibes95 4:eb89733b8642 128
catchvibes95 4:eb89733b8642 129 void UpdateSensorData(void)
catchvibes95 4:eb89733b8642 130 {
angelasnail 6:328ef7a29083 131 if(flag == 1) {
angelasnail 6:328ef7a29083 132 result[1]=1;
angelasnail 6:328ef7a29083 133 flag=0;
angelasnail 6:328ef7a29083 134 userChosen = 1;
angelasnail 6:328ef7a29083 135 }
angelasnail 6:328ef7a29083 136
angelasnail 6:328ef7a29083 137 if(flag == 2) {
angelasnail 6:328ef7a29083 138 result[1]=2;
angelasnail 6:328ef7a29083 139 flag=0;
angelasnail 6:328ef7a29083 140 userChosen = 2;
angelasnail 6:328ef7a29083 141 }
angelasnail 6:328ef7a29083 142
angelasnail 6:328ef7a29083 143 if(flag == 3){
angelasnail 6:328ef7a29083 144 result[1]=3;
angelasnail 6:328ef7a29083 145 flag=0;
angelasnail 6:328ef7a29083 146 userChosen = 3;
angelasnail 6:328ef7a29083 147 }
angelasnail 6:328ef7a29083 148
trhackett 5:a2f68bbb5400 149 accel.acquire_accel_data_g(accel_data);
trhackett 5:a2f68bbb5400 150 ax = Filter(0);
trhackett 5:a2f68bbb5400 151 ay = Filter(1);
trhackett 5:a2f68bbb5400 152 az = Filter(2);
trhackett 5:a2f68bbb5400 153 wait(0.02);
trhackett 5:a2f68bbb5400 154 accel_rms = sqrt((ax*ax)+(ay*ay)+(az*az)/3);
trhackett 5:a2f68bbb5400 155 dot = (old_accx * ax)+(old_accy * ay)+(old_accz * az);
trhackett 5:a2f68bbb5400 156 old_acc = abs(sqrt(old_accx*old_accx+old_accy*old_accy+old_accz*old_accz));
trhackett 5:a2f68bbb5400 157 new_acc = abs(sqrt(ax*ax+ay*ay+az*az));
trhackett 5:a2f68bbb5400 158 dot /= (old_acc * new_acc);
trhackett 5:a2f68bbb5400 159
trhackett 5:a2f68bbb5400 160 /* Display Legends */
trhackett 5:a2f68bbb5400 161 StepNum = StepNumber;
trhackett 5:a2f68bbb5400 162 if(abs(dot - old_dot) >= 0.05 && abs(dot - old_dot) <= 0.10) {
trhackett 5:a2f68bbb5400 163 StepNumber += 1;
trhackett 5:a2f68bbb5400 164 }
trhackett 5:a2f68bbb5400 165
trhackett 5:a2f68bbb5400 166 old_accx = ax;
trhackett 5:a2f68bbb5400 167 old_accy = ay;
trhackett 5:a2f68bbb5400 168 old_accz = az;
trhackett 5:a2f68bbb5400 169 old_dot = dot;
trhackett 5:a2f68bbb5400 170
trhackett 5:a2f68bbb5400 171 Thread::wait(250);
angelasnail 6:328ef7a29083 172 }
angelasnail 6:328ef7a29083 173
angelasnail 6:328ef7a29083 174 void StartHaptic(void) {
angelasnail 6:328ef7a29083 175 hapticTimer.start(50);
angelasnail 6:328ef7a29083 176 haptic = 1;
angelasnail 6:328ef7a29083 177 }
angelasnail 6:328ef7a29083 178
angelasnail 6:328ef7a29083 179 void StopHaptic(void const *n) {
angelasnail 6:328ef7a29083 180 haptic = 0;
angelasnail 6:328ef7a29083 181 hapticTimer.stop();
angelasnail 6:328ef7a29083 182 }
angelasnail 6:328ef7a29083 183
angelasnail 6:328ef7a29083 184 float Filter(int s) {
angelasnail 6:328ef7a29083 185 accel.acquire_accel_data_g(accel_data);
angelasnail 6:328ef7a29083 186 float filter_sum = 0.0;
angelasnail 6:328ef7a29083 187 //printf("%d\n\r",s);
angelasnail 6:328ef7a29083 188 for(int i = 0; i < 75; i++)
angelasnail 6:328ef7a29083 189 {
angelasnail 6:328ef7a29083 190 filter_buf[i] = accel_data[s];
angelasnail 6:328ef7a29083 191 //printf("%4.2f\n\r",filter_buf[i]);
angelasnail 6:328ef7a29083 192 filter_sum += filter_buf[i];
angelasnail 6:328ef7a29083 193 }
angelasnail 6:328ef7a29083 194 return (float)(filter_sum / 75);
angelasnail 6:328ef7a29083 195 }
angelasnail 6:328ef7a29083 196
angelasnail 6:328ef7a29083 197 // Key modification: use the alert functionality enabled by the host-ble interface
angelasnail 6:328ef7a29083 198 // to define our own command.
angelasnail 6:328ef7a29083 199 void AlertReceived(uint8_t *data, uint8_t length) {
angelasnail 6:328ef7a29083 200
angelasnail 6:328ef7a29083 201 StartHaptic();
angelasnail 6:328ef7a29083 202 data[19] = 0;
angelasnail 6:328ef7a29083 203
angelasnail 6:328ef7a29083 204 // 1: copy data into a global array
angelasnail 6:328ef7a29083 205 if (processedReceivedData) {
angelasnail 6:328ef7a29083 206 processedReceivedData = false;
angelasnail 6:328ef7a29083 207 for (int i = 0; i < 9; i++) {
angelasnail 6:328ef7a29083 208 receivedSummaryData1[i] = data[i];
angelasnail 6:328ef7a29083 209 }
angelasnail 6:328ef7a29083 210
angelasnail 6:328ef7a29083 211 for (int i = 9; i < 18; i++) {
angelasnail 6:328ef7a29083 212 receivedSummaryData2[i-9] = data[i];
angelasnail 6:328ef7a29083 213 }
angelasnail 6:328ef7a29083 214 }
angelasnail 6:328ef7a29083 215
angelasnail 6:328ef7a29083 216 user[0] = '0' + userChosen;
angelasnail 6:328ef7a29083 217
angelasnail 6:328ef7a29083 218 mean[0] = data[0];
angelasnail 6:328ef7a29083 219 mean[1] = data[1];
angelasnail 6:328ef7a29083 220 mean[2] = data[2];
angelasnail 6:328ef7a29083 221
angelasnail 6:328ef7a29083 222 max[0] = data[5];
angelasnail 6:328ef7a29083 223 max[1] = data[6];
angelasnail 6:328ef7a29083 224 max[2] = data[7];
angelasnail 6:328ef7a29083 225
angelasnail 6:328ef7a29083 226 min[0] = data[10];
angelasnail 6:328ef7a29083 227 min[1] = data[11];
angelasnail 6:328ef7a29083 228 min[2] = data[12];
angelasnail 6:328ef7a29083 229
angelasnail 6:328ef7a29083 230 steps[0] = data[15];
angelasnail 6:328ef7a29083 231 steps[1] = data[16];
angelasnail 6:328ef7a29083 232 steps[2] = data[17];
angelasnail 6:328ef7a29083 233 steps[3] = data[18];
angelasnail 6:328ef7a29083 234 steps[4] = data[19];
angelasnail 6:328ef7a29083 235
angelasnail 6:328ef7a29083 236 user[1] = 0;
angelasnail 6:328ef7a29083 237 mean[3] = 0;
angelasnail 6:328ef7a29083 238 max[3] = 0;
angelasnail 6:328ef7a29083 239 min[3] = 0;
angelasnail 6:328ef7a29083 240 steps[5] = 0;
angelasnail 6:328ef7a29083 241
angelasnail 6:328ef7a29083 242 receivedSummaryData1[9] = 0;
angelasnail 6:328ef7a29083 243 receivedSummaryData2[9] = 0;
angelasnail 6:328ef7a29083 244
angelasnail 6:328ef7a29083 245 // if you haven't yet processed the data that pi sent
angelasnail 6:328ef7a29083 246 // you in the past, then don't do anything.
angelasnail 6:328ef7a29083 247
angelasnail 6:328ef7a29083 248 // 2: queue up the displaying of that string
angelasnail 6:328ef7a29083 249 displayEventQueue.call(&displayString);
trhackett 5:a2f68bbb5400 250 }