Bluetooth Low Energy for Smart Plug

Dependencies:   BLE_API mbed nRF51822

Fork of SmartPlugBLE by Pavit Noinongyao

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SmartPlugService.h Source File

SmartPlugService.h

00001 #ifndef SP_SERVICE_H
00002 #define SP_SERVICE_H
00003 
00004 #include "ble/BLE.h"
00005 #include "MVC.h"
00006 #include "mbed.h"
00007 #include "SmartPlugBLE.h"
00008 
00009 
00010 #define FULL_UUID(uuid_16) {        \
00011     0x9B,0x3F,uuid_16>>16,uuid_16&0xFF,0x65,0x80,0x47,0x51, \
00012     0xB0,0x2F,0xA7,0xB5,0x19,0x4C,0x7F,0x23     \
00013     }
00014 
00015 static const uint16_t SPS_UUID_SERVICE = 0x1522;
00016 static const uint16_t SPS_UUID_VOLTAGE_CHAR = 0x1523;
00017 static const uint16_t SPS_UUID_CURERNT_CHAR = 0x1524;
00018 static const uint16_t SPS_UUID_POWER_CHAR = 0x1525;
00019 static const uint16_t SPS_UUID_POWER_FACTOR_CHAR = 0x1526;
00020 static const uint16_t SPS_UUID_ENERGY_CHAR = 0x1527;
00021 static const uint16_t SPS_UUID_RELAY_CHAR = 0x1528;
00022 static const uint16_t SPS_UUID_UPDATE_CHAR = 0x1529;
00023 
00024 static const uint8_t SPS_UUID_SERVICE_FULL[] = FULL_UUID(SPS_UUID_SERVICE);
00025 static const uint8_t SPS_UUID_VOLTAGE_CHAR_FULL[] = FULL_UUID(SPS_UUID_VOLTAGE_CHAR);
00026 static const uint8_t SPS_UUID_CURERNT_CHAR_FULL[] = FULL_UUID(SPS_UUID_CURERNT_CHAR);
00027 static const uint8_t SPS_UUID_POWER_CHAR_FULL[] = FULL_UUID(SPS_UUID_POWER_CHAR);
00028 static const uint8_t SPS_UUID_POWER_FACTOR_CHAR_FULL[] = FULL_UUID(SPS_UUID_POWER_FACTOR_CHAR);
00029 static const uint8_t SPS_UUID_ENERGY_CHAR_FULL[] = FULL_UUID(SPS_UUID_ENERGY_CHAR);
00030 static const uint8_t SPS_UUID_RELAY_CHAR_FULL[] = FULL_UUID(SPS_UUID_RELAY_CHAR);
00031 static const uint8_t SPS_UUID_UPDATE_CHAR_FULL[] = FULL_UUID(SPS_UUID_UPDATE_CHAR);
00032 
00033 
00034 class SmartPlugService: public Observer
00035 {
00036 public:
00037     SmartPlugService(BLE &_ble, SmartPlugBLE &sys);
00038     
00039     void updateVoltage(uint32_t value);
00040     void updateCurrent(uint32_t value);
00041     void updatePower(uint32_t value);
00042     void updatePowerFactor(uint32_t value); 
00043     void onDataWritten(const GattWriteCallbackParams *params);
00044     void updateObserver(void* data);    
00045     void updateRelay(Relay* relay);
00046     void updateEnergy(uint32_t value);
00047     void setupService(void);
00048 private:
00049     class RelayValueBytes
00050     {
00051         public:
00052             static const uint8_t MAX_SIZE_BYTES = 2;
00053             static const uint8_t STATE_BIT_INDEX = 7;
00054             static const uint8_t STATE_BYTE_INDEX = 0;
00055             static const uint8_t HOUR_TIMER_BYTE_INDEX = 0;
00056             static const uint8_t MINUTE_TIMER_BYTE_INDEX = 1;
00057             
00058             RelayValueBytes()
00059             {
00060                 memset(data,0,MAX_SIZE_BYTES);
00061             }
00062             
00063             void updateData(Relay* relay)
00064             {
00065                 printf("updateData:: min = %d,hour = %d,state = %d\r\n",relay->getMinCounter(),relay->getHrCounter(),relay->getState());
00066                 data[STATE_BYTE_INDEX] |= ((relay->getState())<<STATE_BIT_INDEX);
00067                 data[HOUR_TIMER_BYTE_INDEX] |= relay->getHrCounter();
00068                 data[MINUTE_TIMER_BYTE_INDEX] = relay->getMinCounter();
00069             }
00070             
00071             void swap(uint8_t* ptr1,uint8_t* ptr2)
00072             {
00073                 uint8_t temp;
00074                 temp = *ptr1;
00075                 *ptr1 = *ptr2;
00076                 *ptr2 = temp;
00077             }
00078             
00079             void reverse(uint8_t* ptr)
00080             {
00081                 swap(&ptr[0],&ptr[1]);
00082             }
00083             
00084             uint8_t* getDataPointer()
00085             {
00086                 //reverse(data);
00087                 return data;
00088             }
00089             
00090             uint8_t getLenBytes()
00091             {
00092                 if(data[HOUR_TIMER_BYTE_INDEX] == 0 && data[MINUTE_TIMER_BYTE_INDEX] == 0)
00093                     return 1;
00094                 else
00095                     return MAX_SIZE_BYTES;
00096             }
00097         private:
00098             uint8_t data[MAX_SIZE_BYTES];
00099     };
00100 
00101     BLE ble;
00102     DigitalOut led;
00103     
00104     uint8_t voltage[4];
00105     uint8_t current[4];
00106     uint8_t power[4];
00107     uint8_t powerFactor[4];
00108     uint8_t energy[4];
00109 
00110     RelayValueBytes relayValue;
00111     //uint8_t updateValue;
00112     SmartPlugBLE& system;
00113     
00114     ReadOnlyGattCharacteristic<uint8_t[4]> voltageChar;
00115     ReadOnlyGattCharacteristic<uint8_t[4]> currentChar;
00116     ReadOnlyGattCharacteristic<uint8_t[4]> powerChar;
00117     ReadOnlyGattCharacteristic<uint8_t[4]> powerFactorChar;
00118     ReadOnlyGattCharacteristic<uint8_t[4]> energyChar;
00119     GattCharacteristic relayChar;
00120     WriteOnlyGattCharacteristic<uint8_t> updateChar;
00121 };
00122 
00123 #endif