Machine Cloud

Dependencies:   XBee mbed-rtos

MachineCloud.cpp

Committer:
ddollar
Date:
2013-08-15
Revision:
1:f5eafb42e9e4
Parent:
0:260d7796eb25
Child:
2:3fb7c06efa1e

File content as of revision 1:f5eafb42e9e4:

#include <string.h>
#include "MachineCloud.h"

MachineCloud::MachineCloud(char *model) {
    init(model, 0x1000);
}

MachineCloud::MachineCloud(char *model, uint16_t router) {
    init(model, router);
}

void MachineCloud::init(char *model, uint16_t router) {
    m_model = model;
    m_router = router;
}

int MachineCloud::connect() {
    m_xbee = new XBee(p9, p10);
    send("model", m_model);
    return 0;
}

int MachineCloud::disconnect() {
    m_xbee = NULL;
    return 0;
}

int MachineCloud::on_receive(MachineCloudCallback *function) {
    m_receiverFunction = function;
    m_receiverObject   = NULL;
    return 0;
}

int MachineCloud::on_receive(MachineCloudReceiver *object) {
    m_receiverFunction = NULL;
    m_receiverObject   = object;
    return 0;
}

int MachineCloud::send(char *key, char *value) {
    m_lock.lock();
    
    int size = strlen(key) + strlen(value) + 1;
    char *message = (char *)malloc(size);
    sprintf(message, "%s=%s", key, value);

    uint8_t payload[size];
    for (int i=0; i<size; i++) {
        payload[i] = message[i];
    }
    
    free(message);
    
    TxStatusResponse txStatus = TxStatusResponse();
    Tx16Request tx = Tx16Request(m_router, payload, sizeof(payload));
    m_xbee->send(tx);
    
    m_lock.unlock();
    
    return 0;
}

void MachineCloud::receive(char *key, char *value) {
    if (m_receiverFunction) (*m_receiverFunction)(key, value);
    if (m_receiverObject) m_receiverObject->receive(key, value);
}

Rx16Response rx16 = Rx16Response();

int MachineCloud::loop() {
    m_xbee->readPacket();
    
    if (m_xbee->getResponse().isAvailable()) {
        switch (m_xbee->getResponse().getApiId()) {
            case RX_16_RESPONSE:
                Rx16Response rx16 = Rx16Response();
                m_xbee->getResponse().getRx16Response(rx16);
                char *data = (char *)malloc(rx16.getDataLength() + 1);
                for (int i=0; i<rx16.getDataLength(); i++) {
                    data[i] = rx16.getData(i);
                }
                data[rx16.getDataLength()] = 0;
                char *key = strtok(data, "=");
                char *val = strtok(NULL, "=");
                receive(key, val);
                free(data);
        }
    }
    

    return 0;
}