Skip to content

Commit

Permalink
Merge branch 'v1.0-dev' into beep
Browse files Browse the repository at this point in the history
  • Loading branch information
t0mpr1c3 authored Sep 18, 2023
2 parents 7fa5d06 + 0253467 commit 43e47d4
Show file tree
Hide file tree
Showing 10 changed files with 198 additions and 192 deletions.
64 changes: 35 additions & 29 deletions src/ayab/com.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ void Com::sendMsg(AYAB_API_t id, char *msg) {
* \param error Error code (0 = success).
*/
void Com::send_reqLine(const uint8_t lineNumber, Err_t error) const {
uint8_t payload[REQLINE_LEN] = {reqLine_msgid, lineNumber, static_cast<uint8_t>(error)};
// `payload` will be allocated on stack since length is compile-time constant
uint8_t payload[REQLINE_LEN] = {static_cast<uint8_t>(AYAB_API::reqLine), lineNumber, static_cast<uint8_t>(error)};
send(static_cast<uint8_t *>(payload), REQLINE_LEN);
}

Expand All @@ -99,8 +100,9 @@ void Com::send_indState(Carriage_t carriage, uint8_t position,
Err_t error) const {
uint16_t leftHallValue = GlobalEncoders::getHallValue(Direction_t::Left);
uint16_t rightHallValue = GlobalEncoders::getHallValue(Direction_t::Right);
// `payload` will be allocated on stack since length is compile-time constant
uint8_t payload[INDSTATE_LEN] = {
indState_msgid,
static_cast<uint8_t>(AYAB_API::indState),
static_cast<uint8_t>(error),
static_cast<uint8_t>(GlobalFsm::getState()),
highByte(leftHallValue),
Expand All @@ -121,67 +123,67 @@ void Com::send_indState(Carriage_t carriage, uint8_t position,
*/
void Com::onPacketReceived(const uint8_t *buffer, size_t size) {
switch (buffer[0]) {
case reqInit_msgid:
case static_cast<uint8_t>(AYAB_API::reqInit):
h_reqInit(buffer, size);
break;

case reqStart_msgid:
case static_cast<uint8_t>(AYAB_API::reqStart):
h_reqStart(buffer, size);
break;

case cnfLine_msgid:
case static_cast<uint8_t>(AYAB_API::cnfLine):
h_cnfLine(buffer, size);
break;

case reqInfo_msgid:
case static_cast<uint8_t>(AYAB_API::reqInfo):
h_reqInfo();
break;

case reqTest_msgid:
case static_cast<uint8_t>(AYAB_API::reqTest):
h_reqTest(buffer, size);
break;

case helpCmd_msgid:
case static_cast<uint8_t>(AYAB_API::helpCmd):
GlobalTester::helpCmd();
break;

case sendCmd_msgid:
case static_cast<uint8_t>(AYAB_API::sendCmd):
GlobalTester::sendCmd();
break;

case beepCmd_msgid:
case static_cast<uint8_t>(AYAB_API::beepCmd):
GlobalTester::beepCmd();
break;

case setSingleCmd_msgid:
case static_cast<uint8_t>(AYAB_API::setSingleCmd):
GlobalTester::setSingleCmd(buffer, size);
break;

case setAllCmd_msgid:
case static_cast<uint8_t>(AYAB_API::setAllCmd):
GlobalTester::setAllCmd(buffer, size);
break;

case readEOLsensorsCmd_msgid:
case static_cast<uint8_t>(AYAB_API::readEOLsensorsCmd):
GlobalTester::readEOLsensorsCmd();
break;

case readEncodersCmd_msgid:
case static_cast<uint8_t>(AYAB_API::readEncodersCmd):
GlobalTester::readEncodersCmd();
break;

case autoReadCmd_msgid:
case static_cast<uint8_t>(AYAB_API::autoReadCmd):
GlobalTester::autoReadCmd();
break;

case autoTestCmd_msgid:
case static_cast<uint8_t>(AYAB_API::autoTestCmd):
GlobalTester::autoTestCmd();
break;

case stopCmd_msgid:
case static_cast<uint8_t>(AYAB_API::stopCmd):
GlobalTester::stopCmd();
break;

case quitCmd_msgid:
case static_cast<uint8_t>(AYAB_API::quitCmd):
GlobalTester::quitCmd();
break;

Expand All @@ -201,7 +203,7 @@ void Com::onPacketReceived(const uint8_t *buffer, size_t size) {
void Com::h_reqInit(const uint8_t *buffer, size_t size) {
if (size < 3U) {
// Need 3 bytes from buffer below.
send_cnfInit(ErrorCode::ERR_EXPECTED_LONGER_MESSAGE);
send_cnfInit(ErrorCode::expected_longer_message);
return;
}

Expand All @@ -210,7 +212,7 @@ void Com::h_reqInit(const uint8_t *buffer, size_t size) {
uint8_t crc8 = buffer[2];
// Check crc on bytes 0-4 of buffer.
if (crc8 != CRC8(buffer, 2)) {
send_cnfInit(ErrorCode::ERR_CHECKSUM_ERROR);
send_cnfInit(ErrorCode::checksum_error);
return;
}

Expand All @@ -228,7 +230,7 @@ void Com::h_reqInit(const uint8_t *buffer, size_t size) {
void Com::h_reqStart(const uint8_t *buffer, size_t size) {
if (size < 5U) {
// Need 5 bytes from buffer below.
send_cnfStart(ErrorCode::ERR_EXPECTED_LONGER_MESSAGE);
send_cnfStart(ErrorCode::expected_longer_message);
return;
}

Expand All @@ -240,7 +242,7 @@ void Com::h_reqStart(const uint8_t *buffer, size_t size) {
uint8_t crc8 = buffer[4];
// Check crc on bytes 0-4 of buffer.
if (crc8 != CRC8(buffer, 4)) {
send_cnfStart(ErrorCode::ERR_CHECKSUM_ERROR);
send_cnfStart(ErrorCode::checksum_error);
return;
}

Expand All @@ -265,8 +267,8 @@ void Com::h_reqStart(const uint8_t *buffer, size_t size) {
* \todo sl: Assert size? Handle error?
*/
void Com::h_cnfLine(const uint8_t *buffer, size_t size) {
auto m = static_cast<uint8_t>(GlobalKnitter::getMachineType());
uint8_t lenLineBuffer = LINE_BUFFER_LEN[m];
auto machineType = static_cast<uint8_t>(GlobalKnitter::getMachineType());
uint8_t lenLineBuffer = LINE_BUFFER_LEN[machineType];
if (size < lenLineBuffer + 5U) {
// message is too short
// TODO(sl): handle error?
Expand Down Expand Up @@ -317,7 +319,7 @@ void Com::h_reqInfo() const {
void Com::h_reqTest(const uint8_t *buffer, size_t size) const {
if (size < 2U) {
// message is too short
send_cnfTest(ErrorCode::ERR_EXPECTED_LONGER_MESSAGE);
send_cnfTest(ErrorCode::expected_longer_message);
return;
}

Expand All @@ -344,8 +346,9 @@ void Com::h_unrecognized() const {
*/
void Com::send_cnfInfo() const {
// Max. length of suffix string: 16 bytes + \0
// `payload` will be allocated on stack since length is compile-time constant
uint8_t payload[22];
payload[0] = cnfInfo_msgid;
payload[0] = static_cast<uint8_t>(AYAB_API::cnfInfo);
payload[1] = API_VERSION;
payload[2] = FW_VERSION_MAJ;
payload[3] = FW_VERSION_MIN;
Expand All @@ -359,8 +362,9 @@ void Com::send_cnfInfo() const {
* \param error Error code (0 = success, other values = error).
*/
void Com::send_cnfInit(Err_t error) const {
// `payload` will be allocated on stack since length is compile-time constant
uint8_t payload[2];
payload[0] = cnfInit_msgid;
payload[0] = static_cast<uint8_t>(AYAB_API::cnfInit);
payload[1] = static_cast<uint8_t>(error);
send(payload, 2);
}
Expand All @@ -371,8 +375,9 @@ void Com::send_cnfInit(Err_t error) const {
* \param error Error code (0 = success, other values = error).
*/
void Com::send_cnfStart(Err_t error) const {
// `payload` will be allocated on stack since length is compile-time constant
uint8_t payload[2];
payload[0] = cnfStart_msgid;
payload[0] = static_cast<uint8_t>(AYAB_API::cnfStart);
payload[1] = static_cast<uint8_t>(error);
send(payload, 2);
}
Expand All @@ -382,8 +387,9 @@ void Com::send_cnfStart(Err_t error) const {
* \param error Error code (0 = success, other values = error).
*/
void Com::send_cnfTest(Err_t error) const {
// `payload` will be allocated on stack since length is compile-time constant
uint8_t payload[2];
payload[0] = cnfTest_msgid;
payload[0] = static_cast<uint8_t>(AYAB_API::cnfTest);
payload[1] = static_cast<uint8_t>(error);
send(payload, 2);
}
Expand Down
62 changes: 31 additions & 31 deletions src/ayab/com.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,31 +46,31 @@ constexpr uint32_t SERIAL_BAUDRATE = 115200U;
constexpr uint8_t MAX_LINE_BUFFER_LEN = 25U;
constexpr uint8_t MAX_MSG_BUFFER_LEN = 255U;

enum AYAB_API {
reqStart_msgid = 0x01,
cnfStart_msgid = 0xC1,
reqLine_msgid = 0x82,
cnfLine_msgid = 0x42,
reqInfo_msgid = 0x03,
cnfInfo_msgid = 0xC3,
reqTest_msgid = 0x04,
cnfTest_msgid = 0xC4,
indState_msgid = 0x84,
helpCmd_msgid = 0x25,
sendCmd_msgid = 0x26,
beepCmd_msgid = 0x27,
setSingleCmd_msgid = 0x28,
setAllCmd_msgid = 0x29,
readEOLsensorsCmd_msgid = 0x2A,
readEncodersCmd_msgid = 0x2B,
autoReadCmd_msgid = 0x2C,
autoTestCmd_msgid = 0x2D,
stopCmd_msgid = 0x2E,
quitCmd_msgid = 0x2F,
reqInit_msgid = 0x05,
cnfInit_msgid = 0xC5,
testRes_msgid = 0xEE,
debug_msgid = 0x9F
enum class AYAB_API : unsigned char {
reqStart = 0x01,
cnfStart = 0xC1,
reqLine = 0x82,
cnfLine = 0x42,
reqInfo = 0x03,
cnfInfo = 0xC3,
reqTest = 0x04,
cnfTest = 0xC4,
indState = 0x84,
helpCmd = 0x25,
sendCmd = 0x26,
beepCmd = 0x27,
setSingleCmd = 0x28,
setAllCmd = 0x29,
readEOLsensorsCmd = 0x2A,
readEncodersCmd = 0x2B,
autoReadCmd = 0x2C,
autoTestCmd = 0x2D,
stopCmd = 0x2E,
quitCmd = 0x2F,
reqInit = 0x05,
cnfInit = 0xC5,
testRes = 0xEE,
debug = 0x9F
};
using AYAB_API_t = enum AYAB_API;

Expand All @@ -89,9 +89,9 @@ class ComInterface {
virtual void sendMsg(AYAB_API_t id, const char *msg) = 0;
virtual void sendMsg(AYAB_API_t id, char *msg) = 0;
virtual void send_reqLine(const uint8_t lineNumber,
Err_t error = ErrorCode::SUCCESS) const = 0;
Err_t error = ErrorCode::success) const = 0;
virtual void send_indState(Carriage_t carriage, uint8_t position,
Err_t error = ErrorCode::SUCCESS) const = 0;
Err_t error = ErrorCode::success) const = 0;
virtual void onPacketReceived(const uint8_t *buffer, size_t size) = 0;
};

Expand All @@ -114,9 +114,9 @@ class GlobalCom final {
static void send(uint8_t *payload, size_t length);
static void sendMsg(AYAB_API_t id, const char *msg);
static void sendMsg(AYAB_API_t id, char *msg);
static void send_reqLine(const uint8_t lineNumber, Err_t error = ErrorCode::SUCCESS);
static void send_reqLine(const uint8_t lineNumber, Err_t error = ErrorCode::success);
static void send_indState(Carriage_t carriage, uint8_t position,
Err_t error = ErrorCode::SUCCESS);
Err_t error = ErrorCode::success);
static void onPacketReceived(const uint8_t *buffer, size_t size);

private:
Expand All @@ -130,9 +130,9 @@ class Com : public ComInterface {
void send(uint8_t *payload, size_t length) const final;
void sendMsg(AYAB_API_t id, const char *msg) final;
void sendMsg(AYAB_API_t id, char *msg) final;
void send_reqLine(const uint8_t lineNumber, Err_t error = ErrorCode::SUCCESS) const final;
void send_reqLine(const uint8_t lineNumber, Err_t error = ErrorCode::success) const final;
void send_indState(Carriage_t carriage, uint8_t position,
Err_t error = ErrorCode::SUCCESS) const final;
Err_t error = ErrorCode::success) const final;
void onPacketReceived(const uint8_t *buffer, size_t size) final;

private:
Expand Down
2 changes: 1 addition & 1 deletion src/ayab/fsm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ void Fsm::init() {
m_nextState = OpState::wait_for_machine;
m_flash = false;
m_flashTime = millis();
m_error = ErrorCode::SUCCESS;
m_error = ErrorCode::success;
}

/*!
Expand Down
50 changes: 25 additions & 25 deletions src/ayab/fsm.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,46 +35,46 @@ enum class OpState : unsigned char {
using OpState_t = enum OpState;

// As of APIv6, the only important distinction
// is between `SUCCESS` (0) and any other value.
// is between `ErrorCode::success` (0) and any other value.
// Informative error codes are provided for
// diagnostic purposes (that is, for debugging).
// Non-zero error codes are subject to change.
// Such changes will be considered non-breaking.
enum class ErrorCode : unsigned char {
SUCCESS = 0x00,
success = 0x00,

// message not understood
ERR_EXPECTED_LONGER_MESSAGE = 0x01,
ERR_UNRECOGNIZED_MSGID = 0x02,
ERR_UNEXPECTED_MSGID = 0x03,
ERR_CHECKSUM_ERROR = 0x04,
expected_longer_message = 0x01,
unrecognized_msgid = 0x02,
unexpected_msgid = 0x03,
checksum_error = 0x04,

// invalid arguments
ERR_MACHINE_TYPE_INVALID = 0x10,
ERR_NEEDLE_VALUE_INVALID = 0x11,
ERR_NULL_POINTER_ARGUMENT = 0x12,
ERR_ARGUMENT_INVALID = 0x13,
ERR_ARGUMENTS_INCOMPATIBLE = 0x13,
machine_type_invalid = 0x10,
needle_value_invalid = 0x11,
null_pointer_argument = 0x12,
argument_invalid = 0x13,
arguments_incompatible = 0x13,

// device not initialized
ERR_NO_MACHINE_TYPE = 0x20,
ERR_NO_CARRIAGE = 0x21,
ERR_NO_DIRECTION = 0x22,
ERR_NO_BELTSHIFT = 0x23,
no_machine_type = 0x20,
no_carriage = 0x21,
no_direction = 0x22,
no_beltshift = 0x23,

// machine in wrong FSM state
ERR_MACHINE_STATE_INIT = 0xE0,
ERR_MACHINE_STATE_READY = 0xE1,
ERR_MACHINE_STATE_KNIT = 0xE2,
ERR_MACHINE_STATE_TEST = 0xE3,
ERR_WRONG_MACHINE_STATE = 0xEF,
machine_state_init = 0xE0,
machine_state_ready = 0xE1,
machine_state_knit = 0xE2,
machine_state_test = 0xE3,
wrong_machine_state = 0xEF,

// generic error codes
WARNING = 0xF0, // ignorable error
RECOVERABLE_ERROR = 0xF1,
CRITICAL_ERROR = 0xF2,
FATAL_ERROR = 0xF3,
UNSPECIFIED_FAILURE = 0xFF
warning = 0xF0, // ignorable error
recoverable_error = 0xF1,
critical_error = 0xF2,
fatal_error = 0xF3,
unspecified_failure = 0xFF
};
using Err_t = enum ErrorCode;

Expand Down
Loading

0 comments on commit 43e47d4

Please sign in to comment.