Skip to content

Commit a0d1872

Browse files
committed
WIP: Enhancement nasa#103 - Implemented native cmdUtil
Native cmdUtil has only subset of full cmdUtil functionality Also implemented updates to GUI and backend to support custom byte offsets in tlm and cmd
1 parent 09261e5 commit a0d1872

File tree

6 files changed

+221
-41
lines changed

6 files changed

+221
-41
lines changed

GroundSystem.py

+31-10
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939
# CFS Ground System: Setup and manage the main window
4040
#
4141
class GroundSystem(QMainWindow, Ui_MainWindow):
42+
HDR_VER_1_OFFSET = 0
43+
HDR_VER_2_OFFSET = 4
44+
4245
#
4346
# Init the class
4447
#
@@ -51,8 +54,10 @@ def __init__(self):
5154

5255
self.pushButtonStartTlm.clicked.connect(self.startTlmSystem)
5356
self.pushButtonStartCmd.clicked.connect(self.startCmdSystem)
54-
self.cbHeaderVer.currentIndexChanged.connect(self.setFixedOffset)
55-
self.sbOffset.valueChanged.connect(self.getOffset)
57+
self.cbTlmHeaderVer.currentIndexChanged.connect(self.setTlmOffset)
58+
self.cbCmdHeaderVer.currentIndexChanged.connect(self.setCmdOffsets)
59+
for sb in (self.sbTlmOffset, self.sbCmdOffsetPri, self.sbCmdOffsetSec):
60+
sb.valueChanged.connect(self.saveOffsets)
5661
# Init lists
5762
self.ipAddressesList = ['All']
5863
self.spacecraftNames = ['All']
@@ -115,19 +120,35 @@ def startFDLSystem(self):
115120
subscription
116121
])
117122

118-
def setFixedOffset(self):
119-
selectedVer = self.cbHeaderVer.currentText().strip()
123+
def setTlmOffset(self):
124+
selectedVer = self.cbTlmHeaderVer.currentText().strip()
125+
if selectedVer == "Custom":
126+
self.sbTlmOffset.setEnabled(True)
127+
else:
128+
self.sbTlmOffset.setEnabled(False)
129+
if selectedVer == "1":
130+
self.sbTlmOffset.setValue(self.HDR_VER_1_OFFSET)
131+
elif selectedVer == "2":
132+
self.sbTlmOffset.setValue(self.HDR_VER_2_OFFSET)
133+
134+
def setCmdOffsets(self):
135+
selectedVer = self.cbCmdHeaderVer.currentText().strip()
120136
if selectedVer == "Custom":
121-
self.sbOffset.setEnabled(True)
137+
self.sbCmdOffsetPri.setEnabled(True)
138+
self.sbCmdOffsetSec.setEnabled(True)
122139
else:
123-
self.sbOffset.setEnabled(False)
140+
self.sbCmdOffsetPri.setEnabled(False)
141+
self.sbCmdOffsetSec.setEnabled(False)
124142
if selectedVer == "1":
125-
self.sbOffset.setValue(0)
143+
self.sbCmdOffsetPri.setValue(self.HDR_VER_1_OFFSET)
126144
elif selectedVer == "2":
127-
self.sbOffset.setValue(4)
145+
self.sbCmdOffsetPri.setValue(self.HDR_VER_2_OFFSET)
146+
self.sbCmdOffsetSec.setValue(self.HDR_VER_1_OFFSET)
128147

129-
def getOffset(self):
130-
shared.offsetVal = self.sbOffset.value()
148+
def saveOffsets(self):
149+
shared.tlmOffset = self.sbTlmOffset.value()
150+
shared.cmdOffsetPri = self.sbCmdOffsetPri.value()
151+
shared.cmdOffsetSec = self.sbCmdOffsetSec.value()
131152

132153
# Update the combo box list in gui
133154
def updateIpList(self, ip, name):

MainWindow.ui

+67-8
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
<rect>
1010
<x>0</x>
1111
<y>0</y>
12-
<width>452</width>
13-
<height>265</height>
12+
<width>552</width>
13+
<height>305</height>
1414
</rect>
1515
</property>
1616
<property name="sizePolicy">
@@ -103,20 +103,20 @@
103103
</property>
104104
<property name="minimumSize">
105105
<size>
106-
<width>141</width>
106+
<width>169</width>
107107
<height>0</height>
108108
</size>
109109
</property>
110110
<property name="text">
111-
<string>Header version</string>
111+
<string>Tlm header version</string>
112112
</property>
113113
<property name="alignment">
114114
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
115115
</property>
116116
</widget>
117117
</item>
118118
<item row="1" column="1">
119-
<widget class="QComboBox" name="cbHeaderVer">
119+
<widget class="QComboBox" name="cbTlmHeaderVer">
120120
<property name="minimumSize">
121121
<size>
122122
<width>132</width>
@@ -146,13 +146,65 @@
146146
</item>
147147
</widget>
148148
</item>
149+
<item row="2" column="0">
150+
<widget class="QLabel" name="label_2">
151+
<property name="text">
152+
<string>Cmd header version</string>
153+
</property>
154+
</widget>
155+
</item>
149156
<item row="1" column="2">
150-
<widget class="QSpinBox" name="sbOffset">
157+
<widget class="QSpinBox" name="sbTlmOffset">
158+
<property name="enabled">
159+
<bool>false</bool>
160+
</property>
161+
<property name="toolTip">
162+
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Offset (in bytes) to be &lt;span style=&quot; font-weight:600;&quot;&gt;added to&lt;/span&gt; existing offsets listed in telemetry text files&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
163+
</property>
164+
<property name="buttonSymbols">
165+
<enum>QAbstractSpinBox::NoButtons</enum>
166+
</property>
167+
</widget>
168+
</item>
169+
<item row="2" column="2">
170+
<widget class="QSpinBox" name="sbCmdOffsetPri">
171+
<property name="enabled">
172+
<bool>false</bool>
173+
</property>
174+
<property name="toolTip">
175+
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Offset (in bytes) to be added &lt;span style=&quot; font-weight:600;&quot;&gt;after&lt;/span&gt; the &lt;span style=&quot; font-weight:600;&quot;&gt;primary&lt;/span&gt; header in a command packet&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
176+
</property>
177+
<property name="buttonSymbols">
178+
<enum>QAbstractSpinBox::NoButtons</enum>
179+
</property>
180+
</widget>
181+
</item>
182+
<item row="2" column="1">
183+
<widget class="QComboBox" name="cbCmdHeaderVer">
184+
<item>
185+
<property name="text">
186+
<string>1</string>
187+
</property>
188+
</item>
189+
<item>
190+
<property name="text">
191+
<string>2</string>
192+
</property>
193+
</item>
194+
<item>
195+
<property name="text">
196+
<string>Custom</string>
197+
</property>
198+
</item>
199+
</widget>
200+
</item>
201+
<item row="2" column="3">
202+
<widget class="QSpinBox" name="sbCmdOffsetSec">
151203
<property name="enabled">
152204
<bool>false</bool>
153205
</property>
154206
<property name="toolTip">
155-
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Offset (in bytes) to be *added to* existing offsets listed in tlm/cmd text files&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
207+
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Offset (in bytes) to be added &lt;span style=&quot; font-weight:600;&quot;&gt;after&lt;/span&gt; the &lt;span style=&quot; font-weight:600;&quot;&gt;secondary&lt;/span&gt; header in a command packet&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
156208
</property>
157209
<property name="buttonSymbols">
158210
<enum>QAbstractSpinBox::NoButtons</enum>
@@ -162,7 +214,14 @@
162214
<item row="0" column="2">
163215
<widget class="QLabel" name="label">
164216
<property name="text">
165-
<string>Offset (bytes)</string>
217+
<string>Offsets</string>
218+
</property>
219+
</widget>
220+
</item>
221+
<item row="0" column="3">
222+
<widget class="QLabel" name="label_6">
223+
<property name="text">
224+
<string>(Hover for info)</string>
166225
</property>
167226
</widget>
168227
</item>

Subsystems/cmdGui/MiniCmdUtil.py

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#
2+
# GSC-18128-1, "Core Flight Executive Version 6.7"
3+
#
4+
# Copyright (c) 2006-2019 United States Government as represented by
5+
# the Administrator of the National Aeronautics and Space Administration.
6+
# All Rights Reserved.
7+
#
8+
# Licensed under the Apache License, Version 2.0 (the "License");
9+
# you may not use this file except in compliance with the License.
10+
# You may obtain a copy of the License at
11+
#
12+
# http://www.apache.org/licenses/LICENSE-2.0
13+
#
14+
# Unless required by applicable law or agreed to in writing, software
15+
# distributed under the License is distributed on an "AS IS" BASIS,
16+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17+
# See the License for the specific language governing permissions and
18+
# limitations under the License.
19+
#
20+
21+
## This file is a Python implementation of a subset of functions in cmdUtil
22+
## to support the GroundSystem GUI
23+
24+
import socket
25+
import sys
26+
from pathlib import Path
27+
28+
ROOTDIR = Path().resolve().parent
29+
sys.path.append(ROOTDIR.parent.parent)
30+
## The two preceding lines must be above
31+
## the next import or the import will fail
32+
import common.shareddata as shared
33+
34+
35+
class MiniCmdUtil:
36+
ccsdsExt = bytearray(4)
37+
cfsCmdSecHdr = bytearray(2)
38+
39+
def __init__(self,
40+
host="127.0.0.1",
41+
port="1234",
42+
endian="BE",
43+
hdrVer=1,
44+
pktID=None,
45+
cmdCode=None,
46+
payload=None):
47+
endians = {"BE": ">", "LE": "<"}
48+
49+
self.host = host
50+
self.port = port
51+
self.endian = ">" if endian == "BE" else "<"
52+
self.pktID = pktID
53+
self.cmdCode = cmdCode
54+
self.hdrVer = hdrVer
55+
self.payload = payload
56+
57+
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
58+
59+
60+
def assemblePriHeader(self):
61+
ccsdsPri = bytearray(6)
62+
ccsdsPri[0:2] = self.pktID.to_bytes(2, byteorder='big')
63+
ccsdsPri[2:4] = (0xC000).to_bytes(2, byteorder='big')
64+
totalPacketLen = len(ccsdsPri) + len(self.cfsCmdSecHdr)
65+
if self.hdrVer == 2:
66+
totalPacketLen += len(self.ccsdsExt)
67+
68+
def assemblePayload(self):
69+
pass

Subsystems/tlmGUI/GenericTelemetry.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def displayTelemetryItem(datagram, tlmIndex, labelField, valueField):
6060
TlmField1 = tlmItemFormat[tlmIndex]
6161
if TlmField1[0] == "<":
6262
TlmField1 = TlmField1[1:]
63-
itemStart = int(tlmItemStart[tlmIndex]) + shared.offsetVal
63+
itemStart = int(tlmItemStart[tlmIndex]) + shared.tlmOffset
6464
TlmField2 = datagram[itemStart:itemStart +
6565
int(tlmItemSize[tlmIndex])]
6666
TlmField = unpack(TlmField1, TlmField2)

Ui_MainWindow.py

+50-21
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class Ui_MainWindow(object):
1212
def setupUi(self, MainWindow):
1313
MainWindow.setObjectName("MainWindow")
1414
MainWindow.setEnabled(True)
15-
MainWindow.resize(452, 265)
15+
MainWindow.resize(552, 305)
1616
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
1717
sizePolicy.setHorizontalStretch(24)
1818
sizePolicy.setVerticalStretch(0)
@@ -60,26 +60,48 @@ def setupUi(self, MainWindow):
6060
sizePolicy.setVerticalStretch(0)
6161
sizePolicy.setHeightForWidth(self.label_4.sizePolicy().hasHeightForWidth())
6262
self.label_4.setSizePolicy(sizePolicy)
63-
self.label_4.setMinimumSize(QtCore.QSize(141, 0))
63+
self.label_4.setMinimumSize(QtCore.QSize(169, 0))
6464
self.label_4.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
6565
self.label_4.setObjectName("label_4")
6666
self.gridLayout.addWidget(self.label_4, 1, 0, 1, 1)
67-
self.cbHeaderVer = QtWidgets.QComboBox(self.centralwidget)
68-
self.cbHeaderVer.setMinimumSize(QtCore.QSize(132, 0))
69-
self.cbHeaderVer.setMaximumSize(QtCore.QSize(132, 16777215))
70-
self.cbHeaderVer.setObjectName("cbHeaderVer")
71-
self.cbHeaderVer.addItem("")
72-
self.cbHeaderVer.addItem("")
73-
self.cbHeaderVer.addItem("")
74-
self.gridLayout.addWidget(self.cbHeaderVer, 1, 1, 1, 1)
75-
self.sbOffset = QtWidgets.QSpinBox(self.centralwidget)
76-
self.sbOffset.setEnabled(False)
77-
self.sbOffset.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
78-
self.sbOffset.setObjectName("sbOffset")
79-
self.gridLayout.addWidget(self.sbOffset, 1, 2, 1, 1)
67+
self.cbTlmHeaderVer = QtWidgets.QComboBox(self.centralwidget)
68+
self.cbTlmHeaderVer.setMinimumSize(QtCore.QSize(132, 0))
69+
self.cbTlmHeaderVer.setMaximumSize(QtCore.QSize(132, 16777215))
70+
self.cbTlmHeaderVer.setObjectName("cbTlmHeaderVer")
71+
self.cbTlmHeaderVer.addItem("")
72+
self.cbTlmHeaderVer.addItem("")
73+
self.cbTlmHeaderVer.addItem("")
74+
self.gridLayout.addWidget(self.cbTlmHeaderVer, 1, 1, 1, 1)
75+
self.label_2 = QtWidgets.QLabel(self.centralwidget)
76+
self.label_2.setObjectName("label_2")
77+
self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
78+
self.sbTlmOffset = QtWidgets.QSpinBox(self.centralwidget)
79+
self.sbTlmOffset.setEnabled(False)
80+
self.sbTlmOffset.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
81+
self.sbTlmOffset.setObjectName("sbTlmOffset")
82+
self.gridLayout.addWidget(self.sbTlmOffset, 1, 2, 1, 1)
83+
self.sbCmdOffsetPri = QtWidgets.QSpinBox(self.centralwidget)
84+
self.sbCmdOffsetPri.setEnabled(False)
85+
self.sbCmdOffsetPri.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
86+
self.sbCmdOffsetPri.setObjectName("sbCmdOffsetPri")
87+
self.gridLayout.addWidget(self.sbCmdOffsetPri, 2, 2, 1, 1)
88+
self.cbCmdHeaderVer = QtWidgets.QComboBox(self.centralwidget)
89+
self.cbCmdHeaderVer.setObjectName("cbCmdHeaderVer")
90+
self.cbCmdHeaderVer.addItem("")
91+
self.cbCmdHeaderVer.addItem("")
92+
self.cbCmdHeaderVer.addItem("")
93+
self.gridLayout.addWidget(self.cbCmdHeaderVer, 2, 1, 1, 1)
94+
self.sbCmdOffsetSec = QtWidgets.QSpinBox(self.centralwidget)
95+
self.sbCmdOffsetSec.setEnabled(False)
96+
self.sbCmdOffsetSec.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons)
97+
self.sbCmdOffsetSec.setObjectName("sbCmdOffsetSec")
98+
self.gridLayout.addWidget(self.sbCmdOffsetSec, 2, 3, 1, 1)
8099
self.label = QtWidgets.QLabel(self.centralwidget)
81100
self.label.setObjectName("label")
82101
self.gridLayout.addWidget(self.label, 0, 2, 1, 1)
102+
self.label_6 = QtWidgets.QLabel(self.centralwidget)
103+
self.label_6.setObjectName("label_6")
104+
self.gridLayout.addWidget(self.label_6, 0, 3, 1, 1)
83105
self.verticalLayout.addLayout(self.gridLayout)
84106
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
85107
self.horizontalLayout_2.setSpacing(32)
@@ -135,12 +157,19 @@ def retranslateUi(self, MainWindow):
135157
self.labelHomeTitle.setText(_translate("MainWindow", "CFS Ground System"))
136158
self.label_3.setText(_translate("MainWindow", "Selected IP Address"))
137159
self.comboBoxIpAddresses.setItemText(0, _translate("MainWindow", "All"))
138-
self.label_4.setText(_translate("MainWindow", "Header version"))
139-
self.cbHeaderVer.setItemText(0, _translate("MainWindow", "1"))
140-
self.cbHeaderVer.setItemText(1, _translate("MainWindow", "2"))
141-
self.cbHeaderVer.setItemText(2, _translate("MainWindow", "Custom"))
142-
self.sbOffset.setToolTip(_translate("MainWindow", "<html><head/><body><p>Offset (in bytes) to be *added to* existing offsets listed in tlm/cmd text files</p></body></html>"))
143-
self.label.setText(_translate("MainWindow", "Offset (bytes)"))
160+
self.label_4.setText(_translate("MainWindow", "Tlm header version"))
161+
self.cbTlmHeaderVer.setItemText(0, _translate("MainWindow", "1"))
162+
self.cbTlmHeaderVer.setItemText(1, _translate("MainWindow", "2"))
163+
self.cbTlmHeaderVer.setItemText(2, _translate("MainWindow", "Custom"))
164+
self.label_2.setText(_translate("MainWindow", "Cmd header version"))
165+
self.sbTlmOffset.setToolTip(_translate("MainWindow", "<html><head/><body><p>Offset (in bytes) to be <span style=\" font-weight:600;\">added to</span> existing offsets listed in telemetry text files</p></body></html>"))
166+
self.sbCmdOffsetPri.setToolTip(_translate("MainWindow", "<html><head/><body><p>Offset (in bytes) to be added <span style=\" font-weight:600;\">after</span> the <span style=\" font-weight:600;\">primary</span> header in a command packet</p></body></html>"))
167+
self.cbCmdHeaderVer.setItemText(0, _translate("MainWindow", "1"))
168+
self.cbCmdHeaderVer.setItemText(1, _translate("MainWindow", "2"))
169+
self.cbCmdHeaderVer.setItemText(2, _translate("MainWindow", "Custom"))
170+
self.sbCmdOffsetSec.setToolTip(_translate("MainWindow", "<html><head/><body><p>Offset (in bytes) to be added <span style=\" font-weight:600;\">after</span> the <span style=\" font-weight:600;\">secondary</span> header in a command packet</p></body></html>"))
171+
self.label.setText(_translate("MainWindow", "Offsets"))
172+
self.label_6.setText(_translate("MainWindow", "(Hover for info)"))
144173
self.pushButtonStartTlm.setText(_translate("MainWindow", "Start Telemetry System"))
145174
self.pushButtonStartCmd.setText(_translate("MainWindow", "Start Command System"))
146175
self.label_5.setText(_translate("MainWindow", "*Read Guide-GroundSystem.txt for help"))

common/shareddata.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,6 @@
2222
# IMPORTANT: ANY class importing this module can read/write any of the data.
2323
# Use caution when read/writing data here.
2424

25-
offsetVal = 0
25+
tlmOffset = 0
26+
cmdOffsetPri = 0
27+
cmdOffsetSec = 0

0 commit comments

Comments
 (0)