Tool Libs
UMIT-TIROL Institute of Automation and Control Engineering library collection
 
Loading...
Searching...
No Matches
frameregistry.h
Go to the documentation of this file.
1
5#pragma once
6
7#include <utils/buffer.h>
8
10struct Frame {
14 uint8_t id{};
16 Frame(uint8_t id=0) : id(id) { }
21 template<typename T>
22 Frame &pack(T value) {
23 const size_t sz = sizeof(T);
24 assert(cursor.pack + sz < b.size);
25 memcpy(b.buf+cursor.pack, &value, sz);
26 cursor.pack += sz;
27 b.len += sz;
28 return *this;
29 }
34 template<typename T>
35 void unPack(T &value) {
36 const size_t sz = sizeof(T);
37 assert(cursor.unpack + sz < b.size);
38 memcpy(&value, b.buf + cursor.unpack, sz);
39 cursor.unpack += sz;
40 }
45 template<typename T>
46 T unpack() {
47 const size_t sz = sizeof(T);
48 assert(cursor.unpack + sz < b.size);
49 T ret{};
50 memcpy(&ret, b.buf + cursor.unpack, sz);
51 cursor.unpack += sz;
52 return ret;
53 }
54private:
55 struct {
56 uint8_t pack, unpack;
57 } cursor{};
58};
59
63 struct FrameHandler {
64 virtual ~FrameHandler(){}
65 virtual void handle(Frame &f)=0;
66 };
68 struct FuncHandler: public FrameHandler {
69 typedef void (*Func)(Frame &f);
70 Func func{};
71 FuncHandler(Func f) : func(f) { }
72 void handle(Frame &f) override {
73 return func(f);
74 }
75 };
77 template<typename T>
78 struct MethodHandler: public FrameHandler {
79 typedef void(T::*Method)(Frame &f);
80 T* base;
81 Method method;
82 MethodHandler(T* b, Method m) : base(b), method(m) { }
83 void handle(Frame &f) override {
84 return (base->*method)(f);
85 }
86 };
87
91 void setHandler(uint8_t id, FuncHandler::Func f) {
92 assert(list[id] == nullptr);
93 list[id] = new FuncHandler(f);
94 }
96 template<typename T>
97 void setHandler(uint8_t id, T& base,
98 typename MethodHandler<T>::Method method) {
99 assert(list[id] == nullptr);
100 list[id] = new MethodHandler(&base, method);
101 }
102
108 void handle(Frame &&f) {
109 FrameHandler *c = list[f.id];
110 if (c) c->handle(f);
111 }
113 for (auto &entry: list) {
114 delete entry;
115 }
116 }
117};
Copyright (c) 2023 IACE.
dynamically allocated, but fixed-size buffer template
Definition buffer.h:18
size_t size
total capacity of buffer
Definition buffer.h:23
size_t len
number of items stored in buffer
Definition buffer.h:21
Virtual Base for a callable Frame handler.
Definition frameregistry.h:63
pure function FrameHandler
Definition frameregistry.h:68
class method FrameHandler
Definition frameregistry.h:78
Registry for dispatching frames to their registered destinations.
Definition frameregistry.h:61
FrameHandler * list[64]
list of registered handlers
Definition frameregistry.h:89
void setHandler(uint8_t id, T &base, typename MethodHandler< T >::Method method)
register class method FrameHandler for given id
Definition frameregistry.h:97
void handle(Frame &&f)
handle given Frame and consume it
Definition frameregistry.h:108
void setHandler(uint8_t id, FuncHandler::Func f)
register pure function FrameHandler for given id
Definition frameregistry.h:91
pyWisp communication frame
Definition frameregistry.h:10
Frame & pack(T value)
pack value into Frame
Definition frameregistry.h:22
Frame(uint8_t id=0)
construct Frame with given id
Definition frameregistry.h:16
Buffer< uint8_t > b
buffer containing the Frame payload
Definition frameregistry.h:12
uint8_t id
buffer id: [0..63]
Definition frameregistry.h:14
T unpack()
return unpacked value from Frame
Definition frameregistry.h:46
void unPack(T &value)
unpack into value from Frame
Definition frameregistry.h:35