diff --git a/Ccs/ccs_function_lib.py b/Ccs/ccs_function_lib.py index dee5d514f50054ea5b5cbd53903ffdc1fd971e46..69fa3d8512f0f8fa8a34b86eacf5b44d07c33e02 100644 --- a/Ccs/ccs_function_lib.py +++ b/Ccs/ccs_function_lib.py @@ -74,7 +74,8 @@ except AttributeError as err: raise err SREC_MAX_BYTES_PER_LINE = 250 -SEG_HEADER_LEN = 12 +SEG_HEADER_FMT = '>III' +SEG_HEADER_LEN = struct.calcsize(SEG_HEADER_FMT) SEG_SPARE_LEN = 2 SEG_CRC_LEN = 2 @@ -2756,8 +2757,8 @@ def srectohex(fname, memid, memaddr, segid, tcsend=False, outname=None, linesper linepack = bytes.fromhex(''.join(linepacklist)) dlen = len(linepack) - data = struct.pack('>III', segid, startaddr, dlen // 4) + linepack + b'\x00\x00' - data = data + struct.pack('>H', crc(data)) + data = struct.pack(SEG_HEADER_FMT, segid, startaddr, dlen // 4) + linepack + bytes(SEG_SPARE_LEN) + data = data + crc(data).to_bytes(SEG_CRC_LEN, 'big') if source_only: if add_memaddr_to_source: source_list.append(prettyhex(memaddr.to_bytes(4, 'big') + data)) @@ -2816,10 +2817,23 @@ def srectosrecmod(input_srec, output_srec, imageaddr=0x40180000, linesperpack=61 source_to_srec('srec_binary_source.TC', output_srec, memaddr=imageaddr) -def upload_srec(fname, memid, memaddr, segid, pool_name='LIVE', tcname=None, linesperpack=61, sleep=0.1): - +def upload_srec(fname, memid, memaddr, segid, pool_name='LIVE', tcname=None, linesperpack=30, sleep=0.125, max_pkt_size=MAX_PKT_LEN): + """ + Upload data from an SREC file to _memid_ via S6,2 + @param fname: + @param memid: + @param memaddr: + @param segid: + @param pool_name: + @param tcname: + @param linesperpack: + @param sleep: + @param max_pkt_size: + """ # get service 6,2 info from MIB apid, memid_ref, fmt, endspares = _get_upload_service_info(tcname) + pkt_overhead = TC_HEADER_LEN + struct.calcsize(fmt) + SEG_HEADER_LEN + SEG_SPARE_LEN + SEG_CRC_LEN + len(endspares) + PEC_LEN + payload_len = max_pkt_size - pkt_overhead if not isinstance(memid, int): dbcon = scoped_session_idb @@ -2827,7 +2841,9 @@ def upload_srec(fname, memid, memaddr, segid, pool_name='LIVE', tcname=None, lin try: memid, = dbres.fetchall()[0] except IndexError: - raise ValueError('MemID "{}" does not exist. Aborting.'.format(memid)) + que = 'SELECT pas_altxt from pas where pas_numbr="{}"'.format(memid_ref) + alvals = [x[0] for x in dbcon.execute(que).fetchall()] + raise ValueError('Invalid MemID "{}". Allowed values are: {}.'.format(memid, ', '.join(alvals))) finally: dbcon.close() memid = int(memid) @@ -2845,6 +2861,10 @@ def upload_srec(fname, memid, memaddr, segid, pool_name='LIVE', tcname=None, lin for n in range(linesperpack): if linecount >= (len(lines) - 1): break + + if (len(''.join(linepacklist)) + len(lines[linecount])) // 2 > payload_len: # ensure max_pkt_size + break + linepacklist.append(lines[linecount]) linelength = len(lines[linecount]) // 2 if int(f[linecount + 1][4:12], 16) != (int(f[linecount][4:12], 16) + linelength): @@ -2858,12 +2878,13 @@ def upload_srec(fname, memid, memaddr, segid, pool_name='LIVE', tcname=None, lin linepack = bytes.fromhex(''.join(linepacklist)) dlen = len(linepack) # segment header, see IWF DBS HW SW ICD - data = struct.pack('>III', segid, startaddr, dlen // 4) + linepack + b'\x00\x00' + data = struct.pack(SEG_HEADER_FMT, segid, startaddr, dlen // 4) + linepack + bytes(SEG_SPARE_LEN) data = data + crc(data).to_bytes(SEG_CRC_LEN, 'big') # create PUS packet packetdata = struct.pack(fmt, memid, memaddr, len(data)) + data + endspares - puspckt = Tcpack(data=packetdata, st=6, sst=2, apid=apid, sc=counters[apid], ack=0b1001) + seq_cnt = counters.setdefault(apid, 0) + puspckt = Tcpack(data=packetdata, st=6, sst=2, apid=apid, sc=seq_cnt, ack=0b1001) if len(puspckt) > MAX_PKT_LEN: logger.warning('Packet length ({}) exceeding MAX_PKT_LEN of {} bytes!'.format(len(puspckt), MAX_PKT_LEN)) @@ -2911,7 +2932,7 @@ def segment_data(data, segid, addr, seglen=480): if chunklen % 4: raise ValueError('Segment data length is not two-word aligned') - sdata = struct.pack('>III', segid, segaddr, chunklen // 4) + chunk + bytes(SEG_SPARE_LEN) + sdata = struct.pack(SEG_HEADER_FMT, segid, segaddr, chunklen // 4) + chunk + bytes(SEG_SPARE_LEN) sdata += crc(sdata).to_bytes(SEG_CRC_LEN, 'big') segments.append(sdata) segaddr += chunklen diff --git a/Ccs/packet_config_SMILE.py b/Ccs/packet_config_SMILE.py index dffbd30aea4781efe8f2600c8eef3abd2622d685..995d5ab530f56374f7be10a5f85c4d0ac185eb1e 100644 --- a/Ccs/packet_config_SMILE.py +++ b/Ccs/packet_config_SMILE.py @@ -34,7 +34,7 @@ RMAP_PEC_LEN = 1 PUS_PKT_VERS_NUM = 0 # 0 for space packets PUS_VERSION = 1 -MAX_PKT_LEN = 1024 # bytes +MAX_PKT_LEN = 886 # 886 for TMs [EID-1298], 504 for TCs [EID-1361] PRIMARY_HEADER = [ ("PKT_VERS_NUM", ctypes.c_uint16, 3),