kopia lustrzana https://github.com/glidernet/python-ogn-client
Split reference_datetime to reference_date and reference_time
rodzic
a0c4d8ea8e
commit
1b485e7629
|
@ -6,16 +6,18 @@ from ogn.parser.pattern import PATTERN_APRS, PATTERN_RECEIVER_BEACON, PATTERN_AI
|
||||||
from ogn.parser.exceptions import AprsParseError, OgnParseError
|
from ogn.parser.exceptions import AprsParseError, OgnParseError
|
||||||
|
|
||||||
|
|
||||||
def parse_aprs(message, reference_date=None):
|
def parse_aprs(message, reference_date=None, reference_time=None):
|
||||||
if reference_date is None:
|
if reference_date is None:
|
||||||
reference_date = datetime.utcnow()
|
now = datetime.utcnow()
|
||||||
|
reference_date = now.date()
|
||||||
|
reference_time = now.time()
|
||||||
|
|
||||||
match = re.search(PATTERN_APRS, message)
|
match = re.search(PATTERN_APRS, message)
|
||||||
if match:
|
if match:
|
||||||
return {'name': match.group('callsign'),
|
return {'name': match.group('callsign'),
|
||||||
'receiver_name': match.group('receiver'),
|
'receiver_name': match.group('receiver'),
|
||||||
'dstcall': match.group('dstcall'),
|
'dstcall': match.group('dstcall'),
|
||||||
'timestamp': createTimestamp(match.group('time'), reference_date),
|
'timestamp': createTimestamp(match.group('time'), reference_date, reference_time),
|
||||||
'latitude': parseAngle('0' + match.group('latitude') + (match.group('latitude_enhancement') or '0')) *
|
'latitude': parseAngle('0' + match.group('latitude') + (match.group('latitude_enhancement') or '0')) *
|
||||||
(-1 if match.group('latitude_sign') == 'S' else 1),
|
(-1 if match.group('latitude_sign') == 'S' else 1),
|
||||||
'symboltable': match.group('symbol_table'),
|
'symboltable': match.group('symbol_table'),
|
||||||
|
|
|
@ -16,12 +16,16 @@ def parseAngle(dddmmhht):
|
||||||
return float(dddmmhht[:3]) + float(dddmmhht[3:]) / 60
|
return float(dddmmhht[:3]) + float(dddmmhht[3:]) / 60
|
||||||
|
|
||||||
|
|
||||||
def createTimestamp(hhmmss, reference):
|
def createTimestamp(hhmmss, reference_date, reference_time=None):
|
||||||
packet_time = datetime.strptime(hhmmss, '%H%M%S').time()
|
packet_time = datetime.strptime(hhmmss, '%H%M%S').time()
|
||||||
timestamp = datetime.combine(reference, packet_time)
|
if reference_time is None:
|
||||||
delta = timestamp - reference
|
return datetime.combine(reference_date, packet_time)
|
||||||
|
else:
|
||||||
|
reference_datetime = datetime.combine(reference_date, reference_time)
|
||||||
|
timestamp = datetime.combine(reference_date, packet_time)
|
||||||
|
delta = timestamp - reference_datetime
|
||||||
|
|
||||||
# This function reconstructs the packet date from the timestamp and a reference time.
|
# This function reconstructs the packet date from the timestamp and a reference_datetime time.
|
||||||
# delta vs. packet date:
|
# delta vs. packet date:
|
||||||
# -24h -12h 0 +12h +24h
|
# -24h -12h 0 +12h +24h
|
||||||
# |-------------------------|---------------------|------------------------|----------------------|
|
# |-------------------------|---------------------|------------------------|----------------------|
|
||||||
|
@ -32,9 +36,9 @@ def createTimestamp(hhmmss, reference):
|
||||||
return timestamp
|
return timestamp
|
||||||
elif delta < timedelta(hours=-23, minutes=-30):
|
elif delta < timedelta(hours=-23, minutes=-30):
|
||||||
# Packet from next day, less than 30min from the future
|
# Packet from next day, less than 30min from the future
|
||||||
return datetime.combine(reference + timedelta(hours=+12), packet_time)
|
return datetime.combine(reference_datetime + timedelta(hours=+12), packet_time)
|
||||||
elif timedelta(hours=12) < delta:
|
elif timedelta(hours=12) < delta:
|
||||||
# Packet from previous day, less than 12h from the past
|
# Packet from previous day, less than 12h from the past
|
||||||
return datetime.combine(reference + timedelta(hours=-12), packet_time)
|
return datetime.combine(reference_datetime + timedelta(hours=-12), packet_time)
|
||||||
else:
|
else:
|
||||||
raise AmbigousTimeError(reference, packet_time)
|
raise AmbigousTimeError(reference_datetime, packet_time)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import unittest
|
import unittest
|
||||||
from datetime import datetime
|
from datetime import date, time, datetime
|
||||||
|
|
||||||
from ogn.parser.utils import parseAngle, createTimestamp
|
from ogn.parser.utils import parseAngle, createTimestamp
|
||||||
from ogn.parser.exceptions import AmbigousTimeError
|
from ogn.parser.exceptions import AmbigousTimeError
|
||||||
|
@ -11,21 +11,22 @@ class TestStringMethods(unittest.TestCase):
|
||||||
|
|
||||||
def test_createTimestamp(self):
|
def test_createTimestamp(self):
|
||||||
test_data = [
|
test_data = [
|
||||||
('000001', datetime(2015, 1, 10, 0, 0, 1), datetime(2015, 1, 10, 0, 0, 1)), # packet from current day (on the tick)
|
('000001', date(2015, 1, 10), time(0, 0, 1), datetime(2015, 1, 10, 0, 0, 1)), # packet from current day (on the tick)
|
||||||
('235959', datetime(2015, 1, 10, 0, 0, 1), datetime(2015, 1, 9, 23, 59, 59)), # packet from previous day (2 seconds old)
|
('235959', date(2015, 1, 10), time(0, 0, 1), datetime(2015, 1, 9, 23, 59, 59)), # packet from previous day (2 seconds old)
|
||||||
('110000', datetime(2015, 1, 10, 0, 0, 1), None), # packet 11 hours from future or 13 hours old
|
('110000', date(2015, 1, 10), time(0, 0, 1), None), # packet 11 hours from future or 13 hours old
|
||||||
('123500', datetime(2015, 1, 10, 23, 50, 0), datetime(2015, 1, 10, 12, 35, 0)), # packet from current day (11 hours old)
|
('123500', date(2015, 1, 10), time(23, 50, 0), datetime(2015, 1, 10, 12, 35, 0)), # packet from current day (11 hours old)
|
||||||
('000001', datetime(2015, 1, 10, 23, 50, 0), datetime(2015, 1, 11, 0, 0, 1)) # packet from next day (11 minutes from future)
|
('000001', date(2015, 1, 10), time(23, 50, 0), datetime(2015, 1, 11, 0, 0, 1)), # packet from next day (11 minutes from future)
|
||||||
|
('000001', date(2015, 1, 10), None, datetime(2015, 1, 10, 0, 0, 1)), # first packet of a specific day
|
||||||
|
('235959', date(2015, 1, 10), None, datetime(2015, 1, 10, 23, 59, 59)), # last packet of a specific day
|
||||||
]
|
]
|
||||||
|
|
||||||
for test in test_data:
|
for test in test_data:
|
||||||
if test[2]:
|
if test[3]:
|
||||||
timestamp = createTimestamp(test[0], reference=test[1])
|
timestamp = createTimestamp(test[0], reference_date=test[1], reference_time=test[2])
|
||||||
self.assertEqual(timestamp, test[2])
|
self.assertEqual(timestamp, test[3])
|
||||||
else:
|
else:
|
||||||
with self.assertRaises(AmbigousTimeError):
|
with self.assertRaises(AmbigousTimeError):
|
||||||
createTimestamp(test[0], reference=test[1])
|
createTimestamp(test[0], reference_date=test[1], reference_time=test[2])
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
Ładowanie…
Reference in New Issue