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.

Dependencies:   mbed DHT Matrix

STMClientRest.cpp

Committer:
ShaneKirkbride
Date:
2016-10-10
Revision:
12:0df73cbe5cbf
Parent:
0:70a6082c1bf7

File content as of revision 12:0df73cbe5cbf:

#include "STMClientRest.h"
#include "millis.h"

typedef enum {
  HEADER_GENERIC = 0,
  HEADER_CONTENT_TYPE,
  HEADER_USER_AGENT
} HEADER_TYPE;

STMClientRest::STMClientRest(STMClient *e)
{
  _elc = e;
  remote_instance = -1;
}

void STMClientRest::restCallback(void *res)
{
  if (!res) return;

  STMClientResponse *resp = (STMClientResponse *)res;

  resp->popArg(&_status, sizeof(_status));
  _elc->_debug->printf("REST code %i \n\r",_status);

  _len = resp->popArgPtr(&_data);
}

int STMClientRest::begin(const char* host, uint16_t port, bool security)
{
  uint8_t sec = !!security;
  restCb.attach(this, &STMClientRest::restCallback);

  _elc->Request(CMD_REST_SETUP, (uint32_t)&restCb, 3);
  _elc->Request(host, strlen(host));
  _elc->Request(&port, 2);
  _elc->Request(&sec, 1);
  _elc->Request();

  STMClientPacket *pkt = _elc->WaitReturn();
  if (pkt && (int32_t)pkt->value >= 0) {
    remote_instance = pkt->value;
    return 0;
  }
  return (int)pkt->value;
}

void STMClientRest::request(const char* path, const char* method, const char* data, int len)
{
  _status = 0;
  if (remote_instance < 0) return;
  if (data != 0 && len > 0) _elc->Request(CMD_REST_REQUEST, remote_instance, 3);
  else                      _elc->Request(CMD_REST_REQUEST, remote_instance, 2);
  _elc->Request(method, strlen(method));
  _elc->Request(path, strlen(path));
  if (data != NULL && len > 0) {
    _elc->Request(data, len);
  }

  _elc->Request();
}

void STMClientRest::request(const char* path, const char* method, const char* data)
{
  request(path, method, data, strlen(data));
}

void STMClientRest::get(const char* path, const char* data) { request(path, "GET", data); }
void STMClientRest::post(const char* path, const char* data) { request(path, "POST", data); }
void STMClientRest::put(const char* path, const char* data) { request(path, "PUT", data); }
void STMClientRest::del(const char* path) { request(path, "DELETE", 0); }

void STMClientRest::setHeader(const char* value)
{
  uint8_t header_index = HEADER_GENERIC;
  _elc->Request(CMD_REST_SETHEADER, remote_instance, 2);
  _elc->Request(&header_index, 1);
  _elc->Request(value, strlen(value));
  _elc->Request();
}

void STMClientRest::setContentType(const char* value)
{
  uint8_t header_index = HEADER_CONTENT_TYPE;
  _elc->Request(CMD_REST_SETHEADER, remote_instance, 2);
  _elc->Request(&header_index, 1);
  _elc->Request(value, strlen(value));
  _elc->Request();
}

void STMClientRest::setUserAgent(const char* value)
{
  uint8_t header_index = HEADER_USER_AGENT;
  _elc->Request(CMD_REST_SETHEADER, remote_instance, 2);
  _elc->Request(&header_index, 1);
  _elc->Request(value, strlen(value));
  _elc->Request();
}

uint16_t STMClientRest::getResponse(char* data, uint16_t maxLen)
{
  if (_status == 0) return 0;
  memcpy(data, _data, _len>maxLen?maxLen:_len);
  int16_t s = _status;
  _status = 0;
  return s;
}

uint16_t STMClientRest::waitResponse(char* data, uint16_t maxLen, uint32_t timeout)
{
  uint32_t wait = millis();
  while (_status == 0 && (millis() - wait < timeout)) {
    _elc->Process();
  }
  return getResponse(data, maxLen);
}