Device to measure angle and get IMU measurements.
Dependencies: mbed commands BLE_API nRF51822
Diff: GonioService.cpp
- Revision:
- 8:c6345e8d607c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GonioService.cpp Thu Jun 11 20:59:22 2015 +0000 @@ -0,0 +1,135 @@ +#include "GonioService.h" + +BLEDevice _ble; +Gap::ConnectionParams_t fast; + +void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) +{ + printf("\n\r disconnect %d:\n\r",reason); + if(reason == Gap::LOCAL_HOST_TERMINATED_CONNECTION) { + printf("\n\r local host terminated connection \n\r"); + }else{ + _ble.startAdvertising(); // restart advertising + } +} + +GonioService::GonioService(): + ble(_ble), + G_ServiceUUID(0x9000), + G_CharUUID(0x9001), + G_ControlUUID(0x9002), + gValueBytes(0,0,0), + dataChar(G_CharUUID, gValueBytes.getPointer(), + gValueBytes.getNumValueBytes(), GonioValueBytes::MAX_VALUE_BYTES, + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY), + batteryChar(GattCharacteristic::UUID_BATTERY_LEVEL_CHAR, &batteryValue, + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY), + controlPoint(G_ControlUUID, &controlPointValue) +{ + setupService(); + //; +} + +bool GonioService::isConnected() +{ + return ble.getGapState().connected; +} + +uint8_t GonioService::getWriteValue() +{ + return writeValue; +} + +void GonioService::disconnect(){ + ble.disconnect( Gap::LOCAL_HOST_TERMINATED_CONNECTION); + } + +bool GonioService::newValue() +{ + if(newValueFlag == 1) { + newValueFlag = 0; + return true; + } else { + return false; + } +} + +void GonioService::setupService() +{ + static bool serviceAdded = false; /* We should only ever need to add the heart rate service once. */ + if (serviceAdded) { + return; + } + init(); + //batteryLevel(GattCharacteristic::UUID_BATTERY_LEVEL_CHAR, &batteryValue, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); + GattCharacteristic *charTable[] = {&dataChar, &controlPoint,&batteryChar}; + GattService GonioService(G_ServiceUUID, charTable, sizeof(charTable) / sizeof(GattCharacteristic *)); + + ble.addService(GonioService); + serviceAdded = true; + + ble.onDataWritten(this, &GonioService::onDataWritten); + setupAdvertising(); +} + +void GonioService::updateBattery(uint8_t newLevel) +{ + batteryValue = newLevel; + ble.updateCharacteristicValue(batteryChar.getValueAttribute().getHandle(), &batteryValue, 1); +} + +uint8_t GonioService::getBatteryLevel() +{ + return batteryValue; +} + +void GonioService::updateGonio(uint16_t params, uint16_t acc, uint16_t gyro) +{ + gValueBytes.updateGonio(params,acc, gyro); + ble.updateCharacteristicValue(dataChar.getValueAttribute().getHandle(), gValueBytes.getPointer(), gValueBytes.getNumValueBytes()); + //waitForEvent(); +} + +void GonioService::onDataWritten(const GattCharacteristicWriteCBParams *params) +{ + if (params->charHandle == controlPoint.getValueAttribute().getHandle()) { + writeValue = params->data[0]; + newValueFlag = true; + } + //waitForEvent(); +} + +void GonioService::waitForEvent(){ + ble.waitForEvent(); + } + +uint8_t GonioService::getGServiceUUID() +{ + return G_ServiceUUID; +} + +void GonioService::init() +{ + ble.init(); + ble.setTxPower(4); + ble.onDisconnection(disconnectionCallback); + ble.getPreferredConnectionParams(&fast); + fast.minConnectionInterval = 6; // 7.5 ms (6*1.25) + fast.maxConnectionInterval = 8; // 10 ms (8*1.25) + fast.slaveLatency = 0; + ble.setPreferredConnectionParams(&fast); +} + +void GonioService::setupAdvertising() +{ + const static char DEVICE_NAME[] = "GonioMeter"; + static const uint16_t uuid16_list[] = {G_ServiceUUID}; + ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); + ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); + ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); + ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); + ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); + ble.setAdvertisingInterval(50); + ble.startAdvertising(); +} +