Followed lateest libraries (BLE ,mbed and nRF51822)
Dependencies: BLE_API mbed nRF51822 BLE_HTM_by_InTempSensr_pub
Dependents: BLE_HTM_by_InTempSensr_pub
Fork of BLE_HTM_by_InTempSensr by
main.cpp@7:b8e9a93ba3b5, 2015-08-26 (annotated)
- Committer:
- takafuminaka
- Date:
- Wed Aug 26 02:04:52 2015 +0000
- Revision:
- 7:b8e9a93ba3b5
- Parent:
- 6:182013fa5592
- Child:
- 8:ae7255b477e6
update to the latest of the underlying libraries.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
takafuminaka | 0:1865c1b765f4 | 1 | /* mbed Microcontroller Library |
takafuminaka | 0:1865c1b765f4 | 2 | * Copyright (c) 2006-2013 ARM Limited |
takafuminaka | 7:b8e9a93ba3b5 | 3 | * Copyright (c) 2014-2015 T.Naka |
takafuminaka | 0:1865c1b765f4 | 4 | * |
takafuminaka | 0:1865c1b765f4 | 5 | * Licensed under the Apache License, Version 2.0 (the "License"); |
takafuminaka | 0:1865c1b765f4 | 6 | * you may not use this file except in compliance with the License. |
takafuminaka | 0:1865c1b765f4 | 7 | * You may obtain a copy of the License at |
takafuminaka | 0:1865c1b765f4 | 8 | * |
takafuminaka | 0:1865c1b765f4 | 9 | * http://www.apache.org/licenses/LICENSE-2.0 |
takafuminaka | 0:1865c1b765f4 | 10 | * |
takafuminaka | 0:1865c1b765f4 | 11 | * Unless required by applicable law or agreed to in writing, software |
takafuminaka | 0:1865c1b765f4 | 12 | * distributed under the License is distributed on an "AS IS" BASIS, |
takafuminaka | 0:1865c1b765f4 | 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
takafuminaka | 0:1865c1b765f4 | 14 | * See the License for the specific language governing permissions and |
takafuminaka | 0:1865c1b765f4 | 15 | * limitations under the License. |
takafuminaka | 0:1865c1b765f4 | 16 | */ |
takafuminaka | 0:1865c1b765f4 | 17 | |
takafuminaka | 0:1865c1b765f4 | 18 | #include "mbed.h" |
takafuminaka | 7:b8e9a93ba3b5 | 19 | #include "BLE.h" |
takafuminaka | 6:182013fa5592 | 20 | // #include "ble_hrs.h" |
takafuminaka | 6:182013fa5592 | 21 | // #include "ble_hts.h" |
takafuminaka | 0:1865c1b765f4 | 22 | |
takafuminaka | 0:1865c1b765f4 | 23 | #include "nrf_soc.h" // for internal Thermo sensoer |
takafuminaka | 0:1865c1b765f4 | 24 | |
takafuminaka | 0:1865c1b765f4 | 25 | // nRF51822n nrf; /* BLE radio driver */ |
takafuminaka | 0:1865c1b765f4 | 26 | BLEDevice ble; |
takafuminaka | 0:1865c1b765f4 | 27 | DigitalOut led1(LED1); |
takafuminaka | 0:1865c1b765f4 | 28 | DigitalOut led2(LED2); |
takafuminaka | 0:1865c1b765f4 | 29 | uint8_t cnt; |
takafuminaka | 0:1865c1b765f4 | 30 | |
takafuminaka | 0:1865c1b765f4 | 31 | #define NEED_CONSOLE_OUTPUT 0 /* Set this if you need debug messages on the console; |
takafuminaka | 0:1865c1b765f4 | 32 | * it will have an impact on code-size and power consumption. */ |
takafuminaka | 0:1865c1b765f4 | 33 | |
takafuminaka | 0:1865c1b765f4 | 34 | #if NEED_CONSOLE_OUTPUT |
takafuminaka | 0:1865c1b765f4 | 35 | Serial pc(USBTX, USBRX); |
takafuminaka | 0:1865c1b765f4 | 36 | #define DEBUG(...) { pc.printf(__VA_ARGS__); } |
takafuminaka | 0:1865c1b765f4 | 37 | #else |
takafuminaka | 0:1865c1b765f4 | 38 | #define DEBUG(...) /* nothing */ |
takafuminaka | 0:1865c1b765f4 | 39 | #endif /* #if NEED_CONSOLE_OUTPUT */ |
takafuminaka | 0:1865c1b765f4 | 40 | |
takafuminaka | 3:fe1294ff1d93 | 41 | const static char DEVICE_NAME[] = "BLE-ITHTM"; |
takafuminaka | 0:1865c1b765f4 | 42 | |
takafuminaka | 0:1865c1b765f4 | 43 | /* Health Thermometer Service */ |
takafuminaka | 0:1865c1b765f4 | 44 | /* Service: https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.health_thermometer.xml */ |
takafuminaka | 0:1865c1b765f4 | 45 | /* HTM Char: https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.temperature_measurement.xml */ |
takafuminaka | 0:1865c1b765f4 | 46 | uint8_t thermTempPayload[5] = { 0, 0, 0, 0, 0 }; |
takafuminaka | 0:1865c1b765f4 | 47 | |
takafuminaka | 0:1865c1b765f4 | 48 | GattCharacteristic tempChar (GattCharacteristic::UUID_TEMPERATURE_MEASUREMENT_CHAR, |
takafuminaka | 0:1865c1b765f4 | 49 | thermTempPayload, sizeof(thermTempPayload), sizeof(thermTempPayload), |
takafuminaka | 0:1865c1b765f4 | 50 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE); |
takafuminaka | 0:1865c1b765f4 | 51 | GattCharacteristic *htmChars[] = {&tempChar, }; |
takafuminaka | 0:1865c1b765f4 | 52 | GattService htmService(GattService::UUID_HEALTH_THERMOMETER_SERVICE, htmChars, |
takafuminaka | 0:1865c1b765f4 | 53 | sizeof(htmChars) / sizeof(GattCharacteristic *)); |
takafuminaka | 0:1865c1b765f4 | 54 | /* Battery Level Service */ |
takafuminaka | 0:1865c1b765f4 | 55 | uint8_t batt = 98; /* Battery level */ |
takafuminaka | 0:1865c1b765f4 | 56 | uint8_t read_batt = 0; /* Variable to hold battery level reads */ |
takafuminaka | 0:1865c1b765f4 | 57 | static uint8_t bpm2[1] = {batt}; |
takafuminaka | 0:1865c1b765f4 | 58 | GattCharacteristic battLevel ( GattCharacteristic::UUID_BATTERY_LEVEL_CHAR, bpm2, sizeof(bpm2), sizeof(bpm2), |
takafuminaka | 0:1865c1b765f4 | 59 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | |
takafuminaka | 0:1865c1b765f4 | 60 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
takafuminaka | 0:1865c1b765f4 | 61 | GattCharacteristic *battChars[] = {&battLevel, }; |
takafuminaka | 0:1865c1b765f4 | 62 | GattService battService(GattService::UUID_BATTERY_SERVICE, battChars, sizeof(battChars) / sizeof(GattCharacteristic *)); |
takafuminaka | 0:1865c1b765f4 | 63 | |
takafuminaka | 0:1865c1b765f4 | 64 | static const uint16_t uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE, GattService::UUID_BATTERY_SERVICE, GattService::UUID_HEALTH_THERMOMETER_SERVICE + 0x1000 }; |
takafuminaka | 0:1865c1b765f4 | 65 | |
takafuminaka | 0:1865c1b765f4 | 66 | static volatile bool triggerSensorPolling = false; /* set to high periodically to indicate to the main thread that |
takafuminaka | 0:1865c1b765f4 | 67 | * polling is necessary. */ |
takafuminaka | 0:1865c1b765f4 | 68 | static Gap::ConnectionParams_t connectionParams; |
takafuminaka | 0:1865c1b765f4 | 69 | |
takafuminaka | 0:1865c1b765f4 | 70 | uint32_t quick_ieee11073_from_float(float temperature); |
takafuminaka | 0:1865c1b765f4 | 71 | |
takafuminaka | 0:1865c1b765f4 | 72 | void Update_Values(); |
takafuminaka | 0:1865c1b765f4 | 73 | |
takafuminaka | 0:1865c1b765f4 | 74 | void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) // Mod |
takafuminaka | 0:1865c1b765f4 | 75 | { |
takafuminaka | 0:1865c1b765f4 | 76 | DEBUG("Disconnected handle %u!\n\r", handle); |
takafuminaka | 0:1865c1b765f4 | 77 | DEBUG("Restarting the advertising process\n\r"); |
takafuminaka | 0:1865c1b765f4 | 78 | led2 = 0; |
takafuminaka | 7:b8e9a93ba3b5 | 79 | ble.gap().startAdvertising(); |
takafuminaka | 0:1865c1b765f4 | 80 | } |
takafuminaka | 0:1865c1b765f4 | 81 | |
takafuminaka | 7:b8e9a93ba3b5 | 82 | void onConnectionCallback(const Gap::ConnectionCallbackParams_t *params) |
takafuminaka | 0:1865c1b765f4 | 83 | { |
takafuminaka | 7:b8e9a93ba3b5 | 84 | DEBUG("connected. Got handle %u\r\n", params->handle); |
takafuminaka | 0:1865c1b765f4 | 85 | |
takafuminaka | 0:1865c1b765f4 | 86 | connectionParams.slaveLatency = 1; |
takafuminaka | 0:1865c1b765f4 | 87 | led2 = 1; |
takafuminaka | 7:b8e9a93ba3b5 | 88 | if (ble.gap().updateConnectionParams(params->handle, &connectionParams) != BLE_ERROR_NONE) { |
takafuminaka | 0:1865c1b765f4 | 89 | DEBUG("failed to update connection paramter\r\n"); |
takafuminaka | 0:1865c1b765f4 | 90 | } |
takafuminaka | 0:1865c1b765f4 | 91 | |
takafuminaka | 0:1865c1b765f4 | 92 | } |
takafuminaka | 0:1865c1b765f4 | 93 | |
takafuminaka | 0:1865c1b765f4 | 94 | /** |
takafuminaka | 0:1865c1b765f4 | 95 | * Triggered periodically by the 'ticker' interrupt. |
takafuminaka | 0:1865c1b765f4 | 96 | */ |
takafuminaka | 0:1865c1b765f4 | 97 | void periodicCallback(void) |
takafuminaka | 0:1865c1b765f4 | 98 | { |
takafuminaka | 0:1865c1b765f4 | 99 | |
takafuminaka | 0:1865c1b765f4 | 100 | led1 = !led1; |
takafuminaka | 0:1865c1b765f4 | 101 | triggerSensorPolling = true; |
takafuminaka | 0:1865c1b765f4 | 102 | |
takafuminaka | 0:1865c1b765f4 | 103 | // triggerSensorPolling = true; /* Note that the periodicCallback() executes in |
takafuminaka | 0:1865c1b765f4 | 104 | // * interrupt context, so it is safer to do |
takafuminaka | 0:1865c1b765f4 | 105 | // * heavy-weight sensor polling from the main |
takafuminaka | 0:1865c1b765f4 | 106 | // * thread.*/ |
takafuminaka | 0:1865c1b765f4 | 107 | } |
takafuminaka | 0:1865c1b765f4 | 108 | |
takafuminaka | 0:1865c1b765f4 | 109 | int main(void) |
takafuminaka | 0:1865c1b765f4 | 110 | { |
takafuminaka | 0:1865c1b765f4 | 111 | led1 = 1; |
takafuminaka | 0:1865c1b765f4 | 112 | led2 = 1; |
takafuminaka | 0:1865c1b765f4 | 113 | wait(3); |
takafuminaka | 0:1865c1b765f4 | 114 | |
takafuminaka | 0:1865c1b765f4 | 115 | led1 = 0; |
takafuminaka | 0:1865c1b765f4 | 116 | led2 = 0; |
takafuminaka | 0:1865c1b765f4 | 117 | Ticker ticker; |
takafuminaka | 0:1865c1b765f4 | 118 | ticker.attach(periodicCallback, 1.0 ); |
takafuminaka | 0:1865c1b765f4 | 119 | DEBUG("Initialising the nRF51822\n\r"); |
takafuminaka | 0:1865c1b765f4 | 120 | ble.init(); |
takafuminaka | 7:b8e9a93ba3b5 | 121 | ble.gap().onDisconnection(disconnectionCallback); |
takafuminaka | 7:b8e9a93ba3b5 | 122 | ble.gap().onConnection(onConnectionCallback); |
takafuminaka | 0:1865c1b765f4 | 123 | |
takafuminaka | 7:b8e9a93ba3b5 | 124 | ble.gap().getPreferredConnectionParams(&connectionParams); |
takafuminaka | 0:1865c1b765f4 | 125 | |
takafuminaka | 0:1865c1b765f4 | 126 | /* setup advertising */ |
takafuminaka | 7:b8e9a93ba3b5 | 127 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
takafuminaka | 7:b8e9a93ba3b5 | 128 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t*)uuid16_list, sizeof(uuid16_list)); |
takafuminaka | 7:b8e9a93ba3b5 | 129 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_THERMOMETER); |
takafuminaka | 0:1865c1b765f4 | 130 | |
takafuminaka | 7:b8e9a93ba3b5 | 131 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
takafuminaka | 0:1865c1b765f4 | 132 | |
takafuminaka | 7:b8e9a93ba3b5 | 133 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
takafuminaka | 7:b8e9a93ba3b5 | 134 | ble.gap().setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ |
takafuminaka | 7:b8e9a93ba3b5 | 135 | ble.gap().startAdvertising(); |
takafuminaka | 0:1865c1b765f4 | 136 | |
takafuminaka | 7:b8e9a93ba3b5 | 137 | ble.gattServer().addService(htmService); |
takafuminaka | 7:b8e9a93ba3b5 | 138 | ble.gattServer().addService(battService); |
takafuminaka | 0:1865c1b765f4 | 139 | |
takafuminaka | 0:1865c1b765f4 | 140 | while (true) { |
takafuminaka | 0:1865c1b765f4 | 141 | if (triggerSensorPolling) { |
takafuminaka | 0:1865c1b765f4 | 142 | triggerSensorPolling = false; |
takafuminaka | 0:1865c1b765f4 | 143 | |
takafuminaka | 0:1865c1b765f4 | 144 | Update_Values(); |
takafuminaka | 0:1865c1b765f4 | 145 | |
takafuminaka | 0:1865c1b765f4 | 146 | } else { |
takafuminaka | 0:1865c1b765f4 | 147 | ble.waitForEvent(); |
takafuminaka | 0:1865c1b765f4 | 148 | } |
takafuminaka | 0:1865c1b765f4 | 149 | } |
takafuminaka | 0:1865c1b765f4 | 150 | } |
takafuminaka | 0:1865c1b765f4 | 151 | |
takafuminaka | 0:1865c1b765f4 | 152 | void Update_Values() |
takafuminaka | 0:1865c1b765f4 | 153 | { |
takafuminaka | 0:1865c1b765f4 | 154 | /* Update the temperature. Note that we need to convert to an ieee11073 format float. */ |
takafuminaka | 0:1865c1b765f4 | 155 | |
takafuminaka | 0:1865c1b765f4 | 156 | int32_t p_temp; |
takafuminaka | 0:1865c1b765f4 | 157 | sd_temp_get(&p_temp); |
takafuminaka | 0:1865c1b765f4 | 158 | float temperature = float(p_temp)/4.; |
takafuminaka | 6:182013fa5592 | 159 | temperature -= 14.; // It should be changed device by device. |
takafuminaka | 0:1865c1b765f4 | 160 | |
takafuminaka | 0:1865c1b765f4 | 161 | DEBUG("temp:%f\n\r", temperature); |
takafuminaka | 0:1865c1b765f4 | 162 | uint32_t temp_ieee11073 = quick_ieee11073_from_float(temperature); |
takafuminaka | 0:1865c1b765f4 | 163 | memcpy(thermTempPayload+1, &temp_ieee11073, 4); |
takafuminaka | 0:1865c1b765f4 | 164 | |
takafuminaka | 0:1865c1b765f4 | 165 | /* Battery Service Update */ |
takafuminaka | 0:1865c1b765f4 | 166 | /* Update battery level */ |
takafuminaka | 0:1865c1b765f4 | 167 | //ble.getGattServer().updateValue(battLevel.handle, (uint8_t*)&batt, sizeof(batt)); |
takafuminaka | 0:1865c1b765f4 | 168 | /* Decrement the battery level. */ |
takafuminaka | 0:1865c1b765f4 | 169 | batt <=50 ? batt=100 : batt--;; |
takafuminaka | 0:1865c1b765f4 | 170 | bpm2[0] = batt; |
takafuminaka | 0:1865c1b765f4 | 171 | |
takafuminaka | 7:b8e9a93ba3b5 | 172 | if (ble.gap().getState().connected ) { |
takafuminaka | 7:b8e9a93ba3b5 | 173 | ble.gattServer().write(tempChar.getValueAttribute().getHandle(), thermTempPayload, sizeof(thermTempPayload)); |
takafuminaka | 7:b8e9a93ba3b5 | 174 | ble.gattServer().write(battLevel.getValueAttribute().getHandle(), (uint8_t *)&batt, sizeof(batt)); |
takafuminaka | 0:1865c1b765f4 | 175 | } |
takafuminaka | 0:1865c1b765f4 | 176 | } |
takafuminaka | 0:1865c1b765f4 | 177 | |
takafuminaka | 0:1865c1b765f4 | 178 | /** |
takafuminaka | 0:1865c1b765f4 | 179 | * @brief A very quick conversion between a float temperature and 11073-20601 FLOAT-Type. |
takafuminaka | 0:1865c1b765f4 | 180 | * @param temperature The temperature as a float. |
takafuminaka | 0:1865c1b765f4 | 181 | * @return The temperature in 11073-20601 FLOAT-Type format. |
takafuminaka | 0:1865c1b765f4 | 182 | */ |
takafuminaka | 0:1865c1b765f4 | 183 | uint32_t quick_ieee11073_from_float(float temperature) |
takafuminaka | 0:1865c1b765f4 | 184 | { |
takafuminaka | 0:1865c1b765f4 | 185 | uint8_t exponent = 0xFE; //exponent is -2 |
takafuminaka | 0:1865c1b765f4 | 186 | uint32_t mantissa = (uint32_t)(temperature*100); |
takafuminaka | 0:1865c1b765f4 | 187 | |
takafuminaka | 0:1865c1b765f4 | 188 | return ( ((uint32_t)exponent) << 24) | mantissa; |
takafuminaka | 0:1865c1b765f4 | 189 | } |