Bluetooth Low Energy for Smart Plug
Dependencies: BLE_API mbed nRF51822
Fork of SmartPlugBLE by
Services/SmartPlugService.cpp@4:721ae30c92f8, 2015-07-14 (annotated)
- Committer:
- Slepnir
- Date:
- Tue Jul 14 10:10:19 2015 +0000
- Revision:
- 4:721ae30c92f8
- Parent:
- 3:aaa92c61931a
For debugging
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 | 2:6db5c9a2894c | 7 | |
Slepnir | 2:6db5c9a2894c | 8 | void convert(uint8_t* res,uint32_t &num) |
Slepnir | 2:6db5c9a2894c | 9 | { |
Slepnir | 2:6db5c9a2894c | 10 | res[3] = (num&0xFF000000)>>24; |
Slepnir | 2:6db5c9a2894c | 11 | res[2] = (num&0x00FF0000)>>16; |
Slepnir | 2:6db5c9a2894c | 12 | res[1] = (num&0x0000FF00)>>8; |
Slepnir | 2:6db5c9a2894c | 13 | res[0] = num&0x000000FF; |
Slepnir | 2:6db5c9a2894c | 14 | } |
Slepnir | 2:6db5c9a2894c | 15 | |
Slepnir | 0:25ad6eba7916 | 16 | SmartPlugService::SmartPlugService(BLE &_ble, SmartPlugBLE &sys): |
Slepnir | 2:6db5c9a2894c | 17 | ble(_ble), led(LED3,1),system(sys), |
Slepnir | 1:e036e77762fa | 18 | voltageChar(SPS_UUID_VOLTAGE_CHAR,&voltage,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY), |
Slepnir | 1:e036e77762fa | 19 | currentChar(SPS_UUID_CURERNT_CHAR,¤t,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY), |
Slepnir | 1:e036e77762fa | 20 | powerChar(SPS_UUID_POWER_CHAR,&power,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY), |
Slepnir | 1:e036e77762fa | 21 | powerFactorChar(SPS_UUID_POWER_FACTOR_CHAR,&powerFactor,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY), |
Slepnir | 1:e036e77762fa | 22 | energyChar(SPS_UUID_ENERGY_CHAR,&energy,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY), |
Slepnir | 1:e036e77762fa | 23 | relayChar(SPS_UUID_RELAY_CHAR, relayValue.getDataPointer(), |
Slepnir | 1:e036e77762fa | 24 | relayValue.getLenBytes(), RelayValueBytes::MAX_SIZE_BYTES, |
Slepnir | 1:e036e77762fa | 25 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | |
Slepnir | 1:e036e77762fa | 26 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ), |
Slepnir | 0:25ad6eba7916 | 27 | updateChar(SPS_UUID_UPDATE_CHAR,NULL) |
Slepnir | 0:25ad6eba7916 | 28 | { |
Slepnir | 2:6db5c9a2894c | 29 | system.addObserver(this); |
Slepnir | 0:25ad6eba7916 | 30 | } |
Slepnir | 0:25ad6eba7916 | 31 | |
Slepnir | 0:25ad6eba7916 | 32 | void SmartPlugService::onDataWritten(const GattWriteCallbackParams *params) |
Slepnir | 0:25ad6eba7916 | 33 | { |
Slepnir | 0:25ad6eba7916 | 34 | if(params->handle == updateChar.getValueHandle()) |
Slepnir | 0:25ad6eba7916 | 35 | { |
Slepnir | 0:25ad6eba7916 | 36 | system.updateData(); |
Slepnir | 0:25ad6eba7916 | 37 | } |
Slepnir | 2:6db5c9a2894c | 38 | else if(params->handle == relayChar.getValueHandle()) |
Slepnir | 3:aaa92c61931a | 39 | { |
Slepnir | 2:6db5c9a2894c | 40 | system.onRelayWrite(params->data); |
Slepnir | 2:6db5c9a2894c | 41 | } |
Slepnir | 0:25ad6eba7916 | 42 | } |
Slepnir | 0:25ad6eba7916 | 43 | |
Slepnir | 2:6db5c9a2894c | 44 | void SmartPlugService::updateObserver(void* data) |
Slepnir | 0:25ad6eba7916 | 45 | { |
Slepnir | 2:6db5c9a2894c | 46 | SmartPlug* sp = (SmartPlug*)data; |
Slepnir | 2:6db5c9a2894c | 47 | updateVoltage(sp->getVoltage()); |
Slepnir | 2:6db5c9a2894c | 48 | updateCurrent(sp->getCurrent()); |
Slepnir | 2:6db5c9a2894c | 49 | updatePower(sp->getPower()); |
Slepnir | 2:6db5c9a2894c | 50 | updatePowerFactor(sp->getPowerFactor()); |
Slepnir | 2:6db5c9a2894c | 51 | updateEnergy(sp->getEnergy()); |
Slepnir | 3:aaa92c61931a | 52 | updateRelay(sp->getRelay()); |
Slepnir | 0:25ad6eba7916 | 53 | } |
Slepnir | 0:25ad6eba7916 | 54 | |
Slepnir | 2:6db5c9a2894c | 55 | void SmartPlugService::updateVoltage(uint32_t v) |
Slepnir | 0:25ad6eba7916 | 56 | { |
Slepnir | 0:25ad6eba7916 | 57 | if (ble.getGapState().connected) |
Slepnir | 0:25ad6eba7916 | 58 | { |
Slepnir | 2:6db5c9a2894c | 59 | convert(voltage,v); |
Slepnir | 2:6db5c9a2894c | 60 | ble.updateCharacteristicValue(voltageChar.getValueHandle(),voltage,sizeof(voltage)); |
Slepnir | 0:25ad6eba7916 | 61 | } |
Slepnir | 0:25ad6eba7916 | 62 | } |
Slepnir | 0:25ad6eba7916 | 63 | |
Slepnir | 2:6db5c9a2894c | 64 | void SmartPlugService::updateCurrent(uint32_t c) |
Slepnir | 0:25ad6eba7916 | 65 | { |
Slepnir | 0:25ad6eba7916 | 66 | if (ble.getGapState().connected) |
Slepnir | 0:25ad6eba7916 | 67 | { |
Slepnir | 2:6db5c9a2894c | 68 | convert(current,c); |
Slepnir | 2:6db5c9a2894c | 69 | ble.updateCharacteristicValue(currentChar.getValueHandle(),(current),sizeof(current)); |
Slepnir | 0:25ad6eba7916 | 70 | } |
Slepnir | 0:25ad6eba7916 | 71 | } |
Slepnir | 0:25ad6eba7916 | 72 | |
Slepnir | 2:6db5c9a2894c | 73 | void SmartPlugService::updatePower(uint32_t p) |
Slepnir | 0:25ad6eba7916 | 74 | { |
Slepnir | 0:25ad6eba7916 | 75 | if (ble.getGapState().connected) |
Slepnir | 0:25ad6eba7916 | 76 | { |
Slepnir | 2:6db5c9a2894c | 77 | convert(power,p); |
Slepnir | 2:6db5c9a2894c | 78 | ble.updateCharacteristicValue(powerChar.getValueHandle(),(power),sizeof(power)); |
Slepnir | 0:25ad6eba7916 | 79 | } |
Slepnir | 0:25ad6eba7916 | 80 | } |
Slepnir | 0:25ad6eba7916 | 81 | |
Slepnir | 2:6db5c9a2894c | 82 | void SmartPlugService::updatePowerFactor(uint32_t pf) |
Slepnir | 0:25ad6eba7916 | 83 | { |
Slepnir | 0:25ad6eba7916 | 84 | if (ble.getGapState().connected) |
Slepnir | 1:e036e77762fa | 85 | { |
Slepnir | 2:6db5c9a2894c | 86 | convert(powerFactor,pf); |
Slepnir | 2:6db5c9a2894c | 87 | ble.updateCharacteristicValue(powerFactorChar.getValueHandle(),(powerFactor),sizeof(powerFactor)); |
Slepnir | 2:6db5c9a2894c | 88 | } |
Slepnir | 2:6db5c9a2894c | 89 | } |
Slepnir | 2:6db5c9a2894c | 90 | |
Slepnir | 2:6db5c9a2894c | 91 | void SmartPlugService::updateEnergy(uint32_t e) |
Slepnir | 2:6db5c9a2894c | 92 | { |
Slepnir | 2:6db5c9a2894c | 93 | if(ble.getGapState().connected) |
Slepnir | 2:6db5c9a2894c | 94 | { |
Slepnir | 2:6db5c9a2894c | 95 | convert(energy,e); |
Slepnir | 2:6db5c9a2894c | 96 | ble.updateCharacteristicValue(energyChar.getValueHandle(),energy,sizeof(energy)); |
Slepnir | 1:e036e77762fa | 97 | } |
Slepnir | 1:e036e77762fa | 98 | } |
Slepnir | 1:e036e77762fa | 99 | |
Slepnir | 1:e036e77762fa | 100 | void SmartPlugService::updateRelay(Relay* relay) |
Slepnir | 1:e036e77762fa | 101 | { |
Slepnir | 1:e036e77762fa | 102 | if (ble.getGapState().connected) |
Slepnir | 1:e036e77762fa | 103 | { |
Slepnir | 1:e036e77762fa | 104 | relayValue.updateData(relay); |
Slepnir | 1:e036e77762fa | 105 | ble.updateCharacteristicValue(relayChar.getValueHandle(),relayValue.getDataPointer(), |
Slepnir | 1:e036e77762fa | 106 | relayValue.getLenBytes()); |
Slepnir | 0:25ad6eba7916 | 107 | } |
Slepnir | 0:25ad6eba7916 | 108 | } |
Slepnir | 0:25ad6eba7916 | 109 | |
Slepnir | 0:25ad6eba7916 | 110 | void SmartPlugService::setupService(void) |
Slepnir | 0:25ad6eba7916 | 111 | { |
Slepnir | 0:25ad6eba7916 | 112 | |
Slepnir | 0:25ad6eba7916 | 113 | static bool serviceAdded = false; /* We should only ever need to add the service once. */ |
Slepnir | 0:25ad6eba7916 | 114 | if (serviceAdded) |
Slepnir | 0:25ad6eba7916 | 115 | { |
Slepnir | 0:25ad6eba7916 | 116 | return; |
Slepnir | 0:25ad6eba7916 | 117 | } |
Slepnir | 0:25ad6eba7916 | 118 | |
Slepnir | 0:25ad6eba7916 | 119 | |
Slepnir | 0:25ad6eba7916 | 120 | GattCharacteristic *charTable[] = {&voltageChar,¤tChar,&powerChar, |
Slepnir | 0:25ad6eba7916 | 121 | &powerFactorChar,&energyChar,&relayChar, |
Slepnir | 0:25ad6eba7916 | 122 | &updateChar |
Slepnir | 0:25ad6eba7916 | 123 | }; |
Slepnir | 0:25ad6eba7916 | 124 | GattService smartPlugService = GattService(SPS_UUID_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *)); |
Slepnir | 0:25ad6eba7916 | 125 | ble.addService(smartPlugService); |
Slepnir | 0:25ad6eba7916 | 126 | |
Slepnir | 0:25ad6eba7916 | 127 | } |