You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
esp-link/arduino/libraries/EspLink/EspLink.h

92 lines
2.3 KiB

#ifndef ESP_LINK_H
#define ESP_LINK_H
#include <inttypes.h>
#include <Stream.h>
typedef struct __attribute__((__packed__)) {
uint16_t len; // length of data
uint8_t data[0]; // really data[len]
} CmdArg;
typedef struct __attribute__((__packed__)) {
uint16_t cmd; // command to perform, from CmdName enum
uint16_t argc; // number of arguments to command
uint32_t value; // callback pointer for response or first argument
CmdArg args[0]; // really args[argc]
} CmdPacket;
typedef struct {
CmdPacket *cmd; // command packet header
uint32_t arg_num; // number of args parsed
uint8_t *arg_ptr; // pointer to ??
} CmdRequest;
typedef void (* CmdRequestCB)(CmdRequest *);
typedef enum {
CMD_NULL = 0,
CMD_SYNC, // synchronize and clear
CMD_RESP_V, // response with a value
CMD_RESP_CB, // response with a callback
CMD_WIFI_STATUS, // get the current wifi status
CMD_CB_ADD,
CMD_CB_EVENTS,
CMD_GET_TIME, // get current time in seconds since the unix epoch
CMD_MQTT_SETUP = 10, // set-up callbacks
CMD_MQTT_PUBLISH, // publish a message
CMD_MQTT_SUBSCRIBE, // subscribe to a topic
CMD_MQTT_LWT, // set the last-will-topic and messge
CMD_REST_SETUP = 20,
CMD_REST_REQUEST,
CMD_REST_SETHEADER,
CMD_WEB_JSON_DATA = 30,
CMD_WEB_REQ_CB,
} CmdName;
typedef enum
{
WAIT_FOR_SLIP_START,
READ_SLIP_PACKAGE,
} ReadState;
class EspLink
{
private:
uint16_t crc16_out;
Stream &stream;
ReadState readState;
uint8_t * readBuf;
uint16_t readBufPtr;
uint16_t readBufMax;
int readLastChar;
CmdRequestCB requestCb;
void crc16_add(uint8_t b, uint16_t *crc);
void writeChar(uint8_t chr);
void writeBuf(uint8_t * buf, uint16_t len);
void checkPacket();
void parseSlipPacket();
public:
EspLink(Stream &stream, CmdRequestCB callback);
~EspLink();
void sendPacketStart(uint16_t cmd, uint32_t value, uint16_t argc);
void sendPacketArg(uint16_t len, uint8_t * data);
void sendPacketEnd();
void readLoop();
uint32_t cmdGetArgc(CmdRequest *req);
int32_t cmdPopArg(CmdRequest *req, void *data, uint16_t len);
void cmdSkipArg(CmdRequest *req);
uint16_t cmdArgLen(CmdRequest *req);
};
#endif /* ESP_LINK_H */