C++ Pixels Library For Windows
Enable communications with Pixels dice using Bluetooth Low Energy.
Loading...
Searching...
No Matches
MessageSerialization.h
Go to the documentation of this file.
1
6#pragma once
7
8#include <memory>
9#include <vector>
10#include <type_traits>
11
12#include "Messages.h"
13
14namespace Systemic::Pixels::Messages::Serialization
15{
22 template <typename T, std::enable_if_t<std::is_base_of_v<Systemic::Pixels::Messages::PixelMessage, T>, int> = 0>
23 inline void serializeMessage(const T& message, std::vector<uint8_t>& outData)
24 {
25 //static_assert(std::is_base_of_v<Message, T>);
26 outData.resize(sizeof(T));
27 memcpy(outData.data(), &message, sizeof(T));
28 }
29
37 template <typename T, std::enable_if_t<std::is_base_of_v<Systemic::Pixels::Messages::PixelMessage, T>, int> = 0>
38 inline std::shared_ptr<const T> deserializeMessage(const std::vector<uint8_t>& data)
39 {
40 if (data.size() == sizeof(T))
41 {
42 auto msg = std::shared_ptr<T>(new T{});
43 memcpy(msg.get(), data.data(), data.size());
44 return msg;
45 }
46 return nullptr;
47 }
48
54 inline std::shared_ptr<const PixelMessage> deserializeMessage(const std::vector<uint8_t>& data)
55 {
56 if (!data.empty())
57 {
58 const auto type = static_cast<MessageType>(data[0]);
59 switch (type)
60 {
61 case MessageType::IAmADie:
62 return deserializeMessage<IAmADie>(data);
63 case MessageType::RollState:
64 return deserializeMessage<RollState>(data);
65 case MessageType::Blink:
66 return deserializeMessage<Blink>(data);
67 case MessageType::BatteryLevel:
68 return deserializeMessage<BatteryLevel>(data);
69 case MessageType::RequestRssi:
70 return deserializeMessage<RequestRssi>(data);
71 case MessageType::Rssi:
72 return deserializeMessage<Rssi>(data);
73 }
74
75 if (data.size() == 1 && type != MessageType::None)
76 {
77 return std::shared_ptr<PixelMessage>(new PixelMessage{ type });
78 }
79 }
80 return nullptr;
81 }
82}
void serializeMessage(const T &message, std::vector< uint8_t > &outData)
Serialize a PixelMessage instance to binary data so it can be send to a Pixels die.
Definition: MessageSerialization.h:23
std::shared_ptr< const T > deserializeMessage(const std::vector< uint8_t > &data)
Deserialize some binary data received from a Pixels die to a PixelMessage.
Definition: MessageSerialization.h:38
List of Pixel messages and their respective classes.
MessageType
Lists all the Pixel dice message types. The value is used for the first byte of data in a Pixel messa...
Definition: Messages.h:19