This is a SLIP interface for the STM32F446RE Nucleo Board. It is designed to work specifically with the esp-link software for the ESP8266. The program is an example of a rest command.
Diff: STMClient.h
- Revision:
- 0:70a6082c1bf7
- Child:
- 2:20ea1be14e4b
diff -r 000000000000 -r 70a6082c1bf7 STMClient.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/STMClient.h Thu Jul 14 20:38:18 2016 +0000 @@ -0,0 +1,116 @@ +#ifndef _STM_CLIENT_H_ +#define _STM_CLIENT_H_ + +#include "mbed.h" +#include "STMClientResponse.h" +#include "FP.h" + +#define ESP_TIMEOUT 2000 + +// Enumeration of commands supported by esp-link, this needs to match the definition in +// esp-link! +typedef enum { + CMD_NULL = 0, // null, mainly to prevent 0 from doing something bad + CMD_SYNC, // synchronize, starts the protocol + CMD_RESP_V, // response with a value + CMD_RESP_CB, // response with a callback + CMD_WIFI_STATUS, // get the wifi status + CMD_CB_ADD, // add a custom callback + CMD_CB_EVENTS, // ??? + CMD_GET_TIME, // get current time in seconds since the unix epoch + //CMD_GET_INFO, + + CMD_MQTT_SETUP = 10, + CMD_MQTT_PUBLISH, + CMD_MQTT_SUBSCRIBE, + CMD_MQTT_LWT, + CMD_MQTT_EVENTS, + + CMD_REST_SETUP = 20, + CMD_REST_REQUEST, + CMD_REST_SETHEADER, + CMD_REST_EVENTS + +} CmdName; + +enum WIFI_STATUS { + STATION_IDLE = 0, + STATION_CONNECTING, + STATION_WRONG_PASSWORD, + STATION_NO_AP_FOUND, + STATION_CONNECT_FAIL, + STATION_GOT_IP +}; + +typedef struct { + uint8_t* buf; + uint16_t bufSize; + uint16_t dataLen; + uint8_t isEsc; +} STMClientProtocol; + +class STMClient { + public: + //Make the serial process interrupt driven + + // Create an esp-link client based on a stream and with a specified debug output stream. + STMClient(Serial* serial, Serial* debug); + + // Create an esp-link client based on a stream with no debug output + STMClient(Serial* serial); + + Serial* _debug; + + //== Requests + // Start a request. cmd is the command to execute, value is either the address of a function + // to call with a response or a first argument to the command if there is no CB. + // Argc is the number of additional arguments + void Request(uint16_t cmd, uint32_t value, uint16_t argc); + + // Add a data block as argument to a request + void Request(const void* data, uint16_t len); + + // Add a data block from flash as argument to a request + //void Request(const __FlashStringHelper* data, uint16_t len); //commented out for now... + + // Finish a request + void Request(void); + + //== Responses + // Process the input stream, call this in loop() to dispatch call-back based responses. + // Callbacks are invoked with an STMClientResponse pointer as argument. + // Returns the STMClientPacket if a non-callback response was received, typically this is + // used to create an STMClientResponse. Returns NULL if no response needs to be processed. + STMClientPacket *Process(void); + + // Busy wait for a response with a timeout in milliseconds, returns an STMClientPacket + // if a response was recv'd and NULL otherwise. The STMClientPacket is typically used to + // create an STMClientResponse. + STMClientPacket *WaitReturn(uint32_t timeout=ESP_TIMEOUT); + + //== Commands built-into STMClient + // Initialize and synchronize communication with esp-link with a timeout in milliseconds, + // and remove all existing callbacks. Registers the wifiCb and returns true on success + bool Sync(uint32_t timeout=ESP_TIMEOUT); + // Request the wifi status + void GetWifiStatus(void); + + // Callback for wifi status changes that must be attached before calling Sync + FP<void, void*> wifiCb; + + //private: + Serial* _serial; + bool _debugEn; + uint16_t crc; + STMClientProtocol _proto; + uint8_t _protoBuf[128]; + + void init(); + void DBG(const char* info); + STMClientPacket *protoCompletedCb(void); + void write(uint8_t data); + void write(void* data, uint16_t len); + uint16_t crc16Add(unsigned char b, uint16_t acc); + uint16_t crc16Data(const unsigned char *data, uint16_t len, uint16_t acc); +}; +#endif // _EL_CLIENT_H_ \ No newline at end of file