37 #ifndef HDLCD_PACKET_ENDPOINT_H 38 #define HDLCD_PACKET_ENDPOINT_H 43 #include <boost/asio.hpp> 51 HdlcdPacketEndpoint(boost::asio::io_service& a_IOService, std::shared_ptr<FrameEndpoint> a_FrameEndpoint): m_IOService(a_IOService), m_FrameEndpoint(a_FrameEndpoint), m_KeepAliveTimer(a_IOService) {
53 assert(m_FrameEndpoint);
58 m_FrameEndpoint->ResetFrameFactories(0xF0);
61 m_FrameEndpoint->SetOnFrameCallback([
this](std::shared_ptr<Frame> a_Frame)->
bool{
return OnFrame(a_Frame); });
62 m_FrameEndpoint->SetOnClosedCallback ([
this](){ OnClosed(); });
66 m_OnDataCallback =
nullptr;
67 m_OnCtrlCallback =
nullptr;
68 m_OnClosedCallback =
nullptr;
73 void SetOnDataCallback(std::function<
bool(std::shared_ptr<const HdlcdPacketData> a_PacketData)> a_OnDataCallback) {
74 m_OnDataCallback = a_OnDataCallback;
78 m_OnCtrlCallback = a_OnCtrlCallback;
82 m_OnClosedCallback = a_OnClosedCallback;
85 bool Send(
const Frame& a_Frame, std::function<
void()> a_OnSendDoneCallback =
nullptr) {
86 return (m_FrameEndpoint->SendFrame(a_Frame, a_OnSendDoneCallback));
90 assert(m_bStarted ==
false);
91 assert(m_bStopped ==
false);
93 auto self(shared_from_this());
94 if (m_FrameEndpoint->GetWasStarted()) {
95 m_IOService.post([
this,
self](){ m_FrameEndpoint->TriggerNextFrame(); });
97 m_IOService.post([
this,
self](){ m_FrameEndpoint->Start(); });
100 StartKeepAliveTimer();
104 m_FrameEndpoint->Shutdown();
105 m_KeepAliveTimer.cancel();
109 if (m_bStarted && (!m_bStopped)) {
111 m_KeepAliveTimer.cancel();
112 m_FrameEndpoint->Close();
113 if (m_OnClosedCallback) {
114 m_OnClosedCallback();
120 m_FrameEndpoint->TriggerNextFrame();
124 void StartKeepAliveTimer() {
125 auto self(shared_from_this());
126 m_KeepAliveTimer.expires_from_now(boost::posix_time::minutes(1));
127 m_KeepAliveTimer.async_wait([
this,
self](
const boost::system::error_code& a_ErrorCode) {
131 StartKeepAliveTimer();
142 bool OnFrame(std::shared_ptr<Frame> a_Frame) {
144 bool l_bReceiving =
true;
145 auto l_PacketData = std::dynamic_pointer_cast<
HdlcdPacketData>(a_Frame);
147 if (m_OnDataCallback) {
149 l_bReceiving = m_OnDataCallback(l_PacketData);
152 auto l_PacketCtrl = std::dynamic_pointer_cast<
HdlcdPacketCtrl>(a_Frame);
154 bool l_bDeliver =
true;
160 if ((l_bDeliver) && (m_OnCtrlCallback)) {
161 m_OnCtrlCallback(*(l_PacketCtrl.get()));
171 boost::asio::io_service& m_IOService;
172 std::shared_ptr<FrameEndpoint> m_FrameEndpoint;
176 std::function<bool(std::shared_ptr<const HdlcdPacketData> a_PacketData)> m_OnDataCallback;
177 std::function<void(const HdlcdPacketCtrl& a_PacketCtrl)> m_OnCtrlCallback;
178 std::function<void()> m_OnClosedCallback;
184 boost::asio::deadline_timer m_KeepAliveTimer;
187 #endif // HDLCD_PACKET_ENDPOINT_H
This file contains the header declaration of class FrameEndpoint.
static std::shared_ptr< HdlcdPacketData > CreateDeserializedPacket()
Copyright (c) 2016, Florian Evers, florian-evers@gmx.de All rights reserved.
A control packet of the HDLCd access protocol.
static std::shared_ptr< HdlcdPacketCtrl > CreateDeserializedPacket()
bool Send(const Frame &a_Frame, std::function< void()> a_OnSendDoneCallback=nullptr)
void SetOnDataCallback(std::function< bool(std::shared_ptr< const HdlcdPacketData > a_PacketData)> a_OnDataCallback)
void TriggerNextDataPacket()
HdlcdPacketEndpoint(boost::asio::io_service &a_IOService, std::shared_ptr< FrameEndpoint > a_FrameEndpoint)
A data packet of the HDLCd access protocol.
void SetOnClosedCallback(std::function< void()> a_OnClosedCallback)
static HdlcdPacketCtrl CreateKeepAliveRequest()
void SetOnCtrlCallback(std::function< void(const HdlcdPacketCtrl &a_PacketCtrl)> a_OnCtrlCallback)
Copyright (c) 2016, Florian Evers, florian-evers@gmx.de All rights reserved.