diff --git a/config/default_mm_msgdefs.h b/config/default_mm_msgdefs.h
index 5a6a5e7..a0145de 100644
--- a/config/default_mm_msgdefs.h
+++ b/config/default_mm_msgdefs.h
@@ -157,6 +157,24 @@ typedef struct {
applicable */
} MM_HkTlm_Payload_t;
+/**
+ * \brief Peek Packet Payload
+ */
+typedef struct {
+ MM_MemType_Enum_t MemType; /**< \brief Memory type */
+ uint32 DataValue; /**< \brief Data from peek */
+ MM_MemAddress_t Address; /**< \brief Fully resolved address */
+ MM_MemSize_t BytesProcessed; /**< \brief Bytes processed */
+} MM_PeekPacket_Payload_t;
+
+/**
+ * \brief Symbol Lookup Packet Payload
+ */
+typedef struct {
+ char SymName[CFE_MISSION_MAX_API_LEN]; /**< \brief Symbol name */
+ MM_MemAddress_t Address; /**< \brief Fully resolved address */
+} MM_SymLookupPacket_Payload_t;
+
#endif /* DEFAULT_MM_MSGDEFS_H */
-/**\}*/
\ No newline at end of file
+/**\}*/
diff --git a/config/default_mm_msgids.h b/config/default_mm_msgids.h
index a862b9e..a158f25 100644
--- a/config/default_mm_msgids.h
+++ b/config/default_mm_msgids.h
@@ -50,6 +50,8 @@
*/
#define MM_HK_TLM_MID MM_TLM_PLATFORM_MIDVAL(HK_TLM)
+#define MM_PEEK_TLM_MID MM_TLM_PLATFORM_MIDVAL(PEEK_TLM)
+#define MM_SYM_LOOKUP_TLM_MID MM_TLM_PLATFORM_MIDVAL(SYM_LOOKUP)
#endif /* DEFAULT_MM_MSGIDS_H */
diff --git a/config/default_mm_msgstruct.h b/config/default_mm_msgstruct.h
index 6b66b1f..5dab917 100644
--- a/config/default_mm_msgstruct.h
+++ b/config/default_mm_msgstruct.h
@@ -178,6 +178,22 @@ typedef struct {
CFE_MSG_TelemetryHeader_t TelemetryHeader;
} MM_SendHkCmd_t;
+/**
+ * \brief Symbol Lookup Packet Structure
+ */
+typedef struct {
+ CFE_MSG_TelemetryHeader_t TlmHeader; /**< \brief Telemetry header */
+ MM_SymLookupPacket_Payload_t Payload; /**< \brief Symbol Lookup Packet Payload */
+} MM_SymLookupPacket_t;
+
+/**
+ * \brief Peek Packet Structure
+ */
+typedef struct {
+ CFE_MSG_TelemetryHeader_t TlmHeader; /**< \brief Telemetry header */
+ MM_PeekPacket_Payload_t Payload; /**< \brief Peek Packet Payload */
+} MM_PeekPacket_t;
+
#endif /* DEFAULT_MM_MSGSTRUCT_H */
-/**\}*/
\ No newline at end of file
+/**\}*/
diff --git a/docs/mm_FunctionalRequirements.csv b/docs/mm_FunctionalRequirements.csv
index d05a27c..f0810a7 100644
--- a/docs/mm_FunctionalRequirements.csv
+++ b/docs/mm_FunctionalRequirements.csv
@@ -20,7 +20,7 @@ b) length of data written
c) value of the data written
",Confirms memory poke operations
MM2000.2,MM2000.2,"When MM receives a Poke command, if the data size is not 8, 16, or 32 bits, MM shall reject the command.",Ensure writes happen at 8-bit boundaries
-MM2002,MM2002,"Upon receipt of a Peek command, MM shall read 8, 16, or 32 bits of data from the command-specified RAM address and telemeter the following information in the HK packet + issue an event message containing:
+MM2002,MM2002,"Upon receipt of a Peek command, MM shall read 8, 16, or 32 bits of data from the command-specified RAM address and telemeter the following information in the HK and Peek packet + issue an event message containing:
a) address read
b) length of data read
c) value of the data read
diff --git a/eds/mm.xml b/eds/mm.xml
index 215903e..a8d3c9b 100644
--- a/eds/mm.xml
+++ b/eds/mm.xml
@@ -208,6 +208,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -343,6 +359,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -365,6 +393,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -372,15 +412,19 @@
+
+
+
+
-
\ No newline at end of file
+
diff --git a/fsw/inc/mm_topicids.h b/fsw/inc/mm_topicids.h
index e2eaa99..dcc532c 100644
--- a/fsw/inc/mm_topicids.h
+++ b/fsw/inc/mm_topicids.h
@@ -32,4 +32,10 @@
#define MM_MISSION_HK_TLM_TOPICID MM_MISSION_TIDVAL(HK_TLM)
#define DEFAULT_MM_MISSION_HK_TLM_TOPICID 0x87
-#endif /* MM_TOPICIDS_H */
\ No newline at end of file
+#define MM_MISSION_PEEK_TLM_TOPICID MM_MISSION_TIDVAL(PEEK_TLM)
+#define DEFAULT_MM_MISSION_PEEK_TLM_TOPICID 0x88
+
+#define MM_MISSION_SYM_LOOKUP_TOPICID MM_MISSION_TIDVAL(SYM_LOOKUP)
+#define DEFAULT_MM_MISSION_SYM_LOOKUP_TOPICID 0x89
+
+#endif /* MM_TOPICIDS_H */
diff --git a/fsw/src/mm_app.c b/fsw/src/mm_app.c
index afc573d..15c6780 100644
--- a/fsw/src/mm_app.c
+++ b/fsw/src/mm_app.c
@@ -159,6 +159,17 @@ CFE_Status_t MM_AppInit(void) {
CFE_MSG_Init(CFE_MSG_PTR(MM_AppData.HkTlm.TelemetryHeader),
CFE_SB_ValueToMsgId(MM_HK_TLM_MID), sizeof(MM_HkTlm_t));
+ /*
+ ** Initialize the local peek telemetry packet (clear user data area)
+ */
+ CFE_MSG_Init(CFE_MSG_PTR(MM_AppData.PeekPacket.TlmHeader), CFE_SB_ValueToMsgId(MM_PEEK_TLM_MID), sizeof(MM_PeekPacket_t));
+
+ /*
+ ** Initialize the local symbol lookup telemetry packet (clear user data area)
+ */
+ CFE_MSG_Init(CFE_MSG_PTR(MM_AppData.SymLookupPacket.TlmHeader), CFE_SB_ValueToMsgId(MM_SYM_LOOKUP_TLM_MID), sizeof(MM_SymLookupPacket_t));
+
+
/*
** Create Software Bus message pipe
*/
diff --git a/fsw/src/mm_app.h b/fsw/src/mm_app.h
index 697337c..6dd8b44 100644
--- a/fsw/src/mm_app.h
+++ b/fsw/src/mm_app.h
@@ -61,6 +61,10 @@
typedef struct {
MM_HkTlm_t HkTlm; /**< \brief Housekeeping telemetry packet */
+ MM_SymLookupPacket_t SymLookupPacket; /**< \brief Symbol lookup telemetry packet */
+
+ MM_PeekPacket_t PeekPacket; /**< \brief Memory peek telemetry packet */
+
CFE_SB_PipeId_t CmdPipe; /**< \brief Command pipe ID */
uint32 RunStatus; /**< \brief Application run status */
@@ -108,4 +112,4 @@ void MM_AppMain(void);
*/
CFE_Status_t MM_AppInit(void);
-#endif
\ No newline at end of file
+#endif
diff --git a/fsw/src/mm_cmds.c b/fsw/src/mm_cmds.c
index 8fc56a6..3bcc439 100644
--- a/fsw/src/mm_cmds.c
+++ b/fsw/src/mm_cmds.c
@@ -140,6 +140,13 @@ CFE_Status_t MM_LookupSymCmd(const MM_LookupSymCmd_t *Msg) {
CFE_EVS_SendEvent(MM_SYM_LOOKUP_INF_EID, CFE_EVS_EventType_INFORMATION,
"Symbol Lookup Command: Name = '%s' Addr = %p", SymName,
(void *)ResolvedAddr);
+
+ /* Update Symbol Look Up Tlm */
+ strncpy(MM_AppData.SymLookupPacket.Payload.SymName, SymName, sizeof(MM_AppData.SymLookupPacket.Payload.SymName));
+
+ MM_AppData.SymLookupPacket.Payload.Address = ResolvedAddr;
+ CFE_SB_TimeStampMsg(CFE_MSG_PTR(MM_AppData.SymLookupPacket.TlmHeader));
+ CFE_SB_TransmitMsg(CFE_MSG_PTR(MM_AppData.SymLookupPacket.TlmHeader), true);
} else {
MM_AppData.HkTlm.Payload.ErrCounter++;
CFE_EVS_SendEvent(MM_SYMNAME_ERR_EID, CFE_EVS_EventType_ERROR,
diff --git a/fsw/src/mm_dump.c b/fsw/src/mm_dump.c
index 7c0fe11..12f980d 100644
--- a/fsw/src/mm_dump.c
+++ b/fsw/src/mm_dump.c
@@ -110,6 +110,15 @@ int32 MM_PeekMem(const MM_PeekCmd_t *CmdPtr, cpuaddr SrcAddress) {
"Peek Command: Addr = %p Size = %u bits Data = 0x%08X",
(void *)SrcAddress, (unsigned int)DataSize,
(unsigned int)DataValue);
+
+ /* Update Peek TLM Packet */
+ MM_AppData.PeekPacket.Payload.MemType = CmdPtr->Payload.MemType;
+ MM_AppData.PeekPacket.Payload.Address = SrcAddress;
+ MM_AppData.PeekPacket.Payload.BytesProcessed = BytesProcessed;
+ MM_AppData.PeekPacket.Payload.DataValue = DataValue;
+
+ CFE_SB_TimeStampMsg(CFE_MSG_PTR(MM_AppData.PeekPacket.TlmHeader));
+ CFE_SB_TransmitMsg(CFE_MSG_PTR(MM_AppData.PeekPacket.TlmHeader), true);
} else {
CFE_EVS_SendEvent(MM_PSP_READ_ERR_EID, CFE_EVS_EventType_ERROR,
"PSP read memory error: RC=%d, Address=%p, MemType=MEM%u",