kopia lustrzana https://github.com/mobilinkd/tnc3-firmware
Loosen DCD requirement for decode.
rodzic
eceaee124b
commit
a78c3df323
|
@ -38,7 +38,7 @@ uint8_t NewDecoder::process(bool input, bool pll_lock)
|
||||||
if (!packet) osThreadYield();
|
if (!packet) osThreadYield();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pll_lock) {
|
if (pll_lock or dcd != DCD::ON) {
|
||||||
if (ones == 5) {
|
if (ones == 5) {
|
||||||
if (input) {
|
if (input) {
|
||||||
// flag byte
|
// flag byte
|
||||||
|
@ -51,6 +51,8 @@ uint8_t NewDecoder::process(bool input, bool pll_lock)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
had_dcd |= pll_lock;
|
||||||
|
|
||||||
buffer >>= 1;
|
buffer >>= 1;
|
||||||
buffer |= (input * 128);
|
buffer |= (input * 128);
|
||||||
bits += 1; // Free-running until Sync byte.
|
bits += 1; // Free-running until Sync byte.
|
||||||
|
@ -63,14 +65,14 @@ uint8_t NewDecoder::process(bool input, bool pll_lock)
|
||||||
if (flag) {
|
if (flag) {
|
||||||
switch (buffer) {
|
switch (buffer) {
|
||||||
case 0x7E:
|
case 0x7E:
|
||||||
if (packet->size() > 2) {
|
if (packet->size() > 14) {
|
||||||
// We have started decoding a packet.
|
// We have started decoding a packet.
|
||||||
packet->parse_fcs();
|
packet->parse_fcs();
|
||||||
report_bits = bits;
|
report_bits = bits;
|
||||||
if (packet->size() < 15) {
|
if (dcd == DCD::PARTIAL and not had_dcd) {
|
||||||
// 120 (136) bits per AX.25 section 3.9.
|
// 120 (136) bits per AX.25 section 3.9.
|
||||||
// Note we discard the flags.
|
// Note we discard the flags.
|
||||||
result_code = STATUS_FRAME_ERROR;
|
result_code = STATUS_NO_CARRIER;
|
||||||
} else if (packet->ok()) {
|
} else if (packet->ok()) {
|
||||||
// Not compliant with AX.25 section 3.9.
|
// Not compliant with AX.25 section 3.9.
|
||||||
// We ignore byte alignment when FCS is OK.
|
// We ignore byte alignment when FCS is OK.
|
||||||
|
@ -92,6 +94,7 @@ uint8_t NewDecoder::process(bool input, bool pll_lock)
|
||||||
state = State::SYNC;
|
state = State::SYNC;
|
||||||
flag = 0;
|
flag = 0;
|
||||||
bits = 0;
|
bits = 0;
|
||||||
|
had_dcd = false;
|
||||||
break;
|
break;
|
||||||
case 0xFE:
|
case 0xFE:
|
||||||
if (packet->size()) {
|
if (packet->size()) {
|
||||||
|
@ -133,15 +136,11 @@ uint8_t NewDecoder::process(bool input, bool pll_lock)
|
||||||
// PLL unlocked.
|
// PLL unlocked.
|
||||||
// Note the rules here are the same as above.
|
// Note the rules here are the same as above.
|
||||||
report_bits = bits;
|
report_bits = bits;
|
||||||
if (packet->size() > 2)
|
had_dcd = false;
|
||||||
|
if (packet->size() > 14)
|
||||||
{
|
{
|
||||||
packet->parse_fcs();
|
packet->parse_fcs();
|
||||||
if (packet->size() < 15) {
|
if (packet->ok())
|
||||||
// 120 (136) bits per AX.25 section 3.9.
|
|
||||||
// Note we discard the flags.
|
|
||||||
result_code = STATUS_NO_CARRIER;
|
|
||||||
}
|
|
||||||
else if (packet->ok())
|
|
||||||
{
|
{
|
||||||
// Not compliant with AX.25 section 3.9.
|
// Not compliant with AX.25 section 3.9.
|
||||||
// We ignore byte alignment when FCS is OK.
|
// We ignore byte alignment when FCS is OK.
|
||||||
|
@ -159,7 +158,7 @@ uint8_t NewDecoder::process(bool input, bool pll_lock)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result_code = STATUS_NO_CARRIER;
|
packet->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state != State::IDLE) {
|
if (state != State::IDLE) {
|
||||||
|
|
|
@ -33,6 +33,7 @@ struct NewDecoder
|
||||||
uint8_t report_bits{0};
|
uint8_t report_bits{0};
|
||||||
uint8_t ones{0};
|
uint8_t ones{0};
|
||||||
bool flag{0};
|
bool flag{0};
|
||||||
|
bool had_dcd{false};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tell the demodulator to return all "passable" HDLC frames. These
|
* Tell the demodulator to return all "passable" HDLC frames. These
|
||||||
|
@ -41,6 +42,10 @@ struct NewDecoder
|
||||||
*/
|
*/
|
||||||
bool passall{false};
|
bool passall{false};
|
||||||
|
|
||||||
|
enum class DCD { ON, PARTIAL, OFF };
|
||||||
|
|
||||||
|
DCD dcd{DCD::PARTIAL};
|
||||||
|
|
||||||
frame_type* packet{nullptr};
|
frame_type* packet{nullptr};
|
||||||
|
|
||||||
NewDecoder(bool pass_all=false)
|
NewDecoder(bool pass_all=false)
|
||||||
|
@ -58,6 +63,11 @@ struct NewDecoder
|
||||||
{
|
{
|
||||||
passall = enabled;
|
passall = enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setDCD(DCD config)
|
||||||
|
{
|
||||||
|
dcd = config;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}}} // mobilinkd::tnc::hdlc
|
}}} // mobilinkd::tnc::hdlc
|
||||||
|
|
Ładowanie…
Reference in New Issue