Bluetooth Low Energy for Smart Plug
Dependencies: BLE_API mbed nRF51822
Fork of SmartPlugBLE by
Services/SmartPlugService.cpp@1:e036e77762fa, 2015-07-07 (annotated)
- 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?
User | Revision | Line number | New 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,¤t,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(),¤t,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,¤tChar,&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 | } |