#ifndef __ENCODER_H_ #define __ENCODER_H_ #include "communication/message/include/message.h" #include "communication/message/include/canmessage.h" #include "communication/include/packet.h" #include "communication/include/command.h" #include "communication/include/network.h" #include "communication/include/packetizer.h" #include #include #include #pragma pack(push, 1) namespace icsneo { class Encoder { public: Encoder(std::shared_ptr packetizerInstance) : packetizer(packetizerInstance) {} bool encode(std::vector& result, const std::shared_ptr& message); bool encode(std::vector& result, Command cmd, bool boolean) { return encode(result, cmd, std::vector({ (uint8_t)boolean })); } bool encode(std::vector& result, Command cmd, std::vector arguments = {}); private: std::shared_ptr packetizer; typedef uint16_t icscm_bitfield; struct HardwareCANPacket { struct { icscm_bitfield IDE : 1; icscm_bitfield SRR : 1; icscm_bitfield SID : 11; icscm_bitfield EDL : 1; icscm_bitfield BRS : 1; icscm_bitfield ESI : 1; } header; struct { icscm_bitfield EID : 12; icscm_bitfield TXMSG : 1; icscm_bitfield TXAborted : 1; icscm_bitfield TXLostArb : 1; icscm_bitfield TXError : 1; } eid; struct { icscm_bitfield DLC : 4; icscm_bitfield RB0 : 1; icscm_bitfield IVRIF : 1; icscm_bitfield HVEnable : 1;// must be cleared before passing into CAN driver icscm_bitfield ExtendedNetworkIndexBit : 1;//DO NOT CLOBBER THIS icscm_bitfield RB1 : 1; icscm_bitfield RTR : 1; icscm_bitfield EID : 6; } dlc; unsigned char data[8]; struct { uint64_t TS : 60; uint64_t : 3; uint64_t IsExtended : 1; } timestamp; }; }; } #pragma pack(pop) #endif