Bluetooth Low Energy for Smart Plug

Dependencies:   BLE_API mbed nRF51822

Fork of SmartPlugBLE by Pavit Noinongyao

Committer:
Slepnir
Date:
Tue Jul 07 04:58:28 2015 +0000
Revision:
1:e036e77762fa
Parent:
0:25ad6eba7916
Child:
2:6db5c9a2894c
V2:; - Change to unsigned long; - Add relay

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Slepnir 0:25ad6eba7916 1 #include "ble/BLE.h"
Slepnir 0:25ad6eba7916 2 #include "mbed.h"
Slepnir 0:25ad6eba7916 3 #include "SmartPlugService.h"
Slepnir 0:25ad6eba7916 4 #include "SmartPlugBLE.h"
Slepnir 0:25ad6eba7916 5
Slepnir 0:25ad6eba7916 6
Slepnir 0:25ad6eba7916 7 SmartPlugService::SmartPlugService(BLE &_ble, SmartPlugBLE &sys):
Slepnir 0:25ad6eba7916 8 ble(_ble), system(sys),
Slepnir 1:e036e77762fa 9 voltageChar(SPS_UUID_VOLTAGE_CHAR,&voltage,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
Slepnir 1:e036e77762fa 10 currentChar(SPS_UUID_CURERNT_CHAR,&current,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
Slepnir 1:e036e77762fa 11 powerChar(SPS_UUID_POWER_CHAR,&power,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
Slepnir 1:e036e77762fa 12 powerFactorChar(SPS_UUID_POWER_FACTOR_CHAR,&powerFactor,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
Slepnir 1:e036e77762fa 13 energyChar(SPS_UUID_ENERGY_CHAR,&energy,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
Slepnir 1:e036e77762fa 14 relayChar(SPS_UUID_RELAY_CHAR, relayValue.getDataPointer(),
Slepnir 1:e036e77762fa 15 relayValue.getLenBytes(), RelayValueBytes::MAX_SIZE_BYTES,
Slepnir 1:e036e77762fa 16 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY |
Slepnir 1:e036e77762fa 17 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ),
Slepnir 0:25ad6eba7916 18 updateChar(SPS_UUID_UPDATE_CHAR,NULL)
Slepnir 0:25ad6eba7916 19 {
Slepnir 0:25ad6eba7916 20 (&system)->addObserver(*this);
Slepnir 0:25ad6eba7916 21 }
Slepnir 0:25ad6eba7916 22
Slepnir 0:25ad6eba7916 23 void SmartPlugService::onDataWritten(const GattWriteCallbackParams *params)
Slepnir 0:25ad6eba7916 24 {
Slepnir 0:25ad6eba7916 25 if(params->handle == updateChar.getValueHandle())
Slepnir 0:25ad6eba7916 26 {
Slepnir 0:25ad6eba7916 27 system.updateData();
Slepnir 0:25ad6eba7916 28 }
Slepnir 0:25ad6eba7916 29 }
Slepnir 0:25ad6eba7916 30 void SmartPlugService::update(void* data)
Slepnir 0:25ad6eba7916 31 {
Slepnir 0:25ad6eba7916 32 updateData((SmartPlug*)data);
Slepnir 0:25ad6eba7916 33 }
Slepnir 0:25ad6eba7916 34
Slepnir 0:25ad6eba7916 35 void SmartPlugService::updateData(SmartPlug* data)
Slepnir 0:25ad6eba7916 36 {
Slepnir 0:25ad6eba7916 37 updateVoltage(data->getVoltage());
Slepnir 0:25ad6eba7916 38 updateCurrent(data->getCurrent());
Slepnir 0:25ad6eba7916 39 updatePower(data->getPower());
Slepnir 0:25ad6eba7916 40 updatePowerFactor(data->getPowerFactor());
Slepnir 0:25ad6eba7916 41 }
Slepnir 0:25ad6eba7916 42
Slepnir 0:25ad6eba7916 43 void SmartPlugService::updateVoltage(unsigned long v)
Slepnir 0:25ad6eba7916 44 {
Slepnir 0:25ad6eba7916 45 if (ble.getGapState().connected)
Slepnir 0:25ad6eba7916 46 {
Slepnir 1:e036e77762fa 47 voltage = v;
Slepnir 1:e036e77762fa 48 ble.updateCharacteristicValue(voltageChar.getValueHandle(),&voltage,4);
Slepnir 0:25ad6eba7916 49 }
Slepnir 0:25ad6eba7916 50 }
Slepnir 0:25ad6eba7916 51
Slepnir 0:25ad6eba7916 52 void SmartPlugService::updateCurrent(unsigned long c)
Slepnir 0:25ad6eba7916 53 {
Slepnir 0:25ad6eba7916 54 if (ble.getGapState().connected)
Slepnir 0:25ad6eba7916 55 {
Slepnir 1:e036e77762fa 56 current = c;
Slepnir 1:e036e77762fa 57 ble.updateCharacteristicValue(currentChar.getValueHandle(),&current,4);
Slepnir 0:25ad6eba7916 58 }
Slepnir 0:25ad6eba7916 59 }
Slepnir 0:25ad6eba7916 60
Slepnir 0:25ad6eba7916 61 void SmartPlugService::updatePower(unsigned long p)
Slepnir 0:25ad6eba7916 62 {
Slepnir 0:25ad6eba7916 63 if (ble.getGapState().connected)
Slepnir 0:25ad6eba7916 64 {
Slepnir 1:e036e77762fa 65 power = p;
Slepnir 1:e036e77762fa 66 ble.updateCharacteristicValue(powerChar.getValueHandle(),&power,4);
Slepnir 0:25ad6eba7916 67 }
Slepnir 0:25ad6eba7916 68 }
Slepnir 0:25ad6eba7916 69
Slepnir 0:25ad6eba7916 70 void SmartPlugService::updatePowerFactor(unsigned long pf)
Slepnir 0:25ad6eba7916 71 {
Slepnir 0:25ad6eba7916 72 if (ble.getGapState().connected)
Slepnir 1:e036e77762fa 73 {
Slepnir 1:e036e77762fa 74 powerFactor = pf;
Slepnir 1:e036e77762fa 75 ble.updateCharacteristicValue(powerFactorChar.getValueHandle(),&powerFactor,4);
Slepnir 1:e036e77762fa 76 }
Slepnir 1:e036e77762fa 77 }
Slepnir 1:e036e77762fa 78
Slepnir 1:e036e77762fa 79 void SmartPlugService::updateRelay(Relay* relay)
Slepnir 1:e036e77762fa 80 {
Slepnir 1:e036e77762fa 81 if (ble.getGapState().connected)
Slepnir 1:e036e77762fa 82 {
Slepnir 1:e036e77762fa 83 relayValue.updateData(relay);
Slepnir 1:e036e77762fa 84 ble.updateCharacteristicValue(relayChar.getValueHandle(),relayValue.getDataPointer(),
Slepnir 1:e036e77762fa 85 relayValue.getLenBytes());
Slepnir 0:25ad6eba7916 86 }
Slepnir 0:25ad6eba7916 87 }
Slepnir 0:25ad6eba7916 88
Slepnir 0:25ad6eba7916 89 void SmartPlugService::setupService(void)
Slepnir 0:25ad6eba7916 90 {
Slepnir 0:25ad6eba7916 91
Slepnir 0:25ad6eba7916 92 static bool serviceAdded = false; /* We should only ever need to add the service once. */
Slepnir 0:25ad6eba7916 93 if (serviceAdded)
Slepnir 0:25ad6eba7916 94 {
Slepnir 0:25ad6eba7916 95 return;
Slepnir 0:25ad6eba7916 96 }
Slepnir 0:25ad6eba7916 97
Slepnir 0:25ad6eba7916 98
Slepnir 0:25ad6eba7916 99 GattCharacteristic *charTable[] = {&voltageChar,&currentChar,&powerChar,
Slepnir 0:25ad6eba7916 100 &powerFactorChar,&energyChar,&relayChar,
Slepnir 0:25ad6eba7916 101 &updateChar
Slepnir 0:25ad6eba7916 102 };
Slepnir 0:25ad6eba7916 103 GattService smartPlugService = GattService(SPS_UUID_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
Slepnir 0:25ad6eba7916 104 ble.addService(smartPlugService);
Slepnir 0:25ad6eba7916 105
Slepnir 0:25ad6eba7916 106 }