Experiment of serial command protocol
Dependencies: RingBuffer SerialInterfaceProtocol duinotech_16x2_LCD mbed
You can edit this area
Diff: CommandPacket.cpp
- Revision:
- 4:658044ad7327
- Parent:
- 3:0c4aa3cec685
--- a/CommandPacket.cpp Thu Jun 16 03:52:01 2016 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,119 +0,0 @@ -#include "CommandPacket.h" -#include "mbed.h" - -#define CHECKSUM_DEBUG - -uint8_t generate_checksum(uint8_t *data, uint8_t length, uint8_t offset) -{ - uint8_t s = 0; - - if (data) - { - // take the sum of all data bytes preceding checksum field - for(uint8_t i = 0; i < length; i++) - { - s += data[i + offset]; - } - - // calculate two's complement of the remainder - s = 0xff - s + 1; - } - - return s; -} - -uint8_t hexchar_to_uint8(uint8_t ch) -{ - uint8_t val = 0; - - if (ch >= '0' && ch <= '9') - { - val = ch - '0'; - } - else if (ch >= 'A' && ch <= 'F') - { - val = ch - 'A'; - val += 10; - } - else if (ch >= 'a' && ch <= 'f') - { - val = ch - 'a'; - val += 10; - } - - return val; -} - - -bool CommandPacket::verify() -{ - return checksum == generate_checksum(); -} - -CommandPacket::CommandPacket() -{ - // reset internal error number - errno = NO_ERROR; - - // set public variables - sflag = '<'; - command = 0x0; - length = 0x0; - memset(payload, 0x0, sizeof(payload)); - checksum = 0x0; - eflag = '>'; -} - -const char *CommandPacket::getErrorString() const -{ - return errorString[errno]; -} - -int CommandPacket::serialize(uint8_t *output) -{ - // create buffer for payload - uint8_t buffer[length * 2]; - memset(buffer, 0x0, sizeof(buffer)); - - for (int i = 0; i < length; i++) - { - sprintf((char *) (buffer + i * 2), "%02X", payload[i]); - } - - // assume the user provide output buffer large enough - sprintf((char *) output, "%c%02X%02X%s%02X%c", - sflag, - command, - length, - (char *) buffer, - generate_checksum(), - eflag - ); - - return length; -} - -uint8_t CommandPacket::generate_checksum() -{ - // checksum is defined by the sum of all characters between sflag and checksum field - uint8_t s = 0; - - // include command - s += command; - - // include length - s += length; - - // include payload - for (int i = 0; i < length; i++) - { - s += payload[i]; - } - - // calculate two's complement of the remainder - s = 0xff - s + 1; - - return s; -} - -