tnc3-firmware/TNC/HdlcDecoder.hpp

60 wiersze
1.5 KiB
C++

// Copyright 2015-2020 Mobilinkd LLC <rob@mobilinkd.com>
// All rights reserved.
#pragma once
#include "HdlcFrame.hpp"
#include <cstdint>
namespace mobilinkd { namespace tnc { namespace hdlc {
struct NewDecoder
{
enum class State {IDLE, SYNC, RECEIVE};
using frame_type = IoFrame;
using result_type = std::tuple<frame_type*, uint8_t>;
using optional_result_type = frame_type*;
static constexpr uint8_t STATUS_OK{0x01};
static constexpr uint8_t STATUS_USER_CANCEL{0x02};
static constexpr uint8_t STATUS_FRAME_ABORT{0x04};
static constexpr uint8_t STATUS_FRAME_ERROR{0x08};
static constexpr uint8_t STATUS_NO_CARRIER{0x10};
static constexpr uint8_t STATUS_CRC_ERROR{0x20};
static constexpr uint16_t VALID_CRC = 0xf0b8;
State state{State::IDLE};
uint8_t buffer{0};
uint8_t bits{0};
uint8_t report_bits{0};
uint8_t ones{0};
bool flag{0};
/**
* Tell the demodulator to return all "passable" HDLC frames. These
* are frames which consist of an even multiple of eight bits and are
* up to 330 bytes, but which do not have a valid checksum.
*/
bool passall{false};
frame_type* packet{nullptr};
NewDecoder(bool pass_all=false)
: passall(pass_all)
{}
bool can_pass(uint8_t status) const
{
return status == STATUS_OK or (passall and status == STATUS_CRC_ERROR);
}
optional_result_type operator()(bool input, bool pll_lock);
uint8_t process(bool input, bool pll_lock);
};
}}} // mobilinkd::tnc::hdlc