kopia lustrzana https://github.com/sh123/esp32_loraprs
Optimized kiss state machine
rodzic
693698e165
commit
3cd67e07d2
|
@ -3,8 +3,7 @@
|
||||||
namespace Kiss {
|
namespace Kiss {
|
||||||
|
|
||||||
Processor::Processor()
|
Processor::Processor()
|
||||||
: cmd_(Cmd::NoCmd)
|
: state_(State::GetStart)
|
||||||
, state_(State::Void)
|
|
||||||
, txQueue_(new cppQueue(sizeof(unsigned char), CfgTxQueueSize))
|
, txQueue_(new cppQueue(sizeof(unsigned char), CfgTxQueueSize))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -55,37 +54,34 @@ void Processor::serialProcessRx()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Processor::resetState()
|
|
||||||
{
|
|
||||||
cmd_ = Cmd::NoCmd;
|
|
||||||
state_ = State::Void;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Processor::processCommand(byte rxByte) {
|
bool Processor::processCommand(byte rxByte) {
|
||||||
|
|
||||||
switch (rxByte) {
|
switch (rxByte) {
|
||||||
case Cmd::Data:
|
case Cmd::Data:
|
||||||
if (!onRigTxBegin()) return false;
|
if (!onRigTxBegin()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
state_ = State::GetData;
|
state_ = State::GetData;
|
||||||
dataType_ = DataType::Raw;
|
dataType_ = DataType::Raw;
|
||||||
break;
|
break;
|
||||||
|
case Cmd::RadioControl:
|
||||||
|
state_ = State::GetData;
|
||||||
|
dataType_ = DataType::Control;
|
||||||
|
cmdBuffer_.clear();
|
||||||
|
break;
|
||||||
case Cmd::P:
|
case Cmd::P:
|
||||||
state_ = State::GetP;
|
state_ = State::GetP;
|
||||||
break;
|
break;
|
||||||
case Cmd::SlotTime:
|
case Cmd::SlotTime:
|
||||||
state_ = State::GetSlotTime;
|
state_ = State::GetSlotTime;
|
||||||
break;
|
break;
|
||||||
case Cmd::RadioControl:
|
case Marker::Fend:
|
||||||
state_ = State::GetData;
|
|
||||||
dataType_ = DataType::Control;
|
|
||||||
cmdBuffer_.clear();
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// unknown command
|
// unknown command
|
||||||
resetState();
|
state_ = State::GetEnd;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
cmd_ = (Cmd)rxByte;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,23 +91,19 @@ void Processor::processData(byte rxByte) {
|
||||||
state_ = State::Escape;
|
state_ = State::Escape;
|
||||||
break;
|
break;
|
||||||
case Marker::Fend:
|
case Marker::Fend:
|
||||||
if (cmd_ == Cmd::Data) {
|
|
||||||
if (dataType_ == DataType::Raw) {
|
if (dataType_ == DataType::Raw) {
|
||||||
onRigTxEnd();
|
onRigTxEnd();
|
||||||
} else if (dataType_ == DataType::Control) {
|
} else if (dataType_ == DataType::Control) {
|
||||||
onRadioControlCommand(cmdBuffer_);
|
onRadioControlCommand(cmdBuffer_);
|
||||||
}
|
}
|
||||||
}
|
state_ = State::GetStart;
|
||||||
resetState();
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (cmd_ == Cmd::Data) {
|
|
||||||
if (dataType_ == DataType::Raw) {
|
if (dataType_ == DataType::Raw) {
|
||||||
onRigTx(rxByte);
|
onRigTx(rxByte);
|
||||||
} else if (dataType_ == DataType::Control) {
|
} else if (dataType_ == DataType::Control) {
|
||||||
cmdBuffer_.push_back(rxByte);
|
cmdBuffer_.push_back(rxByte);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -119,24 +111,28 @@ void Processor::processData(byte rxByte) {
|
||||||
bool Processor::receiveByte(byte rxByte) {
|
bool Processor::receiveByte(byte rxByte) {
|
||||||
|
|
||||||
switch (state_) {
|
switch (state_) {
|
||||||
case State::Void:
|
case State::GetStart:
|
||||||
if (rxByte == Marker::Fend) {
|
if (rxByte == Marker::Fend) {
|
||||||
cmd_ = Cmd::NoCmd;
|
|
||||||
state_ = State::GetCmd;
|
state_ = State::GetCmd;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case State::GetEnd:
|
||||||
|
if (rxByte == Marker::Fend) {
|
||||||
|
state_ = State::GetStart;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case State::GetCmd:
|
case State::GetCmd:
|
||||||
if (rxByte != Marker::Fend) {
|
if (!processCommand(rxByte)) {
|
||||||
if (!processCommand(rxByte)) return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case State::GetP:
|
case State::GetP:
|
||||||
onControlCommand(Cmd::P, rxByte);
|
onControlCommand(Cmd::P, rxByte);
|
||||||
state_ = State::GetData;
|
state_ = State::GetEnd;
|
||||||
break;
|
break;
|
||||||
case State::GetSlotTime:
|
case State::GetSlotTime:
|
||||||
onControlCommand(Cmd::SlotTime, rxByte);
|
onControlCommand(Cmd::SlotTime, rxByte);
|
||||||
state_ = State::GetData;
|
state_ = State::GetEnd;
|
||||||
break;
|
break;
|
||||||
case State::GetData:
|
case State::GetData:
|
||||||
processData(rxByte);
|
processData(rxByte);
|
||||||
|
@ -150,11 +146,13 @@ bool Processor::receiveByte(byte rxByte) {
|
||||||
onRigTx((byte)Marker::Fesc);
|
onRigTx((byte)Marker::Fesc);
|
||||||
state_ = State::GetData;
|
state_ = State::GetData;
|
||||||
}
|
}
|
||||||
else {
|
else if (rxByte != Marker::Fend) {
|
||||||
resetState();
|
state_ = State::GetEnd;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
// unknown state
|
||||||
|
state_ = State::GetStart;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -24,7 +24,8 @@ protected:
|
||||||
};
|
};
|
||||||
|
|
||||||
enum State {
|
enum State {
|
||||||
Void = 0,
|
GetStart = 0,
|
||||||
|
GetEnd,
|
||||||
GetCmd,
|
GetCmd,
|
||||||
GetData,
|
GetData,
|
||||||
GetP,
|
GetP,
|
||||||
|
@ -72,12 +73,10 @@ private:
|
||||||
bool receiveByte(byte rxByte);
|
bool receiveByte(byte rxByte);
|
||||||
void processData(byte rxByte);
|
void processData(byte rxByte);
|
||||||
bool processCommand(byte rxByte);
|
bool processCommand(byte rxByte);
|
||||||
void resetState();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Cmd cmd_;
|
|
||||||
DataType dataType_;
|
|
||||||
State state_;
|
State state_;
|
||||||
|
DataType dataType_;
|
||||||
std::shared_ptr<cppQueue> txQueue_;
|
std::shared_ptr<cppQueue> txQueue_;
|
||||||
std::vector<byte> cmdBuffer_;
|
std::vector<byte> cmdBuffer_;
|
||||||
};
|
};
|
||||||
|
|
Ładowanie…
Reference in New Issue