Satellite-Gateway
GatewayClient.cpp
Go to the documentation of this file.
1 
24 #include "GatewayClient.h"
27 #include "GatewayFrameData.h"
28 #include <assert.h>
29 
30 GatewayClient::GatewayClient(boost::asio::io_service& a_IOService, boost::asio::ip::tcp::resolver::iterator a_EndpointIterator, std::shared_ptr<ConfigServerHandlerCollection>
31  a_ConfigServerHandlerCollection, std::shared_ptr<HdlcdClientHandlerCollection> a_HdlcdClientHandlerCollection, GatewayClientConnectGuard& a_GatewayClientConnectGuard, uint16_t a_ReferenceNbr):
32  m_IOService(a_IOService), m_ConfigServerHandlerCollection(a_ConfigServerHandlerCollection), m_HdlcdClientHandlerCollection(a_HdlcdClientHandlerCollection),
33  m_GatewayClientConnectGuard(a_GatewayClientConnectGuard), m_TcpSocket(a_IOService), m_ReferenceNbr(a_ReferenceNbr), m_bClosed(false) {
34  // Checks
35  assert(m_ConfigServerHandlerCollection);
36  assert(m_HdlcdClientHandlerCollection);
37 
38  // Connect the TCP socket
39  boost::asio::async_connect(m_TcpSocket, a_EndpointIterator, [this, &a_IOService](boost::system::error_code a_ErrorCode, boost::asio::ip::tcp::resolver::iterator) {
40  if (a_ErrorCode == boost::asio::error::operation_aborted) return;
41  if (a_ErrorCode) {
42  Close();
43  } else {
44  // Configure the frame end point
45  m_GatewayClientConnectGuard.IsConnected();
46  m_FrameEndpoint = std::make_shared<FrameEndpoint>(a_IOService, m_TcpSocket, 0x00); // 0x00: unset the filter mask as there is no preceeding type byte
47  m_FrameEndpoint->RegisterFrameFactory(GATEWAY_FRAME_DATA, []()->std::shared_ptr<Frame>{ return GatewayFrameData::CreateDeserializedFrame (); });
48  m_FrameEndpoint->SetOnFrameCallback ([this](std::shared_ptr<Frame> a_Frame)->bool{ return OnFrame(a_Frame); });
49  m_FrameEndpoint->SetOnClosedCallback ([this](){ OnClosed(); });
50  m_FrameEndpoint->Start();
51  } // else
52  }); // async_connect
53 }
54 
56  Close();
57 }
58 
60  if (m_FrameEndpoint) {
61  m_FrameEndpoint->Shutdown();
62  } // if
63 }
64 
66  if (m_bClosed == false) {
67  m_bClosed = true;
68  if (m_ConfigServerHandlerCollection) {
69  m_GatewayClientConnectGuard.IsDisconnected();
70  } // if
71 
72  if (m_FrameEndpoint) {
73  m_FrameEndpoint->Close();
74  } // if
75 
76  if (m_OnClosedCallback) {
77  m_OnClosedCallback();
78  } // if
79  } // if
80 
81  // Drop all shared pointers
82  m_ConfigServerHandlerCollection.reset();
83  m_HdlcdClientHandlerCollection.reset();
84 }
85 
86 void GatewayClient::SendPacket(uint16_t a_SerialPortNbr, const std::vector<unsigned char> &a_Payload) {
87  // Deliver the packet to the gateway client entity
88  if (m_FrameEndpoint) {
89  m_FrameEndpoint->SendFrame(GatewayFrameData::Create(a_SerialPortNbr, a_Payload));
90  } // if
91 }
92 
93 void GatewayClient::SetOnClosedCallback(std::function<void()> a_OnClosedCallback) {
94  m_OnClosedCallback = a_OnClosedCallback;
95 }
96 
97 bool GatewayClient::OnFrame(std::shared_ptr<Frame> a_Frame) {
98  // Dispatch
99  assert(a_Frame);
100  auto l_GatewayFrameData = std::dynamic_pointer_cast<GatewayFrameData>(a_Frame);
101  assert(l_GatewayFrameData);
102  m_HdlcdClientHandlerCollection->SendPacket(l_GatewayFrameData->GetSerialPortNbr(), l_GatewayFrameData->GetPayload());
103  return true;
104 }
105 
106 void GatewayClient::OnClosed() {
107  Close();
108 }
void SetOnClosedCallback(std::function< void()> a_OnClosedCallback)
static GatewayFrameData Create(uint16_t a_SerialPortNbr, const std::vector< unsigned char > &a_Payload)
GatewayClient(boost::asio::io_service &a_IOService, boost::asio::ip::tcp::resolver::iterator a_EndpointIterator, std::shared_ptr< ConfigServerHandlerCollection > a_ConfigServerHandlerCollection, std::shared_ptr< HdlcdClientHandlerCollection > a_HdlcdClientHandlerCollection, GatewayClientConnectGuard &a_GatewayClientConnectGuard, uint16_t a_ReferenceNbr)
void SendPacket(uint16_t a_SerialPortNbr, const std::vector< unsigned char > &a_Payload)
static std::shared_ptr< GatewayFrameData > CreateDeserializedFrame()