Bluetooth Low Energy for Smart Plug

Dependencies:   BLE_API mbed nRF51822

Fork of SmartPlugBLE by Pavit Noinongyao

Committer:
Slepnir
Date:
Wed Jul 08 07:25:11 2015 +0000
Revision:
2:6db5c9a2894c
Parent:
1:e036e77762fa
Child:
3:aaa92c61931a
Beta version:; - Everything works, have not tested the timer function

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 2:6db5c9a2894c 39 {//like stack
Slepnir 2:6db5c9a2894c 40 printf("SmartPlugService::onDataWritten params->len = %d\r\n",params->len);
Slepnir 2:6db5c9a2894c 41 for(int i=0;i<params->len;i++)
Slepnir 2:6db5c9a2894c 42 {
Slepnir 2:6db5c9a2894c 43 printf("data = 0x%08x\r\n",params->data[i]);
Slepnir 2:6db5c9a2894c 44 }
Slepnir 2:6db5c9a2894c 45 system.onRelayWrite(params->data);
Slepnir 2:6db5c9a2894c 46 }
Slepnir 0:25ad6eba7916 47 }
Slepnir 0:25ad6eba7916 48
Slepnir 2:6db5c9a2894c 49 void SmartPlugService::updateObserver(void* data)
Slepnir 0:25ad6eba7916 50 {
Slepnir 2:6db5c9a2894c 51 SmartPlug* sp = (SmartPlug*)data;
Slepnir 2:6db5c9a2894c 52 updateVoltage(sp->getVoltage());
Slepnir 2:6db5c9a2894c 53 updateCurrent(sp->getCurrent());
Slepnir 2:6db5c9a2894c 54 updatePower(sp->getPower());
Slepnir 2:6db5c9a2894c 55 updatePowerFactor(sp->getPowerFactor());
Slepnir 2:6db5c9a2894c 56 updateEnergy(sp->getEnergy());
Slepnir 2:6db5c9a2894c 57 updateRelay(&sp->getRelay());
Slepnir 0:25ad6eba7916 58 }
Slepnir 0:25ad6eba7916 59
Slepnir 2:6db5c9a2894c 60 void SmartPlugService::updateVoltage(uint32_t v)
Slepnir 0:25ad6eba7916 61 {
Slepnir 0:25ad6eba7916 62 if (ble.getGapState().connected)
Slepnir 0:25ad6eba7916 63 {
Slepnir 2:6db5c9a2894c 64 convert(voltage,v);
Slepnir 2:6db5c9a2894c 65 ble.updateCharacteristicValue(voltageChar.getValueHandle(),voltage,sizeof(voltage));
Slepnir 0:25ad6eba7916 66 }
Slepnir 0:25ad6eba7916 67 }
Slepnir 0:25ad6eba7916 68
Slepnir 2:6db5c9a2894c 69 void SmartPlugService::updateCurrent(uint32_t c)
Slepnir 0:25ad6eba7916 70 {
Slepnir 0:25ad6eba7916 71 if (ble.getGapState().connected)
Slepnir 0:25ad6eba7916 72 {
Slepnir 2:6db5c9a2894c 73 convert(current,c);
Slepnir 2:6db5c9a2894c 74 ble.updateCharacteristicValue(currentChar.getValueHandle(),(current),sizeof(current));
Slepnir 0:25ad6eba7916 75 }
Slepnir 0:25ad6eba7916 76 }
Slepnir 0:25ad6eba7916 77
Slepnir 2:6db5c9a2894c 78 void SmartPlugService::updatePower(uint32_t p)
Slepnir 0:25ad6eba7916 79 {
Slepnir 0:25ad6eba7916 80 if (ble.getGapState().connected)
Slepnir 0:25ad6eba7916 81 {
Slepnir 2:6db5c9a2894c 82 convert(power,p);
Slepnir 2:6db5c9a2894c 83 ble.updateCharacteristicValue(powerChar.getValueHandle(),(power),sizeof(power));
Slepnir 0:25ad6eba7916 84 }
Slepnir 0:25ad6eba7916 85 }
Slepnir 0:25ad6eba7916 86
Slepnir 2:6db5c9a2894c 87 void SmartPlugService::updatePowerFactor(uint32_t pf)
Slepnir 0:25ad6eba7916 88 {
Slepnir 0:25ad6eba7916 89 if (ble.getGapState().connected)
Slepnir 1:e036e77762fa 90 {
Slepnir 2:6db5c9a2894c 91 convert(powerFactor,pf);
Slepnir 2:6db5c9a2894c 92 ble.updateCharacteristicValue(powerFactorChar.getValueHandle(),(powerFactor),sizeof(powerFactor));
Slepnir 2:6db5c9a2894c 93 }
Slepnir 2:6db5c9a2894c 94 }
Slepnir 2:6db5c9a2894c 95
Slepnir 2:6db5c9a2894c 96 void SmartPlugService::updateEnergy(uint32_t e)
Slepnir 2:6db5c9a2894c 97 {
Slepnir 2:6db5c9a2894c 98 if(ble.getGapState().connected)
Slepnir 2:6db5c9a2894c 99 {
Slepnir 2:6db5c9a2894c 100 convert(energy,e);
Slepnir 2:6db5c9a2894c 101 ble.updateCharacteristicValue(energyChar.getValueHandle(),energy,sizeof(energy));
Slepnir 1:e036e77762fa 102 }
Slepnir 1:e036e77762fa 103 }
Slepnir 1:e036e77762fa 104
Slepnir 1:e036e77762fa 105 void SmartPlugService::updateRelay(Relay* relay)
Slepnir 1:e036e77762fa 106 {
Slepnir 1:e036e77762fa 107 if (ble.getGapState().connected)
Slepnir 1:e036e77762fa 108 {
Slepnir 2:6db5c9a2894c 109 if(relay->getState())
Slepnir 2:6db5c9a2894c 110 {
Slepnir 2:6db5c9a2894c 111 led = 0;
Slepnir 2:6db5c9a2894c 112 printf("Open\r\n");
Slepnir 2:6db5c9a2894c 113 }
Slepnir 2:6db5c9a2894c 114 else
Slepnir 2:6db5c9a2894c 115 {
Slepnir 2:6db5c9a2894c 116 led = 1;
Slepnir 2:6db5c9a2894c 117 printf("Close\r\n");
Slepnir 2:6db5c9a2894c 118 }
Slepnir 1:e036e77762fa 119 relayValue.updateData(relay);
Slepnir 2:6db5c9a2894c 120 //convert(relayValue.getDataPointer(),*relayValue.getDataPointer());
Slepnir 1:e036e77762fa 121 ble.updateCharacteristicValue(relayChar.getValueHandle(),relayValue.getDataPointer(),
Slepnir 1:e036e77762fa 122 relayValue.getLenBytes());
Slepnir 0:25ad6eba7916 123 }
Slepnir 0:25ad6eba7916 124 }
Slepnir 0:25ad6eba7916 125
Slepnir 0:25ad6eba7916 126 void SmartPlugService::setupService(void)
Slepnir 0:25ad6eba7916 127 {
Slepnir 0:25ad6eba7916 128
Slepnir 0:25ad6eba7916 129 static bool serviceAdded = false; /* We should only ever need to add the service once. */
Slepnir 0:25ad6eba7916 130 if (serviceAdded)
Slepnir 0:25ad6eba7916 131 {
Slepnir 0:25ad6eba7916 132 return;
Slepnir 0:25ad6eba7916 133 }
Slepnir 0:25ad6eba7916 134
Slepnir 0:25ad6eba7916 135
Slepnir 0:25ad6eba7916 136 GattCharacteristic *charTable[] = {&voltageChar,&currentChar,&powerChar,
Slepnir 0:25ad6eba7916 137 &powerFactorChar,&energyChar,&relayChar,
Slepnir 0:25ad6eba7916 138 &updateChar
Slepnir 0:25ad6eba7916 139 };
Slepnir 0:25ad6eba7916 140 GattService smartPlugService = GattService(SPS_UUID_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
Slepnir 0:25ad6eba7916 141 ble.addService(smartPlugService);
Slepnir 0:25ad6eba7916 142
Slepnir 0:25ad6eba7916 143 }