From 03f99af39b8a61f9c6b8e0d35cd507bf85d2f136 Mon Sep 17 00:00:00 2001
From: Marko Mecina <marko.mecina@univie.ac.at>
Date: Wed, 20 Dec 2023 14:14:46 +0100
Subject: [PATCH] update RMAP packet definitions

---
 Ccs/packet_config_ARIEL.py | 152 +++++++++++++++++++++++++++++++++++++
 Ccs/packet_config_SMILE.py |  12 +--
 2 files changed, 159 insertions(+), 5 deletions(-)

diff --git a/Ccs/packet_config_ARIEL.py b/Ccs/packet_config_ARIEL.py
index d68168d..9b1ea36 100644
--- a/Ccs/packet_config_ARIEL.py
+++ b/Ccs/packet_config_ARIEL.py
@@ -298,6 +298,158 @@ RMAP_REPLY_READ_HEADER = [
 ]
 
 
+class RMapCommandHeaderBits(ctypes.BigEndianStructure):
+    _pack_ = 1
+    _fields_ = [(label, ctype, bits) for label, ctype, bits in RMAP_COMMAND_HEADER]
+
+
+RMAP_COMMAND_HEADER_LEN = ctypes.sizeof(RMapCommandHeaderBits)  # sum([x[2] for x in RMAP_COMMAND_HEADER]) // 8
+
+
+class RMapCommandHeader(ctypes.Union, RawGetterSetter):
+    _pack_ = 1
+    _fields_ = [
+        ('bits', RMapCommandHeaderBits),
+        ('bin', ctypes.c_ubyte * RMAP_COMMAND_HEADER_LEN)
+    ]
+
+    def __init__(self, *args, **kw):
+        super(RMapCommandHeader, self).__init__(*args, **kw)
+        self.bits.PROTOCOL_ID = SPW_PROTOCOL_IDS["RMAP"]
+        self.bits.PKT_TYPE = 1
+
+
+class RMapReplyWriteHeaderBits(ctypes.BigEndianStructure):
+    _pack_ = 1
+    _fields_ = [(label, ctype, bits) for label, ctype, bits in RMAP_REPLY_WRITE_HEADER]
+
+
+RMAP_REPLY_WRITE_HEADER_LEN = ctypes.sizeof(
+    RMapReplyWriteHeaderBits)  # sum([x[2] for x in RMAP_REPLY_WRITE_HEADER]) // 8
+
+
+class RMapReplyWriteHeader(ctypes.Union, RawGetterSetter):
+    _pack_ = 1
+    _fields_ = [
+        ('bits', RMapReplyWriteHeaderBits),
+        ('bin', ctypes.c_ubyte * RMAP_REPLY_WRITE_HEADER_LEN)
+    ]
+
+    def __init__(self, *args, **kw):
+        super(RMapReplyWriteHeader, self).__init__(*args, **kw)
+        self.bits.PROTOCOL_ID = SPW_PROTOCOL_IDS["RMAP"]
+        self.bits.PKT_TYPE = 0
+        self.bits.WRITE = 1
+        self.bits.REPLY = 1
+
+
+class RMapReplyReadHeaderBits(ctypes.BigEndianStructure):
+    _pack_ = 1
+    _fields_ = [(label, ctype, bits) for label, ctype, bits in RMAP_REPLY_READ_HEADER]
+
+
+RMAP_REPLY_READ_HEADER_LEN = ctypes.sizeof(RMapReplyReadHeaderBits)  # sum([x[2] for x in RMAP_REPLY_READ_HEADER]) // 8
+
+
+class RMapReplyReadHeader(ctypes.Union, RawGetterSetter):
+    _pack_ = 1
+    _fields_ = [
+        ('bits', RMapReplyReadHeaderBits),
+        ('bin', ctypes.c_ubyte * RMAP_REPLY_READ_HEADER_LEN)
+    ]
+
+    def __init__(self, *args, **kw):
+        super(RMapReplyReadHeader, self).__init__(*args, **kw)
+        self.bits.PROTOCOL_ID = SPW_PROTOCOL_IDS["RMAP"]
+        self.bits.PKT_TYPE = 0
+        self.bits.WRITE = 0
+        self.bits.VERIFY = 0
+        self.bits.REPLY = 1
+
+
+class RMapCommandWrite(RMapCommandHeader):
+    """This is intended for building an RMap Write Command"""
+
+    def __init__(self, addr, data, verify=True, reply=True, incr=True, key=SPW_FEE_KEY,
+                 initiator=SPW_DPU_LOGICAL_ADDRESS, tid=1, *args, **kwargs):
+        super(RMapCommandWrite, self).__init__(*args, **kwargs)
+
+        self.header = self.bits
+        self.data = data
+        self.data_crc = rmapcrc(self.data).to_bytes(RMAP_PEC_LEN, 'big')
+
+        self.bits.TARGET_LOGICAL_ADDR = SPW_FEE_LOGICAL_ADDRESS
+        self.bits.PROTOCOL_ID = SPW_PROTOCOL_IDS['RMAP']
+
+        self.bits.PKT_TYPE = 1
+        self.bits.WRITE = 1
+        self.bits.VERIFY = verify
+        self.bits.REPLY = reply
+        self.bits.INCREMENT = incr
+        self.bits.REPLY_ADDR_LEN = 0
+        self.bits.KEY = key
+
+        self.bits.INIT_LOGICAL_ADDR = initiator
+        self.bits.TRANSACTION_ID = tid
+        self.bits.EXT_ADDR = addr >> 32
+        self.bits.ADDR = addr & 0xFFFFFFFF
+        self.bits.DATA_LEN = len(self.data)
+        self.bits.HEADER_CRC = rmapcrc(bytes(self.bin[:-1]))
+
+    @property
+    def raw(self):
+        return bytes(self.bin) + self.data + self.data_crc
+
+    @raw.setter
+    def raw(self, rawdata):
+        self.bin[:] = rawdata[:RMAP_COMMAND_HEADER_LEN]
+        self.data = rawdata[RMAP_COMMAND_HEADER_LEN:-RMAP_PEC_LEN]
+        self.data_crc = rawdata[-RMAP_PEC_LEN:]
+
+    def crc_updt(self):
+        self.bits.HEADER_CRC = rmapcrc(bytes(self.bin[:-1]))
+        self.data_crc = rmapcrc(self.data).to_bytes(RMAP_PEC_LEN, 'big')
+
+
+class RMapCommandRead(RMapCommandHeader):
+    """This is intended for building an RMap Read Command"""
+
+    def __init__(self, addr, datalen, incr=True, key=SPW_FEE_KEY, initiator=SPW_DPU_LOGICAL_ADDRESS, tid=1,
+                 *args, **kwargs):
+        super(RMapCommandRead, self).__init__(*args, **kwargs)
+
+        self.header = self.bits
+
+        self.bits.TARGET_LOGICAL_ADDR = SPW_FEE_LOGICAL_ADDRESS
+        self.bits.PROTOCOL_ID = SPW_PROTOCOL_IDS['RMAP']
+
+        self.bits.PKT_TYPE = 1
+        self.bits.WRITE = 0
+        self.bits.VERIFY = 0
+        self.bits.REPLY = 1
+        self.bits.INCREMENT = incr
+        self.bits.REPLY_ADDR_LEN = 0
+        self.bits.KEY = key
+
+        self.bits.INIT_LOGICAL_ADDR = initiator
+        self.bits.TRANSACTION_ID = tid
+        self.bits.EXT_ADDR = addr >> 32
+        self.bits.ADDR = addr & 0xFFFFFFFF
+        self.bits.DATA_LEN = datalen
+        self.bits.HEADER_CRC = rmapcrc(bytes(self.bin[:-1]))
+
+    @property
+    def raw(self):
+        return bytes(self.bin)
+
+    @raw.setter
+    def raw(self, rawdata):
+        self.bin[:] = rawdata[:RMAP_COMMAND_HEADER_LEN]
+
+    def crc_updt(self):
+        self.bits.HEADER_CRC = rmapcrc(bytes(self.bin[:-1]))
+
+
 # S13 data header format, using python struct conventions
 S13_FMT_OBSID = 'I'
 S13_FMT_TIME = 'I'
diff --git a/Ccs/packet_config_SMILE.py b/Ccs/packet_config_SMILE.py
index 802c4e4..5369bb4 100644
--- a/Ccs/packet_config_SMILE.py
+++ b/Ccs/packet_config_SMILE.py
@@ -620,9 +620,6 @@ class RMapCommandWrite(RMapCommandHeader):
 
     @property
     def raw(self):
-        """Return raw packet with updated CRCs"""
-        self.bits.HEADER_CRC = rmapcrc(bytes(self.bin[:-1]))
-        self.data_crc = rmapcrc(self.data).to_bytes(RMAP_PEC_LEN, 'big')
         return bytes(self.bin) + self.data + self.data_crc
 
     @raw.setter
@@ -631,6 +628,10 @@ class RMapCommandWrite(RMapCommandHeader):
         self.data = rawdata[RMAP_COMMAND_HEADER_LEN:-RMAP_PEC_LEN]
         self.data_crc = rawdata[-RMAP_PEC_LEN:]
 
+    def crc_updt(self):
+        self.bits.HEADER_CRC = rmapcrc(bytes(self.bin[:-1]))
+        self.data_crc = rmapcrc(self.data).to_bytes(RMAP_PEC_LEN, 'big')
+
 
 class RMapCommandRead(RMapCommandHeader):
     """This is intended for building an RMap Read Command"""
@@ -661,14 +662,15 @@ class RMapCommandRead(RMapCommandHeader):
 
     @property
     def raw(self):
-        """Return raw packet with updated CRCs"""
-        self.bits.HEADER_CRC = rmapcrc(bytes(self.bin[:-1]))
         return bytes(self.bin)
 
     @raw.setter
     def raw(self, rawdata):
         self.bin[:] = rawdata[:RMAP_COMMAND_HEADER_LEN]
 
+    def crc_updt(self):
+        self.bits.HEADER_CRC = rmapcrc(bytes(self.bin[:-1]))
+
 
 class FeeDataTransfer(FeeDataTransferHeader):
     """
-- 
GitLab