BLE_Health_Thermometer for mbed HRM1017 with BLE library 0.1.0
Dependencies: BLE_API TMP102 mbed nRF51822
Fork of BLE_Health_Thermometer2 by
You are viewing an older revision! See the latest version
BLE_Health_Thermometer2 010
mbed HRM1017をはじめように掲載されている、https://mbed.org/users/ytsuboi/code/BLE_Health_Thermometer_IRC/をBLE ライブラリ0.1.0に移植しました。 前回公開したhttp://mbed.org/users/todotani/code/BLE_Health_Thermometer2/からさらに新ライブラリ0.1.0に対応するための各種修正を加えています。修正点は以下の通りです。
- ライブラリ0.1.0を使うためには、mbedライブラリをDevelopment版である、mbed-srcに変更します
- mbed-srcのクロッククロック設定が外部クロックになっているため、HRM1017で使用する内部クロック設定に変更します。mbed-src/targets/cmsis/TARGET_NORDIC/TARGET_MCU_NRF51822/system_nrf51822.cの69行目を以下のように修正します。<追記>最新のmbed-src 309版では、ターゲットをHRM1017に設定すると自動的に下記のコードが選択されるようになっています。
system_nrf51822.cの変更
NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_RC << CLOCK_LFCLKSRC_SRC_Pos);
- nRF51822/btle/btle.cpp を以下のように変更し、内部クロックを選択するようにします(この変更は以前から必要なものでした)。このpublishではターゲットをHRM1017に設定すると自動的に内部クロックを選択するようにしました。
btle.cppの変更1
#ifdef TARGET_HRM1017 SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_RC_250_PPM_4000MS_CALIBRATION, false); #else SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, useScheduler); #endif
- btle.cppのbtle_handler関数を以下のように修正します。この変更は、disconnected.reasonが1種類しか定義されていないために、disconnectionCallback関数が呼ばれない問題を回避するためです。本publishでは、BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTIONに加えて、BLE_HCI_REMOTE_USER_TERMINATED_CONNECTIONの処理を追加して、iOSでバイス等から切断した時もイベント処理出来るようにしました。
btle.cppの変更2
case BLE_GAP_EVT_DISCONNECTED: { Gap::Handle_t handle = p_ble_evt->evt.gap_evt.conn_handle; // Since we are not in a connection and have not started advertising, // store bonds nRF51Gap::getInstance().setConnectionHandle (BLE_CONN_HANDLE_INVALID); #if NEED_BOND_MANAGER /* disabled by default */ ASSERT_STATUS_RET_VOID ( ble_bondmngr_bonded_centrals_store()); #endif if (p_ble_evt->evt.gap_evt.params.disconnected.reason == BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION) { nRF51Gap::getInstance().processDisconnectionEvent(handle, Gap::LOCAL_HOST_TERMINATED_CONNECTION); } else if (p_ble_evt->evt.gap_evt.params.disconnected.reason == BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION) { nRF51Gap::getInstance().processDisconnectionEvent(handle, Gap::REMOTE_USER_TERMINATED_CONNECTION); } else { nRF51Gap::getInstance().processDisconnectionEvent(handle, Gap::CONN_INTERVAL_UNACCEPTABLE); } break;
- main.cppにTickerを設定して以下のような処理を周期的に実行するようにします。こうすることで、waitForEvent()関数から抜けない問題を回避します。
Tickerの使用
void periodicCallback(void) { oneSecondLed = !oneSecondLed; /* Do blinky on LED1 while we're waiting for BLE events */ /* Note that the periodicCallback() executes in interrupt context, so it is safer to do * heavy-weight sensor polling from the main thread. */ triggerSensorPolling = true; }
- main.cppで定義するイベントハンドラ関数の引数が以下のように追加されています。新ライブラリのAPI変更に対応したコード変更になります。
EventHandler
void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) void onConnectionCallback(Gap::Handle_t handle, const Gap::ConnectionParams_t *params)
- main.cppで呼び出すupdateCharacteristicValueの引数が、以前のtempChar.getHandle()から変更されています。こちらも、新ライブラリのAPI変更に対応したコード変更になります。
updateCharacteristicValue
ble.updateCharacteristicValue(tempChar.getValueAttribute().getHandle(), thermTempPayload, sizeof(thermTempPayload)); ble.updateCharacteristicValue(battLevel.getValueAttribute().getHandle(), (uint8_t *)&batt, sizeof(batt));
- あと、iOSを使っている方で、mbedのBLEソフトを入れ替えてGATTの内容がが変わるような場合は、iOSデバイスのBluetoothをoff/onしないと変更が反映されず、接続しても情報が表示されないような状態になることがあります。この点も、ご注意を。
プログラム全体は以下の通りです。
Import programBLE_Health_Thermometer2-010
BLE_Health_Thermometer for mbed HRM1017 with BLE library 0.1.0
btle.cppの<追記>分変更を盛り込んだコードは以下の通りです。
Import librarynRF51822-060mod
Nordic stack and drivers for the mbed BLE API Modified for HRM 1017 and correct DISCONNECT event processing