Support CR XOR LF in protocol's line ending implementation

Please note Windows CRLF sequence is not supported,
but a separate CR xor a separate LF works now.

This is a workaround for stupid terminals for debugging purposes,
and it is not necessary for the protocol to work on its own.
It may be removed in the future.
pull/71/head
D.R.racer 2021-07-26 09:12:46 +02:00 committed by DRracer
parent b109a520c2
commit 1f7a84a623
2 changed files with 14 additions and 7 deletions

View File

@ -51,11 +51,11 @@ DecodeStatus Protocol::DecodeRequest(uint8_t c) {
return DecodeStatus::Error; return DecodeStatus::Error;
} }
case RequestStates::Value: case RequestStates::Value:
if (c >= '0' && c <= '9') { if (IsDigit(c)) {
requestMsg.value *= 10; requestMsg.value *= 10;
requestMsg.value += c - '0'; requestMsg.value += c - '0';
return DecodeStatus::NeedMoreData; return DecodeStatus::NeedMoreData;
} else if (c == '\n') { } else if (IsNewLine(c)) {
rqState = RequestStates::Code; rqState = RequestStates::Code;
return DecodeStatus::MessageCompleted; return DecodeStatus::MessageCompleted;
} else { } else {
@ -64,7 +64,7 @@ DecodeStatus Protocol::DecodeRequest(uint8_t c) {
return DecodeStatus::Error; return DecodeStatus::Error;
} }
default: //case error: default: //case error:
if (c == '\n') { if (IsNewLine(c)) {
rqState = RequestStates::Code; rqState = RequestStates::Code;
return DecodeStatus::MessageCompleted; return DecodeStatus::MessageCompleted;
} else { } else {
@ -107,7 +107,7 @@ DecodeStatus Protocol::DecodeResponse(uint8_t c) {
return DecodeStatus::Error; return DecodeStatus::Error;
} }
case ResponseStates::RequestValue: case ResponseStates::RequestValue:
if (c >= '0' && c <= '9') { if (IsDigit(c)) {
responseMsg.request.value *= 10; responseMsg.request.value *= 10;
responseMsg.request.value += c - '0'; responseMsg.request.value += c - '0';
return DecodeStatus::NeedMoreData; return DecodeStatus::NeedMoreData;
@ -135,11 +135,11 @@ DecodeStatus Protocol::DecodeResponse(uint8_t c) {
return DecodeStatus::Error; return DecodeStatus::Error;
} }
case ResponseStates::ParamValue: case ResponseStates::ParamValue:
if (c >= '0' && c <= '9') { if (IsDigit(c)) {
responseMsg.paramValue *= 10; responseMsg.paramValue *= 10;
responseMsg.paramValue += c - '0'; responseMsg.paramValue += c - '0';
return DecodeStatus::NeedMoreData; return DecodeStatus::NeedMoreData;
} else if (c == '\n') { } else if (IsNewLine(c)) {
rspState = ResponseStates::RequestCode; rspState = ResponseStates::RequestCode;
return DecodeStatus::MessageCompleted; return DecodeStatus::MessageCompleted;
} else { } else {
@ -148,7 +148,7 @@ DecodeStatus Protocol::DecodeResponse(uint8_t c) {
return DecodeStatus::Error; return DecodeStatus::Error;
} }
default: //case error: default: //case error:
if (c == '\n') { if (IsNewLine(c)) {
rspState = ResponseStates::RequestCode; rspState = ResponseStates::RequestCode;
return DecodeStatus::MessageCompleted; return DecodeStatus::MessageCompleted;
} else { } else {

View File

@ -151,6 +151,13 @@ private:
ResponseStates rspState; ResponseStates rspState;
ResponseMsg responseMsg; ResponseMsg responseMsg;
static bool IsNewLine(uint8_t c) {
return c == '\n' || c == '\r';
}
static bool IsDigit(uint8_t c) {
return c >= '0' && c <= '9';
}
}; };
} // namespace protocol } // namespace protocol