Skip to content

Commit a3c7343

Browse files
authored
Merge pull request #51 from ska-sa/devel
Merge for AR1 v1.3 QTP on site.
2 parents 0edc8d4 + 7d629f3 commit a3c7343

File tree

8 files changed

+466
-188
lines changed

8 files changed

+466
-188
lines changed

scripts/casperfpga_tengbe_status.py

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@
5252
logging.basicConfig(level=eval('logging.%s' % log_level))
5353
except AttributeError:
5454
raise RuntimeError('No such log level: %s' % log_level)
55+
# import logging
56+
# logging.basicConfig(filename='/tmp/casperfpga_tengbe_status_curses.log', level=logging.DEBUG)
57+
# logging.info('****************************************************')
5558

5659
if args.comms == 'katcp':
5760
HOSTCLASS = katcp_fpga.KatcpFpga
@@ -155,6 +158,17 @@ def exit_gracefully(sig, frame):
155158
signal.signal(signal.SIGINT, exit_gracefully)
156159
signal.signal(signal.SIGHUP, exit_gracefully)
157160

161+
# work out the maximum host/core name
162+
max_1st_col_offset = -1
163+
for fpga in fpgas:
164+
max_1st_col_offset = max(max_1st_col_offset, len(fpga.host))
165+
for gbe_name in fpga.tengbes.names():
166+
max_1st_col_offset = max(max_1st_col_offset, len(gbe_name))
167+
max_fldname = -1
168+
for hdr in fpga_headers[0]:
169+
max_fldname = max(max_fldname, len(hdr))
170+
max_1st_col_offset += 5
171+
158172
# set up the curses scroll screen
159173
scroller = scroll.Scroll(debug=False)
160174
scroller.screen_setup()
@@ -174,54 +188,50 @@ def exit_gracefully(sig, frame):
174188
scroller.draw_screen()
175189
if time.time() > last_refresh + polltime:
176190
scroller.clear_buffer()
177-
scroller.add_line(
191+
line = scroller.add_string(
178192
'Polling %i host%s every %s - %is elapsed.' % (
179193
len(fpgas),
180194
'' if len(fpgas) == 1 else 's',
181195
'second' if polltime == 1 else ('%i seconds' % polltime),
182-
time.time() - STARTTIME), 0, 0, absolute=True)
183-
start_pos = 20
184-
pos_increment = 15
185-
if len(fpga_headers) == 1:
186-
scroller.add_line('Host', 0, 1, absolute=True)
187-
for reg in fpga_headers[0]:
188-
scroller.add_line(
189-
reg.rjust(pos_increment), start_pos, 1, absolute=True)
190-
start_pos += pos_increment
191-
scroller.set_ypos(newpos=2)
192-
scroller.set_ylimits(ymin=2)
193-
else:
194-
scroller.set_ypos(1)
195-
scroller.set_ylimits(ymin=1)
196+
time.time() - STARTTIME), 0, 0, fixed=True)
197+
start_pos = max_1st_col_offset
198+
pos_increment = max_fldname + 2
199+
200+
scroller.set_current_line(1)
201+
scroller.set_ylimits(1)
202+
196203
gbe_data = utils.threaded_fpga_operation(fpgas, 10, get_gbe_data)
197204
for ctr, fpga in enumerate(fpgas):
205+
start_pos = max_1st_col_offset
198206
fpga_data = gbe_data[fpga.host]
199-
scroller.add_line(fpga.host)
207+
line = scroller.add_string(fpga.host)
208+
for reg in fpga_headers[0]:
209+
fld = '{val:>{width}}'.format(val=reg, width=max_fldname)
210+
line = scroller.add_string(fld, start_pos)
211+
start_pos += pos_increment
212+
scroller.add_string('', cr=True)
200213
for core, core_data in fpga_data.items():
201214
tap_running = tap_data[fpga.host][core]['name'] == ''
202215
fpga_data[core]['tap_running'] = not tap_running
203216
fpga_data[core]['ip'] = tap_data[fpga.host][core]['ip']
204-
start_pos = 20
205-
scroller.add_line(core, 5)
217+
start_pos = max_1st_col_offset
218+
line = scroller.add_string(core)
206219
for header_register in fpga_headers[0]:
207220
core_regname = header_register.replace('gbe', core)
208-
if start_pos < 200:
209-
if core_regname in core_data.keys():
210-
if not isinstance(core_data[core_regname], str):
211-
regval = '%d' % core_data[core_regname]
212-
else:
213-
regval = core_data[core_regname]
214-
else:
215-
regval = 'n/a'
216-
# all on the same line
217-
scroller.add_line(regval.rjust(pos_increment),
218-
start_pos,
219-
scroller.get_current_line() - 1)
220-
start_pos += pos_increment
221+
if core_regname in core_data.keys():
222+
fld = '{val:>{width}}'.format(
223+
val=core_data[core_regname],
224+
width=max_fldname)
225+
else:
226+
fld = '{val:>{width}}'.format(
227+
val='n/a', width=max_fldname)
228+
scroller.add_string(fld, start_pos)
229+
start_pos += pos_increment
230+
scroller.add_string('', cr=True)
221231
scroller.draw_screen()
222232
last_refresh = time.time()
223233
else:
224-
time.sleep(0.1)
234+
time.sleep(0.05)
225235
except Exception, e:
226236
exit_gracefully(None, None)
227237
raise

setup.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
provides=['casperfpga'],
1919
packages=['casperfpga'], # , 'casperfpga.test'],
2020
package_dir={'casperfpga': 'src'},
21-
scripts=glob.glob('scripts/*')
21+
scripts=glob.glob('scripts/*'),
22+
setup_requires=['katversion'],
23+
use_katversion=True
2224
)
2325

2426
# end

src/__init__.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,15 @@
1414
from snap import Snap
1515
from tengbe import TenGbe
1616

17-
# end
17+
# BEGIN VERSION CHECK
18+
# Get package version when locally imported from repo or via -e develop install
19+
try:
20+
import katversion as _katversion
21+
except ImportError:
22+
import time as _time
23+
__version__ = "0.0+unknown.{}".format(_time.strftime('%Y%m%d%H%M'))
24+
else:
25+
__version__ = _katversion.get_version(__path__[0])
26+
# END VERSION CHECK
27+
28+
# end

src/casperfpga.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -436,8 +436,12 @@ def get_system_information(self, filename=None, fpg_info=None):
436436
except KeyError:
437437
LOGGER.warn('%s: no sys info key in design info!' % self.host)
438438
# and RCS information if included
439-
if '77777_git' in device_dict:
440-
self.rcs_info['git'] = device_dict['77777_git']
439+
for device_name in device_dict:
440+
if device_name.startswith('77777_git_'):
441+
name = device_name[device_name.find('_', 10) + 1:]
442+
if 'git' not in self.rcs_info:
443+
self.rcs_info['git'] = {}
444+
self.rcs_info['git'][name] = device_dict[device_name]
441445
if '77777_svn' in device_dict:
442446
self.rcs_info['svn'] = device_dict['77777_svn']
443447

src/katcp_fpga.py

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,27 @@ def __str__(self):
576576
(self.host, self._bindaddr[1],
577577
'connected' if self.is_connected() else 'disconnected')
578578

579+
@staticmethod
580+
def _process_git_info(metalist):
581+
"""
582+
Git information in the FPG must be processed.
583+
:param metalist:
584+
:return:
585+
"""
586+
got_git = {}
587+
time_pref = str(int(time.time())).replace('.', '_') + '_'
588+
for ctr, parms in enumerate(metalist):
589+
name, tag, param, value = parms
590+
if name == '77777_git':
591+
assert tag == 'rcs'
592+
newname = name + '_' + time_pref + param
593+
if newname not in got_git:
594+
got_git[newname] = (newname, tag, 'file-name', param)
595+
param = value[0]
596+
value = value[1:]
597+
metalist[ctr] = (newname, tag, param, value)
598+
metalist.extend(got_git.values())
599+
579600
def _read_design_info_from_host(self, device=None):
580601
"""
581602
Katcp request for extra system information embedded in the boffile.
@@ -617,47 +638,56 @@ def _read_design_info_from_host(self, device=None):
617638
value = value[0]
618639
name = name.replace('/', '_')
619640
metalist.append((name, tag, param, value))
641+
self._process_git_info(metalist)
620642
return create_meta_dictionary(metalist)
621643

622644
def _read_coreinfo_from_host(self):
623645
"""
624-
Get the equivalent of coreinfo.tab from the host using KATCP listdev commands.
646+
Get the equivalent of coreinfo.tab from the host using
647+
KATCP listdev commands.
625648
:return:
626649
"""
627650
LOGGER.debug('%s: reading coreinfo' % self.host)
628651
memorymap_dict = {}
629652
listdev_size = self.listdev(getsize=True)
630653
listdev_address = self.listdev(getaddress=True)
631654
if len(listdev_address) != len(listdev_size):
632-
raise RuntimeError('Different length listdev(size) and listdev(detail)')
655+
raise RuntimeError('Different length listdev(size) and '
656+
'listdev(detail)')
633657
for byte_dev, byte_size in listdev_size:
634658
matched = False
635659
for addrdev, address in listdev_address:
636660
if addrdev == byte_dev:
637661
byte_size = int(byte_size.split(':')[0])
638662
address = int(address.split(':')[0], 16)
639-
memorymap_dict[byte_dev] = {'address': address, 'bytes': byte_size}
663+
memorymap_dict[byte_dev] = {'address': address,
664+
'bytes': byte_size}
640665
matched = True
641666
continue
642667
if not matched:
643-
raise RuntimeError('No matching listdev address for device %s' % byte_dev)
668+
raise RuntimeError('No matching listdev address for '
669+
'device %s' % byte_dev)
644670
return memorymap_dict
645671

646672
def get_system_information(self, filename=None, fpg_info=None):
647673
"""
648674
Get information about the design running on the FPGA.
649-
If filename is given, get it from there, otherwise query the host via KATCP.
675+
If filename is given, get it from there, otherwise query the
676+
host via KATCP.
650677
:param filename: fpg filename
678+
:param fpg_info: a tuple with two dictionaries of FPG information
651679
:return: <nothing> the information is populated in the class
652680
"""
653681
if (not self.is_running()) and (filename is None):
654-
raise RuntimeError('This can only be run on a running device when no file is given.')
682+
raise RuntimeError('This can only be run on a running device '
683+
'when no file is given.')
655684
if filename is not None:
656685
device_dict, memorymap_dict = parse_fpg(filename)
657686
else:
658687
device_dict = self._read_design_info_from_host()
659688
memorymap_dict = self._read_coreinfo_from_host()
660-
super(KatcpFpga, self).get_system_information(fpg_info=(device_dict, memorymap_dict))
689+
super(KatcpFpga, self).get_system_information(
690+
fpg_info=(device_dict, memorymap_dict))
661691

662692
def unhandled_inform(self, msg):
663693
"""

0 commit comments

Comments
 (0)