2#include "core/device/vdb/crc32.hpp"
23#define VDPWarnf(fmt, ...) printf("WARN: " fmt "\n", ##__VA_ARGS__)
29#define VDPDebugf(fmt, ...) printf("DEBUG: " fmt "\n", ##__VA_ARGS__)
35#define VDPTracef(fmt, ...) printf("TRACE: " fmt "\n", ##__VA_ARGS__)
41constexpr size_t MAX_CHANNELS = 256;
46using PartPtr = std::shared_ptr<Part>;
48using Packet = std::vector<uint8_t>;
51using ChannelID = uint8_t;
54 template <
typename MutexType>
friend class RegistryListener;
55 friend class RegistryController;
60 explicit Channel(PartPtr data) : data(data) {}
65 ChannelID getID()
const;
73 Channel(PartPtr data, ChannelID channel_id) : data(data), id(channel_id) {}
76 Packet packet_scratch_space;
84void dump_packet_hex(
const Packet &pac);
85void dump_packet_8bit(
const Packet &pac);
90enum class PacketType : uint8_t {
91 Broadcast = 0b00000000,
94enum class PacketFunction : uint8_t {
96 Acknowledge = 0b00100000,
97 Response = 0b01000000,
109enum PacketValidity : uint8_t {
114PacketValidity validate_packet(
const VDP::Packet &packet);
118enum class Type : uint8_t {
138std::string to_string(Type t);
148void add_indents(std::stringstream &ss,
size_t indent);
155 friend class PacketReader;
156 friend class PacketWriter;
165 Part(std::string name);
182 virtual void fetch() = 0;
184 virtual void response();
187 PartPtr to_PartPtr(){
188 return std::make_shared<T>(
this);
191 virtual VDP::PartPtr clone() = 0;
198 std::string get_name()
const;
200 virtual void Visit(
Visitor *) = 0;
219 virtual void pprint(std::stringstream &ss,
size_t indent)
const = 0;
225 virtual void pprint_data(std::stringstream &ss,
size_t indent)
const = 0;
238 PacketReader(Packet pac);
244 PacketReader(Packet pac,
size_t start);
256 std::string get_string();
261 template <
typename Number>
Number get_number() {
264 std::is_floating_point<Number>::value || std::is_integral<Number>::value,
265 "This function should only be used on numbers"
269 if (read_head +
sizeof(
Number) > pac.size()) {
271 "%s:%d: Reading a number[%d] at position %d would read past "
274 __FILE__, __LINE__,
sizeof(
Number), read_head, pac.size()
281 std::memcpy(&value, &pac[read_head],
sizeof(
Number));
282 read_head +=
sizeof(
Number);
356 std::array<uint8_t,
sizeof(
Number)> bytes;
357 std::memcpy(&bytes, &num,
sizeof(
Number));
358 for (
const uint8_t b : bytes) {
394PartPtr make_decoder(PacketReader &pac);
410std::pair<ChannelID, PartPtr> decode_broadcast(
const Packet &packet);
412std::pair<ChannelID, PartPtr> decode_data(
const Packet &packet);
Definition protocol.hpp:369
virtual ~AbstractDevice()
Definition protocol.cpp:331
virtual void register_receive_callback(std::function< void(const VDP::Packet &packet)> callback)=0
virtual bool send_packet(const VDP::Packet &packet)=0
Definition protocol.hpp:293
void write_data_message(const Channel &part)
Definition protocol.cpp:272
void write_number(const Number &num)
Definition protocol.hpp:355
const Packet & get_packet() const
Definition protocol.cpp:229
void write_string(const std::string &str)
Definition protocol.cpp:219
PacketWriter(Packet &scratch_space)
Definition protocol.cpp:196
void write_channel_broadcast(const Channel &chan)
Definition protocol.cpp:252
void write_request()
Definition protocol.cpp:294
void write_type(Type t)
Definition protocol.cpp:214
void clear()
Definition protocol.cpp:200
void write_byte(uint8_t b)
Definition protocol.cpp:209
void write_channel_acknowledge(const Channel &chan)
Definition protocol.cpp:235
void write_response(std::deque< Channel > &channels)
Definition protocol.cpp:308
size_t size()
Definition protocol.cpp:204
virtual void pprint_data(std::stringstream &ss, size_t indent) const =0
virtual void write_schema(PacketWriter &sofar) const =0
std::string pretty_print_data() const
Definition protocol.cpp:115
std::string pretty_print() const
Definition protocol.cpp:106
virtual void write_message(PacketWriter &sofar) const =0
virtual void read_data_from_message(PacketReader &reader)=0
virtual void pprint(std::stringstream &ss, size_t indent) const =0
Part(std::string name)
Definition protocol.cpp:92
Definition protocol.hpp:13
uint32_t time_ms()
Definition wrapper_device.cpp:16
void delay_ms(uint32_t ms)
Definition wrapper_device.cpp:12