Bluetooth Low Energy for Smart Plug

Dependencies:   BLE_API mbed nRF51822

Fork of SmartPlugBLE by Pavit Noinongyao

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?

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 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,&current,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,&currentChar,&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 }