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 Nakatafu ☆

Committer:
takafuminaka
Date:
Thu Aug 27 13:33:42 2015 +0000
Revision:
8:ae7255b477e6
Parent:
7:b8e9a93ba3b5
Fixed minor problem

Who changed what in which revision?

UserRevisionLine numberNew 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 8:ae7255b477e6 64 static const uint16_t uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE, GattService::UUID_BATTERY_SERVICE};
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 }