Transmit temperature data via BLE
Dependencies: BLE_API mbed nRF51822
main.cpp@2:580d838ba0cb, 2015-10-08 (annotated)
- Committer:
- wgd8700
- Date:
- Thu Oct 08 07:56:24 2015 +0000
- Revision:
- 2:580d838ba0cb
- Parent:
- 1:d64b82b9d615
Fix disconnectionCallback parameter conflict
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Marcomissyou | 0:ac4c040491f9 | 1 | #include "mbed.h" |
wgd8700 | 1:d64b82b9d615 | 2 | #include "BLE.h" |
Marcomissyou | 0:ac4c040491f9 | 3 | #include "BatteryService.h" |
Marcomissyou | 0:ac4c040491f9 | 4 | #include "DeviceInformationService.h" |
Marcomissyou | 0:ac4c040491f9 | 5 | #include "HealthThermometerService.h" |
Marcomissyou | 0:ac4c040491f9 | 6 | #include "hts221.h" |
Marcomissyou | 0:ac4c040491f9 | 7 | |
Marcomissyou | 0:ac4c040491f9 | 8 | #define UPDATE_PARAMS_FOR_LONGER_CONNECTION_INTERVAL 0 |
Marcomissyou | 0:ac4c040491f9 | 9 | |
Marcomissyou | 0:ac4c040491f9 | 10 | BLEDevice ble; |
Marcomissyou | 0:ac4c040491f9 | 11 | DigitalOut led1(p1); |
Marcomissyou | 0:ac4c040491f9 | 12 | DigitalOut led2(p2); |
Marcomissyou | 0:ac4c040491f9 | 13 | |
Marcomissyou | 0:ac4c040491f9 | 14 | const static char DEVICE_NAME[] = "BLEThermo"; |
Marcomissyou | 0:ac4c040491f9 | 15 | static const uint16_t uuid16_list[] = {GattService::UUID_BATTERY_SERVICE, |
Marcomissyou | 0:ac4c040491f9 | 16 | GattService::UUID_DEVICE_INFORMATION_SERVICE, |
Marcomissyou | 0:ac4c040491f9 | 17 | GattService::UUID_HEALTH_THERMOMETER_SERVICE,}; |
Marcomissyou | 0:ac4c040491f9 | 18 | |
Marcomissyou | 0:ac4c040491f9 | 19 | static volatile bool triggerSensorPolling = false; |
Marcomissyou | 0:ac4c040491f9 | 20 | |
wgd8700 | 2:580d838ba0cb | 21 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) |
Marcomissyou | 0:ac4c040491f9 | 22 | { |
Marcomissyou | 0:ac4c040491f9 | 23 | ble.startAdvertising(); // restart advertising |
Marcomissyou | 0:ac4c040491f9 | 24 | } |
Marcomissyou | 0:ac4c040491f9 | 25 | |
Marcomissyou | 0:ac4c040491f9 | 26 | void onConnectionCallback(Gap::Handle_t handle, Gap::addr_type_t peerAddrType, const Gap::address_t peerAddr, const Gap::ConnectionParams_t *params) |
Marcomissyou | 0:ac4c040491f9 | 27 | { |
Marcomissyou | 0:ac4c040491f9 | 28 | #if UPDATE_PARAMS_FOR_LONGER_CONNECTION_INTERVAL |
Marcomissyou | 0:ac4c040491f9 | 29 | |
Marcomissyou | 0:ac4c040491f9 | 30 | #define MIN_CONN_INTERVAL 250 /**< Minimum connection interval (250 ms) */ |
Marcomissyou | 0:ac4c040491f9 | 31 | #define MAX_CONN_INTERVAL 350 /**< Maximum connection interval (350 ms). */ |
Marcomissyou | 0:ac4c040491f9 | 32 | #define CONN_SUP_TIMEOUT 6000 /**< Connection supervisory timeout (6 seconds). */ |
Marcomissyou | 0:ac4c040491f9 | 33 | #define SLAVE_LATENCY 4 |
Marcomissyou | 0:ac4c040491f9 | 34 | |
Marcomissyou | 0:ac4c040491f9 | 35 | Gap::ConnectionParams_t gap_conn_params; |
Marcomissyou | 0:ac4c040491f9 | 36 | gap_conn_params.minConnectionInterval = Gap::MSEC_TO_GAP_DURATION_UNITS(MIN_CONN_INTERVAL); |
Marcomissyou | 0:ac4c040491f9 | 37 | gap_conn_params.maxConnectionInterval = Gap::MSEC_TO_GAP_DURATION_UNITS(MAX_CONN_INTERVAL); |
Marcomissyou | 0:ac4c040491f9 | 38 | gap_conn_params.connectionSupervisionTimeout = Gap::MSEC_TO_GAP_DURATION_UNITS(CONN_SUP_TIMEOUT); |
Marcomissyou | 0:ac4c040491f9 | 39 | gap_conn_params.slaveLatency = SLAVE_LATENCY; |
Marcomissyou | 0:ac4c040491f9 | 40 | ble.updateConnectionParams(handle, &gap_conn_params); |
Marcomissyou | 0:ac4c040491f9 | 41 | #endif /* #if UPDATE_PARAMS_FOR_LONGER_CONNECTION_INTERVAL */ |
Marcomissyou | 0:ac4c040491f9 | 42 | } |
Marcomissyou | 0:ac4c040491f9 | 43 | |
Marcomissyou | 0:ac4c040491f9 | 44 | void periodicCallback(void) |
Marcomissyou | 0:ac4c040491f9 | 45 | { |
Marcomissyou | 0:ac4c040491f9 | 46 | led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */ |
Marcomissyou | 0:ac4c040491f9 | 47 | triggerSensorPolling = true; |
Marcomissyou | 0:ac4c040491f9 | 48 | } |
Marcomissyou | 0:ac4c040491f9 | 49 | |
Marcomissyou | 0:ac4c040491f9 | 50 | float tempCelsius = 25.50; |
Marcomissyou | 0:ac4c040491f9 | 51 | float humi = 55; |
Marcomissyou | 0:ac4c040491f9 | 52 | int humiMax = 100; |
Marcomissyou | 0:ac4c040491f9 | 53 | |
Marcomissyou | 0:ac4c040491f9 | 54 | int main(void) |
Marcomissyou | 0:ac4c040491f9 | 55 | { |
Marcomissyou | 0:ac4c040491f9 | 56 | led2 = 0; |
Marcomissyou | 0:ac4c040491f9 | 57 | led1 = 0; |
Marcomissyou | 0:ac4c040491f9 | 58 | if (hts221_init()) |
Marcomissyou | 0:ac4c040491f9 | 59 | { |
Marcomissyou | 0:ac4c040491f9 | 60 | HTS221_Calib(); |
Marcomissyou | 0:ac4c040491f9 | 61 | |
Marcomissyou | 0:ac4c040491f9 | 62 | Ticker ticker; |
Marcomissyou | 0:ac4c040491f9 | 63 | ticker.attach(periodicCallback, 1); |
Marcomissyou | 0:ac4c040491f9 | 64 | |
Marcomissyou | 0:ac4c040491f9 | 65 | ble.init(); |
Marcomissyou | 0:ac4c040491f9 | 66 | ble.onDisconnection(disconnectionCallback); |
Marcomissyou | 0:ac4c040491f9 | 67 | #if UPDATE_PARAMS_FOR_LONGER_CONNECTION_INTERVAL |
Marcomissyou | 0:ac4c040491f9 | 68 | ble.onConnection(onConnectionCallback); |
Marcomissyou | 0:ac4c040491f9 | 69 | #endif /* #if UPDATE_PARAMS_FOR_LONGER_CONNECTION_INTERVAL */ |
Marcomissyou | 0:ac4c040491f9 | 70 | |
Marcomissyou | 0:ac4c040491f9 | 71 | |
Marcomissyou | 0:ac4c040491f9 | 72 | HealthThermometerService ThermoService(ble, tempCelsius , HealthThermometerService::LOCATION_EAR); |
Marcomissyou | 0:ac4c040491f9 | 73 | BatteryService battery(ble); |
Marcomissyou | 0:ac4c040491f9 | 74 | DeviceInformationService deviceInfo(ble, "Cyntec", "Combo module", "SN1", "hw-rev1", "fw-rev1", "soft-rev1"); |
Marcomissyou | 0:ac4c040491f9 | 75 | |
Marcomissyou | 0:ac4c040491f9 | 76 | /* Setup advertising. */ |
Marcomissyou | 0:ac4c040491f9 | 77 | /* Setting advertising string*/ |
Marcomissyou | 0:ac4c040491f9 | 78 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
Marcomissyou | 0:ac4c040491f9 | 79 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); |
Marcomissyou | 0:ac4c040491f9 | 80 | ble.accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_TAG); |
Marcomissyou | 0:ac4c040491f9 | 81 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
Marcomissyou | 0:ac4c040491f9 | 82 | /* Setting advertising parameters*/ |
Marcomissyou | 0:ac4c040491f9 | 83 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
wgd8700 | 1:d64b82b9d615 | 84 | ble.setAdvertisingInterval(1000); |
Marcomissyou | 0:ac4c040491f9 | 85 | ble.setAdvertisingTimeout(0x1e); //Timeout, stop advertising after 30sec |
Marcomissyou | 0:ac4c040491f9 | 86 | ble.startAdvertising(); |
Marcomissyou | 0:ac4c040491f9 | 87 | |
Marcomissyou | 0:ac4c040491f9 | 88 | while (true) { |
Marcomissyou | 0:ac4c040491f9 | 89 | if (triggerSensorPolling && ble.getGapState().connected) { |
Marcomissyou | 0:ac4c040491f9 | 90 | triggerSensorPolling = false; |
Marcomissyou | 0:ac4c040491f9 | 91 | |
Marcomissyou | 0:ac4c040491f9 | 92 | HTS221_ReadTempHumi(&tempCelsius, &humi); |
Marcomissyou | 0:ac4c040491f9 | 93 | ThermoService.updateTemperature(tempCelsius); |
Marcomissyou | 0:ac4c040491f9 | 94 | |
Marcomissyou | 0:ac4c040491f9 | 95 | } else { |
Marcomissyou | 0:ac4c040491f9 | 96 | ble.waitForEvent(); |
Marcomissyou | 0:ac4c040491f9 | 97 | } |
Marcomissyou | 0:ac4c040491f9 | 98 | } |
Marcomissyou | 0:ac4c040491f9 | 99 | } else { |
Marcomissyou | 0:ac4c040491f9 | 100 | while(true) |
Marcomissyou | 0:ac4c040491f9 | 101 | { |
Marcomissyou | 0:ac4c040491f9 | 102 | led2 = !led2; |
Marcomissyou | 0:ac4c040491f9 | 103 | wait(1); |
Marcomissyou | 0:ac4c040491f9 | 104 | } |
Marcomissyou | 0:ac4c040491f9 | 105 | } |
Marcomissyou | 0:ac4c040491f9 | 106 | } |