#pragma once #include "coding/traffic.hpp" #include "std/string.hpp" #include "std/vector.hpp" #include "boost/circular_buffer.hpp" namespace tracking { class Protocol { public: using Encoder = coding::TrafficGPSEncoder; using DataElementsCirc = boost::circular_buffer; using DataElementsVec = vector; static uint8_t const kOk[4]; static uint8_t const kFail[4]; enum class PacketType { AuthV0 = 0x81, DataV0 = 0x82, CurrentAuth = AuthV0, CurrentData = DataV0 }; static vector CreateHeader(PacketType type, uint32_t payloadSize); static vector CreateAuthPacket(string const & clientId); static vector CreateDataPacket(DataElementsCirc const & points); static vector CreateDataPacket(DataElementsVec const & points); static pair DecodeHeader(vector const & data); static string DecodeAuthPacket(PacketType type, vector const & data); static DataElementsVec DecodeDataPacket(PacketType type, vector const & data); private: static void InitHeader(vector & packet, PacketType type, uint32_t payloadSize); }; string DebugPrint(Protocol::PacketType type); } // namespace tracking