65 lines
2.1 KiB
C++
65 lines
2.1 KiB
C++
/// @file
|
|
#pragma once
|
|
#include <stdint.h>
|
|
#include "modules/timebase.h"
|
|
#include "modules/protocol.h"
|
|
#include "logic/error_codes.h"
|
|
|
|
namespace logic {
|
|
class CommandBase;
|
|
}
|
|
|
|
class Application {
|
|
public:
|
|
Application();
|
|
|
|
inline void CommandFinishedCorrectly() {
|
|
lastCommandProcessedMs = mt::timebase.Millis();
|
|
}
|
|
|
|
/// Perform firmware panic handling
|
|
void Panic(ErrorCode ec);
|
|
|
|
/// Perform one step of top level
|
|
void Step();
|
|
|
|
uint8_t CurrentProgressCode();
|
|
uint16_t CurrentErrorCode();
|
|
|
|
#ifndef UNITTEST
|
|
private:
|
|
#endif
|
|
/// Checks if the MMU can enter manual mode (user can move the selector with buttons)
|
|
/// The MMU enters idle mode after 5s from the last command finished and there must be no filament present in the selector.
|
|
void CheckManualOperation();
|
|
|
|
/// Checks messages on the UART
|
|
bool CheckMsgs();
|
|
|
|
/// Tries to plan a logic::command if possible
|
|
void PlanCommand(const mp::RequestMsg &rq);
|
|
|
|
mp::ResponseCommandStatus RunningCommandStatus() const;
|
|
void ReportCommandAccepted(const mp::RequestMsg &rq, mp::ResponseMsgParamCodes status);
|
|
void ReportFINDA(const mp::RequestMsg &rq);
|
|
void ReportRunningCommand();
|
|
void ReportReadRegister(const mp::RequestMsg &rq);
|
|
void ReportWriteRegister(const mp::RequestMsg &rq);
|
|
void ProcessRequestMsg(const mp::RequestMsg &rq);
|
|
|
|
uint16_t lastCommandProcessedMs;
|
|
|
|
/// A command that resulted in the currently on-going operation
|
|
logic::CommandBase *currentCommand;
|
|
|
|
/// Remember the request message that started the currently running command
|
|
/// For the start we report "Reset finished" which in fact corresponds with the MMU state pretty closely
|
|
/// and plays nicely even with the protocol implementation.
|
|
/// And, since the default startup command is the noCommand, which always returns "Finished"
|
|
/// the implementation is clean and straightforward - the response to the first Q0 messages
|
|
/// will look like "X0 F" until a command (T, L, U ...) has been issued.
|
|
mp::RequestMsg currentCommandRq;
|
|
};
|
|
|
|
extern Application application;
|