#ifndef KISS_PROCESSOR_H #define KISS_PROCESSOR_H #include #include #include namespace Kiss { class Processor { protected: enum Marker { Fend = 0xc0, Fesc = 0xdb, Tfend = 0xdc, Tfesc = 0xdd }; enum State { GetStart = 0, GetEnd, GetCmd, GetData, GetP, GetSlotTime, Escape }; enum Cmd { Data = 0x00, P = 0x02, SlotTime = 0x03, SetHardware = 0x06, SignalReport = 0x07, NoCmd = 0x80 }; enum DataType { Raw = 0, Control }; const int CfgTxQueueSize = 4096; public: Processor(); void serialSend(Cmd cmd, const byte *b, int dataLength); void serialProcessRx(); protected: virtual bool onRigTxBegin() = 0; virtual void onRigTx(byte b) = 0; virtual void onRigTxEnd() = 0; virtual void onSerialTx(byte b) = 0; virtual bool onSerialRxHasData() = 0; virtual bool onSerialRx(byte *b) = 0; virtual void onControlCommand(Cmd cmd, byte value) = 0; virtual void onRadioControlCommand(const std::vector &command) = 0; private: bool receiveByte(byte rxByte); void processData(byte rxByte); bool processCommand(byte rxByte); private: State state_; DataType dataType_; std::shared_ptr txQueue_; std::vector cmdBuffer_; }; } // Kiss #endif // KISS_PROCESSOR_H