Skip to content

Commit 1ec9b1c

Browse files
committed
Made script mem get/set string functions depend on device byte order
1 parent dbd20bf commit 1ec9b1c

1 file changed

Lines changed: 45 additions & 6 deletions

File tree

src/server/python/mbserver.py

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,15 @@
3030

3131

3232
def swapbyteorder(data: bytearray) -> bytearray:
33+
"""
34+
@note Since v0.4.2
35+
36+
@details
37+
Function swaps byte array pair: 0 with 1, 2 with 3, 4 with 5 and so on.
38+
If byte count is odd then last byte is left unchanged.
39+
40+
@return Input `data` reference
41+
"""
3342
for j in range(0, len(data) // 2):
3443
i = j * 2
3544
data[i], data[i + 1] = data[i + 1], data[i]
@@ -242,6 +251,8 @@ def setbytes(self, byteoffset:int, value:type[bytes|bytearray])->None:
242251
c = self._countbytes - byteoffset
243252
else:
244253
c = count
254+
if not isinstance(value, bytes):
255+
value = bytes(value)
245256
self._shm.lock()
246257
memmove(self._pmembytes[byteoffset], value, c)
247258
memset(self._pmaskbytes[byteoffset], -1, c)
@@ -418,7 +429,11 @@ def getbitstring(self, bitoffset:int, bytecount:int)->str:
418429
@param[in] bitoffset Bit offset (0-based).
419430
@param[in] bytecount Count of byte of `utf-8` string encoding to read.
420431
"""
432+
## @cond
433+
if self._byteorder == 'big':
434+
return swapbyteorder(self.getbitbytearray(bitoffset, bytecount*8)).decode()
421435
return self.getbitbytes(bitoffset, bytecount*8).decode()
436+
## @endcond
422437

423438
def setbitstring(self, bitoffset:int, value:str)->None:
424439
"""
@@ -434,10 +449,13 @@ def setbitstring(self, bitoffset:int, value:str)->None:
434449
register with offset 1 is bit offset 16-31, etc.
435450
436451
@param[in] bitoffset Bit offset (0-based).
437-
@param[in] value Written string value.
452+
@param[in] value String value to be written.
438453
"""
439454
## @cond
440-
b = value.encode()
455+
if self._byteorder == 'big':
456+
b = swapbyteorder(bytearray(value.encode()))
457+
else:
458+
b = value.encode()
441459
self.setbitbytes(bitoffset, len(b)*8, b)
442460
## @endcond
443461

@@ -457,7 +475,11 @@ def getbytestring(self, byteoffset:int, bytecount:int)->str:
457475
@param[in] byteoffset Byte offset (0-based).
458476
@param[in] bytecount Count of bytes to read.
459477
"""
478+
## @cond
479+
if self._byteorder == 'big':
480+
return swapbyteorder(self.getbytearray(byteoffset, bytecount)).decode()
460481
return self.getbytes(byteoffset, bytecount).decode()
482+
## @endcond
461483

462484
def setbytestring(self, byteoffset:int, value:str)->None:
463485
"""
@@ -474,9 +496,15 @@ def setbytestring(self, byteoffset:int, value:str)->None:
474496
register with offset 1 is byte offset 2 and 3, etc.
475497
476498
@param[in] byteoffset Byte offset (0-based).
477-
@param[in] value Written string value.
499+
@param[in] value String value to be written.
478500
"""
479-
self.setbytes(byteoffset, value.encode())
501+
## @cond
502+
if self._byteorder == 'big':
503+
b = swapbyteorder(bytearray(value.encode()))
504+
else:
505+
b = value.encode()
506+
self.setbytes(byteoffset, b)
507+
## @endcond
480508

481509
def getregstring(self, regoffset:int, bytecount:int)->str:
482510
"""
@@ -496,7 +524,11 @@ def getregstring(self, regoffset:int, bytecount:int)->str:
496524
@param[in] regoffset 16-bit register offset (0-based).
497525
@param[in] bytecount Count of bytes to read.
498526
"""
527+
## @cond
528+
if self._byteorder == 'big':
529+
return swapbyteorder(self.getbytearray(regoffset*2, bytecount)).decode()
499530
return self.getbytes(regoffset*2, bytecount).decode()
531+
## @endcond
500532

501533
def setregstring(self, regoffset:int, value:str)->None:
502534
"""
@@ -514,9 +546,16 @@ def setregstring(self, regoffset:int, value:str)->None:
514546
register with offset 1 is byte offset 2 and 3, etc.
515547
516548
@param[in] regoffset 16-bit register offset (0-based).
517-
@param[in] value Written string value.
549+
@param[in] value String value to be written.
518550
"""
519-
self.setbytes(regoffset*2, value.encode())
551+
## @cond
552+
if self._byteorder == 'big':
553+
b = swapbyteorder(bytearray(value.encode()))
554+
else:
555+
b = value.encode()
556+
self.setbytes(regoffset*2, b)
557+
## @endcond
558+
520559

521560
class _MemoryBlockBits(_MemoryBlock):
522561
"""Class for the bit memory objects: mem0x, mem1x.

0 commit comments

Comments
 (0)