WSJT-X/all2cab.py

126 lines
3.9 KiB
Python
Raw Normal View History

import sys
from datetime import datetime
mycall="K1JT"
mygrid="FN20"
# Keyed with hiscall:
Freq={}
T0={}
RcvdExch={}
Grid={}
# Keyed with hiscall_band:
Staged={}
TimeLogged={}
QSOinProgress={}
# QSOinProgress bit values:
# 1 He called me
# 2 I called him
# 4 Received his exchange
# 8 Received his Roger
# 16 Sent Roger
# 32 Staged for logging
def isGrid(g):
"""Return True if g is a valid grid4 and not RR73"""
if len(g)!=4 or g=="RR73": return False
if ord(g[0:1])<ord('A') or ord(g[0:1])>ord('R'): return False
if ord(g[1:2])<ord('A') or ord(g[1:2])>ord('R'): return False
if ord(g[2:3])<ord('0') or ord(g[2:3])>ord('9'): return False
if ord(g[3:4])<ord('0') or ord(g[3:4])>ord('9'): return False
return True
if len(sys.argv)!=4:
print "Usage: python all2cab.py <mycall> <mygrid> <infile>"
print "Example: python all2cab.py K1JT FN20 all_wwdigi_2019.txt"
exit()
f=open(sys.argv[3],mode='r')
ss=f.readlines()
f.close
dt0=datetime.strptime(ss[0][0:13],"%y%m%d_%H%M%S")
iz=len(ss)
nqso=0
hiscall_band=""
for i in range(iz):
s=ss[i][0:80].strip()
dt=datetime.strptime(s[0:13],"%y%m%d_%H%M%S")
tx=" Tx " in s #True if this is my transmission
w=s.split()
if len(w)<10: continue
if w[7]=="CQ":
cq=True
if w[8].isalpha():
s=s.replace(" CQ "," CQ_")
w=s.split()
if len(w)<10: continue
c1=w[7]
c2=w[8]
c3=w[9]
roger = c3=="R"
if roger: c3=w[10]
cq = (c1=="CQ" or c1[0:3]=="CQ_")
if cq:
Grid[c2]=c3
hiscall=""
if tx and not cq:
hiscall=c1
if c1==mycall:
freq=int(1000.0*float(s[13:23])) + int((int(s[42:47]))/1000)
hiscall=c2
Freq[hiscall]=freq
MHz="%3d" % int(float(s[13:23]))
hiscall_band=hiscall+MHz
n=QSOinProgress.get(hiscall_band,0)
n = n | 1 #He called me
if roger or c3=="RR73" or c3=="RRR" or c3=="73":
n = n | 8 # Rcvd Roger
if isGrid(c3):
hisgrid=c3
RcvdExch[hiscall]=hisgrid
n = n | 4 #Received his exchange
else:
g=Grid.get(hiscall,"")
if isGrid(g):
RcvdExch[hiscall]=g
n = n | 4 #Received his exchange
QSOinProgress[hiscall_band]=n
if len(hiscall)>=3:
MHz="%3d" % int(float(s[13:23]))
hiscall_band=hiscall+MHz
if tx:
n=QSOinProgress.get(hiscall_band,0)
n = n | 2 #I called him
if roger or c3=="RR73" or c3=="RRR" or c3=="73":
n = n | 4 | 16 #Rcvd Exch, Sent Roger
if c3=="RR73" or c3=="RRR" or c3=="73":
n = n | 8 #Rcvd Exch, Sent Roger
QSOinProgress[hiscall_band]=n
T0[hiscall]=dt
if len(hiscall_band)<5 or len(hiscall)<3: continue
if QSOinProgress.get(hiscall_band,0)>=31:
n=QSOinProgress.get(hiscall_band,0)
n = n | 32
QSOinProgress[hiscall_band]=n
t=str(T0[hiscall])[0:16]
t=t[0:13] + t[14:16]
buf="QSO: %5d DG %s %-10s %s %-10s %s" % (Freq[hiscall],t,\
mycall,mygrid,hiscall,RcvdExch.get(hiscall," "))
MHz="%3d" % int(float(s[13:23]))
hiscall_band=hiscall+MHz
t=Staged.get(hiscall_band,"")
time_diff=-1
if TimeLogged.get(hiscall_band,0)!=0:
time_diff=(T0[hiscall] - TimeLogged[hiscall_band]).total_seconds()
if time_diff == -1 or time_diff > 180: #Log only once within 3 min
Staged[hiscall_band]=buf #Staged for logging
nqso=nqso+1
TimeLogged[hiscall_band]=T0[hiscall]
print buf #For now, log anything staged
del QSOinProgress[hiscall_band]