Skip to content

Commit 9d50d00

Browse files
author
sascha
committed
git-svn-id: http://isvn/svn/rep_IEP-I000261_LINUX-KERNEL/01_Entwicklung/trunk/10_Entwicklung/28_SW_Komponente_XCOM/30_IMPL/XCOM_Client_Python/dependencies/ixcom-public@12509 fa3a88b2-825e-5648-bb98-bb0d4e3c2968
1 parent 44d6653 commit 9d50d00

3 files changed

Lines changed: 53 additions & 21 deletions

File tree

ixcom/cmdline.py

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@
55
import argparse
66
import socket
77

8-
8+
99
class TextFileParser(ixcom.parser.MessageParser):
10-
def __init__(self, outputfile, print_request = True):
10+
def __init__(self, outputfile, skip_parameter=None, print_request = True):
1111
super().__init__()
1212
self.outputfile = outputfile
1313
self.print_request = print_request
14-
self.messageSearcher.disableCRC = True
14+
self.messageSearcher.disableCRC = False
1515
self._indent_level = 0
1616
self.add_subscriber(self)
17+
self.skipParameter = skip_parameter
18+
self.parameterList = list()
1719

1820
def __handle_loglist2(self, message):
1921
self.write_output(f"Channel: {message.payload.data['reserved_paramheader']}\n")
@@ -32,8 +34,13 @@ def __handle_loglist2(self, message):
3234

3335
def handle_message(self, message, from_device):
3436
zeile = "Header Time: %.4f\n" % (message.header.get_time())
35-
self.write_output(zeile)
37+
if self.skipParameter is None:
38+
self.write_output(zeile)
39+
elif message.data['parameterID'] in self.skipParameter:
40+
return
3641
if message.header.msgID == ixcom.data.MessageID.PARAMETER:
42+
self.parameterList.append((message.data['parameterID'], message))
43+
return
3744
if message.payload.data["action"] == 0:
3845
zeile = "Parameter: %s\n" % message.payload.get_name()
3946
else:
@@ -51,6 +58,22 @@ def handle_message(self, message, from_device):
5158
zeile = "\n\n"
5259
self.write_output(zeile)
5360

61+
def write_parameter(self):
62+
self.parameterList.sort(key=lambda messagetuple: messagetuple[0])
63+
for par in self.parameterList:
64+
message = par[1]
65+
if message.payload.data["action"] == 0:
66+
zeile = "Parameter: %s\n" % message.payload.get_name()
67+
else:
68+
zeile = "Parameter request: %s\n" % message.payload.get_name()
69+
self.write_output(zeile)
70+
if isinstance(message.payload, ixcom.data.PARXCOM_LOGLIST2_Payload):
71+
self.__handle_loglist2(message)
72+
else:
73+
self.__convert_dict(message.payload.data)
74+
zeile = "\n\n"
75+
self.write_output(zeile)
76+
5477
def write_divider(self):
5578
self.write_output('-'*10+'\n')
5679

@@ -125,15 +148,16 @@ def xcom_lookup(argv = None):
125148
pass
126149
sys.exit(0)
127150

128-
def configdump2txt(argv = None):
151+
152+
def configdump2txt(argv=None):
129153
parser = argparse.ArgumentParser(description='Converts xcom binary config dump files to other representations')
130-
parser.add_argument('input_file', metavar='', type=argparse.FileType('rb'), nargs='?',
131-
help='Name of the binary file', default = 'config.dump')
132-
parser.add_argument('-o', '--output', metavar='output_filename', type=argparse.FileType('wt'),
133-
help='Filename of the output file', default = sys.stdout)
134-
args = parser.parse_args(args = argv)
135-
xcomparser = TextFileParser(args.output)
154+
parser.add_argument('input_file', metavar='', type=argparse.FileType('rb'), nargs='?', help='Name of the binary file', default='config.dump')
155+
parser.add_argument('-o', '--output', metavar='output_filename', type=argparse.FileType('wt'), help='Filename of the output file', default=sys.stdout)
156+
args = parser.parse_args(args=argv)
157+
xcomparser = TextFileParser(args.output, skip_parameter=[917]) # skip parxcom_loglist2(917)
136158
xcomparser.parse_file(args.input_file)
159+
xcomparser.write_parameter()
160+
137161

138162
def monitor2xcom(argv = None):
139163
import re

ixcom/parameters.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,12 @@ class PARGNSS_SWITCHER_Payload(DefaultParameterPayload):
222222
PayloadItem(name = 'switcher', dimension = 1, datatype = 'B'),
223223
PayloadItem(name = 'reserved2', dimension = 1, datatype = 'H'),
224224
])
225+
226+
@parameter(229)
227+
class PARGNSS_HDGOFFSET_Payload(DefaultParameterPayload):
228+
parameter_payload = Message([
229+
PayloadItem(name='offset', dimension=1, datatype='f'),
230+
])
225231

226232
"""
227233
PARMAG

ixcom/parser.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def __init__(self, parserDelegate = None, disable_crc = False):
2929
self.currentBytes = bytearray(512)
3030
self.currentByteIdx = 0
3131
self.remainingByteCount = 0
32+
self.msgLength = 0
3233
self.disableCRC = disable_crc
3334
self.callbacks = []
3435
if parserDelegate is not None:
@@ -38,7 +39,7 @@ def process_buffer_unsafe(self, buffer):
3839
current_msg_start_idx = 0
3940
inBytes = memoryview(buffer)
4041
inbytelen = len(inBytes)
41-
while current_msg_start_idx < inbytelen:
42+
while current_msg_start_idx + 5 < inbytelen:
4243
current_msg_length = inBytes[current_msg_start_idx + 4] + 256*inBytes[current_msg_start_idx + 5]
4344
if current_msg_start_idx + current_msg_length > inbytelen: # Message nicht mehr komplett
4445
break
@@ -63,23 +64,21 @@ def process_bytes(self, inBytes):
6364
self.currentByteIdx += 1
6465
self.remainingByteCount -= 1
6566
if self.remainingByteCount == 0:
66-
self.remainingByteCount = self.currentBytes[self.currentByteIdx - 1] * 256 + self.currentBytes[
67-
self.currentByteIdx - 2] - 6
67+
self.msgLength = self.currentBytes[self.currentByteIdx - 1] * 256 + self.currentBytes[self.currentByteIdx - 2]
68+
self.remainingByteCount = self.msgLength - 6
6869
# 4096 should be replaced if greater messages would be defined
6970
if self.remainingByteCount < 4096 and self.remainingByteCount > 0:
7071
self.searcherState = MessageSearcherState.fetching_bytes
7172
else:
7273
self.searcherState = MessageSearcherState.waiting_for_sync
7374
elif self.searcherState == MessageSearcherState.fetching_bytes:
7475
if len(inBytes) - 1 >= self.remainingByteCount + inByteIdx - 1: # Der Buffer ist Länger als der Rest der Nachricht.
75-
self.currentBytes[self.currentByteIdx:self.currentByteIdx + self.remainingByteCount] = inBytes[
76-
inByteIdx:inByteIdx + self.remainingByteCount]
76+
self.currentBytes[self.currentByteIdx:self.currentByteIdx + self.remainingByteCount] = inBytes[inByteIdx:inByteIdx + self.remainingByteCount]
7777
self.currentByteIdx = self.currentByteIdx + self.remainingByteCount
7878
inByteIdx = inByteIdx + self.remainingByteCount
7979
self.remainingByteCount = 0
8080
else:
81-
self.currentBytes[self.currentByteIdx:self.currentByteIdx + (len(inBytes) - inByteIdx)] = inBytes[
82-
inByteIdx:]
81+
self.currentBytes[self.currentByteIdx:self.currentByteIdx + (len(inBytes) - inByteIdx)] = inBytes[inByteIdx:]
8382
self.currentByteIdx = self.currentByteIdx + (len(inBytes) - inByteIdx)
8483
self.remainingByteCount -= (len(inBytes) - inByteIdx)
8584
inByteIdx = len(inBytes)
@@ -124,10 +123,13 @@ def parse_parameter(self, inBytes):
124123
parameterID = inBytes[16] + (inBytes[17] << 8)
125124
message = data.getParameterWithID(parameterID)
126125
if message is not None:
127-
message.from_bytes(inBytes)
128-
self.publish(message)
126+
try:
127+
message.from_bytes(inBytes)
128+
self.publish(message)
129+
except Exception:
130+
print('Error: Parameter with ID: {} could not be parsed!'.format(parameterID))
129131
else:
130-
pass
132+
print('Warning: Parameter with ID: {} not handled!'.format(parameterID))
131133

132134
def parse_command(self, inBytes):
133135
cmdID = inBytes[16] + (inBytes[17] << 8)

0 commit comments

Comments
 (0)