-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
64 lines (54 loc) · 2.46 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import re
from typing import TypedDict, Dict
class ConfDict(TypedDict):
my_call: str
my_grid: str
LogItem = Dict[str, str]
# Change here to fit your condition
my_conf = ConfDict({
'my_call': 'BI1MHK',
'my_grid': 'ON80',
})
pat_time = r'(?P<mo>\d\d)\.(?P<day>\d\d)\.(?P<yr>\d\d) (?P<hr>\d\d):(?P<min>\d\d):(?P<sec>\d\d)\.\d+'
pat_call = r'(?P<dx_call>[^ ]+)'
log_tmp = '''<QSO_DATE:8>{date}<TIME_ON:6>{time}<CALL:{dx_call_len}>{dx_call}<RST_SENT:3>599<RST_RCVD:3>599<FREQ:7>435.310<MODE:3>PKT<PROP_MODE:3>SAT<SAT_NAME:6>IO-117<BAND:4>70CM<SAT_MODE:3>U/U<STATION_CALLSIGN:{my_call_len}>{my_call}<MY_GRIDSQUARE:{my_grid_len}>{my_grid}<EOR>\n'''
def writeLog(log: Dict[str, LogItem], conf: ConfDict):
print('Callsigns included: ', list(log.keys()))
with open('recovered.adi', 'w') as f:
f.write('# Generated by Kina GCLogRecover\n')
f.write('# https://clzls.github.io/\n')
f.write('<PROGRAMID:14>KinaRailLogger<ADIF_VER:5>3.1.4')
f.write('<EOH>\n')
for dct in log.values():
dct.update(conf)
dct['date'] = '20{yr}{mo}{day}'.format_map(dct)
dct['time'] = '{hr}{min}{sec}'.format_map(dct)
assert len(dct['date']) == 8
assert len(dct['time']) == 6
dct['dx_call_len'] = len(dct['dx_call'])
dct['my_call_len'] = len(conf['my_call'])
dct['my_grid_len'] = len(conf['my_grid'])
f.write(log_tmp.format_map(dct))
def isMultiCall(log1, log2: LogItem) -> bool:
return abs(
int(log1['hr']) * 60 + int(log1['min']) - (int(log2['hr']) * 60 + int(log2['min']))
) > 3
def main(conf: ConfDict):
log: Dict[str, dict] = {}
s73 = re.compile(f'^{pat_time} {conf["my_call"]} {pat_call} .*73 .*$')
r73 = re.compile(f'^{pat_time} {pat_call} {conf["my_call"]} .*73 .*$')
with open('monitor.log', 'r') as f:
for x in f:
if match := s73.match(x):
dct = match.groupdict()
if dct['dx_call'] in log and isMultiCall(log[dct['dx_call']], dct):
print('Multi call!', dct, log[dct['dx_call']])
log[dct['dx_call']] = dct
elif match := r73.match(x):
dct = match.groupdict()
if dct['dx_call'] in log and isMultiCall(log[dct['dx_call']], dct):
print('Multi call!', dct, log[dct['dx_call']])
log[dct['dx_call']] = dct
writeLog(log, conf)
if __name__ == '__main__':
main(my_conf)