123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820 |
- #include "mmu2_protocol_logic.h"
- #include "mmu2_log.h"
- #include "mmu2_fsensor.h"
- #include "system_timer.h"
- #include <string.h>
- namespace MMU2 {
- static const uint8_t supportedMmuFWVersion[3] PROGMEM = { 2, 1, 5 };
- const uint8_t ProtocolLogic::regs8Addrs[ProtocolLogic::regs8Count] PROGMEM = {
- 8,
- 0x1b,
- 0x1c,
- };
- const uint8_t ProtocolLogic::regs16Addrs[ProtocolLogic::regs16Count] PROGMEM = {
- 4,
- 0x1a,
- };
- const uint8_t ProtocolLogic::initRegs8Addrs[ProtocolLogic::initRegs8Count] PROGMEM = {
- 0x0b,
- };
- void ProtocolLogic::CheckAndReportAsyncEvents() {
-
-
- uint8_t fs = (uint8_t)WhereIsFilament();
- if (fs != lastFSensor) {
- SendAndUpdateFilamentSensor();
- }
- }
- void ProtocolLogic::SendQuery() {
- SendMsg(RequestMsg(RequestMsgCodes::Query, 0));
- scopeState = ScopeState::QuerySent;
- }
- void ProtocolLogic::StartReading8bitRegisters() {
- regIndex = 0;
- SendReadRegister(pgm_read_byte(regs8Addrs + regIndex), ScopeState::Reading8bitRegisters);
- }
- void ProtocolLogic::ProcessRead8bitRegister(){
- regs8[regIndex] = rsp.paramValue;
- ++regIndex;
- if(regIndex >= regs8Count){
-
- StartReading16bitRegisters();
- } else {
- SendReadRegister(pgm_read_byte(regs8Addrs + regIndex), ScopeState::Reading8bitRegisters);
- }
- }
- void ProtocolLogic::StartReading16bitRegisters() {
- regIndex = 0;
- SendReadRegister(pgm_read_byte(regs16Addrs + regIndex), ScopeState::Reading16bitRegisters);
- }
- ProtocolLogic::ScopeState __attribute__((noinline)) ProtocolLogic::ProcessRead16bitRegister(ProtocolLogic::ScopeState stateAtEnd){
- regs16[regIndex] = rsp.paramValue;
- ++regIndex;
- if(regIndex >= regs16Count){
- return stateAtEnd;
- } else {
- SendReadRegister(pgm_read_byte(regs16Addrs + regIndex), ScopeState::Reading16bitRegisters);
- }
- return ScopeState::Reading16bitRegisters;
- }
- void ProtocolLogic::StartWritingInitRegisters() {
- regIndex = 0;
- SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters);
- }
- bool __attribute__((noinline)) ProtocolLogic::ProcessWritingInitRegister(){
- ++regIndex;
- if(regIndex >= initRegs8Count){
- return true;
- } else {
- SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters);
- }
- return false;
- }
- void ProtocolLogic::SendAndUpdateFilamentSensor() {
- SendMsg(RequestMsg(RequestMsgCodes::FilamentSensor, lastFSensor = (uint8_t)WhereIsFilament()));
- scopeState = ScopeState::FilamentSensorStateSent;
- }
- void ProtocolLogic::SendButton(uint8_t btn) {
- SendMsg(RequestMsg(RequestMsgCodes::Button, btn));
- scopeState = ScopeState::ButtonSent;
- }
- void ProtocolLogic::SendVersion(uint8_t stage) {
- SendMsg(RequestMsg(RequestMsgCodes::Version, stage));
- scopeState = (ScopeState)((uint_fast8_t)ScopeState::S0Sent + stage);
- }
- void ProtocolLogic::SendReadRegister(uint8_t index, ScopeState nextState) {
- SendMsg(RequestMsg(RequestMsgCodes::Read, index));
- scopeState = nextState;
- }
- void ProtocolLogic::SendWriteRegister(uint8_t index, uint16_t value, ScopeState nextState){
- SendWriteMsg(RequestMsg(RequestMsgCodes::Write, index, value));
- scopeState = nextState;
- }
- struct OldMMUFWDetector {
- uint8_t ok;
- inline constexpr OldMMUFWDetector():ok(0) { }
-
- enum class State : uint8_t { MatchingPart, SomethingElse, Matched };
-
-
- State Detect(uint8_t c){
-
- if(ok == 0 && c == 'o'){
- ++ok;
- return State::MatchingPart;
- } else if(ok == 1 && c == 'k'){
- ++ok;
- return State::MatchingPart;
- } else if(ok == 2 && c == '\n'){
- return State::Matched;
- }
- return State::SomethingElse;
- }
- };
- StepStatus ProtocolLogic::ExpectingMessage() {
- int bytesConsumed = 0;
- int c = -1;
-
- OldMMUFWDetector oldMMUh4x0r;
-
-
- while ((c = uart->read()) >= 0) {
- ++bytesConsumed;
- RecordReceivedByte(c);
- switch (protocol.DecodeResponse(c)) {
- case DecodeStatus::MessageCompleted:
- rsp = protocol.GetResponseMsg();
- LogResponse();
- RecordUARTActivity();
- return MessageReady;
- case DecodeStatus::NeedMoreData:
- break;
- case DecodeStatus::Error:{
-
- auto old = oldMMUh4x0r.Detect(c);
- if( old == OldMMUFWDetector::State::Matched ){
-
-
- rsp = ResponseMsg(RequestMsg(RequestMsgCodes::Version, 0), ResponseMsgParamCodes::Accepted, 0);
- return MessageReady;
- } else if( old == OldMMUFWDetector::State::MatchingPart ){
- break;
- }
- }
- [[fallthrough]];
- default:
- RecordUARTActivity();
- return ProtocolError;
- }
- }
- if (bytesConsumed != 0) {
- RecordUARTActivity();
- return Processing;
- } else if (Elapsed(linkLayerTimeout)) {
- return CommunicationTimeout;
- }
- return Processing;
- }
- void ProtocolLogic::SendMsg(RequestMsg rq) {
- uint8_t txbuff[Protocol::MaxRequestSize()];
- uint8_t len = Protocol::EncodeRequest(rq, txbuff);
- uart->write(txbuff, len);
- LogRequestMsg(txbuff, len);
- RecordUARTActivity();
- }
- void ProtocolLogic::SendWriteMsg(RequestMsg rq){
- uint8_t txbuff[Protocol::MaxRequestSize()];
- uint8_t len = Protocol::EncodeWriteRequest(rq.value, rq.value2, txbuff);
- uart->write(txbuff, len);
- LogRequestMsg(txbuff, len);
- RecordUARTActivity();
- }
- void ProtocolLogic::StartSeqRestart() {
- retries = maxRetries;
- SendVersion(0);
- }
- void ProtocolLogic::DelayedRestartRestart() {
- scopeState = ScopeState::RecoveringProtocolError;
- }
- void ProtocolLogic::CommandRestart() {
- scopeState = ScopeState::CommandSent;
- SendMsg(rq);
- }
- void ProtocolLogic::IdleRestart() {
- scopeState = ScopeState::Ready;
- }
- StepStatus ProtocolLogic::ProcessVersionResponse(uint8_t stage) {
- if (rsp.request.code != RequestMsgCodes::Version || rsp.request.value != stage) {
-
- SendVersion(stage);
- } else {
- mmuFwVersion[stage] = rsp.paramValue;
- if (mmuFwVersion[stage] != pgm_read_byte(supportedMmuFWVersion + stage)) {
- if (--retries == 0) {
- return VersionMismatch;
- } else {
- SendVersion(stage);
- }
- } else {
- dataTO.Reset();
- SendVersion(stage + 1);
- }
- }
- return Processing;
- }
- StepStatus ProtocolLogic::ScopeStep() {
- if ( ! ExpectsResponse() ) {
-
- switch (currentScope) {
- case Scope::DelayedRestart:
- return DelayedRestartWait();
- case Scope::Idle:
- return IdleWait();
- case Scope::Command:
- return CommandWait();
- case Scope::Stopped:
- return StoppedStep();
- default:
- break;
- }
- } else {
-
- if (auto expmsg = ExpectingMessage(); expmsg != MessageReady)
- return expmsg;
-
- switch (currentScope) {
- case Scope::StartSeq:
- return StartSeqStep();
- case Scope::Idle:
- return IdleStep();
- case Scope::Command:
- return CommandStep();
- case Scope::Stopped:
- return StoppedStep();
- default:
- break;
- }
- }
- return Finished;
- }
- StepStatus ProtocolLogic::StartSeqStep() {
-
- switch (scopeState) {
- case ScopeState::S0Sent:
- case ScopeState::S1Sent:
- case ScopeState::S2Sent:
- return ProcessVersionResponse((uint8_t)scopeState - (uint8_t)ScopeState::S0Sent);
- case ScopeState::S3Sent:
- if (rsp.request.code != RequestMsgCodes::Version || rsp.request.value != 3) {
-
- SendVersion(3);
- } else {
- mmuFwVersionBuild = rsp.paramValue;
-
- StartWritingInitRegisters();
- }
- return Processing;
- case ScopeState::WritingInitRegisters:
- if( ProcessWritingInitRegister() ){
- SendAndUpdateFilamentSensor();
- }
- return Processing;
- case ScopeState::FilamentSensorStateSent:
- SwitchFromStartToIdle();
- return Processing;
-
-
- default:
- return VersionMismatch;
- }
- }
- StepStatus ProtocolLogic::DelayedRestartWait() {
- if (Elapsed(heartBeatPeriod)) {
- while (uart->read() != -1)
- ;
-
- Start();
- }
- return Processing;
- }
- StepStatus ProtocolLogic::CommandWait() {
- if (Elapsed(heartBeatPeriod)) {
- SendQuery();
- } else {
-
-
- CheckAndReportAsyncEvents();
- }
- return Processing;
- }
- StepStatus ProtocolLogic::ProcessCommandQueryResponse() {
- switch (rsp.paramCode) {
- case ResponseMsgParamCodes::Processing:
- progressCode = static_cast<ProgressCode>(rsp.paramValue);
- errorCode = ErrorCode::OK;
- SendAndUpdateFilamentSensor();
- return Processing;
- case ResponseMsgParamCodes::Error:
-
- errorCode = static_cast<ErrorCode>(rsp.paramValue);
-
-
- SendAndUpdateFilamentSensor();
- return CommandError;
- case ResponseMsgParamCodes::Button:
-
-
- buttonCode = static_cast<Buttons>(rsp.paramValue);
- SendAndUpdateFilamentSensor();
- return ButtonPushed;
- case ResponseMsgParamCodes::Finished:
-
-
- if( ReqMsg().code == rsp.request.code && ReqMsg().value == rsp.request.value ){
- progressCode = ProgressCode::OK;
- scopeState = ScopeState::Ready;
- return Finished;
- } else {
-
- return Interrupted;
- }
- default:
- return ProtocolError;
- }
- }
- StepStatus ProtocolLogic::CommandStep() {
- switch (scopeState) {
- case ScopeState::CommandSent: {
- switch (rsp.paramCode) {
- case ResponseMsgParamCodes::Accepted:
- progressCode = ProgressCode::OK;
- errorCode = ErrorCode::RUNNING;
- scopeState = ScopeState::Wait;
- break;
- case ResponseMsgParamCodes::Rejected:
-
- progressCode = ProgressCode::OK;
- errorCode = ErrorCode::PROTOCOL_ERROR;
- return CommandRejected;
- default:
- return ProtocolError;
- }
- } break;
- case ScopeState::QuerySent:
- return ProcessCommandQueryResponse();
- case ScopeState::FilamentSensorStateSent:
- StartReading8bitRegisters();
- return Processing;
- case ScopeState::Reading8bitRegisters:
- ProcessRead8bitRegister();
- return Processing;
- case ScopeState::Reading16bitRegisters:
- scopeState = ProcessRead16bitRegister(ScopeState::Wait);
- return Processing;
- case ScopeState::ButtonSent:
- if (rsp.paramCode == ResponseMsgParamCodes::Accepted) {
-
- mmu2.DecrementRetryAttempts();
- }
- SendAndUpdateFilamentSensor();
- break;
- default:
- return ProtocolError;
- }
- return Processing;
- }
- StepStatus ProtocolLogic::IdleWait() {
- if (scopeState == ScopeState::Ready) {
- if (Elapsed(heartBeatPeriod)) {
- SendQuery();
- return Processing;
- }
- }
- return Finished;
- }
- StepStatus ProtocolLogic::IdleStep() {
- switch (scopeState) {
- case ScopeState::QuerySent:
-
-
-
- switch (rsp.request.code) {
- case RequestMsgCodes::Cut:
- case RequestMsgCodes::Eject:
- case RequestMsgCodes::Load:
- case RequestMsgCodes::Mode:
- case RequestMsgCodes::Tool:
- case RequestMsgCodes::Unload:
- if (rsp.paramCode != ResponseMsgParamCodes::Finished) {
- return SwitchFromIdleToCommand();
- }
- break;
- case RequestMsgCodes::Reset:
-
-
-
- switch (rsp.paramCode) {
- case ResponseMsgParamCodes::Button:
-
-
- buttonCode = static_cast<Buttons>(rsp.paramValue);
- StartReading8bitRegisters();
- return ButtonPushed;
- case ResponseMsgParamCodes::Processing:
-
-
-
- case ResponseMsgParamCodes::Finished:
- errorCode = ErrorCode::OK;
- break;
- default:
- errorCode = static_cast<ErrorCode>(rsp.paramValue);
- StartReading8bitRegisters();
- return CommandError;
- }
- break;
- default:
- return ProtocolError;
- }
- StartReading8bitRegisters();
- return Processing;
- case ScopeState::Reading8bitRegisters:
- ProcessRead8bitRegister();
- return Processing;
- case ScopeState::Reading16bitRegisters:
- scopeState = ProcessRead16bitRegister(ScopeState::Ready);
- return scopeState == ScopeState::Ready ? Finished : Processing;
- case ScopeState::ButtonSent:
- if (rsp.paramCode == ResponseMsgParamCodes::Accepted) {
-
- mmu2.DecrementRetryAttempts();
- }
- StartReading8bitRegisters();
- return Processing;
- case ScopeState::ReadRegisterSent:
- if (rsp.paramCode == ResponseMsgParamCodes::Accepted) {
-
- }
- return Finished;
- case ScopeState::WriteRegisterSent:
- if (rsp.paramCode == ResponseMsgParamCodes::Accepted) {
-
- }
- return Finished;
- default:
- return ProtocolError;
- }
-
-
-
-
-
-
-
- return Finished;
- }
- ProtocolLogic::ProtocolLogic(MMU2Serial *uart, uint8_t extraLoadDistance)
- : currentScope(Scope::Stopped)
- , scopeState(ScopeState::Ready)
- , plannedRq(RequestMsgCodes::unknown, 0)
- , lastUARTActivityMs(0)
- , dataTO()
- , rsp(RequestMsg(RequestMsgCodes::unknown, 0), ResponseMsgParamCodes::unknown, 0)
- , state(State::Stopped)
- , lrb(0)
- , uart(uart)
- , errorCode(ErrorCode::OK)
- , progressCode(ProgressCode::OK)
- , buttonCode(NoButton)
- , lastFSensor((uint8_t)WhereIsFilament())
- , regs8 { 0, 0, 0 }
- , regs16 { 0, 0 }
- , initRegs8 { extraLoadDistance }
- , regIndex(0)
- , mmuFwVersion { 0, 0, 0 }
- {}
- void ProtocolLogic::Start() {
- state = State::InitSequence;
- currentScope = Scope::StartSeq;
- protocol.ResetResponseDecoder();
- StartSeqRestart();
- }
- void ProtocolLogic::Stop() {
- state = State::Stopped;
- currentScope = Scope::Stopped;
- }
- void ProtocolLogic::ToolChange(uint8_t slot) {
- PlanGenericRequest(RequestMsg(RequestMsgCodes::Tool, slot));
- }
- void ProtocolLogic::Statistics() {
- PlanGenericRequest(RequestMsg(RequestMsgCodes::Version, 3));
- }
- void ProtocolLogic::UnloadFilament() {
- PlanGenericRequest(RequestMsg(RequestMsgCodes::Unload, 0));
- }
- void ProtocolLogic::LoadFilament(uint8_t slot) {
- PlanGenericRequest(RequestMsg(RequestMsgCodes::Load, slot));
- }
- void ProtocolLogic::EjectFilament(uint8_t slot) {
- PlanGenericRequest(RequestMsg(RequestMsgCodes::Eject, slot));
- }
- void ProtocolLogic::CutFilament(uint8_t slot) {
- PlanGenericRequest(RequestMsg(RequestMsgCodes::Cut, slot));
- }
- void ProtocolLogic::ResetMMU() {
- PlanGenericRequest(RequestMsg(RequestMsgCodes::Reset, 0));
- }
- void ProtocolLogic::Button(uint8_t index) {
- PlanGenericRequest(RequestMsg(RequestMsgCodes::Button, index));
- }
- void ProtocolLogic::Home(uint8_t mode) {
- PlanGenericRequest(RequestMsg(RequestMsgCodes::Home, mode));
- }
- void ProtocolLogic::ReadRegister(uint8_t address){
- PlanGenericRequest(RequestMsg(RequestMsgCodes::Read, address));
- }
- void ProtocolLogic::WriteRegister(uint8_t address, uint16_t data){
- PlanGenericRequest(RequestMsg(RequestMsgCodes::Write, address, data));
- }
- void ProtocolLogic::PlanGenericRequest(RequestMsg rq) {
- plannedRq = rq;
- if (!ExpectsResponse()) {
- ActivatePlannedRequest();
- }
- }
- bool ProtocolLogic::ActivatePlannedRequest() {
- switch(plannedRq.code){
- case RequestMsgCodes::Button:
-
- SendButton(plannedRq.value);
- plannedRq = RequestMsg(RequestMsgCodes::unknown, 0);
- return true;
- case RequestMsgCodes::Read:
- SendReadRegister(plannedRq.value, ScopeState::ReadRegisterSent );
- plannedRq = RequestMsg(RequestMsgCodes::unknown, 0);
- return true;
- case RequestMsgCodes::Write:
- SendWriteRegister(plannedRq.value, plannedRq.value2, ScopeState::WriteRegisterSent );
- plannedRq = RequestMsg(RequestMsgCodes::unknown, 0);
- return true;
- case RequestMsgCodes::unknown:
- return false;
- default:
- currentScope = Scope::Command;
- SetRequestMsg(plannedRq);
- plannedRq = RequestMsg(RequestMsgCodes::unknown, 0);
- CommandRestart();
- return true;
- }
- }
- StepStatus ProtocolLogic::SwitchFromIdleToCommand() {
- currentScope = Scope::Command;
- SetRequestMsg(rsp.request);
-
-
- return ProcessCommandQueryResponse();
- }
- void ProtocolLogic::SwitchToIdle() {
- state = State::Running;
- currentScope = Scope::Idle;
- IdleRestart();
- }
- void ProtocolLogic::SwitchFromStartToIdle() {
- state = State::Running;
- currentScope = Scope::Idle;
- IdleRestart();
- SendQuery();
- }
- bool ProtocolLogic::Elapsed(uint32_t timeout) const {
- return _millis() >= (lastUARTActivityMs + timeout);
- }
- void ProtocolLogic::RecordUARTActivity() {
- lastUARTActivityMs = _millis();
- }
- void ProtocolLogic::RecordReceivedByte(uint8_t c) {
- lastReceivedBytes[lrb] = c;
- lrb = (lrb + 1) % lastReceivedBytes.size();
- }
- constexpr char NibbleToChar(uint8_t c) {
- switch (c) {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- return c + '0';
- case 10:
- case 11:
- case 12:
- case 13:
- case 14:
- case 15:
- return (c - 10) + 'a';
- default:
- return 0;
- }
- }
- void ProtocolLogic::FormatLastReceivedBytes(char *dst) {
- for (uint8_t i = 0; i < lastReceivedBytes.size(); ++i) {
- uint8_t b = lastReceivedBytes[(lrb - i - 1) % lastReceivedBytes.size()];
- dst[i * 3] = NibbleToChar(b >> 4);
- dst[i * 3 + 1] = NibbleToChar(b & 0xf);
- dst[i * 3 + 2] = ' ';
- }
- dst[(lastReceivedBytes.size() - 1) * 3 + 2] = 0;
- }
- void ProtocolLogic::FormatLastResponseMsgAndClearLRB(char *dst) {
- *dst++ = '<';
- for (uint8_t i = 0; i < lrb; ++i) {
- uint8_t b = lastReceivedBytes[i];
- if (b < 32)
- b = '.';
- if (b > 127)
- b = '.';
- *dst++ = b;
- }
- *dst = 0;
- lrb = 0;
- }
- void ProtocolLogic::LogRequestMsg(const uint8_t *txbuff, uint8_t size) {
- constexpr uint_fast8_t rqs = modules::protocol::Protocol::MaxRequestSize() + 2;
- char tmp[rqs] = ">";
- static char lastMsg[rqs] = "";
- for (uint8_t i = 0; i < size; ++i) {
- uint8_t b = txbuff[i];
- if (b < 32)
- b = '.';
- if (b > 127)
- b = '.';
- tmp[i + 1] = b;
- }
- tmp[size + 1] = '\n';
- tmp[size + 2] = 0;
- if (!strncmp_P(tmp, PSTR(">S0*99.\n"), rqs) && !strncmp(lastMsg, tmp, rqs)) {
-
-
-
-
-
-
- } else {
- MMU2_ECHO_MSG(tmp);
- }
- memcpy(lastMsg, tmp, rqs);
- }
- void ProtocolLogic::LogError(const char *reason_P) {
- char lrb[lastReceivedBytes.size() * 3];
- FormatLastReceivedBytes(lrb);
- MMU2_ERROR_MSGRPGM(reason_P);
- SERIAL_ECHOPGM(", last bytes: ");
- SERIAL_ECHOLN(lrb);
- }
- void ProtocolLogic::LogResponse() {
- char lrb[lastReceivedBytes.size()];
- FormatLastResponseMsgAndClearLRB(lrb);
- MMU2_ECHO_MSG(lrb);
- SERIAL_ECHOLN();
- }
- StepStatus ProtocolLogic::SuppressShortDropOuts(const char *msg_P, StepStatus ss) {
- if (dataTO.Record(ss)) {
- LogError(msg_P);
- return dataTO.InitialCause();
- } else {
- return Processing;
- }
- }
- StepStatus ProtocolLogic::HandleCommunicationTimeout() {
- uart->flush();
- protocol.ResetResponseDecoder();
- Start();
- return SuppressShortDropOuts(PSTR("Communication timeout"), CommunicationTimeout);
- }
- StepStatus ProtocolLogic::HandleProtocolError() {
- uart->flush();
- state = State::InitSequence;
- currentScope = Scope::DelayedRestart;
- DelayedRestartRestart();
- return SuppressShortDropOuts(PSTR("Protocol Error"), ProtocolError);
- }
- StepStatus ProtocolLogic::Step() {
- if (!ExpectsResponse()) {
- ActivatePlannedRequest();
- }
- auto currentStatus = ScopeStep();
- switch (currentStatus) {
- case Processing:
-
- break;
- case Finished: {
-
-
-
- bool previousCommandFinished = currentScope == Scope::Command;
- if (!ActivatePlannedRequest()) {
- SwitchToIdle();
- } else {
-
- if (!previousCommandFinished && currentScope == Scope::Command) {
- currentStatus = Processing;
- }
- }
- } break;
- case CommandRejected:
-
-
-
- LogError(PSTR("Command rejected"));
- CommandRestart();
- break;
- case CommandError:
- LogError(PSTR("Command Error"));
-
-
- break;
- case VersionMismatch:
- LogError(PSTR("Version mismatch"));
- Stop();
- break;
- case ProtocolError:
- currentStatus = HandleProtocolError();
- break;
- case CommunicationTimeout:
- currentStatus = HandleCommunicationTimeout();
- break;
- default:
- break;
- }
- return currentStatus;
- }
- uint8_t ProtocolLogic::CommandInProgress() const {
- if (currentScope != Scope::Command)
- return 0;
- return (uint8_t)ReqMsg().code;
- }
- bool DropOutFilter::Record(StepStatus ss) {
- if (occurrences == maxOccurrences) {
- cause = ss;
- }
- --occurrences;
- return occurrences == 0;
- }
- }
|