@@ -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 */
2872template <typename messageType>
2973class Message ;
@@ -33,7 +77,7 @@ class Recorder;
3377
3478/* ! Read functors have read-only access to messages*/
3579template <typename messageType>
36- class ReadFunctor {
80+ class ReadFunctor : public ReadFunctorBase {
3781private:
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>
187238class WriteFunctor {
188239private:
189240 messageType* payloadPointer; // !< pointer to the message payload
190- MsgHeader* headerPointer; // !< pointer to the message header
241+ MsgHeader* headerPointer; // !< pointer to the message header
191242public:
192243 // ! write functor constructor
193244 WriteFunctor (){};
@@ -210,12 +261,13 @@ class Recorder;
210261 * base class template for bsk messages
211262 */
212263template <typename messageType>
213- class Message {
264+ class Message : public MessageBase {
214265private:
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
218269public:
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
244302template <typename messageType>
245303ReadFunctor<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