Skip to content

Commit d0c932d

Browse files
Expose raw message header and payload pointers
1 parent 6128b8e commit d0c932d

File tree

1 file changed

+68
-53
lines changed

1 file changed

+68
-53
lines changed

src/architecture/messaging/messaging.h

Lines changed: 68 additions & 53 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,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>
187204
class WriteFunctor{
188205
private:
189206
messageType* payloadPointer; //!< pointer to the message payload
190-
MsgHeader* headerPointer; //!< pointer to the message header
207+
MsgHeader* headerPointer; //!< pointer to the message header
191208
public:
192209
//! write functor constructor
193210
WriteFunctor(){};
@@ -210,12 +227,13 @@ class Recorder;
210227
* base class template for bsk messages
211228
*/
212229
template<typename messageType>
213-
class Message{
230+
class Message : public MessageBase{
214231
private:
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
218235
public:
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

244268
template<typename messageType>
245269
ReadFunctor<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

Comments
 (0)