Skip to content

Commit 88377c8

Browse files
Expose raw message header and payload pointers
1 parent d1c5c66 commit 88377c8

File tree

1 file changed

+67
-10
lines changed

1 file changed

+67
-10
lines changed

src/architecture/messaging/messaging.h

Lines changed: 67 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,57 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1717
*/
1818
#ifndef MESSAGING_H
1919
#define MESSAGING_H
20+
#include <memory>
2021
#include "architecture/_GeneralModuleFiles/sys_model.h"
2122
#include <vector>
2223
#include "architecture/messaging/msgHeader.h"
2324
#include "architecture/utilities/bskLogging.h"
2425
#include <typeinfo>
2526
#include <stdlib.h>
2627

28+
29+
struct messagePointerData{
30+
void *header;
31+
void *payload;
32+
};
33+
34+
typedef struct messagePointerData messagePointerData;
35+
36+
class MessageBase{
37+
public:
38+
messagePointerData pointers;
39+
messagePointerData *reference;
40+
41+
messagePointerData *GetPointers(void)
42+
{
43+
this->reference = (messagePointerData*)malloc(sizeof(messagePointerData));
44+
this->reference->payload = pointers.payload;
45+
this->reference->header = pointers.header;
46+
47+
return this->reference;
48+
}
49+
};
50+
51+
class ReadFunctorBase{
52+
public :
53+
void *headerVoidPtr; //! TODO: kludge to fix PITL, do we want to keep this member?
54+
void *payloadVoidPtr;
55+
messagePointerData *reference;
56+
57+
//! constructor
58+
ReadFunctorBase() : headerVoidPtr(NULL), payloadVoidPtr(NULL), reference(NULL) {};
59+
60+
messagePointerData *GetPointers(void)
61+
{
62+
this->reference = (messagePointerData*)malloc(sizeof(messagePointerData));
63+
this->reference->header = this->headerVoidPtr;
64+
this->reference->payload = this->payloadVoidPtr;
65+
return this->reference;
66+
}
67+
68+
};
69+
70+
2771
/*! forward-declare sim message for use by read functor */
2872
template<typename messageType>
2973
class Message;
@@ -33,7 +77,7 @@ class Recorder;
3377

3478
/*! Read functors have read-only access to messages*/
3579
template<typename messageType>
36-
class ReadFunctor{
80+
class ReadFunctor : public ReadFunctorBase{
3781
private:
3882
messageType* payloadPointer; //!< -- pointer to the incoming msg data
3983
MsgHeader *headerPointer; //!< -- pointer to the incoming msg header
@@ -49,7 +93,12 @@ class ReadFunctor{
4993
ReadFunctor() : initialized(false) {};
5094

5195
//! constructor
52-
ReadFunctor(messageType* payloadPtr, MsgHeader *headerPtr) : payloadPointer(payloadPtr), headerPointer(headerPtr), initialized(true){};
96+
ReadFunctor(messageType* payloadPtr, MsgHeader *headerPtr) :
97+
payloadPointer(payloadPtr), headerPointer(headerPtr), initialized(true)
98+
{
99+
this->headerVoidPtr = headerPtr;
100+
this->payloadVoidPtr = payloadPtr;
101+
};
53102

54103
//! constructor
55104
const messageType& operator()(){
@@ -110,10 +159,12 @@ class ReadFunctor{
110159
MsgHeader* pt = this->headerPointer;
111160
this->payloadPointer = (messageType *) (++pt);
112161

113-
114162
// set flag that this input message is connected to another message
115163
this->initialized = true; // set input message as linked
116164
this->headerPointer->isLinked = 1; // set source output message as linked
165+
166+
this->payloadVoidPtr = this->payloadPointer;
167+
this->headerVoidPtr = this->headerPointer;
117168
};
118169
//! Subscribe to the message located at the sourceAddr in memory
119170
void subscribeToAddr(uint64_t sourceAddr)
@@ -187,7 +238,7 @@ template<typename messageType>
187238
class WriteFunctor{
188239
private:
189240
messageType* payloadPointer; //!< pointer to the message payload
190-
MsgHeader* headerPointer; //!< pointer to the message header
241+
MsgHeader* headerPointer; //!< pointer to the message header
191242
public:
192243
//! write functor constructor
193244
WriteFunctor(){};
@@ -210,12 +261,13 @@ class Recorder;
210261
* base class template for bsk messages
211262
*/
212263
template<typename messageType>
213-
class Message{
264+
class Message : public MessageBase{
214265
private:
215266
messageType payload = {}; //!< struct defining message payload, zero'd on creation
216267
MsgHeader header = {}; //!< struct defining the message header, zero'd on creation
217268
ReadFunctor<messageType> read = ReadFunctor<messageType>(&payload, &header); //!< read functor instance
218269
public:
270+
Message();
219271
//! write functor to this message
220272
WriteFunctor<messageType> write = WriteFunctor<messageType>(&payload, &header);
221273
//! -- request read rights. returns reference to class ``read`` variable
@@ -240,6 +292,12 @@ class Message{
240292
uint64_t getPayloadSize() {return sizeof(messageType);};
241293
};
242294

295+
template<typename messageType>
296+
Message<messageType>::Message()
297+
{
298+
this->pointers.payload = &payload;
299+
this->pointers.header = &header;
300+
}
243301

244302
template<typename messageType>
245303
ReadFunctor<messageType> Message<messageType>::addSubscriber(){
@@ -280,12 +338,11 @@ class Recorder : public SysModel{
280338
Recorder(void* message, uint64_t timeDiff = 0){
281339
this->timeInterval = timeDiff;
282340

283-
MsgHeader* msgPt = (MsgHeader *) message;
284-
MsgHeader *pt = msgPt;
285-
messageType* payloadPointer;
286-
payloadPointer = (messageType *) (++pt);
341+
auto* headerPtr = static_cast<MsgHeader*>(message);
342+
auto* payloadPtr = reinterpret_cast<messageType*>(headerPtr + 1);
343+
344+
this->readMessage = ReadFunctor<messageType>(payloadPtr, headerPtr);
287345

288-
this->readMessage = ReadFunctor<messageType>(payloadPointer, msgPt);
289346
this->ModelTag = "Rec:";
290347
Message<messageType> tempMsg;
291348
std::string msgName = typeid(tempMsg).name();

0 commit comments

Comments
 (0)