Loading...
Searching...
No Matches
DSMEMessage.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2022 HAW Hamburg
3 * SPDX-License-Identifier: LGPL-2.1-only
4 */
5
6#pragma once
7
20
21#include <stdint.h>
22#include <string.h>
23
24#include "dsmeLayer/messages/IEEE802154eMACHeader.h"
25#include "interfaces/IDSMEMessage.h"
26#include "iolist.h"
27#include "mac_services/dataStructures/DSMEMessageElement.h"
28#include "net/gnrc/pktbuf.h"
31
32#ifdef __cplusplus
33extern "C" {
34#endif
35
36namespace dsme {
37
41class DSMEPlatform;
42
46class DSMEMessage : public IDSMEMessage {
47public:
48 /************* IDSMEMessage implementation *************/
49
53 void prependFrom(DSMEMessageElement *msg) override;
54
58 void decapsulateTo(DSMEMessageElement *msg) override;
59
63 void copyTo(DSMEMessageElement *msg);
64
68 bool hasPayload() override
69 {
70 return this->pkt != NULL && this->pkt->size > 0;
71 }
72
77 {
78 return startOfFrameDelimiterSymbolCounter;
79 }
80
84 void setStartOfFrameDelimiterSymbolCounter(uint32_t symbolCounter) override
85 {
86 startOfFrameDelimiterSymbolCounter = symbolCounter;
87 }
88
92 uint16_t getTotalSymbols() override
93 {
94 DSME_ASSERT(pkt);
95 /* Hardcoded to O-QPSK */
96 uint16_t bytes = macHdr.getSerializationLength()
97 + pkt->size
98 + 2 /* FCS */
99 + 4 /* Preamble */
100 + 1 /* SFD */
101 + 1; /* PHY Header */
102
103 return bytes * 2; /* 4 bit per symbol */
104 }
105
110 uint8_t getMPDUSymbols() override;
111
115 IEEE802154eMACHeader& getHeader() override
116 {
117 return macHdr;
118 }
119
123 uint8_t getLQI() override
124 {
125 return messageLQI;
126 }
127
131 bool getReceivedViaMCPS() override
132 {
133 return receivedViaMCPS;
134 }
135
139 void setReceivedViaMCPS(bool receivedViaMCPS) override
140 {
141 this->receivedViaMCPS = receivedViaMCPS;
142 }
143
147 bool getCurrentlySending() override
148 {
149 return currentlySending;
150 }
151
155 void setCurrentlySending(bool currentlySending) override
156 {
157 this->currentlySending = currentlySending;
158 }
159
163 void increaseRetryCounter() override
164 {
165 this->retryCounter++;
166 }
167
171 uint8_t getRetryCounter() override
172 {
173 return this->retryCounter;
174 }
175
180 {
181 DSME_ASSERT(pkt);
182 return pkt->size;
183 }
184
188 int8_t getRSSI() override
189 {
190 return this->messageRSSI;
191 }
192
196 int loadBuffer(size_t len);
197
202
206 uint8_t *getPayload()
207 {
208 DSME_ASSERT(pkt);
209 return (uint8_t *)pkt->data;
210 }
211
215 int dropHdr(size_t len);
216
221
226
231
236
241
245 bool free;
246private:
250 DSMEMessage() :
251 messageRSSI(0),
252 messageLQI(0),
253 receivedViaMCPS(false),
254 currentlySending(false),
255 retryCounter(0)
256 {}
257
262 {}
263
267 void prepare()
268 {
269 currentlySending = false;
270 firstTry = true;
271 receivedViaMCPS = false;
272 retryCounter = 0;
273
274 macHdr.reset();
275 }
276
280 IEEE802154eMACHeader macHdr;
281
285 uint8_t messageRSSI;
286
290 uint8_t messageLQI;
291
295 gnrc_pktsnip_t *pkt;
296
300 uint32_t startOfFrameDelimiterSymbolCounter;
301
305 bool receivedViaMCPS;
306
310 bool currentlySending;
311
315 uint8_t retryCounter;
316
320 gnrc_netif_t *netif;
321
322/* declare related classes as friends */
323friend class DSMEPlatform;
324friend class DSMEMessageElement;
325friend class DSMEPlatformBase;
326friend class DSMEMessageBuffer;
327};
328
329}
330
331#ifdef __cplusplus
332}
333#endif
334
DSME Message interface implementation for GNRC.
Definition DSMEMessage.h:46
bool hasPayload() override
check whether the message has payload
Definition DSMEMessage.h:68
void increaseRetryCounter() override
increase retry counter for current message
uint8_t getRetryCounter() override
get retry counter
void setCurrentlySending(bool currentlySending) override
indicate that the message is being sent
bool free
whether the message is free
uint8_t getLQI() override
get LQI of the message
void clearMessage()
clear the message
int dropHdr(size_t len)
drop a number of bytes from the header
void copyTo(DSMEMessageElement *msg)
copy payload to DSME Message Element
int8_t getRSSI() override
get RSSI of frame
void setReceivedViaMCPS(bool receivedViaMCPS) override
indicated that message was received via MCPS
int loadBuffer(size_t len)
preallocate buffer with a given length
bool firstTry
whether the message is being sent on the first try
bool getReceivedViaMCPS() override
check whether the message was received via MCPS
void setStartOfFrameDelimiterSymbolCounter(uint32_t symbolCounter) override
set the symbol counter at the end of the SFD
Definition DSMEMessage.h:84
int loadBuffer(iolist_t *pkt)
load a GNRC packet into the internal openDSME message representation
void decapsulateTo(DSMEMessageElement *msg) override
decapsulate header to a message
uint8_t getPayloadLength()
get payload length
uint16_t getTotalSymbols() override
get the total number of symbols in current frame
Definition DSMEMessage.h:92
uint8_t getMPDUSymbols() override
get number of MPDU Symbols
IEEE802154eMACHeader & getHeader() override
get IEEE 802.15.4 header
void dispatchMessage()
dispatch the message to upper layers
iolist_t * getIolPayload()
get the IOLIST representation of the message
uint32_t getStartOfFrameDelimiterSymbolCounter() override
get the symbol counter at the end of the SFD
Definition DSMEMessage.h:76
void prependFrom(DSMEMessageElement *msg) override
prepend a header to current message
bool getCurrentlySending() override
whether the message is being sent
void releaseMessage()
release the message
uint8_t * getPayload()
get buffer associated to the current payload
DSMEPlatform interface implementation for GNRC.
#define DSME_ASSERT(x)
openDSME DSME assert macro implementation
struct gnrc_pktsnip gnrc_pktsnip_t
Type to represent parts (either headers or payload) of a packet, called snips.
struct iolist iolist_t
iolist forward declaration
Definition iolist.h:30
iolist scatter / gather IO
Interface definition for the global network buffer.