Client for the DeviceHubNet gateway. (You need the gateway SW as well!)

Dependents:   DeviceHubNet_DEMO

DeviceHubNet.h

Committer:
gume
Date:
2017-03-28
Revision:
0:093f1cb20c52
Child:
1:5dca66437dd1

File content as of revision 0:093f1cb20c52:

#ifndef __DEVICEHUBNET_H__
#define __DEVICEHUBNET_H__

#include <mbed.h>
#include "RF24.h"
#include <list>
#include <map>
#include <string>

#define BROADCAST_ADDRESS_LL 0x3333333333LL
#define NETWORK_PREFIX 0x424D45L    // All network node has a common 3 byte address prefix

#define PACKET_PING 1
#define PACKET_PONG 2
#define PACKET_DATA 3
#define PACKET_REGISTER 4
#define PACKET_UNREGISTER 5
#define PACKET_REGISTERERROR 6
#define PACKET_ERROR 15


struct __attribute__((__packed__)) Message {
    uint16_t sourceAddress;
    uint8_t type;
    uint8_t counter;
    uint8_t payload[28];
};

struct __attribute__((__packed__)) MsgRegister {
    uint8_t rType;  // 1: Project, 2: Device, 3: Sensor, 4: Actuator
    uint8_t id[27];
};

struct __attribute__((__packed__)) MsgData {
    uint16_t sensorId;
    uint8_t dType;  // 0: Digital, 1: Analog
    union {
        uint8_t ddata;
        float adata;
    } data;
};


class DeviceHubNet
{
private:
    uint32_t projectId;
    uint8_t apiKey[16];
    uint8_t deviceId[16];
    uint16_t nextSId;       // Increasing sensor IDs

    map<uint16_t, string> sensors;
    map<uint16_t, string> actuators;
    map<uint16_t, void*> actuator_cbs;
    map<uint16_t, uint8_t> actuator_types;

    RF24 *radio;
    uint16_t nodeAddress;
    uint8_t msgCounter;

    int readHex(char *hexStr, uint8_t *hex);
    bool sendData(uint8_t type, uint8_t *data, uint8_t len);
    uint64_t getFullAddress();
    uint64_t getGWAddress();
    
    void registerProject();
    void registerDevice();

public:
    DeviceHubNet(uint32_t projectId, uint8_t* apiKey, uint8_t* deviceId);
    DeviceHubNet(uint32_t projectId, char* apiKeyStr, char* deviceIdStr);
    virtual ~DeviceHubNet() {};

    bool radioPinConfig(PinName mosi, PinName miso, PinName sck, PinName cs, PinName ce);
    bool radioConfig(uint16_t address, uint8_t channel);
    void radioDump();

    void processMsgs();

    uint16_t registerSensor(char* sensorName);
    uint16_t registerActuator(char *actuatorName, uint8_t type, void (*onReceive)(uint8_t, uint8_t, float));
    void reRegisterSensor(uint16_t sensorId);
    void reRegisterActuator(uint16_t actuatorId);

    bool sendDigitalData(uint16_t sensorId, uint8_t data);
    bool sendAnalogData(uint16_t sensorId, float data);
};

#endif