From b4af194264d7953ba8091b7bc2460a91e32477a8 Mon Sep 17 00:00:00 2001
From: Greg Quinn <greg.quinn@ssec.wisc.edu>
Date: Fri, 18 Nov 2016 20:20:40 +0000
Subject: [PATCH] Fix crgen problem handling packets w no stamp

---
 edosl0util/crgen.py | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/edosl0util/crgen.py b/edosl0util/crgen.py
index b5e4492..d1ab600 100644
--- a/edosl0util/crgen.py
+++ b/edosl0util/crgen.py
@@ -177,17 +177,21 @@ def scan_packets(pds_file, prev_pds_file=None):
         apid_map = {}
         logger.info('scanning {}'.format(pds_file))
         stream = jpss_packet_stream(open(pds_file, 'rb'))
-        first_pkt = stream.next()
-        for pkt in itertools.chain([first_pkt], stream):
+        first_pkt_time = None
+        last_pkt_time = None
+        for pkt in stream:
             entry = apid_map.get(pkt.apid)
             if not entry:
                 entry_from_prev_pds = prev_apid_map.get(pkt.apid)
                 apid_map[pkt.apid] = init_entry(pkt, entry_from_prev_pds)
             else:
                 update_entry(entry, pkt)
-        last_pkt = pkt
-        return {'first_packet_time': datetime_to_ccsds(first_pkt.stamp),
-                'last_packet_time': datetime_to_ccsds(last_pkt.stamp),
+            if pkt.stamp:
+                if not first_pkt_time:
+                    first_pkt_time = pkt.stamp
+                last_pkt_time = pkt.stamp
+        return {'first_packet_time': datetime_to_ccsds(first_pkt_time),
+                'last_packet_time': datetime_to_ccsds(last_pkt_time),
                 'apid_info': [apid_map[k] for k in sorted(apid_map)]}
 
     def build_prev_apid_map(prev_pds_file):
@@ -209,7 +213,10 @@ def scan_packets(pds_file, prev_pds_file=None):
     def update_entry(entry, new_pkt):
         prev_last_ssc = entry['last_packet_ssc']
         prev_last_time = entry['last_packet_time']
-        entry['last_packet_time'] = datetime_to_ccsds(new_pkt.stamp)
+        if new_pkt.stamp:
+            if entry['first_packet_time'] == DaySegmentedTimecode():
+                entry['first_packet_time'] = datetime_to_ccsds(new_pkt.stamp)
+            entry['last_packet_time'] = datetime_to_ccsds(new_pkt.stamp)
         entry['last_packet_ssc'] = new_pkt.seqid
         entry['total_packets'] += 1
         entry['total_bytes'] += new_pkt.size
@@ -235,12 +242,12 @@ def datetime_to_ccsds(dt):
     Handles input of None by returning epoch value of 1958-01-01.
     """
     if dt is not None:
-        epoch = datetime(1958, 1, 1)
-        days = (dt - epoch).days
+        days = (dt - idps_epoch).days
         micros = int((dt - datetime(dt.year, dt.month, dt.day)).total_seconds() * 1e6)
         return DaySegmentedTimecode(days, micros // 1000, micros % 1000)
     else:
         return DaySegmentedTimecode()
 
+idps_epoch = datetime(1958, 1, 1)
 
 logger = logging.getLogger(__name__)
-- 
GitLab