Francisco Santos
/
SRA_VFF
pepe
Diff: MessageBuilder.cpp
- Revision:
- 0:a7324f51348d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MessageBuilder.cpp Wed Mar 13 23:04:14 2019 +0000 @@ -0,0 +1,77 @@ +#include "MessageBuilder.h" +#include "mbed.h" + +MessageBuilder::MessageBuilder() { + reset(); +} + +MessageBuilder::~MessageBuilder() { + // TODO Auto-generated destructor stub +} + +char MessageBuilder::add(const void* data, size_t len) { + if (available() >= len) { + memcpy(_pointer, data, len); + _pointer += len; + return 0; + } else { + return 1; + } +} + +void MessageBuilder::reset() { + message[0] = 0x06; + message[1] = 0x85; + _pointer = &message[2]; +} + +// Note: if message size grow beyond 32 bytes, return "size_t" insted, because it +// is the most appropriate type for "sizeof" operator. Now, unsgined char is used +// for memory economy. +unsigned char MessageBuilder::available() { + return &message[max_len - 1] - _pointer + 1; +} + +unsigned char MessageBuilder::length() { + return _pointer - &message[0]; +} + +char MessageBuilder::add(float data) { + if (available() >= sizeof(data)) { + memcpy(_pointer, &data, sizeof(data)); + _pointer += sizeof(data); + return 0; + } else { + return 1; + } +} + +char MessageBuilder::add(int data) { + if (available() >= sizeof(data)) { + memcpy(_pointer, &data, sizeof(data)); + _pointer += sizeof(data); + return 0; + } else { + return 1; + } +} + +char MessageBuilder::add(char data) { + if (available() >= sizeof(data)) { + memcpy(_pointer, &data, sizeof(data)); + _pointer += sizeof(data); + return 0; + } else { + return 1; + } +} + +char MessageBuilder::add(unsigned int data) { + if (available() >= sizeof(data)) { + memcpy(_pointer, &data, sizeof(data)); + _pointer += sizeof(data); + return 0; + } else { + return 1; + } +} \ No newline at end of file