Open Model Railroad Network (OpenMRN)
Loading...
Searching...
No Matches
DirectHubGc.cxx
Go to the documentation of this file.
1
35#include "utils/DirectHub.hxx"
36
39{
40public:
42 {
43 clear();
44 }
45
46 ssize_t segment_message(const void *d, size_t size) override
47 {
48 if (!size)
49 {
50 return 0; // nothing to do.
51 }
52 const char *data = static_cast<const char *>(d);
53 if (packetLen_ == 0)
54 {
55 // beginning of packet.
56 isGcPacket_ = data[0] == ':';
57 }
58 size_t ofs = 0;
59 if (isGcPacket_)
60 {
61 // looking for terminating ;
62 while ((ofs < size) && (data[ofs] != ';'))
63 {
64 ++ofs;
65 }
66 if (ofs < size)
67 {
68 // found the terminating ;
69 ++ofs;
70 // append any garbage we still have.
71 while ((ofs < size) && (data[ofs] != ':'))
72 {
73 ++ofs;
74 }
75 packetLen_ += ofs;
76 return packetLen_;
77 }
78 else
79 {
80 // ran out of payload without finding terminating ;
81 packetLen_ += size;
82 return 0;
83 }
84 }
85 else
86 {
87 // Looking for starting ':'
88 while ((ofs < size) && (data[ofs] != ':'))
89 {
90 ++ofs;
91 }
92 packetLen_ += ofs;
93 if (ofs < size)
94 {
95 // found it
96 return packetLen_;
97 }
98 else
99 {
100 return 0;
101 }
102 }
103 }
104
107 void clear() override
108 {
109 isGcPacket_ = false;
110 packetLen_ = 0;
111 }
112
113private:
116 uint32_t isGcPacket_ : 1;
117
119 uint32_t packetLen_ : 30;
120};
121
126
129{
130public:
131 ssize_t segment_message(const void *d, size_t size) override
132 {
133 total_ += size;
134 LOG(VERBOSE, "segment %zu total %zu", size, total_);
135 return size;
136 }
137
138 void clear() override
139 {
140 }
141
142 size_t total_ {0};
143};
144
MessageSegmenter * create_gc_message_segmenter()
Creates a message segmenter for gridconnect data.
MessageSegmenter * create_trivial_message_segmenter()
Creates a message segmenter for arbitrary data.
Message segmenter that chops incoming byte stream into gridconnect packets.
uint32_t packetLen_
How many bytes long this packet is.
void clear() override
Resets internal state machine.
uint32_t isGcPacket_
True if the current packet is a gridconnect packet; false if it is garbage.
ssize_t segment_message(const void *d, size_t size) override
Makes a segmenting decision given more input data.
Message segmenter that keeps each packet as-is.
ssize_t segment_message(const void *d, size_t size) override
Makes a segmenting decision given more input data.
void clear() override
Resets internal state machine.
Abstract base class for segmenting a byte stream typed input into meaningful packet sized chunks.
#define LOG(level, message...)
Conditionally write a message to the logging output.
Definition logging.h:99
static const int VERBOSE
Loglevel that is usually not printed, reporting debugging information.
Definition logging.h:59