Bluetooth Low Energy for Smart Plug

Dependencies:   BLE_API mbed nRF51822

Fork of SmartPlugBLE by Pavit Noinongyao

Revision:
3:aaa92c61931a
Parent:
2:6db5c9a2894c
Child:
4:721ae30c92f8
--- a/SmartPlugBLE.h	Wed Jul 08 07:25:11 2015 +0000
+++ b/SmartPlugBLE.h	Mon Jul 13 13:14:34 2015 +0000
@@ -5,63 +5,122 @@
 #include "MVC.h"
 #include "mbed.h"
 #include "SPCommunication.h"
-#include <vector> 
+#include <vector>
 
 
 class SmartPlugBLE: public Observable
 {
-    public:
-        SmartPlugBLE()
+public:
+    SmartPlugBLE():counter(60),led(LED3,0)
+     {
+        ticker.attach(this,&SmartPlugBLE::periodicCallback, 1); // blink LED every second
+    }
+
+    void onRelayWrite(const uint8_t *data)
+     {
+        counter = 60;
+        updateRelay(data);
+        notifyObservers();
+    }
+
+    void updateRelay(const uint8_t *data) 
+    {
+        uint8_t state = data[0]>>7;
+        uint8_t hour = data[0]&0x7F;
+        uint8_t min = data[1];
+        //instant behavior
+        if(state)
         {
-            ticker.attach(this,&SmartPlugBLE::periodicCallback, 1); // blink LED every second
-        }    
-            
-        void onRelayWrite(const uint8_t *data)
+            printf("Open!\r\n");
+            led = 0;
+        }
+        else if(!state && hour == 0 && min == 0)
         {
-            updateRelay(data);
-            notifyObservers();
+            printf("Close!\r\n");
+            led = 1;
         }
-        
-        void updateRelay(const uint8_t *data)
+        //
+        smartPlug.setRelay(state,hour,min);
+    }
+
+    void notifyObservers()
+     {
+        for(int i=0; i<observers.size(); i++) 
         {
-            smartPlug.setRelay(data);
+            observers[i]->updateObserver((void*)&smartPlug);
         }
-        
-        void notifyObservers()
-        {
-            for(int i=0;i<observers.size();i++)
+    }
+
+    void addObserver(Observer* o) 
+    {
+        observers.push_back(o);
+    }
+
+    void periodicCallback(void)
+     {
+        if(smartPlug.isCounting)
+         {
+            counter--;
+             if(counter > 60) 
             {
-                observers[i]->updateObserver((void*)&smartPlug);
+                smartPlug.getRelay()->setMinCounter(smartPlug.getRelay()->getMinCounter()-1);
+                if(smartPlug.getRelay()->getMinCounter() == 0) 
+                {
+                    smartPlug.getRelay()->setHrCounter(smartPlug.getRelay()->getHrCounter()-1);
+                    smartPlug.getRelay()->setMinCounter(0);
+                }
+                if(smartPlug.getRelay()->getHrCounter() >128) 
+                {
+                    smartPlug.getRelay()->setHrCounter(0);
+                    //spComm.setRelay(smartPlug.getRelay()->getState());
+                    if(smartPlug.getRelay()->getState())
+                        printf("Open!\r\n");
+                    else
+                    {
+                        printf("Close!\r\n");
+                        led = 1;
+                        smartPlug.isCounting = false;
+                    }
+                }
+                counter = 60;
             }
         }
-        
-        void addObserver(Observer* o)
-        {
-            observers.push_back(o);
-        }
-        
-        void periodicCallback(void) 
-        {
-            //led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
-        }
-        
-        void updateData(void)
-        {
-            smartPlug.setVoltage(smartPlug.getVoltage()+1);//(spComm.getVoltage());
-            smartPlug.setCurrent(smartPlug.getCurrent()+1);//(spComm.getCurrent());
-            smartPlug.setPower(smartPlug.getPower()+1);//(spComm.getPower());
-            smartPlug.setPowerFactor(smartPlug.getPowerFactor()+1);//(spComm.getPowerFactor());
-            smartPlug.setEnergy(smartPlug.getEnergy()+1);
-            notifyObservers();
-        }
-        
-    private:
-        SmartPlug smartPlug;
-        Ticker ticker;
-        //DigitalOut led1;
-        SPCommunication spComm;
-        //BLECommunication bleComm;
-        vector<Observer*> observers;
+        else
+            counter = 60;
+    }
+
+    void updateData(void) {
+        smartPlug.setVoltage/*(smartPlug.getVoltage()+1);*/(spComm.getVoltage());
+        smartPlug.setCurrent/*(smartPlug.getCurrent()+1);*/(spComm.getCurrent());
+        smartPlug.setPower/*(smartPlug.getPower()+1);*/(spComm.getPower());
+        smartPlug.setPowerFactor/*(smartPlug.getPowerFactor()+1);*/(spComm.getPowerFactor());
+        smartPlug.setEnergy/*(smartPlug.getEnergy()+1);*/(spComm.getEnergy());
+        //smartPlug.getRelay()->setState(spComm.getRelay());
+        notifyObservers();
+    }
+    
+    SmartPlug getSmartPlug()
+    {
+        return smartPlug;
+    }
+    
+    uint8_t getCounter()
+    {
+        return counter;
+    }
+    
+    void setCounter(uint8_t val)
+    {
+        counter = val;
+    }
+private:
+    SmartPlug smartPlug;
+    Ticker ticker;
+    uint8_t counter;
+    DigitalOut led;
+    SPCommunication spComm;
+    //BLECommunication bleComm;
+    vector<Observer*> observers;
 };
 
 #endif
\ No newline at end of file