Fork of my MQTTGateway

Dependencies:   mbed-http

XbeeMonitor/XbeeMonitor.cpp

Committer:
vpcola
Date:
2017-04-08
Revision:
0:f1d3878b8dd9

File content as of revision 0:f1d3878b8dd9:

#include "XbeeMonitor.h"
#include "XBeeLib.h"
#include "Utils.h"
#include "MQTTSManager.h"
#include "config.h"
#include "mbed.h"

using namespace XBeeLib;

#if defined(TARGET_NUCLEO_L476RG)
XBee802 xbee(D8, D2, NC, NC, NC, 115200); // local xbee
#else
XBee802 xbee(PTC15, PTC14, NC, NC, NC, 115200); // local xbee
#endif

extern float lastTemperature;

static MemoryPool<RadioControlData, 4> mpool;
static Queue<RadioControlData, 4> mqueue;

void postRadioControl(RadioControlData &data)
{
    // push data to pool
    RadioControlData *message = mpool.alloc();
    // Simple copy
    *message = data;
    mqueue.put(message);    
}

// Callback functions
static void io_data_cb(const RemoteXBee802 & remote, const IOSample802 & data)
{
    RadioStatus radioStatus;
    const uint64_t remote_addr64 = remote.get_addr64();
    
    printf("\r\n============== Radio Callback ===================\r\n");
    printf("\r\nRemote Radio Address :[%08x:%08x] %llu\r\n",
          UINT64_HI32(remote_addr64),
          UINT64_LO32(remote_addr64),
          remote_addr64);

    SensorData sdata;    
   
    // Get data from the digital input pin (DIO2) Sprinkler
    DioVal dio2;
    radioStatus = data.get_dio(XBee802::DIO2_AD2, &dio2);
    if (radioStatus != Success) {
        printf("Getting data from digital pin DIO2 FAILED\r\n");
    } 


    // Get data from the humidity pin
    uint16_t humidity;
    radioStatus = data.get_adc( XBee802::DIO3_AD3, &humidity);
    if (radioStatus != Success) {
        printf("Getting data from analog pin AD3 FAILED\r\n" );
    } 
    
    // Get data from the temperature pin
    uint16_t temperature;
    radioStatus = data.get_adc( XBee802::DIO0_AD0, &temperature);
    if (radioStatus != Success) {
        printf("Temperature : (AD0 Not connected) FAILED\r\n");
    } 
    
    // Get data from the luminace pin
    uint16_t luminance;
    radioStatus = data.get_adc( XBee802::DIO1_AD1, &luminance);
    if (radioStatus != Success) {
        printf("Getting data from analog pin AD1 FAILED\r\n");
    }    
    
    sdata.deviceaddr  = remote_addr64;
    sdata.temperature = lastTemperature;//temperature;
    sdata.humidity = 1023 - humidity;
    sdata.luminance = luminance;
    // Assign the value to the sensor data
    sdata.sprinkler = dio2;
    
    sdata.debug();        
    postMQTTUpdate(sdata);
    printf("\r\n=================================================\r\n");    
}

uint64_t getXbeeId()
{
    return xbee.get_addr64();   
}

int initXbeeMonitor()
{
  
    /* Register the callback function */
    xbee.register_io_sample_cb(&io_data_cb);
    
    /* Initialize the xbee device */
    RadioStatus radioStatus = xbee.init();
    if (radioStatus != Success)
    {
        printf("Radio initialization failed!\r\n");
        return -1;
    }
    printf("XBee radios initialized ...\r\n");
    
    return 0;
}

int sendControlData(RadioControlData * data)
{
    RadioStatus radioStatus;
    const RemoteXBee802 remoteDevice = RemoteXBee802(data->radioID);
    if (data->sprinkler_pin == 0) // Turn on 
    {
        radioStatus = xbee.set_dio(remoteDevice, XBee802::DIO2_AD2, Low);
    }else
    {
        radioStatus = xbee.set_dio(remoteDevice, XBee802::DIO2_AD2, High);
    }
    
    return (radioStatus == Success);
}

void runXbeeMonitor()
{
    // Continually listen for arriving frames
    while(true)
    {
        osEvent evt = mqueue.get(100);
        if (evt.status == osEventMessage) 
        {
            // Unpack the message
            RadioControlData * message = (RadioControlData *)evt.value.p;

            // Send the packet, do not queue the call
            sendControlData(message);
            
            // Free the message from mempool  after using
            mpool.free(message);
        }
        
        xbee.process_rx_frames();
        // Thread::wait(100);
    }
}