Graduation Thesis, use Nucleo and X-Nucleo BLE

Dependencies:   PulseSensor GSM Thermometer KalmanFilter

Committer:
DuyLionTran
Date:
Wed Feb 21 10:18:51 2018 +0000
Revision:
7:d8032114995b
Parent:
6:26a4b005cb75
* version 0.9.6   02-21-2018  Some modification for LM35

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DuyLionTran 0:64ca984b3efd 1 /**
DuyLionTran 2:16f6cfcd7505 2 * This is the project for "BLE HealthCare". The device is attached on any patient's body at will.
DuyLionTran 0:64ca984b3efd 3
DuyLionTran 0:64ca984b3efd 4 * Revision:
DuyLionTran 2:16f6cfcd7505 5 * version 0.8 02-12-2018
DuyLionTran 2:16f6cfcd7505 6 * version 0.8.5 02-14-2018
DuyLionTran 4:e44cd8682f1c 7 * version 0.9 02-15-2018 Pulse sensor and thermometer added
DuyLionTran 4:e44cd8682f1c 8 * version 0.9.5 02-16-2018 Calculation for pulse sensor and thermometer. GSM library added
DuyLionTran 6:26a4b005cb75 9 * version 0.9.6 02-21-2018 Update mbed-os
DuyLionTran 7:d8032114995b 10 * version 0.9.6 02-21-2018 Some modification for LM35
DuyLionTran 0:64ca984b3efd 11
DuyLionTran 0:64ca984b3efd 12 /* ======================== INCLUDES ========================= */
DuyLionTran 0:64ca984b3efd 13 #include <events/mbed_events.h>
DuyLionTran 0:64ca984b3efd 14 #include <mbed.h>
DuyLionTran 0:64ca984b3efd 15 #include "ble/BLE.h"
DuyLionTran 0:64ca984b3efd 16 #include "ble_healthcare_service.h"
DuyLionTran 5:c12c16c0d2ea 17 #include "GSM.h"
DuyLionTran 4:e44cd8682f1c 18 #include "LM35.h"
DuyLionTran 3:9b552b775c6e 19 #include "PulseSensor.h"
DuyLionTran 0:64ca984b3efd 20
DuyLionTran 4:e44cd8682f1c 21
DuyLionTran 4:e44cd8682f1c 22
DuyLionTran 0:64ca984b3efd 23 /* ======================== DEFINES ========================== */
DuyLionTran 4:e44cd8682f1c 24 #define THERM_FINGER_LOCATION 3
DuyLionTran 4:e44cd8682f1c 25 #define HRM_FINGER_LOCATION 3
DuyLionTran 4:e44cd8682f1c 26
DuyLionTran 4:e44cd8682f1c 27 #define PULSE_SENSOR_PIN A0
DuyLionTran 4:e44cd8682f1c 28 #define THERM_SENSOR_PIN A1
DuyLionTran 0:64ca984b3efd 29
DuyLionTran 0:64ca984b3efd 30 /* ======================= VARIABLES ========================= */
DuyLionTran 0:64ca984b3efd 31 /* GLOBAL VARIABLES */
DuyLionTran 0:64ca984b3efd 32 static float currentTemperature = 39.6;
DuyLionTran 0:64ca984b3efd 33 static uint8_t currentHRMCounter = 80;
DuyLionTran 0:64ca984b3efd 34
DuyLionTran 0:64ca984b3efd 35 /* PRIVATE VARIABLES */
DuyLionTran 0:64ca984b3efd 36 const static char DEVICE_NAME[] = "HEALTH STATE";
DuyLionTran 3:9b552b775c6e 37 static const uint16_t uuid16_list[] = {GattService::UUID_HEART_RATE_SERVICE, GattService::UUID_HEALTH_THERMOMETER_SERVICE};
DuyLionTran 0:64ca984b3efd 38
DuyLionTran 0:64ca984b3efd 39 /* STRUCTS/CLASSESS */
DuyLionTran 0:64ca984b3efd 40 static EventQueue eventQueue(EVENTS_EVENT_SIZE * 20);
DuyLionTran 0:64ca984b3efd 41 HealthCareService *HealthCareServicePtr;
DuyLionTran 3:9b552b775c6e 42 //PulseSensor PulseSensor();
DuyLionTran 0:64ca984b3efd 43
DuyLionTran 4:e44cd8682f1c 44 Serial serial(USBTX, USBRX);
DuyLionTran 4:e44cd8682f1c 45
DuyLionTran 0:64ca984b3efd 46 /* ================== FUNCTION PROTOTYPES ==================== */
DuyLionTran 4:e44cd8682f1c 47 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *);
DuyLionTran 4:e44cd8682f1c 48 void onBleInitError(BLE &ble, ble_error_t error);
DuyLionTran 4:e44cd8682f1c 49 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params);
DuyLionTran 4:e44cd8682f1c 50 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context);
DuyLionTran 4:e44cd8682f1c 51
DuyLionTran 4:e44cd8682f1c 52 void main_event(void);
DuyLionTran 4:e44cd8682f1c 53 void periodicCallback(void);
DuyLionTran 0:64ca984b3efd 54
DuyLionTran 0:64ca984b3efd 55 /* ==================== FUNCTION DETAILS ===================== */
DuyLionTran 0:64ca984b3efd 56 /* Restart Advertising on disconnection*/
DuyLionTran 0:64ca984b3efd 57 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *) {
DuyLionTran 0:64ca984b3efd 58 BLE::Instance().gap().startAdvertising();
DuyLionTran 0:64ca984b3efd 59 }
DuyLionTran 0:64ca984b3efd 60
DuyLionTran 0:64ca984b3efd 61 void main_event(void) {
DuyLionTran 0:64ca984b3efd 62 /* Do blocking calls or whatever is necessary for sensor polling.
DuyLionTran 0:64ca984b3efd 63 In our case, we simply update the Temperature measurement. */
DuyLionTran 0:64ca984b3efd 64 currentTemperature = (currentTemperature + 0.1 > 43.0) ? 39.6 : currentTemperature + 0.1;
DuyLionTran 0:64ca984b3efd 65 currentHRMCounter = (currentHRMCounter + 1 > 120) ? 80 : currentHRMCounter + 1;
DuyLionTran 4:e44cd8682f1c 66 if (BLE::Instance().gap().getState().connected) {
DuyLionTran 4:e44cd8682f1c 67 HealthCareServicePtr->updateTemperature(currentTemperature);
DuyLionTran 4:e44cd8682f1c 68 HealthCareServicePtr->updateHeartRate(currentHRMCounter);
DuyLionTran 4:e44cd8682f1c 69 }
DuyLionTran 4:e44cd8682f1c 70
DuyLionTran 0:64ca984b3efd 71 }
DuyLionTran 0:64ca984b3efd 72
DuyLionTran 0:64ca984b3efd 73 void periodicCallback(void) {
DuyLionTran 4:e44cd8682f1c 74 /* call main_event immediately */
DuyLionTran 4:e44cd8682f1c 75 eventQueue.call(main_event);
DuyLionTran 0:64ca984b3efd 76 }
DuyLionTran 0:64ca984b3efd 77
DuyLionTran 0:64ca984b3efd 78 void printMacAddress() {
DuyLionTran 0:64ca984b3efd 79 /* Print out device MAC address to the console*/
DuyLionTran 0:64ca984b3efd 80 Gap::AddressType_t addr_type;
DuyLionTran 0:64ca984b3efd 81 Gap::Address_t address;
DuyLionTran 0:64ca984b3efd 82 BLE::Instance().gap().getAddress(&addr_type, address);
DuyLionTran 0:64ca984b3efd 83 printf("DEVICE MAC ADDRESS: ");
DuyLionTran 0:64ca984b3efd 84 for (int i = 5; i >= 1; i--) {
DuyLionTran 0:64ca984b3efd 85 printf("%02x:", address[i]);
DuyLionTran 0:64ca984b3efd 86 }
DuyLionTran 0:64ca984b3efd 87 printf("%02x\r\n", address[0]);
DuyLionTran 0:64ca984b3efd 88 }
DuyLionTran 0:64ca984b3efd 89
DuyLionTran 0:64ca984b3efd 90 void onBleInitError(BLE &ble, ble_error_t error) {
DuyLionTran 0:64ca984b3efd 91 /* Initialization error handling should go here */
DuyLionTran 4:e44cd8682f1c 92
DuyLionTran 0:64ca984b3efd 93 }
DuyLionTran 0:64ca984b3efd 94
DuyLionTran 0:64ca984b3efd 95 /**
DuyLionTran 0:64ca984b3efd 96 * @brief Callback triggered when the ble initialization process has finished
DuyLionTran 0:64ca984b3efd 97 */
DuyLionTran 0:64ca984b3efd 98 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) {
DuyLionTran 0:64ca984b3efd 99 BLE& ble = params->ble;
DuyLionTran 0:64ca984b3efd 100 ble_error_t error = params->error;
DuyLionTran 0:64ca984b3efd 101
DuyLionTran 0:64ca984b3efd 102 if (error != BLE_ERROR_NONE) {
DuyLionTran 0:64ca984b3efd 103 onBleInitError(ble, error);
DuyLionTran 0:64ca984b3efd 104 return;
DuyLionTran 0:64ca984b3efd 105 }
DuyLionTran 0:64ca984b3efd 106
DuyLionTran 0:64ca984b3efd 107 /* Ensure that it is the default instance of BLE */
DuyLionTran 0:64ca984b3efd 108 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
DuyLionTran 0:64ca984b3efd 109 return;
DuyLionTran 0:64ca984b3efd 110 }
DuyLionTran 0:64ca984b3efd 111
DuyLionTran 0:64ca984b3efd 112 ble.gap().onDisconnection(disconnectionCallback);
DuyLionTran 4:e44cd8682f1c 113 HealthCareServicePtr = new HealthCareService(ble, currentTemperature, THERM_FINGER_LOCATION,
DuyLionTran 4:e44cd8682f1c 114 currentHRMCounter, HRM_FINGER_LOCATION);
DuyLionTran 0:64ca984b3efd 115
DuyLionTran 0:64ca984b3efd 116 /* setup advertising */
DuyLionTran 0:64ca984b3efd 117 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
DuyLionTran 0:64ca984b3efd 118 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
DuyLionTran 2:16f6cfcd7505 119 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_THERMOMETER );
DuyLionTran 0:64ca984b3efd 120 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_HEART_RATE_SENSOR);
DuyLionTran 0:64ca984b3efd 121 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
DuyLionTran 0:64ca984b3efd 122 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
DuyLionTran 0:64ca984b3efd 123 ble.gap().setAdvertisingInterval(1000); /* 1000ms. */
DuyLionTran 0:64ca984b3efd 124 ble.gap().startAdvertising();
DuyLionTran 0:64ca984b3efd 125
DuyLionTran 0:64ca984b3efd 126 printMacAddress();
DuyLionTran 0:64ca984b3efd 127 }
DuyLionTran 0:64ca984b3efd 128
DuyLionTran 0:64ca984b3efd 129 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
DuyLionTran 0:64ca984b3efd 130 BLE &ble = BLE::Instance();
DuyLionTran 0:64ca984b3efd 131 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
DuyLionTran 0:64ca984b3efd 132 }
DuyLionTran 0:64ca984b3efd 133
DuyLionTran 0:64ca984b3efd 134 /* MAIN FUNCTION */
DuyLionTran 0:64ca984b3efd 135 int main() {
DuyLionTran 4:e44cd8682f1c 136
DuyLionTran 4:e44cd8682f1c 137 serial.baud(115200);
DuyLionTran 4:e44cd8682f1c 138 printf("\r\n BODY WIRELESS SENSOR NETWORK\r\n");
DuyLionTran 4:e44cd8682f1c 139 /* call periodicCallback every 500ms */
DuyLionTran 0:64ca984b3efd 140 eventQueue.call_every(500, periodicCallback);
DuyLionTran 4:e44cd8682f1c 141
DuyLionTran 4:e44cd8682f1c 142 /* init BLE */
DuyLionTran 0:64ca984b3efd 143 BLE &ble = BLE::Instance();
DuyLionTran 0:64ca984b3efd 144 ble.onEventsToProcess(scheduleBleEventsProcessing);
DuyLionTran 0:64ca984b3efd 145 ble.init(bleInitComplete);
DuyLionTran 4:e44cd8682f1c 146
DuyLionTran 4:e44cd8682f1c 147 /* dispatch the event queue */
DuyLionTran 0:64ca984b3efd 148 eventQueue.dispatch_forever();
DuyLionTran 0:64ca984b3efd 149
DuyLionTran 0:64ca984b3efd 150 return 0;
DuyLionTran 0:64ca984b3efd 151 }