/// Types for the BLK_BOX NOW priv protocol #ifndef _BBNOW_PRIV_H #define _BBNOW_PRIV_H #include #include #include #include #include #include "bb_expantions.hpp" /////////////////////////////////////// // ACK // ///////////////////////////////////// /// The data associated with the `ACK` type. struct BBNowPrivAckData { }; /////////////////////////////////////// // DISCOVERY RESPONSE // ///////////////////////////////////// /// The data associated with the `DISCOVERY_RESPONSE` type. struct BBNowPrivDiscoveryResponseData { BlkBoxExpantion expantion_type{}; }; /////////////////////////////////////// // EXPANDER MESSAGE // ///////////////////////////////////// /// The data associated with the `EXPANDER_MESSAGE` type. struct BBNowPrivExpanderMessageData { // TODO: this should get flattened into a concrete type, an enum over the expander types. std::vector data; }; /////////////////////////////////////// // INFO QUERY // ///////////////////////////////////// /// The data associated with the `INFO_QUERY` type. struct BBNowPrivInfoQueryData { uint8_t battery_percentage; // TODO: add other status fields that may be useful to query. }; /////////////////////////////////////// // PRIV PACKET // ///////////////////////////////////// /// The packet type for `BBNowPrivPacket`s. enum class BBNowPrivPacketType: uint16_t { NONE = 0, ACK = 1, // TODO: we will need to add more here for handshaking in the future. DISCOVERY_RESPONSE = 2, EXPANDER_MESSAGE = 3, INFO_QUERY = 4, MAX = 4, }; /// The data field for the packet. using BBNowPrivPacketData = std::variant< std::monostate, BBNowPrivAckData, BBNowPrivDiscoveryResponseData, BBNowPrivExpanderMessageData, BBNowPrivInfoQueryData >; struct BBNowPrivPacket { /// ACK packet size. const static size_t ACK_PACKET_SIZE = 4; static_assert( ACK_PACKET_SIZE == sizeof(BBNowPrivPacketType) + sizeof(uint16_t), "ACK packet size should match it's data size" ); /// Discovery response packet size. const static size_t DISCOVERY_RESPONSE_PACKET_SIZE = 6; static_assert( DISCOVERY_RESPONSE_PACKET_SIZE == sizeof(BBNowPrivPacketType) + sizeof(uint16_t) + sizeof(BBNowPrivDiscoveryResponseData), "Discovery response packet size should match it's data size" ); /// Info query packet size. const static size_t INFO_QUERY_PACKET_SIZE = 5; static_assert( INFO_QUERY_PACKET_SIZE == sizeof(BBNowPrivPacketType) + sizeof(uint16_t) + sizeof(BBNowPrivInfoQueryData), "Info query packet size should match its data size" ); /// The type of packet this is. BBNowPrivPacketType packet_type{}; /// Sequence number associated with this packet. uint16_t sequence{}; /// The data held by the packet. BBNowPrivPacketData packet_data{}; /// The size of the serialized packet (in bytes). size_t serialize_size() const; /// Serializes the packet to a vector. std::vector serialize() const; /// Serializes the packet into the given vector. /// /// Returns the number of bytes written into the buffer. size_t serialize_into(std::vector& buf) const; /// Deserializes a packet from the given bytes. static std::optional deserialize(std::span bytes); /// Constructs an empty packet. BBNowPrivPacket() = default; /// Constructs a new `ACK` packet. static BBNowPrivPacket new_ack(uint16_t sequence); /// Constructs a new `DISCOVERY_RESPONSE` packet. static BBNowPrivPacket new_discovery_response( uint16_t sequence, BBNowPrivDiscoveryResponseData data ); /// Constructs a new `EXPANDER_MESSAGE` packet. static BBNowPrivPacket new_expander_message( uint16_t sequence, BBNowPrivExpanderMessageData data ); /// Constructs a new `INFO_QUERY` packet. static BBNowPrivPacket new_info_query( uint16_t sequence, BBNowPrivInfoQueryData data ); }; #endif /* _BBNOW_PRIV_H */