/*! \file ELClientResponse.cpp \brief Constructor and functions for ELClientResponse */ #include "ELClientResponse.h" /*! ELClientResponse(ELClientPacket* packet) @brief Constructor for ELClientResponse with ELClientPacket packet @param packet Pointer to packet for response @par Example @code no example code yet @endcode */ ELClientResponse::ELClientResponse(ELClientPacket* packet) { _cmd = packet; _arg_ptr = _cmd->args; _arg_num = 0; } /*! ELClientResponse(void* packet) @brief Constructor for ELClientResponse with void packet @param packet Pointer to packet for response @par Example @code no example code yet @endcode */ ELClientResponse::ELClientResponse(void* packet) { _cmd = (ELClientPacket *)packet; _arg_ptr = _cmd->args; _arg_num = 0; } /*! popArgPtr(void **data) @brief Extract pointer to an argument from the response packet @param data Pointer to buffer for the argument pointer @return int16_t Size of argument @par Example @code no example code yet @endcode */ int16_t ELClientResponse::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; } /*! popArg(void* d, uint16_t maxLen) @brief Extract an argument from the response packet @param d Pointer to buffer for the argument @param maxLen Size of the buffer for the argument @return int16_t Size of argument @par Example @code no example code yet @endcode */ int16_t ELClientResponse::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; } /*! popChar(char* buffer) @brief Extract a character from the response packet @param buffer Pointer to buffer for the character @par Example @code no example code yet @endcode */ void ELClientResponse::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; } /*! popString() @brief Extract a string from the response packet @return String String extracted from the response packet @par Example @code no example code yet @endcode */ String ELClientResponse::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; } /*! popString(String* data) @brief Extract the pointer to a string from the response packet @param data Pointer to be set to the string in the response packet @par Example @code no example code yet @endcode */ void ELClientResponse::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--) data->concat((char)*_arg_ptr++); _arg_ptr += pad; }