diff --git a/Ccs/ccs_function_lib.py b/Ccs/ccs_function_lib.py index 0e2e5eb98ee092874fc5032101aa5febead790e4..7b6b8cd7ded0ea732193ed687dd4238e3816cdb1 100644 --- a/Ccs/ccs_function_lib.py +++ b/Ccs/ccs_function_lib.py @@ -3661,7 +3661,7 @@ def calc_param_crc(cmd, *args, no_check=False, hack_value=None): def load_to_memory(data, memid, memaddr, max_pkt_size=MAX_PKT_LEN, sleep=0.125, ack=0b1001, pool_name='LIVE', tcname=None, - progress=True, calc_crc=True, byte_align=4): + progress=True, calc_crc=True, byte_align=4, dryrun=False): """ Function for loading data to DPU memory. Splits the input _data_ into slices and sequentially sends them to the specified location _memid_, _mempos_ by repeatedly calling the _Tcsend_bytes_ function until @@ -3678,6 +3678,7 @@ def load_to_memory(data, memid, memaddr, max_pkt_size=MAX_PKT_LEN, sleep=0.125, :param progress: :param calc_crc: :param byte_align: + :param dryrun: :return: """ @@ -3687,6 +3688,9 @@ def load_to_memory(data, memid, memaddr, max_pkt_size=MAX_PKT_LEN, sleep=0.125, else: raise TypeError('Data is not bytes or str') + if dryrun: + print('DRYRUN -- NO PACKETS ARE BEING SENT!') + if byte_align and (len(data) % byte_align): logger.warning('Data is not {}-byte aligned, padding.'.format(byte_align)) data += bytes(byte_align - (len(data) % byte_align)) @@ -3696,14 +3700,23 @@ def load_to_memory(data, memid, memaddr, max_pkt_size=MAX_PKT_LEN, sleep=0.125, pkt_overhead = TC_HEADER_LEN + struct.calcsize(fmt) + len(endspares) + PEC_LEN payload_len = max_pkt_size - pkt_overhead + # ensure packet payload byte alignment + payload_len = (payload_len // byte_align) * byte_align + memid = get_mem_id(memid, memid_ref) # get permanent pmgr handle to avoid requesting one for each packet - pmgr = _get_pmgr_handle(tc_pool=pool_name) + if not dryrun: + pmgr = _get_pmgr_handle(tc_pool=pool_name) data_size = len(data) startaddr = memaddr + if len(fmt) == 4: # PUS-A + nseg_and_memid = [memid] + else: # PUS-C, use one segment only + nseg_and_memid = [1, memid] + upload_bytes = b'' pcnt = 0 ptot = None @@ -3716,14 +3729,16 @@ def load_to_memory(data, memid, memaddr, max_pkt_size=MAX_PKT_LEN, sleep=0.125, t1 = time.time() # create PUS packet - packetdata = struct.pack(fmt, memid, startaddr, len(sli)) + sli + endspares + packetdata = struct.pack(fmt, *nseg_and_memid, startaddr, len(sli)) + sli + endspares seq_cnt = counters.setdefault(apid, 0) puspckt = Tcpack(data=packetdata, st=6, sst=2, apid=apid, sc=seq_cnt, ack=ack) if len(puspckt) > MAX_PKT_LEN: logger.warning('Packet length ({}) exceeding MAX_PKT_LEN of {} bytes!'.format(len(puspckt), MAX_PKT_LEN)) - Tcsend_bytes(puspckt, pool_name=pool_name, pmgr_handle=pmgr) + if not dryrun: + Tcsend_bytes(puspckt, pool_name=pool_name, pmgr_handle=pmgr) + # collect all uploaded segments for CRC at the end upload_bytes += sli pcnt += 1