Bluetooth Low Energy for Smart Plug
Dependencies: BLE_API mbed nRF51822
Fork of SmartPlugBLE by
Services/SmartPlugService.cpp@2:6db5c9a2894c, 2015-07-08 (annotated)
- 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?
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 | 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,¤tChar,&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 | } |