started from BLE now the whole team -- here

Committer:
vazbyte
Date:
Thu Feb 07 14:27:23 2019 +0000
Revision:
22:0d59828e0b66
Parent:
20:1998218bbb63
latest!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vazbyte 22:0d59828e0b66 1 /* mbed Microcontroller Library
vazbyte 22:0d59828e0b66 2 * Copyright (c) 2006-2014 ARM Limited
vazbyte 22:0d59828e0b66 3 *
vazbyte 22:0d59828e0b66 4 * Licensed under the Apache License, Version 2.0 (the "License");
vazbyte 22:0d59828e0b66 5 * you may not use this file except in compliance with the License.
vazbyte 22:0d59828e0b66 6 * You may obtain a copy of the License at
vazbyte 22:0d59828e0b66 7 *
vazbyte 22:0d59828e0b66 8 * http://www.apache.org/licenses/LICENSE-2.0
vazbyte 22:0d59828e0b66 9 *
vazbyte 22:0d59828e0b66 10 * Unless required by applicable law or agreed to in writing, software
vazbyte 22:0d59828e0b66 11 * distributed under the License is distributed on an "AS IS" BASIS,
vazbyte 22:0d59828e0b66 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vazbyte 22:0d59828e0b66 13 * See the License for the specific language governing permissions and
vazbyte 22:0d59828e0b66 14 * limitations under the License.
vazbyte 22:0d59828e0b66 15 */
vazbyte 22:0d59828e0b66 16
vazbyte 0:07212de2fec1 17 #include <events/mbed_events.h>
vazbyte 3:a33709dad06c 18 #include <math.h>
vazbyte 11:5023e8c93e4d 19
vazbyte 10:8cf4069d064a 20 #include <ctime>
vazbyte 0:07212de2fec1 21 #include <mbed.h>
vazbyte 1:df8884d38960 22 #include "MPU9250.h"
vazbyte 0:07212de2fec1 23 #include "ble/BLE.h"
vazbyte 0:07212de2fec1 24 #include "ble/Gap.h"
vazbyte 1:df8884d38960 25 #include "ble/services/HeartRateService.h"
vazbyte 1:df8884d38960 26
vazbyte 22:0d59828e0b66 27 DigitalOut Led0(p31);
vazbyte 22:0d59828e0b66 28 DigitalOut Led1(p30);
vazbyte 22:0d59828e0b66 29 DigitalOut Led2(p29);
vazbyte 22:0d59828e0b66 30 DigitalOut Led3(p28);
vazbyte 22:0d59828e0b66 31 DigitalOut Led4(p4);
vazbyte 22:0d59828e0b66 32 DigitalOut Led5(p3);
vazbyte 20:1998218bbb63 33 DigitalOut Led6(p11);
vazbyte 20:1998218bbb63 34 DigitalOut Led7(p12);
vazbyte 20:1998218bbb63 35 DigitalOut Led8(p13);
vazbyte 20:1998218bbb63 36 DigitalOut Led9(p14);
vazbyte 0:07212de2fec1 37
vazbyte 22:0d59828e0b66 38 //DigitalOut led1(LED1, 1);
vazbyte 0:07212de2fec1 39
vazbyte 1:df8884d38960 40 const static char DEVICE_NAME[] = "ProVaida";
vazbyte 1:df8884d38960 41 static const uint16_t uuid16_list[] = {GattService::UUID_HEART_RATE_SERVICE};
vazbyte 0:07212de2fec1 42
vazbyte 4:af0530752b76 43 int16_t destination[3];
vazbyte 22:0d59828e0b66 44 short hrmCounter = 0;
vaida 9:40874a5c5ad0 45 double step_threshold = 14.45;
vazbyte 12:3934b9d6d5a3 46
vaida 9:40874a5c5ad0 47 double oldAcceleration = 0.0;
vaida 15:a502564c7a88 48 int callback_cycles = 1; // used to be 4
vazbyte 13:99ed8a3db67a 49 int step;
vazbyte 22:0d59828e0b66 50 int run_threshold = 6; // used to be 7
vazbyte 22:0d59828e0b66 51 int run_count = 0;
vazbyte 22:0d59828e0b66 52
vazbyte 20:1998218bbb63 53 int totalsteps = 0;
vazbyte 20:1998218bbb63 54
vazbyte 22:0d59828e0b66 55 static HeartRateService* hrService;
vazbyte 4:af0530752b76 56 MPU9250 mpu = MPU9250(P0_26, P0_27);
vazbyte 0:07212de2fec1 57
vazbyte 22:0d59828e0b66 58 static EventQueue eventQueue(/* event count */ 16 * EVENTS_EVENT_SIZE);
vazbyte 0:07212de2fec1 59
vazbyte 0:07212de2fec1 60 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
vazbyte 0:07212de2fec1 61 {
vazbyte 0:07212de2fec1 62 BLE::Instance().gap().startAdvertising();
vazbyte 0:07212de2fec1 63 }
vazbyte 0:07212de2fec1 64
vazbyte 22:0d59828e0b66 65 void updateSensorValue() {
vazbyte 22:0d59828e0b66 66 step = 0;
vazbyte 22:0d59828e0b66 67 callback_cycles++;
vazbyte 13:99ed8a3db67a 68
vazbyte 22:0d59828e0b66 69 mpu.readAccelData(destination);
vazbyte 3:a33709dad06c 70
vazbyte 22:0d59828e0b66 71 double acc_x = destination[0] / 1000.0;
vazbyte 22:0d59828e0b66 72 double acc_y = destination[1] / 1000.0;
vazbyte 22:0d59828e0b66 73 double acc_z = destination[2] / 1000.0;
vazbyte 3:a33709dad06c 74
vazbyte 22:0d59828e0b66 75 double sqr_acc_x = acc_x*acc_x;
vazbyte 22:0d59828e0b66 76 double sqr_acc_y = acc_y*acc_y;
vazbyte 22:0d59828e0b66 77 double sqr_acc_z = acc_z*acc_z;
vazbyte 3:a33709dad06c 78
vazbyte 22:0d59828e0b66 79 double sum_acc = sqr_acc_x + sqr_acc_y + sqr_acc_z;
vazbyte 22:0d59828e0b66 80 double accel = sqrt(sum_acc);
vazbyte 22:0d59828e0b66 81
vazbyte 22:0d59828e0b66 82 //printf("calback cycles: " );
vazbyte 22:0d59828e0b66 83 //printf("%i\n", callback_cycles);
vazbyte 22:0d59828e0b66 84
vazbyte 22:0d59828e0b66 85 if (accel < step_threshold && oldAcceleration >= step_threshold && (callback_cycles > 2)) {
vazbyte 22:0d59828e0b66 86 if (callback_cycles <= run_threshold) {
vazbyte 22:0d59828e0b66 87 if (run_count >= 2) {
vazbyte 22:0d59828e0b66 88 step = 2;
vaida 15:a502564c7a88 89 }
vaida 15:a502564c7a88 90 else {
vaida 16:567f06e22645 91 step = 1;
vazbyte 22:0d59828e0b66 92 run_count++;
vaida 15:a502564c7a88 93 }
vazbyte 22:0d59828e0b66 94 }
vazbyte 22:0d59828e0b66 95 else {
vazbyte 22:0d59828e0b66 96 step = 1;
vazbyte 22:0d59828e0b66 97 run_count = 0;
vaida 15:a502564c7a88 98 }
vazbyte 22:0d59828e0b66 99 callback_cycles = 0;
vazbyte 22:0d59828e0b66 100 }
vazbyte 22:0d59828e0b66 101 if (step != 0)
vazbyte 22:0d59828e0b66 102 {
vazbyte 22:0d59828e0b66 103 printf("STEP: " );
vazbyte 22:0d59828e0b66 104 printf("%i\n", step);
vazbyte 17:b4a080229f5c 105
vazbyte 22:0d59828e0b66 106 totalsteps++;
vazbyte 22:0d59828e0b66 107
vazbyte 22:0d59828e0b66 108 printf("totalSTEPs: " );
vazbyte 22:0d59828e0b66 109 printf("%i\n", totalsteps);
vazbyte 22:0d59828e0b66 110
vazbyte 22:0d59828e0b66 111 Led0 = ((totalsteps >> 0) % 2);
vazbyte 22:0d59828e0b66 112 Led1 = ((totalsteps >> 1) % 2);
vazbyte 22:0d59828e0b66 113 Led2 = ((totalsteps >> 2) % 2);
vazbyte 22:0d59828e0b66 114 Led3 = ((totalsteps >> 3) % 2);
vazbyte 22:0d59828e0b66 115 Led4 = ((totalsteps >> 4) % 2);
vazbyte 22:0d59828e0b66 116 Led5 = ((totalsteps >> 5) % 2);
vazbyte 22:0d59828e0b66 117 Led6 = ((totalsteps >> 6) % 2);
vazbyte 22:0d59828e0b66 118 Led7 = ((totalsteps >> 7) % 2);
vazbyte 22:0d59828e0b66 119 Led8 = ((totalsteps >> 8) % 2);
vazbyte 22:0d59828e0b66 120 Led9 = ((totalsteps >> 9) % 2);
vazbyte 22:0d59828e0b66 121 }
vazbyte 20:1998218bbb63 122
vazbyte 22:0d59828e0b66 123 oldAcceleration = accel;
vazbyte 22:0d59828e0b66 124
vazbyte 22:0d59828e0b66 125 hrmCounter = (short) step;
vazbyte 22:0d59828e0b66 126 //printf("STEP: " );
vazbyte 22:0d59828e0b66 127 //printf("%hu\n", hrmCounter);
vazbyte 22:0d59828e0b66 128
vazbyte 22:0d59828e0b66 129 hrService->updateHeartRate(hrmCounter);
vazbyte 0:07212de2fec1 130 }
vazbyte 0:07212de2fec1 131
vazbyte 0:07212de2fec1 132 void blinkCallback(void)
vazbyte 0:07212de2fec1 133 {
vazbyte 22:0d59828e0b66 134 //led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
vazbyte 0:07212de2fec1 135 BLE &ble = BLE::Instance();
vazbyte 0:07212de2fec1 136 if (ble.gap().getState().connected) {
vazbyte 0:07212de2fec1 137 eventQueue.call(updateSensorValue);
vazbyte 0:07212de2fec1 138 }
vazbyte 0:07212de2fec1 139 }
vazbyte 0:07212de2fec1 140
vazbyte 22:0d59828e0b66 141 /**
vazbyte 22:0d59828e0b66 142 * This function is called when the ble initialization process has failed
vazbyte 22:0d59828e0b66 143 */
vazbyte 22:0d59828e0b66 144 void onBleInitError(BLE &ble, ble_error_t error)
vazbyte 22:0d59828e0b66 145 {
vazbyte 22:0d59828e0b66 146 /* Initialization error handling should go here */
vazbyte 22:0d59828e0b66 147 }
vazbyte 0:07212de2fec1 148
vazbyte 22:0d59828e0b66 149 void printMacAddress()
vazbyte 22:0d59828e0b66 150 {
vazbyte 22:0d59828e0b66 151 /* Print out device MAC address to the console*/
vazbyte 22:0d59828e0b66 152 Gap::AddressType_t addr_type;
vazbyte 22:0d59828e0b66 153 Gap::Address_t address;
vazbyte 22:0d59828e0b66 154 BLE::Instance().gap().getAddress(&addr_type, address);
vazbyte 22:0d59828e0b66 155 printf("DEVICE MAC ADDRESS: ");
vazbyte 22:0d59828e0b66 156 for (int i = 5; i >= 1; i--){
vazbyte 22:0d59828e0b66 157 printf("%02x:", address[i]);
vazbyte 22:0d59828e0b66 158 }
vazbyte 22:0d59828e0b66 159 printf("%02x\r\n", address[0]);
vazbyte 22:0d59828e0b66 160 }
vazbyte 22:0d59828e0b66 161
vazbyte 22:0d59828e0b66 162 /**
vazbyte 22:0d59828e0b66 163 * Callback triggered when the ble initialization process has finished
vazbyte 22:0d59828e0b66 164 */
vazbyte 0:07212de2fec1 165 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
vazbyte 0:07212de2fec1 166 {
vazbyte 0:07212de2fec1 167 BLE& ble = params->ble;
vazbyte 0:07212de2fec1 168 ble_error_t error = params->error;
vazbyte 0:07212de2fec1 169
vazbyte 22:0d59828e0b66 170 if (error != BLE_ERROR_NONE) {
vazbyte 22:0d59828e0b66 171 /* In case of error, forward the error handling to onBleInitError */
vazbyte 0:07212de2fec1 172 onBleInitError(ble, error);
vazbyte 0:07212de2fec1 173 return;
vazbyte 0:07212de2fec1 174 }
vazbyte 0:07212de2fec1 175
vazbyte 22:0d59828e0b66 176 /* Ensure that it is the default instance of BLE */
vazbyte 0:07212de2fec1 177 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
vazbyte 0:07212de2fec1 178 return;
vazbyte 0:07212de2fec1 179 }
vazbyte 0:07212de2fec1 180
vazbyte 0:07212de2fec1 181 ble.gap().onDisconnection(disconnectionCallback);
vazbyte 0:07212de2fec1 182
vazbyte 22:0d59828e0b66 183 /* Setup primary service */
vazbyte 1:df8884d38960 184 hrService = new HeartRateService(ble, hrmCounter, HeartRateService::LOCATION_FINGER);
vazbyte 0:07212de2fec1 185
vazbyte 22:0d59828e0b66 186 /* Setup advertising */
vazbyte 0:07212de2fec1 187 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
vazbyte 0:07212de2fec1 188 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *) uuid16_list, sizeof(uuid16_list));
vazbyte 0:07212de2fec1 189 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *) DEVICE_NAME, sizeof(DEVICE_NAME));
vazbyte 0:07212de2fec1 190 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
vazbyte 22:0d59828e0b66 191 ble.gap().setAdvertisingInterval(1000); /* 1000ms */
vazbyte 0:07212de2fec1 192 ble.gap().startAdvertising();
vazbyte 22:0d59828e0b66 193
vazbyte 22:0d59828e0b66 194
vazbyte 22:0d59828e0b66 195 printMacAddress();
vazbyte 22:0d59828e0b66 196
vazbyte 0:07212de2fec1 197 }
vazbyte 0:07212de2fec1 198
vazbyte 0:07212de2fec1 199 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
vazbyte 0:07212de2fec1 200 BLE &ble = BLE::Instance();
vazbyte 0:07212de2fec1 201 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
vazbyte 0:07212de2fec1 202 }
vazbyte 0:07212de2fec1 203
vazbyte 0:07212de2fec1 204 int main()
vazbyte 22:0d59828e0b66 205 {
vazbyte 2:1957a4985d6e 206 mpu.initMPU9250();
vazbyte 10:8cf4069d064a 207
vazbyte 22:0d59828e0b66 208 eventQueue.call_every(80, blinkCallback);
vazbyte 0:07212de2fec1 209
vazbyte 22:0d59828e0b66 210 BLE &ble = BLE::Instance();
vazbyte 22:0d59828e0b66 211 ble.onEventsToProcess(scheduleBleEventsProcessing);
vazbyte 22:0d59828e0b66 212 ble.init(bleInitComplete);
vazbyte 22:0d59828e0b66 213
vazbyte 22:0d59828e0b66 214 eventQueue.dispatch_forever();
vazbyte 0:07212de2fec1 215
vazbyte 0:07212de2fec1 216 return 0;
vazbyte 0:07212de2fec1 217 }