@@ -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,38 +159,20 @@ 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 };
118- // ! Subscribe to the message located at the sourceAddr in memory
119- void subscribeToAddr (uint64_t sourceAddr)
120- {
121- // !Cast a pointer at the sourceAddr and call the regular subscribe
122- Message<messageType> *source =
123- reinterpret_cast <Message<messageType> *> (sourceAddr);
124- subscribeTo (source);
125- }
126- // ! Subscribe to the C message located at the sourceAddr in memory
127- void subscribeToCAddr (uint64_t sourceAddr)
128- {
129- // ! Cast a void* pointer and call the regular C-subscribe method
130- void *source = reinterpret_cast <void *> (sourceAddr);
131- subscribeToC (source);
132- }
169+
133170 // ! Subscribe to a C++ message
134171 void subscribeTo (Message<messageType> *source){
135172 *this = source->addSubscriber ();
136173 this ->initialized = true ;
137174 };
138175
139- // ! Unsubscribe to the connected message, noop if no message was connected
140- void unsubscribe (){
141- this ->payloadPointer = nullptr ;
142- this ->headerPointer = nullptr ;
143- this ->initialized = false ;
144- }
145176
146177 // ! Check if self has been subscribed to a C message
147178 uint8_t isSubscribedToC (void *source){
@@ -163,20 +194,6 @@ class ReadFunctor{
163194 return (this ->initialized && firstCheck && secondCheck );
164195
165196 };
166- // ! Check if self has been subscribed to the message at sourceAddr
167- uint8_t isSubscribedToAddr (uint64_t sourceAddr)
168- {
169- // !Cast a pointer at the sourceAddr and call the regular is-subscribe
170- Message<messageType> *source = reinterpret_cast <Message<messageType> *> (sourceAddr);
171- return (isSubscribedTo (source));
172- }
173- // ! Check if self has been subscribed to the message at sourceAddr
174- uint8_t isSubscribedToCAddr (uint64_t sourceAddr)
175- {
176- // !Cast a void* pointer at the sourceAddr and call the regular is-subscribe
177- void *source = reinterpret_cast <void *> (sourceAddr);
178- return (isSubscribedToC (source));
179- }
180197
181198 // ! Recorder method description
182199 Recorder<messageType> recorder (uint64_t timeDiff = 0 ){return Recorder<messageType>(this , timeDiff);}
@@ -187,7 +204,7 @@ template<typename messageType>
187204class WriteFunctor {
188205private:
189206 messageType* payloadPointer; // !< pointer to the message payload
190- MsgHeader* headerPointer; // !< pointer to the message header
207+ MsgHeader* headerPointer; // !< pointer to the message header
191208public:
192209 // ! write functor constructor
193210 WriteFunctor (){};
@@ -210,12 +227,13 @@ class Recorder;
210227 * base class template for bsk messages
211228 */
212229template <typename messageType>
213- class Message {
230+ class Message : public MessageBase {
214231private:
215232 messageType payload = {}; // !< struct defining message payload, zero'd on creation
216- MsgHeader header = {}; // !< struct defining the message header, zero'd on creation
233+ MsgHeader header = {}; // !< struct defining the message header, zero'd on creation
217234 ReadFunctor<messageType> read = ReadFunctor<messageType>(&payload, &header); // !< read functor instance
218235public:
236+ Message ();
219237 // ! write functor to this message
220238 WriteFunctor<messageType> write = WriteFunctor<messageType>(&payload, &header);
221239 // ! -- request read rights. returns reference to class ``read`` variable
@@ -240,6 +258,12 @@ class Message{
240258 uint64_t getPayloadSize () {return sizeof (messageType);};
241259};
242260
261+ template <typename messageType>
262+ Message<messageType>::Message()
263+ {
264+ this ->pointers .payload = &payload;
265+ this ->pointers .header = &header;
266+ }
243267
244268template <typename messageType>
245269ReadFunctor<messageType> Message<messageType>::addSubscriber(){
@@ -279,13 +303,13 @@ class Recorder : public SysModel{
279303 // ! -- Use this to record C messages
280304 Recorder (void * message, uint64_t timeDiff = 0 ){
281305 this ->timeInterval = timeDiff;
306+ MsgHeader msgHeader;
282307
283- MsgHeader* msgPt = (MsgHeader *) message;
284- MsgHeader *pt = msgPt;
308+ MsgHeader* pt = (MsgHeader *) message;
285309 messageType* payloadPointer;
286310 payloadPointer = (messageType *) (++pt);
287311
288- this ->readMessage = ReadFunctor<messageType>(payloadPointer, msgPt );
312+ this ->readMessage = ReadFunctor<messageType>(payloadPointer, &msgHeader );
289313 this ->ModelTag = " Rec:" ;
290314 Message<messageType> tempMsg;
291315 std::string msgName = typeid (tempMsg).name ();
@@ -310,13 +334,6 @@ class Recorder : public SysModel{
310334 // ! -- Read and record the message
311335 void UpdateState (uint64_t CurrentSimNanos){
312336 if (CurrentSimNanos >= this ->nextUpdateTime ) {
313- // Log warning if message is invalid but don't change behavior
314- if (!this ->readMessage .isLinked () || !this ->readMessage .isWritten ()) {
315- messageType var;
316- bskLogger.bskLog (BSK_WARNING, " Recording message of type %s that is not properly initialized or written" , typeid (var).name ());
317- }
318-
319- // Record the message
320337 this ->msgRecordTimes .push_back (CurrentSimNanos);
321338 this ->msgWrittenTimes .push_back (this ->readMessage .timeWritten ());
322339 this ->msgRecord .push_back (this ->readMessage ());
@@ -336,8 +353,6 @@ class Recorder : public SysModel{
336353 std::vector<uint64_t >& timesWritten (){return this ->msgWrittenTimes ;}
337354 // ! record method
338355 std::vector<messageType>& record (){return this ->msgRecord ;};
339- // ! size of the record so far
340- size_t size (){return this ->record ().size ();}
341356
342357 // ! determine message name
343358 std::string findMsgName (std::string msgName) {
0 commit comments