Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed X_NUCLEO_IDB0XA1 BLE_API
Revision 23:bcc213904a44, committed 2021-04-29
- Comitter:
- lucadevito
- Date:
- Thu Apr 29 16:55:17 2021 +0000
- Parent:
- 22:94afa3edefb3
- Commit message:
- 1st version
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Thu Aug 09 14:07:14 2018 +0000
+++ b/main.cpp Thu Apr 29 16:55:17 2021 +0000
@@ -16,34 +16,59 @@
#include "mbed.h"
#include "ble/BLE.h"
-#include "ble/services/HeartRateService.h"
+#include "HeartRateService.h"
+#include "BatteryService.h"
+#include "DeviceInformationService.h"
+
+Serial pc1(USBTX, USBRX);
+#define DEBUG(...) { pc1.printf(__VA_ARGS__); }
-#if !defined(IDB0XA1_D13_PATCH)
-DigitalOut led1(LED1, 1); // LED conflicts SPI_CLK in case of D13 patch
-#endif
+// ??? Initialize Ticker and DigitalOut objects
+// 1 DigitalOut object for Led 1
+// 2 Ticker objects: for aliveness and updating measurements
+DigitalOut ???????????
+Ticker ????????;
+Ticker ????????;
-const static char DEVICE_NAME[] = "HRM1";
-static const uint16_t uuid16_list[] = {GattService::UUID_HEART_RATE_SERVICE};
+// Initialize variables and tables
+// Define the device name (add your group number)
+const static char ?????????[] = "MY_BLE_HRM??";
+static const uint16_t uuid16_list[] = {GattService::UUID_HEART_RATE_SERVICE,
+ GattService::UUID_BATTERY_SERVICE,
+ GattService::UUID_DEVICE_INFORMATION_SERVICE};
-static volatile bool triggerSensorPolling = false;
+// ??? define flag for measurement updating
+static volatile bool ?????????????????????????
void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
{
+ DEBUG("Disconnected!\n\r");
+ DEBUG("Restarting the advertising process\n\r");
(void)params;
- BLE::Instance().gap().startAdvertising(); // restart advertising
+ // ??? Restart advertising
+ ??????????????????????????
+}
+
+// Connection Handler
+void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
+{
+ DEBUG("Connected\r\n");
}
-void periodicCallback(void)
-{
-#if !defined(IDB0XA1_D13_PATCH)
- led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
-#endif
+// ??? Define update Characteristics Handler update_handler
+// It must set the flag for update the heart rate
+void ???????????(void)
+{
+ ??????????????????????????
+}
- /* Note that the periodicCallback() executes in interrupt context, so it is safer to do
- * heavy-weight sensor polling from the main thread. */
- triggerSensorPolling = true;
+// ??? Define the Aliveness Handler, it must toggle the led 1
+void aliveness_handler (void)
+{
+ ????????????????????????
}
+
void onBleInitError(BLE &ble, ble_error_t error)
{
(void)ble;
@@ -55,6 +80,15 @@
{
BLE& ble = params->ble;
ble_error_t error = params->error;
+
+ // ??? Attach ticker objects to functions
+ // Two handlers:
+ // 1. aliveness_handler, with 500 ms timing, which toggles led1
+ // 2. update_handler, with 2 s timing, which sets a flag for the heart rate updating
+ ???????????????????????????
+ ???????????????????????????
+
+ DEBUG("Initialising \n\r");
if (error != BLE_ERROR_NONE) {
onBleInitError(ble, error);
@@ -66,37 +100,68 @@
}
ble.gap().onDisconnection(disconnectionCallback);
+ ble.gap().onConnection(connectionCallback);
+
+ // Setup BLE device services
- /* Setup primary service. */
- uint8_t hrmCounter = 60; // init HRM to 60bps
- HeartRateService hrService(ble, hrmCounter, HeartRateService::LOCATION_FINGER);
+ /* ??? Setup primary service. */
+ // Define and init variable for heart rate simulation (it can be a uint8_t)
+ uint8_t ????????????????? = ???;
+ /* Declare and init (call constructor) HeartRateService object
+ * Constructor is:
+ * HeartRateService(BLE &_ble, uint8_t hrmCounter, uint8_t location)
+ * for location you can use HeartRateService::LOCATION_FINGER */
+ HeartRateService ????????????????;
+
+ /* ??? Setup battery level service. */
+ // Define and init variable for battery level simulation (it can be a uint8_t)
+ uint8_t ?????????? = ???;
+ /* Declare and init (call constructor) BatteryService object
+ * Constructor is:
+ * BatteryService(BLE &_ble, uint8_t level = 100) */
+ BatteryService ????????????????;
+ /* Declare and init (call constructor) DeviceInformationService object
+ * Constructor is:
+ * DeviceInformationService(BLE &_ble,
+ const char *manufacturersName = NULL,
+ const char *modelNumber = NULL,
+ const char *serialNumber = NULL,
+ const char *hardwareRevision = NULL,
+ const char *firmwareRevision = NULL,
+ const char *softwareRevision = NULL)
+ * You can use manufacturerName = "ST", modelNumber = "Nucleo", serialNumber = "SN1"*/
+ DeviceInformationService ???????????????;
/* Setup advertising. */
ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
- ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
- ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_HEART_RATE_SENSOR);
- ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
+ // ??? Add the complete list of services provided to the advertising payload (GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS)
+ ble.gap().??????????????????????????????????
+ // ??? Add the heart rate service to the advertising payload (GapAdvertisingData::GENERIC_HEART_RATE_SENSOR)
+ ble.gap().??????????????????????????????????
+ // ??? Add the device name to the advertising payload (GapAdvertisingData::COMPLETE_LOCAL_NAME)
+ ble.gap().??????????????????????????????????
ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
- ble.gap().setAdvertisingInterval(1000); /* 1000ms */
- ble.gap().startAdvertising();
+ // Set advertising interval to 1 s
+ ble.gap().??????????????????????????????????
+ // ??? Start advertising, call the appropriate methods of the GAP object
+ ble.gap().????????????????;
// infinite loop
while (true) {
- // check for trigger from periodicCallback()
- if (triggerSensorPolling && ble.getGapState().connected) {
- triggerSensorPolling = false;
-
- // Do blocking calls or whatever is necessary for sensor polling.
- // In our case, we simply update the HRM measurement.
- hrmCounter++;
+ // check for from update_handler()
+ if (???????????????????? && ble.getGapState().connected) {
+ //??? Reset flag
+ ?????????????????????
+
+ // ??? Update the heart rate counter
+ // increase by 1. If equal to 150, then reset to 80
+ ?????????????
+ ?????????????
+ ?????????????
+ ?????????????
- // 60 <= HRM bps <= 100
- if (hrmCounter == 100) {
- hrmCounter = 60;
- }
-
- // update bps
- hrService.updateHeartRate(hrmCounter);
+ // ??? Update value of heart rate service
+ ?????????????????????????
} else {
ble.waitForEvent(); // low power wait for event
}
@@ -105,9 +170,6 @@
int main(void)
{
- Ticker ticker;
- ticker.attach(periodicCallback, 1); // blink LED every second
-
BLE::Instance().init(bleInitComplete);
}