/* SerialDevice.h -- Serial Device class to handle serial communications with XBee -- */ /* ------------------------------------------------------------------------- */ /* September 20, 2016 -- @Copyright Aymen Soussia. All rights reserved. */ /* (aymen.soussia@gmail.com) */ #pragma once #include #include #include #include #include"MultithreadingDeque.hpp" #include"XBeeFrame.h" namespace Mist { namespace Xbee { struct Out_Packet_S { uint8_t packet_ID_; std::shared_ptr>> packet_buffer_; }; typedef MultithreadingDeque> Thread_Safe_Deque; typedef MultithreadingDeque Thread_Safe_Deque_Of_Vectors; //***************************************************************************** class SerialDevice { public: SerialDevice(); ~SerialDevice(); bool Init(const std::string& device, const std::size_t baud_rate); void Send_Frame(const std::string& frame); void Run_Service(); void Stop_Service(); void Set_In_Messages_Pointers(Thread_Safe_Deque* in_std_messages, Thread_Safe_Deque* in_fragments, Thread_Safe_Deque* in_Acks_and_Pings, Thread_Safe_Deque* command_responses, Thread_Safe_Deque* in_packet_loss); bool Is_IO_Service_Stopped(); // TO DO delete this function void Reset_IO_Service(); // TO DO delete this function void Close_Serial_Port(); const char FRAGMENT_MSG_ID = 'F'; const char ACKNOWLEDGEMENT_MSG_ID = 'A'; const char PING_MSG_ID = 'P'; const char STANDARD_MSG_ID = 'S'; const char PACKET_LOSS_MSG_ID = 'L'; private: enum FRAME_TYPE { AT_COMMAND = 0, AT_COMMAND_QUEUE_REGISTER_VALUE = 1, TRANSMIT_REQUEST = 2, EXPLICIT_ADDRESSING_COMMAND_FRAME = 3, REMOTE_AT_COMMAND = 4, AT_COMMAND_RESPONSE = 5, MODEM_STATUS = 6, TRANSMIT_STATUS = 7, ROUTE_INFORMATION_PACKET = 8, AGGREGATE_ADDRESSING_UPDATE = 9, RECEIVE_PACKET = 10, EXPLICIT_RX_INDICATOR = 11, IO_DATA_SAMPLE_RX_INDICATOR = 12, NODE_IDENTIFICATION_INDICATOR = 13, REMOTE_AT_COMMAND_RESPONSE = 14 }; void Init_Frame_Type_Keys(); void Set_Port_Options(const std::size_t baud_rate); void Read_Frame_Header(); void Read_Frame_Body(); void Write_Frame(); boost::asio::io_service io_service_; boost::asio::serial_port serial_port_; std::deque out_messages_; Thread_Safe_Deque* in_std_messages_; Thread_Safe_Deque* in_fragments_; Thread_Safe_Deque* in_Acks_and_Pings_; Thread_Safe_Deque* command_responses_; Thread_Safe_Deque* in_packet_loss_; Mist::Xbee::Frame current_frame_; unsigned int FRAME_TYPE_KEYS[REMOTE_AT_COMMAND_RESPONSE + 1]; }; } }