ifocus smart light sample v0.9

Dependencies:   MbedJSONValue MQTT

main.cpp

Committer:
zixuanlim
Date:
2019-12-11
Revision:
5:9b664d736a6a
Parent:
4:dffb6c949dbf
Child:
6:cd4d7e943f96

File content as of revision 5:9b664d736a6a:

#include "mbed.h"
#include "TCPSocket.h"
#include "MQTTNetwork.h"
#include "MQTTmbed.h"
#include "MQTTClient.h"

#define WIFI_IDW0XX1    2
#define MQTTCLIENT_QOS2 1

#define RELAY_TIMEOUT 1

#if (defined(TARGET_DISCO_L475VG_IOT01A) || defined(TARGET_DISCO_F413ZH))
#include "ISM43362Interface.h"

//ISM43362Interface _Wifi(MBED_CONF_APP_WIFI_SPI_MOSI, MBED_CONF_APP_WIFI_SPI_MISO, MBED_CONF_APP_WIFI_SPI_SCLK, MBED_CONF_APP_WIFI_SPI_NSS, MBED_CONF_APP_WIFI_RESET, MBED_CONF_APP_WIFI_DATAREADY, MBED_CONF_APP_WIFI_WAKEUP, false);
ISM43362Interface _Wifi(false);
//
//#else // External WiFi modules
//
//#if MBED_CONF_APP_WIFI_SHIELD == WIFI_IDW0XX1
//#include "SpwfSAInterface.h"
//SpwfSAInterface _Wifi(MBED_CONF_APP_WIFI_TX, MBED_CONF_APP_WIFI_RX);
//
//#endif // MBED_CONF_APP_WIFI_SHIELD == WIFI_IDW0XX1

#endif

//WiFi LED region

#define WIFI_LED_ON     {_wifiLed.output(); _wifiLed = 1;_isWifiLedOn = 1;}
#define WIFI_LED_OFF    {_wifiLed.input(); _isWifiLedOn = 0;}

DigitalOut _pirSensorLed(LED1);
DigitalOut _relayLed(LED2);
DigitalInOut _wifiLed(LED3);

DigitalOut _relay1(D7);

InterruptIn _motionTrigger(D2);

Thread _dioManagerThread;
Thread _wifiManagerThread;

int _currentRelayTimeout = RELAY_TIMEOUT;

typedef enum ServerConnectivity
{
    Disconnected,
    Connected
}ServerConnectivity;

ServerConnectivity _brokerConnection;
ServerConnectivity _pelionConnection;
 
Timer _resetRelayTimer;

bool _isRelayTriggered = false;
bool _isWifiConnected = false;

int _isWifiLedOn = 0;

void OnRelay()
{
    //_relayLed = 1;
    _relay1 = 1;
    _isRelayTriggered = true;
}

void OffRelay()
{
    if(!_pirSensorLed)
    {
        //_relayLed = 0;
        _relay1 = 0;
        _isRelayTriggered = false;
        _resetRelayTimer.stop();
    }
    else
    {
        _resetRelayTimer.reset();
    }
}

void OnTrigger()
{
    _pirSensorLed = 1;
    _resetRelayTimer.reset();
    
    if(!_isRelayTriggered)
    {
        OnRelay();
        _resetRelayTimer.start();
    }
}

void OffTrigger()
{
    _pirSensorLed = 0; //When no more motion trigger, off the PIR LED
}

void HandlePIR()
{
    _motionTrigger.rise(&OnTrigger); 
    _motionTrigger.fall(&OffTrigger);
    
    while(true)
    {
        if(_isRelayTriggered) //If relay is triggering
        {
            if(_resetRelayTimer.read() > _currentRelayTimeout) //Read Timer, if timer read above target time
            {                
                OffRelay(); //Turn off the relay
            }
        }
        thread_sleep_for(500);
    }
}


void ConnectWifi()
{   
    do
    {
        if(!_isWifiConnected)
        {
            _Wifi.disconnect();

            int ret = 0;
            do
            {
                ret = _Wifi.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
                if(ret != 0)
                {
                    thread_sleep_for(500);
                }
            }while(ret != 0);
            
            //Connected to WiFi interface or WIFI?
            
            //Start connectivity
        }
        else
        {
            _relayLed = !_relayLed;
        }        
        thread_sleep_for(500);
    }while(true);
}

void status_callback(nsapi_event_t status, intptr_t param)
{   
    if (status == NSAPI_EVENT_CONNECTION_STATUS_CHANGE) {
        switch(param) {
            case NSAPI_STATUS_GLOBAL_UP:
            {
                _isWifiConnected = true;
                _currentRelayTimeout = 10; //ZXLIM - Assume connected to broker and control by broker
                WIFI_LED_ON;
                break;
            }
            default:
            {
                _isWifiConnected = false; //ZXLIM - Ignore connected LAN 1st.
                _currentRelayTimeout = 1;
                break;
            }
        }
    }
}


int main()
{
    
    _dioManagerThread.start(callback(HandlePIR));    
    _Wifi.attach(&status_callback);
    _wifiManagerThread.start(callback(ConnectWifi));
    
    while(true)
    {
        while(!_isWifiConnected)
        {
            if(!_isWifiLedOn)
            {
                WIFI_LED_ON;
            }
            else
            {
                WIFI_LED_OFF;
            }            
            thread_sleep_for(100);
        }      
        thread_sleep_for(500);
    }
}