Bluetooth Low Energy for Smart Plug

Dependencies:   BLE_API mbed nRF51822

Services/SmartPlugService.h

Committer:
Slepnir
Date:
2015-07-07
Revision:
1:e036e77762fa
Parent:
0:25ad6eba7916
Child:
2:6db5c9a2894c

File content as of revision 1:e036e77762fa:

#ifndef SP_SERVICE_H
#define SP_SERVICE_H

#include "ble/BLE.h"
#include "MVC.h"
#include "mbed.h"
#include "SmartPlugBLE.h"


#define FULL_UUID(uuid_16) {        \
    0x9B,0x3F,uuid_16>>16,uuid_16&0xFF,0x65,0x80,0x47,0x51, \
    0xB0,0x2F,0xA7,0xB5,0x19,0x4C,0x7F,0x23     \
    }

static const uint16_t SPS_UUID_SERVICE = 0x1522;
static const uint16_t SPS_UUID_VOLTAGE_CHAR = 0x1523;
static const uint16_t SPS_UUID_CURERNT_CHAR = 0x1524;
static const uint16_t SPS_UUID_POWER_CHAR = 0x1525;
static const uint16_t SPS_UUID_POWER_FACTOR_CHAR = 0x1526;
static const uint16_t SPS_UUID_ENERGY_CHAR = 0x1527;
static const uint16_t SPS_UUID_RELAY_CHAR = 0x1528;
static const uint16_t SPS_UUID_UPDATE_CHAR = 0x1529;

static const uint8_t SPS_UUID_SERVICE_FULL[] = FULL_UUID(SPS_UUID_SERVICE);
static const uint8_t SPS_UUID_VOLTAGE_CHAR_FULL[] = FULL_UUID(SPS_UUID_VOLTAGE_CHAR);
static const uint8_t SPS_UUID_CURERNT_CHAR_FULL[] = FULL_UUID(SPS_UUID_CURERNT_CHAR);
static const uint8_t SPS_UUID_POWER_CHAR_FULL[] = FULL_UUID(SPS_UUID_POWER_CHAR);
static const uint8_t SPS_UUID_POWER_FACTOR_CHAR_FULL[] = FULL_UUID(SPS_UUID_POWER_FACTOR_CHAR);
static const uint8_t SPS_UUID_ENERGY_CHAR_FULL[] = FULL_UUID(SPS_UUID_ENERGY_CHAR);
static const uint8_t SPS_UUID_RELAY_CHAR_FULL[] = FULL_UUID(SPS_UUID_RELAY_CHAR);
static const uint8_t SPS_UUID_UPDATE_CHAR_FULL[] = FULL_UUID(SPS_UUID_UPDATE_CHAR);


class SmartPlugService: public Observer
{
public:
    SmartPlugService(BLE &_ble, SmartPlugBLE &sys);
    
    void updateVoltage(unsigned long value);
    void updateCurrent(unsigned long value);
    void updatePower(unsigned long value);
    void updatePowerFactor(unsigned long value); 
    void onDataWritten(const GattWriteCallbackParams *params);
    void update(void* data);    
    void updateData(SmartPlug* data);
    void updateRelay(Relay* relay);
    void setupService(void);
private:
    class RelayValueBytes
    {
        public:
            static const uint8_t MAX_SIZE_BYTES = 3;
            static const uint8_t STATE_INDEX = 0;
            static const uint8_t HOUR_TIMER_INDEX = 1;
            static const uint8_t MINUTE_TIMER_INDEX = 2;
            
            RelayValueBytes()
            {
                
            }
            
            void updateData(Relay* relay)
            {
                data[STATE_INDEX] = relay->getState();
                data[HOUR_TIMER_INDEX] = relay->getHrCounter();
                data[MINUTE_TIMER_INDEX] = relay->getMinCounter();
            }
            
            uint8_t* getDataPointer()
            {
                return data;
            }
            
            uint8_t getLenBytes()
            {
                if(data[HOUR_TIMER_INDEX] == 0 && data[MINUTE_TIMER_INDEX] == 0)
                    return 1;
                else
                    return MAX_SIZE_BYTES;
            }
        private:
            uint8_t data[MAX_SIZE_BYTES];
    };

    BLE ble;
    
    unsigned long voltage;
    unsigned long current;
    unsigned long power;
    unsigned long powerFactor;
    unsigned long energy;
    RelayValueBytes relayValue;
    //uint8_t updateValue;
    SmartPlugBLE& system;
    
    ReadOnlyGattCharacteristic<unsigned long> voltageChar;
    ReadOnlyGattCharacteristic<unsigned long> currentChar;
    ReadOnlyGattCharacteristic<unsigned long> powerChar;
    ReadOnlyGattCharacteristic<unsigned long> powerFactorChar;
    ReadOnlyGattCharacteristic<unsigned long> energyChar;
    GattCharacteristic relayChar;
    WriteOnlyGattCharacteristic<uint8_t> updateChar;
};

#endif