Bluetooth Low Energy for Smart Plug
Dependencies: BLE_API mbed nRF51822
Fork of SmartPlugBLE by
Diff: Services/SmartPlugService.cpp
- Revision:
- 0:25ad6eba7916
- Child:
- 1:e036e77762fa
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Services/SmartPlugService.cpp Tue Jul 07 04:02:14 2015 +0000 @@ -0,0 +1,105 @@ +#include "ble/BLE.h" +#include "mbed.h" +#include "SmartPlugService.h" +#include "SmartPlugBLE.h" + + +SmartPlugService::SmartPlugService(BLE &_ble, SmartPlugBLE &sys): + ble(_ble), system(sys), + voltageChar(SPS_UUID_VOLTAGE_CHAR,voltage), + currentChar(SPS_UUID_CURERNT_CHAR,current), + powerChar(SPS_UUID_POWER_CHAR,power), + powerFactorChar(SPS_UUID_POWER_FACTOR_CHAR,powerFactor), + energyChar(SPS_UUID_ENERGY_CHAR,energy), + relayChar(SPS_UUID_RELAY_CHAR,relayValue), + updateChar(SPS_UUID_UPDATE_CHAR,NULL) +{ + (&system)->addObserver(*this); +} + +void SmartPlugService::onDataWritten(const GattWriteCallbackParams *params) +{ + if(params->handle == updateChar.getValueHandle()) + { + system.updateData(); + } +} +void SmartPlugService::update(void* data) +{ + updateData((SmartPlug*)data); +} + +void SmartPlugService::updateData(SmartPlug* data) +{ + updateVoltage(data->getVoltage()); + updateCurrent(data->getCurrent()); + updatePower(data->getPower()); + updatePowerFactor(data->getPowerFactor()); +} + +void SmartPlugService::updateVoltage(unsigned long v) +{ + if (ble.getGapState().connected) + { + voltage[0] = v>>24; + voltage[1] = (v&0x00FFFFFF)>>16; + voltage[2] = (v&0x0000FFFF)>>8; + voltage[3] = v&0x000000FF; + ble.updateCharacteristicValue(voltageChar.getValueHandle(),voltage,4); + } +} + +void SmartPlugService::updateCurrent(unsigned long c) +{ + if (ble.getGapState().connected) + { + current[0] = c>>24; + current[1] = (c&0x00FFFFFF)>>16; + current[2] = (c&0x0000FFFF)>>8; + current[3] = c&0x000000FF; + ble.updateCharacteristicValue(currentChar.getValueHandle(),voltage,4); + } +} + +void SmartPlugService::updatePower(unsigned long p) +{ + if (ble.getGapState().connected) + { + power[0] = p>>24; + power[1] = (p&0x00FFFFFF)>>16; + power[2] = (p&0x0000FFFF)>>8; + power[3] = p&0x000000FF; + ble.updateCharacteristicValue(powerChar.getValueHandle(),voltage,4); + } +} + +void SmartPlugService::updatePowerFactor(unsigned long pf) +{ + if (ble.getGapState().connected) + { + powerFactor[0] = pf>>24; + powerFactor[1] = (pf&0x00FFFFFF)>>16; + powerFactor[2] = (pf&0x0000FFFF)>>8; + powerFactor[3] = pf&0x000000FF; + ble.updateCharacteristicValue(powerFactorChar.getValueHandle(),voltage,4); + } +} + +void SmartPlugService::setupService(void) +{ + + static bool serviceAdded = false; /* We should only ever need to add the service once. */ + if (serviceAdded) + { + return; + } + + + GattCharacteristic *charTable[] = {&voltageChar,¤tChar,&powerChar, + &powerFactorChar,&energyChar,&relayChar, + &updateChar + }; + GattService smartPlugService = GattService(SPS_UUID_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *)); + ble.addService(smartPlugService); + +}