Browse Source

tested redsea, found RDS spec; table: decode RT only when displayed, store raw byte-string, emit TMC signals only when tmc log is displayed

master
Clemens Richter 9 years ago
parent
commit
5874367057
  1. 2
      grc/crfa_rds_parser_table_qt.xml
  2. 45
      python/rds_parser_table_qt.py

2
grc/crfa_rds_parser_table_qt.xml

@ -12,7 +12,7 @@
#set $label = '"%s"'%$id #set $label = '"%s"'%$id
#end if #end if
$(signals) = rds_parser_table_qt_Signals() $(signals) = rds_parser_table_qt_Signals()
self.$(id) = crfa.rds_parser_table_qt($(signals),$nPorts,self.set_$(freq_tune),$freq_tune,$log, $debug,$workdir,$writeDB) self.$(id) = crfa.rds_parser_table_qt($(signals),$nPorts,self.set_$(freq_tune),$freq_tune,$log, $debug,$workdir,$writeDB,$showTMC)
$(win) = rds_parser_table_qt_Widget($signals, $label,self.$(id),$showTMC) $(win) = rds_parser_table_qt_Widget($signals, $label,self.$(id),$showTMC)
$(gui_hint()($win))</make> $(gui_hint()($win))</make>
<callback>set_freq_tune($freq_tune);</callback> <callback>set_freq_tune($freq_tune);</callback>

45
python/rds_parser_table_qt.py

@ -743,7 +743,7 @@ class rds_parser_table_qt(gr.sync_block):#START
if self.writeDB: if self.writeDB:
#self.db.commit() #self.db.commit()
self.db.close() self.db.close()
def __init__(self,signals,nPorts,slot,freq,log,debug,workdir,writeDB): def __init__(self,signals,nPorts,slot,freq,log,debug,workdir,writeDB,showTMC):
#QObject.__init__() #QObject.__init__()
gr.sync_block.__init__(self, gr.sync_block.__init__(self,
name="RDS Table", name="RDS Table",
@ -763,6 +763,7 @@ class rds_parser_table_qt(gr.sync_block):#START
self.log=log self.log=log
self.debug=debug self.debug=debug
self.writeDB=writeDB self.writeDB=writeDB
self.showTMC=showTMC
self.signals=signals self.signals=signals
self.RDS_data={} self.RDS_data={}
self.change_freq_tune=slot self.change_freq_tune=slot
@ -985,8 +986,8 @@ class rds_parser_table_qt(gr.sync_block):#START
self.RDS_data[PI]["blockcounts"]["any"]+=1 self.RDS_data[PI]["blockcounts"]["any"]+=1
if self.RDS_data[PI]["blockcounts"]["any"]==5: if self.RDS_data[PI]["blockcounts"]["any"]==5:
self.RDS_data[PI]["blockcounts"]["any"]=0 self.RDS_data[PI]["blockcounts"]["any"]=0
t=(str(PI),groupType,self.RDS_data[PI]["blockcounts"][groupType])#TODO only update DB every few seconds
if self.writeDB: if self.writeDB:
t=(str(PI),groupType,self.RDS_data[PI]["blockcounts"][groupType])#TODO only update DB every few seconds
db.execute("INSERT OR REPLACE INTO grouptypeCounts (PI,grouptype,count) VALUES (?,?,?)",t) db.execute("INSERT OR REPLACE INTO grouptypeCounts (PI,grouptype,count) VALUES (?,?,?)",t)
dots="."*self.RDS_data[PI]["blockcounts"]["any"] dots="."*self.RDS_data[PI]["blockcounts"]["any"]
self.RDS_data[PI]["TP"]=TP self.RDS_data[PI]["TP"]=TP
@ -1180,7 +1181,9 @@ class rds_parser_table_qt(gr.sync_block):#START
# self.RDS_data[PI]["RT_last_ab_flag"] =ab_flag # self.RDS_data[PI]["RT_last_ab_flag"] =ab_flag
self.RDS_data[PI]["RT_last_ab_flag"] =ab_flag self.RDS_data[PI]["RT_last_ab_flag"] =ab_flag
segment=self.decode_chars(chr(array[4])+chr(array[5])+chr(array[6])+chr(array[7])) #segment=self.decode_chars(chr(array[4])+chr(array[5])+chr(array[6])+chr(array[7]))
segment=chr(array[4])+chr(array[5])+chr(array[6])+chr(array[7])#EDIT:latedecode
#print("RT:adress: %d, segment:%s"%(adr,segment)) #print("RT:adress: %d, segment:%s"%(adr,segment))
#self.signals.DataUpdateEvent.emit({'col':5,'row':port,'PI':PI,'groupType':groupType,'adress':adr,'segment':segment}) #self.signals.DataUpdateEvent.emit({'col':5,'row':port,'PI':PI,'groupType':groupType,'adress':adr,'segment':segment})
text_list=list(self.RDS_data[PI]["RT_"+str(ab_flag)]["RT"]) text_list=list(self.RDS_data[PI]["RT_"+str(ab_flag)]["RT"])
@ -1227,19 +1230,20 @@ class rds_parser_table_qt(gr.sync_block):#START
self.RDS_data[PI]["internals"]["RT_history"].append(l) self.RDS_data[PI]["internals"]["RT_history"].append(l)
if len(self.RDS_data[PI]["internals"]["RT_history"])>10:#only store last 10 RTs if len(self.RDS_data[PI]["internals"]["RT_history"])>10:#only store last 10 RTs
self.RDS_data[PI]["internals"]["RT_history"].pop(0) self.RDS_data[PI]["internals"]["RT_history"].pop(0)
t=(str(datetime.now()),PI,self.RDS_data[PI]["PSN"],"RT",rt)
if self.writeDB: if self.writeDB:
t=(str(datetime.now()),PI,self.RDS_data[PI]["PSN"],"RT",self.decode_chars(rt))
db.execute("INSERT INTO data (time,PI,PSN,dataType,data) VALUES (?,?,?,?,?)",t) db.execute("INSERT INTO data (time,PI,PSN,dataType,data) VALUES (?,?,?,?,?)",t)
self.RDS_data[PI]["internals"]["last_valid_rt"]=rt self.RDS_data[PI]["internals"]["last_valid_rt"]=rt
try:#save rt+ if it exist try:#save rt+ if it exist
if self.writeDB: if self.writeDB:
t=(str(datetime.now()),PI,self.RDS_data[PI]["PSN"],"RT+",str(self.RDS_data[PI]["RT+"])) t=(str(datetime.now()),PI,self.RDS_data[PI]["PSN"],"RT+",self.decode_chars(str(self.RDS_data[PI]["RT+"])))
db.execute("INSERT INTO data (time,PI,PSN,dataType,data) VALUES (?,?,?,?,?)",t) db.execute("INSERT INTO data (time,PI,PSN,dataType,data) VALUES (?,?,?,?,?)",t)
except KeyError: except KeyError:
pass#no rt+ -> dont save pass#no rt+ -> dont save
else: else:
textcolor="gray" textcolor="gray"
formatted_text=self.color_text(self.RDS_data[PI]["RT_"+str(ab_flag)]["RT"],adr*4,adr*4+4,textcolor,segmentcolor) display_text=self.decode_chars(self.RDS_data[PI]["RT_"+str(ab_flag)]["RT"].split("\r")[0])
formatted_text=self.color_text(display_text,adr*4,adr*4+4,textcolor,segmentcolor)
rtcol=self.colorder.index('text') rtcol=self.colorder.index('text')
self.signals.DataUpdateEvent.emit({'col':rtcol,'row':port,'PI':PI,'string':formatted_text}) self.signals.DataUpdateEvent.emit({'col':rtcol,'row':port,'PI':PI,'string':formatted_text})
@ -1580,6 +1584,7 @@ class rds_parser_table_qt(gr.sync_block):#START
if self.debug: if self.debug:
print("8A without 3A on PI:%s"%PI) print("8A without 3A on PI:%s"%PI)
#else:#other group #else:#other group
#print("group of type %s not decoded on station %s"% (groupType,PI))
if 1==1: if 1==1:
#printdelay=50 #printdelay=50
printdelay=500 printdelay=500
@ -1597,7 +1602,7 @@ class rds_parser_table_qt(gr.sync_block):#START
print("RT+:",end="") print("RT+:",end="")
pp.pprint(self.RDS_data[key]["RT+"]) pp.pprint(self.RDS_data[key]["RT+"])
self.printcounter=0 self.printcounter=0
#print("group of type %s not decoded on station %s"% (groupType,PI))
pr.disable() #disabled-internal-profiling pr.disable() #disabled-internal-profiling
#end of handle_msg #end of handle_msg
@ -1610,17 +1615,15 @@ class rds_parser_table_qt(gr.sync_block):#START
reflocs=tmc_msg.location.reflocs reflocs=tmc_msg.location.reflocs
if not self.TMC_data.has_key(tmc_hash):#if message new if not self.TMC_data.has_key(tmc_hash):#if message new
try: try:
#message_string="TMC-message,event:%s lcn:%i,location:%s,reflocs:%s, station:%s"%(str(tmc_msg.event),tmc_msg.location.lcn,tmc_msg.location,reflocs,self.RDS_data[PI]["PSN"])
#message_string=tmc_msg.log_string()
self.TMC_data[tmc_hash]=tmc_msg self.TMC_data[tmc_hash]=tmc_msg
self.signals.DataUpdateEvent.emit({'TMC_log':tmc_msg,'multi_str':tmc_msg.multi_str()}) if self.showTMC:
self.signals.DataUpdateEvent.emit({'TMC_log':tmc_msg,'multi_str':tmc_msg.multi_str()})
#t=(str(datetime.now()),PI,self.RDS_data[PI]["PSN"],"ALERT-C",message_string.decode("utf-8")) #t=(str(datetime.now()),PI,self.RDS_data[PI]["PSN"],"ALERT-C",message_string.decode("utf-8"))
#self.db.execute("INSERT INTO data (time,PI,PSN,dataType,data) VALUES (?,?,?,?,?)",t) #self.db.execute("INSERT INTO data (time,PI,PSN,dataType,data) VALUES (?,?,?,?,?)",t)
timestring=self.RDS_data[PI]["time"]["timestring"] timestring=self.RDS_data[PI]["time"]["timestring"]
#message_string="%s ,locname:%s, reflocs:%s"%(str(tmc_msg.event),tmc_msg.location,reflocs)
message_string=tmc_msg.db_string()
t=(tmc_hash,timestring,PI, tmc_F,tmc_msg.event.ecn,int(tmc_msg.location.lcn),tmc_msg.tmc_DP,tmc_msg.tmc_D,tmc_msg.tmc_dir,tmc_msg.tmc_extent,message_string.decode("utf-8"),tmc_msg.multi_str().decode("utf-8"),str(tmc_msg.debug_data))
if self.writeDB: if self.writeDB:
message_string=tmc_msg.db_string()
t=(tmc_hash,timestring,PI, tmc_F,tmc_msg.event.ecn,int(tmc_msg.location.lcn),tmc_msg.tmc_DP,tmc_msg.tmc_D,tmc_msg.tmc_dir,tmc_msg.tmc_extent,message_string.decode("utf-8"),tmc_msg.multi_str().decode("utf-8"),str(tmc_msg.debug_data))
self.db.execute("INSERT INTO TMC (hash,time,PI, F,event,location,DP,div,dir,extent,text,multi,rawmgm) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)",t) self.db.execute("INSERT INTO TMC (hash,time,PI, F,event,location,DP,div,dir,extent,text,multi,rawmgm) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)",t)
except Exception as e: except Exception as e:
print(e) print(e)
@ -1665,17 +1668,23 @@ class rds_parser_table_qt(gr.sync_block):#START
#charlist=list(charstring) #charlist=list(charstring)
return_string="" return_string=""
for i,char in enumerate(charstring): for i,char in enumerate(charstring):
#split byte
if ord(char)<= 0b01111111: alnr=(ord(char)&0xF0 )>>4 #upper 4 bit
index=ord(char)&0x0F #lower 4 bit
if ord(char)<= 0b00011111:#control code
if ord(char)==0x0D or ord(char)==0x00:#end of message SWR uses: \r\0\0\0 for last block (\0 fill 4 char segment)
#return_string+="\r"
return_string+=char
else:
return_string+="{%02X}"%ord(char)#output control code
elif ord(char)<= 0b01111111:
#charlist[i]=char #use ascii #charlist[i]=char #use ascii
return_string+=char return_string+=char
else: else:
#split byte
alnr=(ord(char)&0xF0 )>>4 #upper 4 bit
index=ord(char)&0x0F #lower 4 bit
try: try:
#charlist[i]=alphabet[alnr][index] #charlist[i]=alphabet[alnr][index]
return_string+=alphabet[alnr][index] return_string+=alphabet[alnr][index]
return_string+=unichr(ord(char))#TODO remove test code and properly decide for UTF8 or EBU charset
except KeyError: except KeyError:
return_string+="?%02X?"%ord(char) return_string+="?%02X?"%ord(char)
print("symbol not decoded: "+"?%02X?"%ord(char)+"in string:"+return_string) print("symbol not decoded: "+"?%02X?"%ord(char)+"in string:"+return_string)

Loading…
Cancel
Save