Maxim Integrated's IoT development kit.

Dependencies:   MAX30101 MAX30003 MAX113XX_Pixi MAX30205 max32630fthr USBDevice

Committer:
Mahir Ozturk
Date:
Thu Jul 19 18:27:45 2018 +0300
Revision:
16:503f8308e2db
Parent:
15:0d47d5879a21
Update mbed-os to fix the bug: Symbol __user_perthread_libspace multiply defined

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Mahir Ozturk 1:efe9cad8942f 1 /*******************************************************************************
Mahir Ozturk 1:efe9cad8942f 2 * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
Mahir Ozturk 1:efe9cad8942f 3 *
Mahir Ozturk 1:efe9cad8942f 4 * Permission is hereby granted, free of charge, to any person obtaining a
Mahir Ozturk 1:efe9cad8942f 5 * copy of this software and associated documentation files (the "Software"),
Mahir Ozturk 1:efe9cad8942f 6 * to deal in the Software without restriction, including without limitation
Mahir Ozturk 1:efe9cad8942f 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
Mahir Ozturk 1:efe9cad8942f 8 * and/or sell copies of the Software, and to permit persons to whom the
Mahir Ozturk 1:efe9cad8942f 9 * Software is furnished to do so, subject to the following conditions:
Mahir Ozturk 1:efe9cad8942f 10 *
Mahir Ozturk 1:efe9cad8942f 11 * The above copyright notice and this permission notice shall be included
Mahir Ozturk 1:efe9cad8942f 12 * in all copies or substantial portions of the Software.
Mahir Ozturk 1:efe9cad8942f 13 *
Mahir Ozturk 1:efe9cad8942f 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Mahir Ozturk 1:efe9cad8942f 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Mahir Ozturk 1:efe9cad8942f 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Mahir Ozturk 1:efe9cad8942f 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
Mahir Ozturk 1:efe9cad8942f 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
Mahir Ozturk 1:efe9cad8942f 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
Mahir Ozturk 1:efe9cad8942f 20 * OTHER DEALINGS IN THE SOFTWARE.
Mahir Ozturk 1:efe9cad8942f 21 *
Mahir Ozturk 1:efe9cad8942f 22 * Except as contained in this notice, the name of Maxim Integrated
Mahir Ozturk 1:efe9cad8942f 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
Mahir Ozturk 1:efe9cad8942f 24 * Products, Inc. Branding Policy.
Mahir Ozturk 1:efe9cad8942f 25 *
Mahir Ozturk 1:efe9cad8942f 26 * The mere transfer of this software does not imply any licenses
Mahir Ozturk 1:efe9cad8942f 27 * of trade secrets, proprietary technology, copyrights, patents,
Mahir Ozturk 1:efe9cad8942f 28 * trademarks, maskwork rights, or any other form of intellectual
Mahir Ozturk 1:efe9cad8942f 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
Mahir Ozturk 1:efe9cad8942f 30 * ownership rights.
Mahir Ozturk 1:efe9cad8942f 31 *******************************************************************************
Mahir Ozturk 1:efe9cad8942f 32 */
Mahir Ozturk 7:2c9c8b6a28a7 33 #include <mbed.h>
Mahir Ozturk 1:efe9cad8942f 34 #include <events/mbed_events.h>
Mahir Ozturk 1:efe9cad8942f 35 #include <rtos.h>
mahirozturk 11:04292fba5078 36 #include "config.h"
Mahir Ozturk 1:efe9cad8942f 37 #include "ble/BLE.h"
Mahir Ozturk 1:efe9cad8942f 38 #include "ble/Gap.h"
Mahir Ozturk 1:efe9cad8942f 39 #include "max32630fthr.h"
Mahir Ozturk 15:0d47d5879a21 40 #include "ble_gatt.h"
Mahir Ozturk 13:fba77a5d0fa0 41 #if defined(LIB_MAX30205)
Mahir Ozturk 13:fba77a5d0fa0 42 # include "max30205_app.h"
Mahir Ozturk 13:fba77a5d0fa0 43 #endif
Mahir Ozturk 13:fba77a5d0fa0 44 #if defined(LIB_MAX30101)
Mahir Ozturk 13:fba77a5d0fa0 45 # include "max30101_app.h"
Mahir Ozturk 1:efe9cad8942f 46 #endif
Mahir Ozturk 13:fba77a5d0fa0 47 #if defined(LIB_MAX30003)
Mahir Ozturk 13:fba77a5d0fa0 48 # include "max30003_app.h"
Mahir Ozturk 13:fba77a5d0fa0 49 #endif
Mahir Ozturk 13:fba77a5d0fa0 50 #if defined(LIB_MAX113XX_PIXI)
Mahir Ozturk 13:fba77a5d0fa0 51 # include "max113xx_pixi_app.h"
Mahir Ozturk 1:efe9cad8942f 52 #endif
Mahir Ozturk 1:efe9cad8942f 53
Mahir Ozturk 1:efe9cad8942f 54
Mahir Ozturk 1:efe9cad8942f 55 /******************************************************************************/
Mahir Ozturk 1:efe9cad8942f 56
Mahir Ozturk 1:efe9cad8942f 57 MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
Mahir Ozturk 1:efe9cad8942f 58
Mahir Ozturk 1:efe9cad8942f 59 InterruptIn button(P2_3);
Mahir Ozturk 1:efe9cad8942f 60
Mahir Ozturk 1:efe9cad8942f 61 SPI spim2(SPI2_MOSI, SPI2_MISO, SPI2_SCK);
Mahir Ozturk 1:efe9cad8942f 62
Mahir Ozturk 1:efe9cad8942f 63 I2C i2c1(I2C1_SDA, I2C1_SCL); /* I2C bus, P3_4 = SDA, P3_5 = SCL */
Mahir Ozturk 1:efe9cad8942f 64
Mahir Ozturk 1:efe9cad8942f 65 /* LEDs */
Mahir Ozturk 1:efe9cad8942f 66 DigitalOut rLED(LED1, LED_OFF);
Mahir Ozturk 1:efe9cad8942f 67 DigitalOut gLED(LED2, LED_OFF);
Mahir Ozturk 1:efe9cad8942f 68 DigitalOut bLED(LED3, LED_OFF);
Mahir Ozturk 1:efe9cad8942f 69
Mahir Ozturk 1:efe9cad8942f 70 /* Hardware serial port over DAPLink */
Mahir Ozturk 1:efe9cad8942f 71 Serial daplink(USBTX, USBRX, 115200);
Mahir Ozturk 1:efe9cad8942f 72
Mahir Ozturk 15:0d47d5879a21 73 int alive_led_event_id;
Mahir Ozturk 2:68ffd74e3b5c 74
Mahir Ozturk 1:efe9cad8942f 75 /******************************************************************************/
Mahir Ozturk 1:efe9cad8942f 76 const static char DEVICE_NAME[] = MAXIM_PLATFORM_NAME;
Mahir Ozturk 15:0d47d5879a21 77 //static const uint16_t uuid16_list[] = {0xFFFF}; //Custom UUID, FFFF is reserved for development
Mahir Ozturk 1:efe9cad8942f 78
Mahir Ozturk 1:efe9cad8942f 79 /* Set Up custom Characteristics */
Mahir Ozturk 15:0d47d5879a21 80 UUID iot_service_uuid("00001520-1d66-11e8-b467-0ed5f89f718b");
Mahir Ozturk 15:0d47d5879a21 81
Mahir Ozturk 15:0d47d5879a21 82 static ble_desc_gatt_cpf_t cpf_float32 = {.format = BLE_DESC_GATT_CPF_FORMAT_FLOAT32};
Mahir Ozturk 15:0d47d5879a21 83 static ble_desc_gatt_cpf_t cpf_uint16 = {.format = BLE_DESC_GATT_CPF_FORMAT_UINT16};
Mahir Ozturk 15:0d47d5879a21 84 static ble_desc_gatt_cpf_t cpf_uint8 = {.format = BLE_DESC_GATT_CPF_FORMAT_UINT8};
Mahir Ozturk 15:0d47d5879a21 85
Mahir Ozturk 15:0d47d5879a21 86 GattAttribute gatt_attr_cpf_format_float32(BLE_UUID_DESCRIPTOR_CHAR_PRESENTATION_FORMAT, (uint8_t *)&cpf_float32, sizeof(ble_desc_gatt_cpf_t));
Mahir Ozturk 15:0d47d5879a21 87 GattAttribute gatt_attr_cpf_format_uint16(BLE_UUID_DESCRIPTOR_CHAR_PRESENTATION_FORMAT, (uint8_t *)&cpf_uint16, sizeof(ble_desc_gatt_cpf_t));
Mahir Ozturk 15:0d47d5879a21 88 GattAttribute gatt_attr_cpf_format_uint8(BLE_UUID_DESCRIPTOR_CHAR_PRESENTATION_FORMAT, (uint8_t *)&cpf_uint8, sizeof(ble_desc_gatt_cpf_t));
Mahir Ozturk 1:efe9cad8942f 89
Mahir Ozturk 15:0d47d5879a21 90 UUID gatt_char_uuid_pushbutton("00001522-1d66-11e8-b467-0ed5f89f718b");
Mahir Ozturk 15:0d47d5879a21 91 static uint8_t pushbutton_press_count = 0;
Mahir Ozturk 15:0d47d5879a21 92 GattAttribute pushbutton_user_desc_descriptor(BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)"Push Button", sizeof("Push Button"));
Mahir Ozturk 15:0d47d5879a21 93 GattAttribute *pushbutton_descriptors[] = {&pushbutton_user_desc_descriptor, &gatt_attr_cpf_format_uint8};
Mahir Ozturk 15:0d47d5879a21 94 GattCharacteristic gatt_char_pushbutton(gatt_char_uuid_pushbutton, &pushbutton_press_count, 1, 1,
Mahir Ozturk 15:0d47d5879a21 95 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY,
Mahir Ozturk 15:0d47d5879a21 96 pushbutton_descriptors,
Mahir Ozturk 15:0d47d5879a21 97 sizeof(pushbutton_descriptors) / sizeof(GattAttribute*));
Mahir Ozturk 1:efe9cad8942f 98
Mahir Ozturk 15:0d47d5879a21 99 UUID gatt_char_uuid_led("00001523-1d66-11e8-b467-0ed5f89f718b");
Mahir Ozturk 15:0d47d5879a21 100 static uint8_t led_init_value[] = {LED_OFF, LED_OFF, LED_OFF};
Mahir Ozturk 15:0d47d5879a21 101 GattAttribute led_user_desc_descriptor(BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)"LED", sizeof("LED"));
Mahir Ozturk 15:0d47d5879a21 102 GattAttribute *led_descriptors[] = {&led_user_desc_descriptor};
Mahir Ozturk 15:0d47d5879a21 103 ReadWriteArrayGattCharacteristic<uint8_t, sizeof(led_init_value)> gatt_char_led(gatt_char_uuid_led, led_init_value,
Mahir Ozturk 15:0d47d5879a21 104 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NONE,
Mahir Ozturk 15:0d47d5879a21 105 led_descriptors,
Mahir Ozturk 15:0d47d5879a21 106 sizeof(led_descriptors) / sizeof(GattAttribute*));
Mahir Ozturk 1:efe9cad8942f 107
Mahir Ozturk 13:fba77a5d0fa0 108 #if defined(LIB_MAX30003)
Mahir Ozturk 15:0d47d5879a21 109 UUID gatt_char_uuid_bpm("00001524-1d66-11e8-b467-0ed5f89f718b");
Mahir Ozturk 15:0d47d5879a21 110 static float bpm_init_value;
Mahir Ozturk 15:0d47d5879a21 111 GattAttribute bpm_user_desc_descriptor(BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)"BPM", sizeof("BPM"));
Mahir Ozturk 15:0d47d5879a21 112 GattAttribute *bpm_descriptors[] = {&bpm_user_desc_descriptor, &gatt_attr_cpf_format_float32};
Mahir Ozturk 15:0d47d5879a21 113 ReadOnlyGattCharacteristic<float> gatt_char_bpm(gatt_char_uuid_bpm, &bpm_init_value,
Mahir Ozturk 15:0d47d5879a21 114 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY,
Mahir Ozturk 15:0d47d5879a21 115 bpm_descriptors,
Mahir Ozturk 15:0d47d5879a21 116 sizeof(bpm_descriptors) / sizeof(GattAttribute*));
Mahir Ozturk 1:efe9cad8942f 117 #endif
Mahir Ozturk 1:efe9cad8942f 118
Mahir Ozturk 1:efe9cad8942f 119 #if defined(LIB_MAX30101)
Mahir Ozturk 15:0d47d5879a21 120 UUID gatt_char_uuid_heartrate("00001525-1d66-11e8-b467-0ed5f89f718b");
Mahir Ozturk 15:0d47d5879a21 121 static uint16_t heartrate_init_value;
Mahir Ozturk 15:0d47d5879a21 122 GattAttribute heartrate_user_desc_descriptor(BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)"Heart Rate", sizeof("Heart Rate"));
Mahir Ozturk 15:0d47d5879a21 123 GattAttribute *heartrate_descriptors[] = {&heartrate_user_desc_descriptor, &gatt_attr_cpf_format_uint16};
Mahir Ozturk 15:0d47d5879a21 124 ReadOnlyGattCharacteristic<uint16_t> gatt_char_heartrate(gatt_char_uuid_heartrate,
Mahir Ozturk 15:0d47d5879a21 125 &heartrate_init_value,
Mahir Ozturk 15:0d47d5879a21 126 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY,
Mahir Ozturk 15:0d47d5879a21 127 heartrate_descriptors,
Mahir Ozturk 15:0d47d5879a21 128 sizeof(heartrate_descriptors) / sizeof(GattAttribute*));
Mahir Ozturk 1:efe9cad8942f 129
Mahir Ozturk 15:0d47d5879a21 130 UUID gatt_char_uuid_spo2("00001526-1d66-11e8-b467-0ed5f89f718b");
Mahir Ozturk 15:0d47d5879a21 131 static uint16_t spo2_init_value;
Mahir Ozturk 15:0d47d5879a21 132 GattAttribute spo2_user_desc_descriptor(BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)"SPO2", sizeof("SPO2"));
Mahir Ozturk 15:0d47d5879a21 133 GattAttribute *spo2_descriptors[] = {&spo2_user_desc_descriptor, &gatt_attr_cpf_format_uint16};
Mahir Ozturk 15:0d47d5879a21 134 ReadOnlyGattCharacteristic<uint16_t> gatt_char_spo2(gatt_char_uuid_spo2,
Mahir Ozturk 15:0d47d5879a21 135 &spo2_init_value,
Mahir Ozturk 15:0d47d5879a21 136 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY,
Mahir Ozturk 15:0d47d5879a21 137 spo2_descriptors,
Mahir Ozturk 15:0d47d5879a21 138 sizeof(spo2_descriptors) / sizeof(GattAttribute*));
Mahir Ozturk 1:efe9cad8942f 139 #endif
Mahir Ozturk 1:efe9cad8942f 140
Mahir Ozturk 1:efe9cad8942f 141 #if defined(LIB_MAX113XX_PIXI)
Mahir Ozturk 15:0d47d5879a21 142 UUID gatt_char_uuid_voltage("00001527-1d66-11e8-b467-0ed5f89f718b");
Mahir Ozturk 15:0d47d5879a21 143 static float voltage_init_value;
Mahir Ozturk 15:0d47d5879a21 144 GattAttribute voltage_user_desc_descriptor(BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)"ADC Voltage", sizeof("ADC Voltage"));
Mahir Ozturk 15:0d47d5879a21 145 GattAttribute *voltage_descriptors[] = {&voltage_user_desc_descriptor, &gatt_attr_cpf_format_float32};
Mahir Ozturk 15:0d47d5879a21 146 ReadOnlyGattCharacteristic<float> gatt_char_voltage(gatt_char_uuid_voltage,
Mahir Ozturk 15:0d47d5879a21 147 &voltage_init_value,
Mahir Ozturk 15:0d47d5879a21 148 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY,
Mahir Ozturk 15:0d47d5879a21 149 voltage_descriptors,
Mahir Ozturk 15:0d47d5879a21 150 sizeof(voltage_descriptors) / sizeof(GattAttribute*));
Mahir Ozturk 1:efe9cad8942f 151 #endif
Mahir Ozturk 1:efe9cad8942f 152
Mahir Ozturk 1:efe9cad8942f 153 #if defined(LIB_MAX30205)
Mahir Ozturk 15:0d47d5879a21 154 UUID gatt_char_uuid_temp("00001528-1d66-11e8-b467-0ed5f89f718b");
Mahir Ozturk 15:0d47d5879a21 155 static float temp_init_value;
Mahir Ozturk 15:0d47d5879a21 156 GattAttribute temp_user_desc_descriptor(BLE_UUID_DESCRIPTOR_CHAR_USER_DESC, (uint8_t *)"Temperature", sizeof("Temperature"));
Mahir Ozturk 15:0d47d5879a21 157 GattAttribute *temp_descriptors[] = {&temp_user_desc_descriptor, &gatt_attr_cpf_format_float32};
Mahir Ozturk 15:0d47d5879a21 158 ReadOnlyGattCharacteristic<float> gatt_char_temp(gatt_char_uuid_temp,
Mahir Ozturk 15:0d47d5879a21 159 &temp_init_value,
Mahir Ozturk 15:0d47d5879a21 160 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY,
Mahir Ozturk 15:0d47d5879a21 161 temp_descriptors,
Mahir Ozturk 15:0d47d5879a21 162 sizeof(temp_descriptors) / sizeof(GattAttribute*));
Mahir Ozturk 1:efe9cad8942f 163 #endif
Mahir Ozturk 1:efe9cad8942f 164
Mahir Ozturk 1:efe9cad8942f 165 /* Set up custom service */
Mahir Ozturk 15:0d47d5879a21 166 GattCharacteristic *characteristics[] = {&gatt_char_led, &gatt_char_pushbutton,
Mahir Ozturk 13:fba77a5d0fa0 167 #if defined(LIB_MAX30003)
Mahir Ozturk 15:0d47d5879a21 168 &gatt_char_bpm,
Mahir Ozturk 1:efe9cad8942f 169 #endif
Mahir Ozturk 1:efe9cad8942f 170 #if defined(LIB_MAX30205)
Mahir Ozturk 15:0d47d5879a21 171 &gatt_char_temp,
Mahir Ozturk 1:efe9cad8942f 172 #endif
Mahir Ozturk 1:efe9cad8942f 173 #if defined(LIB_MAX30101)
Mahir Ozturk 15:0d47d5879a21 174 &gatt_char_heartrate,
Mahir Ozturk 15:0d47d5879a21 175 &gatt_char_spo2,
Mahir Ozturk 1:efe9cad8942f 176 #endif
Mahir Ozturk 1:efe9cad8942f 177 #if defined(LIB_MAX113XX_PIXI)
Mahir Ozturk 15:0d47d5879a21 178 &gatt_char_voltage,
Mahir Ozturk 1:efe9cad8942f 179 #endif
Mahir Ozturk 1:efe9cad8942f 180 };
Mahir Ozturk 1:efe9cad8942f 181
Mahir Ozturk 15:0d47d5879a21 182 GattService iot_gatt_service(iot_service_uuid, characteristics, sizeof(characteristics) / sizeof(GattCharacteristic *));
Mahir Ozturk 1:efe9cad8942f 183
Mahir Ozturk 1:efe9cad8942f 184 /******************************************************************************/
Mahir Ozturk 1:efe9cad8942f 185
Mahir Ozturk 1:efe9cad8942f 186 static EventQueue eventQueue(/* event count */ 10 * /* event size */ 32);
Mahir Ozturk 1:efe9cad8942f 187
Mahir Ozturk 1:efe9cad8942f 188 void updateButtonState(uint8_t newState) {
Mahir Ozturk 1:efe9cad8942f 189 printf("Button pressed...\r\n");
Mahir Ozturk 15:0d47d5879a21 190 bleGattAttrWrite(gatt_char_pushbutton.getValueHandle(), (uint8_t *)&newState, sizeof(uint8_t));
Mahir Ozturk 1:efe9cad8942f 191 }
Mahir Ozturk 1:efe9cad8942f 192
Mahir Ozturk 1:efe9cad8942f 193 void buttonPressedCallback(void)
Mahir Ozturk 1:efe9cad8942f 194 {
Mahir Ozturk 15:0d47d5879a21 195 eventQueue.call(Callback<void(uint8_t)>(&updateButtonState), ++pushbutton_press_count);
Mahir Ozturk 1:efe9cad8942f 196 }
Mahir Ozturk 1:efe9cad8942f 197
Mahir Ozturk 1:efe9cad8942f 198 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
Mahir Ozturk 1:efe9cad8942f 199 {
Mahir Ozturk 1:efe9cad8942f 200 printf("disc\r\n");
Mahir Ozturk 10:dbeda3ffffb8 201 BLE::Instance().gap().startAdvertising(); // restart advertising
Mahir Ozturk 1:efe9cad8942f 202 }
Mahir Ozturk 1:efe9cad8942f 203
Mahir Ozturk 1:efe9cad8942f 204 /* Connection */
Mahir Ozturk 1:efe9cad8942f 205 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
Mahir Ozturk 1:efe9cad8942f 206 {
Mahir Ozturk 1:efe9cad8942f 207 printf("succ\r\n");
Mahir Ozturk 1:efe9cad8942f 208 }
Mahir Ozturk 1:efe9cad8942f 209
Mahir Ozturk 1:efe9cad8942f 210 void blinkCallback(void)
Mahir Ozturk 1:efe9cad8942f 211 {
Mahir Ozturk 2:68ffd74e3b5c 212 gLED = !gLED;
Mahir Ozturk 1:efe9cad8942f 213 }
Mahir Ozturk 1:efe9cad8942f 214
Mahir Ozturk 1:efe9cad8942f 215 void onBleInitError(BLE &ble, ble_error_t error)
Mahir Ozturk 1:efe9cad8942f 216 {
Mahir Ozturk 10:dbeda3ffffb8 217 /* Initialization error handling should go here */
Mahir Ozturk 1:efe9cad8942f 218 }
Mahir Ozturk 1:efe9cad8942f 219
Mahir Ozturk 1:efe9cad8942f 220 /**
Mahir Ozturk 1:efe9cad8942f 221 * This callback allows the LEDService to receive updates to the ledState Characteristic.
Mahir Ozturk 1:efe9cad8942f 222 *
Mahir Ozturk 1:efe9cad8942f 223 * @param[in] params
Mahir Ozturk 1:efe9cad8942f 224 * Information about the characteristic being updated.
Mahir Ozturk 1:efe9cad8942f 225 */
Mahir Ozturk 1:efe9cad8942f 226 void onDataWrittenCallback(const GattWriteCallbackParams *params)
Mahir Ozturk 1:efe9cad8942f 227 {
Mahir Ozturk 15:0d47d5879a21 228 if ((params->handle == gatt_char_led.getValueHandle()) && (params->len >= 3)) {
Mahir Ozturk 10:dbeda3ffffb8 229 rLED = (params->data[0] != 0) ? LED_OFF : LED_ON;
Mahir Ozturk 10:dbeda3ffffb8 230 gLED = (params->data[1] != 0) ? LED_OFF : LED_ON;
Mahir Ozturk 10:dbeda3ffffb8 231 bLED = (params->data[2] != 0) ? LED_OFF : LED_ON;
Mahir Ozturk 10:dbeda3ffffb8 232 }
Mahir Ozturk 1:efe9cad8942f 233 }
Mahir Ozturk 1:efe9cad8942f 234
Mahir Ozturk 1:efe9cad8942f 235 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
Mahir Ozturk 1:efe9cad8942f 236 {
Mahir Ozturk 10:dbeda3ffffb8 237 BLE& ble = params->ble;
Mahir Ozturk 10:dbeda3ffffb8 238 ble_error_t error = params->error;
Mahir Ozturk 1:efe9cad8942f 239
Mahir Ozturk 10:dbeda3ffffb8 240 if (error != BLE_ERROR_NONE) {
Mahir Ozturk 10:dbeda3ffffb8 241 /* In case of error, forward the error handling to onBleInitError */
Mahir Ozturk 10:dbeda3ffffb8 242 onBleInitError(ble, error);
Mahir Ozturk 10:dbeda3ffffb8 243 return;
Mahir Ozturk 10:dbeda3ffffb8 244 }
Mahir Ozturk 1:efe9cad8942f 245
Mahir Ozturk 10:dbeda3ffffb8 246 /* Ensure that it is the default instance of BLE */
Mahir Ozturk 10:dbeda3ffffb8 247 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
Mahir Ozturk 10:dbeda3ffffb8 248 return;
Mahir Ozturk 10:dbeda3ffffb8 249 }
Mahir Ozturk 1:efe9cad8942f 250
Mahir Ozturk 10:dbeda3ffffb8 251 ble.gap().onDisconnection(disconnectionCallback);
Mahir Ozturk 10:dbeda3ffffb8 252 ble.gap().onConnection(connectionCallback);
Mahir Ozturk 1:efe9cad8942f 253
Mahir Ozturk 10:dbeda3ffffb8 254 ble.gattServer().onDataWritten(onDataWrittenCallback);
Mahir Ozturk 1:efe9cad8942f 255
Mahir Ozturk 15:0d47d5879a21 256 ble.gattServer().addService(iot_gatt_service);
Mahir Ozturk 1:efe9cad8942f 257
Mahir Ozturk 10:dbeda3ffffb8 258 /* setup advertising */
Mahir Ozturk 10:dbeda3ffffb8 259 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
Mahir Ozturk 15:0d47d5879a21 260 //ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
Mahir Ozturk 10:dbeda3ffffb8 261 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
Mahir Ozturk 10:dbeda3ffffb8 262 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
Mahir Ozturk 10:dbeda3ffffb8 263 ble.gap().setAdvertisingInterval(1000); /* 1000ms. */
Mahir Ozturk 10:dbeda3ffffb8 264 ble.gap().startAdvertising();
Mahir Ozturk 1:efe9cad8942f 265
Mahir Ozturk 10:dbeda3ffffb8 266 button.fall(buttonPressedCallback);
Mahir Ozturk 1:efe9cad8942f 267 }
Mahir Ozturk 1:efe9cad8942f 268
Mahir Ozturk 1:efe9cad8942f 269 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
Mahir Ozturk 10:dbeda3ffffb8 270 BLE &ble = BLE::Instance();
Mahir Ozturk 10:dbeda3ffffb8 271 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
Mahir Ozturk 1:efe9cad8942f 272 }
Mahir Ozturk 1:efe9cad8942f 273
Mahir Ozturk 1:efe9cad8942f 274 int main()
Mahir Ozturk 1:efe9cad8942f 275 {
Mahir Ozturk 1:efe9cad8942f 276 osStatus status;
Mahir Ozturk 13:fba77a5d0fa0 277 rLED = LED_OFF; gLED = LED_OFF; bLED = LED_OFF;
Mahir Ozturk 1:efe9cad8942f 278
Mahir Ozturk 15:0d47d5879a21 279 alive_led_event_id = eventQueue.call_every(1000, blinkCallback);
Mahir Ozturk 1:efe9cad8942f 280
Mahir Ozturk 13:fba77a5d0fa0 281 printf("Initializing BLE service...\r\n");
Mahir Ozturk 1:efe9cad8942f 282
Mahir Ozturk 2:68ffd74e3b5c 283 BLE &ble = BLE::Instance();
Mahir Ozturk 2:68ffd74e3b5c 284 ble.onEventsToProcess(scheduleBleEventsProcessing);
Mahir Ozturk 2:68ffd74e3b5c 285 ble.init(bleInitComplete);
Mahir Ozturk 1:efe9cad8942f 286
Mahir Ozturk 1:efe9cad8942f 287 #if defined(LIB_MAX30205)
Mahir Ozturk 13:fba77a5d0fa0 288 Thread thread_max30205_reader;
Mahir Ozturk 13:fba77a5d0fa0 289 struct max30205_reader_task_args args_max30205 = {
Mahir Ozturk 13:fba77a5d0fa0 290 i2c1,
Mahir Ozturk 15:0d47d5879a21 291 gatt_char_temp.getValueHandle(),
Mahir Ozturk 13:fba77a5d0fa0 292 MAX30205_BLE_NOTIFY_PERIOD_SEC};
Mahir Ozturk 13:fba77a5d0fa0 293 status = thread_max30205_reader.start(callback(max30205_reader_task, &args_max30205));
Mahir Ozturk 2:68ffd74e3b5c 294 if (status != osOK) {
Mahir Ozturk 13:fba77a5d0fa0 295 printf("Starting thread_max30205_reader thread failed(%ld)!\r\n", status);
Mahir Ozturk 2:68ffd74e3b5c 296 }
Mahir Ozturk 1:efe9cad8942f 297 #endif
Mahir Ozturk 1:efe9cad8942f 298
Mahir Ozturk 1:efe9cad8942f 299 #if defined(LIB_MAX30101)
Mahir Ozturk 13:fba77a5d0fa0 300 Thread thread_max30101_reader;
Mahir Ozturk 13:fba77a5d0fa0 301 struct max30101_reader_task_args args_max30101 = {
Mahir Ozturk 13:fba77a5d0fa0 302 &thread_max30101_reader,
Mahir Ozturk 13:fba77a5d0fa0 303 i2c1, P3_2, P3_3,
Mahir Ozturk 15:0d47d5879a21 304 gatt_char_heartrate.getValueHandle(),
Mahir Ozturk 15:0d47d5879a21 305 gatt_char_spo2.getValueHandle(),
Mahir Ozturk 13:fba77a5d0fa0 306 MAX30101_BLE_NOTIFY_PERIOD_SEC};
Mahir Ozturk 13:fba77a5d0fa0 307 status = thread_max30101_reader.start(callback(max30101_reader_task, &args_max30101));
Mahir Ozturk 2:68ffd74e3b5c 308 if (status != osOK) {
Mahir Ozturk 13:fba77a5d0fa0 309 printf("Starting thread_max30205_reader thread failed(%ld)!\r\n", status);
Mahir Ozturk 2:68ffd74e3b5c 310 }
Mahir Ozturk 1:efe9cad8942f 311 #endif
Mahir Ozturk 1:efe9cad8942f 312
Mahir Ozturk 1:efe9cad8942f 313 #if defined(LIB_MAX30003)
Mahir Ozturk 13:fba77a5d0fa0 314 Thread thread_max30003_reader;
Mahir Ozturk 13:fba77a5d0fa0 315 struct max30003_reader_task_args args_max30003 = {
Mahir Ozturk 13:fba77a5d0fa0 316 &thread_max30003_reader,
Mahir Ozturk 13:fba77a5d0fa0 317 spim2, SPI2_SS,
Mahir Ozturk 15:0d47d5879a21 318 gatt_char_bpm.getValueHandle(),
Mahir Ozturk 13:fba77a5d0fa0 319 MAX30003_BLE_NOTIFY_PERIOD_SEC};
Mahir Ozturk 13:fba77a5d0fa0 320 status = thread_max30003_reader.start(callback(max30003_reader_task, &args_max30003));
Mahir Ozturk 2:68ffd74e3b5c 321 if (status != osOK) {
Mahir Ozturk 13:fba77a5d0fa0 322 printf("Starting thread_max30205_reader thread failed(%ld)!\r\n", status);
Mahir Ozturk 2:68ffd74e3b5c 323 }
Mahir Ozturk 1:efe9cad8942f 324 #endif
Mahir Ozturk 1:efe9cad8942f 325
Mahir Ozturk 1:efe9cad8942f 326 #if defined(LIB_MAX113XX_PIXI)
Mahir Ozturk 13:fba77a5d0fa0 327 Thread thread_max11301_reader;
Mahir Ozturk 13:fba77a5d0fa0 328 struct max11301_reader_task_args args_max11301 = {
Mahir Ozturk 13:fba77a5d0fa0 329 i2c1,
Mahir Ozturk 15:0d47d5879a21 330 gatt_char_voltage.getValueHandle(),
Mahir Ozturk 13:fba77a5d0fa0 331 MAX113XX_PIXI_BLE_NOTIFY_PERIOD_SEC};
Mahir Ozturk 13:fba77a5d0fa0 332 status = thread_max11301_reader.start(callback(max11301_reader_task, &args_max11301));
Mahir Ozturk 2:68ffd74e3b5c 333 if (status != osOK) {
Mahir Ozturk 13:fba77a5d0fa0 334 printf("Starting thread_max30205_reader thread failed(%ld)!\r\n", status);
Mahir Ozturk 2:68ffd74e3b5c 335 }
Mahir Ozturk 1:efe9cad8942f 336 #endif
Mahir Ozturk 1:efe9cad8942f 337
Mahir Ozturk 2:68ffd74e3b5c 338 eventQueue.dispatch_forever();
Mahir Ozturk 1:efe9cad8942f 339
Mahir Ozturk 2:68ffd74e3b5c 340 return 0;
Mahir Ozturk 1:efe9cad8942f 341 }
Mahir Ozturk 1:efe9cad8942f 342