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

STMClientResponse.cpp

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

File content as of revision 12:0df73cbe5cbf:

#include "STMClientResponse.h"

STMClientResponse::STMClientResponse(STMClientPacket* packet) {
  _cmd = packet;
  _arg_ptr = _cmd->args;
  _arg_num = 0;
}

STMClientResponse::STMClientResponse(void* packet) {
  _cmd = (STMClientPacket *)packet;
  _arg_ptr = _cmd->args;
  _arg_num = 0;
}

int16_t STMClientResponse::popArgPtr(void **data) {
  if (_arg_num >= _cmd->argc) return -1;

  uint16_t len = *(uint16_t*)_arg_ptr;
  uint16_t pad = (4-((len+2)&3))&3;    // pad to next multiple of 4, including length
  _arg_ptr += 2;
  _arg_num++;

  *data = _arg_ptr;
  _arg_ptr += len + pad;
  return len;
}

int16_t STMClientResponse::popArg(void* d, uint16_t maxLen) {
  if (_arg_num >= _cmd->argc) return -1;

  uint16_t len = *(uint16_t*)_arg_ptr;
  uint16_t pad = (4-((len+2)&3))&3;    // pad to next multiple of 4, including length
  _arg_ptr += 2;
  _arg_num++;

  uint8_t *data = (uint8_t *)d;
  uint16_t l = len > maxLen ? maxLen : len;
  uint8_t *p = _arg_ptr;
  while (l--)
    *data++ = *p++;

  _arg_ptr += len + pad;
  return len;
}

void STMClientResponse::popChar(char* buffer) {
  uint16_t len = *(uint16_t*)_arg_ptr;
  uint16_t pad = (4-((len+2)&3))&3;    // pad to next multiple of 4, including length
  _arg_ptr += 2;
  _arg_num++;

  uint8_t i;
  for (i = 0; i < len; i++) {
    buffer[i] = (char)*_arg_ptr++;
  }
  buffer[i] = '\0';

  _arg_ptr += pad;
}

string STMClientResponse::popString() {
  string ret;
  uint16_t len = *(uint16_t*)_arg_ptr;
  uint16_t pad = (4-((len+2)&3))&3;    // pad to next multiple of 4, including length
  _arg_ptr += 2;
  _arg_num++;

  while (len--)
    ret += (char)*_arg_ptr++;

  _arg_ptr += pad;
  return ret;
}

void STMClientResponse::popString(string* data) {
  uint16_t len = *(uint16_t*)_arg_ptr;
  uint16_t pad = (4-((len+2)&3))&3;    // pad to next multiple of 4, including length
  _arg_ptr += 2;
  _arg_num++;

  while (len--)
    //string.append((char)*_arg_ptr++);
    //strcat (data,(char)*_arg_ptr++);
    data += (char)*_arg_ptr++;

  _arg_ptr += pad;
}