|
|
|
@ -176,7 +176,7 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
f=open(self.workdir+'pty-list.csv') |
|
|
|
f=open(self.workdir+'pty-list.csv') |
|
|
|
reader = csv.reader(f, delimiter=',', quotechar='"') |
|
|
|
reader = csv.reader(f, delimiter=',', quotechar='"') |
|
|
|
next(reader)#skip header |
|
|
|
next(reader)#skip header |
|
|
|
self.pty_dict=dict((int(rows[0]),unicode(rows[1],errors='ignore')) |
|
|
|
self.pty_dict=dict((int(rows[0]),rows[1]) |
|
|
|
for rows in reader) |
|
|
|
for rows in reader) |
|
|
|
f.close() |
|
|
|
f.close() |
|
|
|
self.minute_count=0 |
|
|
|
self.minute_count=0 |
|
|
|
@ -269,7 +269,7 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
self.RDS_data[PI]["time"]={"timestring":"88:88","datestring":"00-00-0000","datetime":None} |
|
|
|
self.RDS_data[PI]["time"]={"timestring":"88:88","datestring":"00-00-0000","datetime":None} |
|
|
|
self.RDS_data[PI]["wrong_block_ratio"]=1#100% |
|
|
|
self.RDS_data[PI]["wrong_block_ratio"]=1#100% |
|
|
|
def handle_msg(self, msg, port): #port from 0 to 3 |
|
|
|
def handle_msg(self, msg, port): #port from 0 to 3 |
|
|
|
if pmt.to_long(pmt.car(msg))==1: #sync/desync messages from RDS decoder |
|
|
|
if pmt.is_integer(pmt.car(msg)) and pmt.to_long(pmt.car(msg))==1: #sync/desync messages from RDS decoder |
|
|
|
synced=pmt.to_python(pmt.cdr(msg)) |
|
|
|
synced=pmt.to_python(pmt.cdr(msg)) |
|
|
|
#print("port:%i, data: %s"%(port,data)) |
|
|
|
#print("port:%i, data: %s"%(port,data)) |
|
|
|
self.decoders[port]['synced']=synced |
|
|
|
self.decoders[port]['synced']=synced |
|
|
|
@ -280,21 +280,21 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
wrong_block_ratio=1#100% |
|
|
|
wrong_block_ratio=1#100% |
|
|
|
self.RDS_data[PI]["wrong_block_ratio"]=wrong_block_ratio |
|
|
|
self.RDS_data[PI]["wrong_block_ratio"]=wrong_block_ratio |
|
|
|
self.signals.DataUpdateEvent.emit({'PI':PI,'wrong_block_ratio':wrong_block_ratio,'dots':dots}) |
|
|
|
self.signals.DataUpdateEvent.emit({'PI':PI,'wrong_block_ratio':wrong_block_ratio,'dots':dots}) |
|
|
|
elif pmt.to_long(pmt.car(msg))==2: #wrong_block_ratio messages from RDS decoder |
|
|
|
elif pmt.is_integer(pmt.car(msg)) and pmt.to_long(pmt.car(msg))==2: #wrong_block_ratio messages from RDS decoder |
|
|
|
wrong_block_ratio=pmt.to_python(pmt.cdr(msg)) |
|
|
|
wrong_block_ratio=pmt.to_python(pmt.cdr(msg)) |
|
|
|
PI=self.decoders[port]['PI'] |
|
|
|
PI=self.decoders[port]['PI'] |
|
|
|
if self.RDS_data.has_key(PI): |
|
|
|
if self.RDS_data.has_key(PI): |
|
|
|
dots="."*self.RDS_data[PI]["blockcounts"]["any"] |
|
|
|
dots="."*self.RDS_data[PI]["blockcounts"]["any"] |
|
|
|
self.RDS_data[PI]["wrong_block_ratio"]=wrong_block_ratio |
|
|
|
self.RDS_data[PI]["wrong_block_ratio"]=wrong_block_ratio |
|
|
|
self.signals.DataUpdateEvent.emit({'PI':PI,'wrong_block_ratio':wrong_block_ratio,'dots':dots}) |
|
|
|
self.signals.DataUpdateEvent.emit({'PI':PI,'wrong_block_ratio':wrong_block_ratio,'dots':dots}) |
|
|
|
elif pmt.to_long(pmt.car(msg))==3: #carrier quality message |
|
|
|
elif pmt.is_integer(pmt.car(msg)) and pmt.to_long(pmt.car(msg))==3: #carrier quality message |
|
|
|
pilot_SNR=pmt.to_long(pmt.cdr(msg)) |
|
|
|
pilot_SNR=pmt.to_long(pmt.cdr(msg)) |
|
|
|
self.decoders[port]['pilot_SNR']=pilot_SNR |
|
|
|
self.decoders[port]['pilot_SNR']=pilot_SNR |
|
|
|
self.update_freq() |
|
|
|
self.update_freq() |
|
|
|
PI=self.decoders[port]['PI'] |
|
|
|
PI=self.decoders[port]['PI'] |
|
|
|
if self.RDS_data.has_key(PI): |
|
|
|
if self.RDS_data.has_key(PI): |
|
|
|
self.signals.DataUpdateEvent.emit({'PI':PI,'pilot_SNR':pilot_SNR}) |
|
|
|
self.signals.DataUpdateEvent.emit({'PI':PI,'pilot_SNR':pilot_SNR}) |
|
|
|
elif pmt.to_long(pmt.car(msg))==4: #mode messages from RDS sync_decim |
|
|
|
elif pmt.is_integer(pmt.car(msg)) and pmt.to_long(pmt.car(msg))==4: #mode messages from RDS sync_decim |
|
|
|
mode=pmt.to_python(pmt.cdr(msg)) |
|
|
|
mode=pmt.to_python(pmt.cdr(msg)) |
|
|
|
self.decoders[port]['decim_mode']=mode |
|
|
|
self.decoders[port]['decim_mode']=mode |
|
|
|
self.update_freq() |
|
|
|
self.update_freq() |
|
|
|
@ -322,11 +322,11 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
groupNR=array[2]&0b11110000 |
|
|
|
groupNR=array[2]&0b11110000 |
|
|
|
groupVar=array[2]&0b00001000 |
|
|
|
groupVar=array[2]&0b00001000 |
|
|
|
if (groupVar == 0): |
|
|
|
if (groupVar == 0): |
|
|
|
groupType=str(groupNR >> 4)+"A" |
|
|
|
groupType=bytes(groupNR >> 4)+"A" |
|
|
|
else: |
|
|
|
else: |
|
|
|
groupType=str(groupNR >> 4)+"B" |
|
|
|
groupType=bytes(groupNR >> 4)+"B" |
|
|
|
#if self.debug: |
|
|
|
#if self.debug: |
|
|
|
#PI=str(port)+"_%02X%02X" %(array[0],array[1]) |
|
|
|
#PI=bytes(port)+"_%02X%02X" %(array[0],array[1]) |
|
|
|
#else: |
|
|
|
#else: |
|
|
|
#PI="%02X%02X" %(array[0],array[1]) |
|
|
|
#PI="%02X%02X" %(array[0],array[1]) |
|
|
|
PI="%02X%02X" %(array[0],array[1]) |
|
|
|
PI="%02X%02X" %(array[0],array[1]) |
|
|
|
@ -365,7 +365,7 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
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 |
|
|
|
if self.writeDB: |
|
|
|
if self.writeDB: |
|
|
|
t=(str(PI),groupType,self.RDS_data[PI]["blockcounts"][groupType])#TODO only update DB every few seconds |
|
|
|
t=(bytes(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 |
|
|
|
@ -380,7 +380,7 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
|
|
|
|
|
|
|
|
#add any received groups to DB (slow) |
|
|
|
#add any received groups to DB (slow) |
|
|
|
#content="%02X%02X%02X%02X%02X" %(array[3]&0x1f,array[4],array[5],array[6],array[7]) |
|
|
|
#content="%02X%02X%02X%02X%02X" %(array[3]&0x1f,array[4],array[5],array[6],array[7]) |
|
|
|
#t=(str(datetime.now()),PI,self.RDS_data[PI]["PSN"],groupType,content) |
|
|
|
#t=(bytes(datetime.now()),PI,self.RDS_data[PI]["PSN"],groupType,content) |
|
|
|
#db.execute("INSERT INTO groups VALUES (?,?,?,?,?)",t) |
|
|
|
#db.execute("INSERT INTO groups VALUES (?,?,?,?,?)",t) |
|
|
|
|
|
|
|
|
|
|
|
if (groupType == "0A"):#AF PSN |
|
|
|
if (groupType == "0A"):#AF PSN |
|
|
|
@ -396,7 +396,7 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
MS=(array[3]>>3)&0x1 |
|
|
|
MS=(array[3]>>3)&0x1 |
|
|
|
self.RDS_data[PI]["TA"]=TA |
|
|
|
self.RDS_data[PI]["TA"]=TA |
|
|
|
#style='font-family:Courier New;color:%s' |
|
|
|
#style='font-family:Courier New;color:%s' |
|
|
|
flag_string="<span style=''>TP:%i, TA:%i, MS:%i, DI:%s</span>"%(TP,TA,MS,str(self.RDS_data[PI]["DI"])) |
|
|
|
flag_string="<span style=''>TP:%i, TA:%i, MS:%i, DI:%s</span>"%(TP,TA,MS,bytes(self.RDS_data[PI]["DI"])) |
|
|
|
pty_colored=self.RDS_data[PI]["PTY"] |
|
|
|
pty_colored=self.RDS_data[PI]["PTY"] |
|
|
|
if TP==1: |
|
|
|
if TP==1: |
|
|
|
if TA==1: |
|
|
|
if TA==1: |
|
|
|
@ -486,7 +486,7 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
#textcolor="black" |
|
|
|
#textcolor="black" |
|
|
|
textcolor=""#use default color (white if background is black) |
|
|
|
textcolor=""#use default color (white if background is black) |
|
|
|
if not self.RDS_data[PI]["internals"]["last_valid_psn"]==self.RDS_data[PI]["PSN"]:#ignore duplicates |
|
|
|
if not self.RDS_data[PI]["internals"]["last_valid_psn"]==self.RDS_data[PI]["PSN"]:#ignore duplicates |
|
|
|
t=(str(datetime.now()),PI,self.RDS_data[PI]["PSN"],"PSN_valid",self.RDS_data[PI]["PSN"]) |
|
|
|
t=(bytes(datetime.now()),PI,self.RDS_data[PI]["PSN"],"PSN_valid",self.RDS_data[PI]["PSN"]) |
|
|
|
if self.writeDB: |
|
|
|
if self.writeDB: |
|
|
|
db.execute("INSERT INTO data (time,PI,PSN,dataType,data) VALUES (?,?,?,?,?)",t) |
|
|
|
db.execute("INSERT INTO data (time,PI,PSN,dataType,data) VALUES (?,?,?,?,?)",t) |
|
|
|
t=(self.RDS_data[PI]["PSN"],PI) |
|
|
|
t=(self.RDS_data[PI]["PSN"],PI) |
|
|
|
@ -511,12 +511,12 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
PIN_valid= PIN_day in range(1,32) and PIN_hour in range(0,24) and PIN_minute in range(0,60) |
|
|
|
PIN_valid= PIN_day in range(1,32) and PIN_hour in range(0,24) and PIN_minute in range(0,60) |
|
|
|
if PIN_valid: |
|
|
|
if PIN_valid: |
|
|
|
self.RDS_data[PI]["PIN"]=[PIN_day,PIN_hour,PIN_minute] |
|
|
|
self.RDS_data[PI]["PIN"]=[PIN_day,PIN_hour,PIN_minute] |
|
|
|
data_string="radio paging code:%i,LA:%i,variant:%i,SLC:%04X,PIN (valid):%s "%(radio_paging,LA,variant,SLC,str([PIN_day,PIN_hour,PIN_minute])) |
|
|
|
data_string="radio paging code:%i,LA:%i,variant:%i,SLC:%04X,PIN (valid):%s "%(radio_paging,LA,variant,SLC,bytes([PIN_day,PIN_hour,PIN_minute])) |
|
|
|
else: |
|
|
|
else: |
|
|
|
data_string="radio paging code:%i,LA:%i,variant:%i,SLC:%04X,PIN:%04X "%(radio_paging,LA,variant,SLC,PIN) |
|
|
|
data_string="radio paging code:%i,LA:%i,variant:%i,SLC:%04X,PIN:%04X "%(radio_paging,LA,variant,SLC,PIN) |
|
|
|
#%02X%02X%02X%02X%02X |
|
|
|
#%02X%02X%02X%02X%02X |
|
|
|
|
|
|
|
|
|
|
|
t=(str(datetime.now()),PI,self.RDS_data[PI]["PSN"],"PIN",data_string) |
|
|
|
t=(bytes(datetime.now()),PI,self.RDS_data[PI]["PSN"],"PIN",data_string) |
|
|
|
if self.writeDB: |
|
|
|
if self.writeDB: |
|
|
|
db.execute("INSERT INTO data (time,PI,PSN,dataType,data) VALUES (?,?,?,?,?)",t) |
|
|
|
db.execute("INSERT INTO data (time,PI,PSN,dataType,data) VALUES (?,?,?,?,?)",t) |
|
|
|
if self.debug and not variant==0:#print if not seen before |
|
|
|
if self.debug and not variant==0:#print if not seen before |
|
|
|
@ -558,7 +558,7 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
segment=chr(array[4])+chr(array[5])+chr(array[6])+chr(array[7])#EDIT:latedecode |
|
|
|
segment=chr(array[4])+chr(array[5])+chr(array[6])+chr(array[7])#EDIT:latedecode |
|
|
|
|
|
|
|
|
|
|
|
#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_"+bytes(ab_flag)]["RT"]) |
|
|
|
#determine text length: |
|
|
|
#determine text length: |
|
|
|
try: |
|
|
|
try: |
|
|
|
text_end=text_list.index('\r') |
|
|
|
text_end=text_list.index('\r') |
|
|
|
@ -576,27 +576,27 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
text_list=['_']*64 #clear text |
|
|
|
text_list=['_']*64 #clear text |
|
|
|
text_list[adr*4:adr*4+4]=segment |
|
|
|
text_list[adr*4:adr*4+4]=segment |
|
|
|
#reset stored text: |
|
|
|
#reset stored text: |
|
|
|
#self.RDS_data[PI]["RT_"+str(ab_flag)]["RT"]="_"*64 #done in text_list |
|
|
|
#self.RDS_data[PI]["RT_"+bytes(ab_flag)]["RT"]="_"*64 #done in text_list |
|
|
|
self.RDS_data[PI]["RT_"+str(ab_flag)]["RT_valid"]=[False]*64 |
|
|
|
self.RDS_data[PI]["RT_"+bytes(ab_flag)]["RT_valid"]=[False]*64 |
|
|
|
#predict RT from last texts: |
|
|
|
#predict RT from last texts: |
|
|
|
for rt in self.RDS_data[PI]["internals"]["RT_history"]: |
|
|
|
for rt in self.RDS_data[PI]["internals"]["RT_history"]: |
|
|
|
if rt[adr*4:adr*4+4]==list(segment): |
|
|
|
if rt[adr*4:adr*4+4]==list(segment): |
|
|
|
self.RDS_data[PI]["RT_"+str(ab_flag)]["RT"]="".join(rt) |
|
|
|
self.RDS_data[PI]["RT_"+bytes(ab_flag)]["RT"]="".join(rt) |
|
|
|
predicted=True |
|
|
|
predicted=True |
|
|
|
|
|
|
|
|
|
|
|
self.RDS_data[PI]["RT_"+str(ab_flag)]["RT_valid"][adr*4:adr*4+4]=[True] *4 |
|
|
|
self.RDS_data[PI]["RT_"+bytes(ab_flag)]["RT_valid"][adr*4:adr*4+4]=[True] *4 |
|
|
|
if not predicted: |
|
|
|
if not predicted: |
|
|
|
self.RDS_data[PI]["RT_"+str(ab_flag)]["RT"]="".join(text_list) |
|
|
|
self.RDS_data[PI]["RT_"+bytes(ab_flag)]["RT"]="".join(text_list) |
|
|
|
|
|
|
|
|
|
|
|
#determine if (new) text is valid |
|
|
|
#determine if (new) text is valid |
|
|
|
self.RDS_data[PI]["RT_"+str(ab_flag)]["RT_all_valid"]=True |
|
|
|
self.RDS_data[PI]["RT_"+bytes(ab_flag)]["RT_all_valid"]=True |
|
|
|
for i in range(0,text_end): |
|
|
|
for i in range(0,text_end): |
|
|
|
if (not self.RDS_data[PI]["RT_"+str(ab_flag)]["RT_valid"][i]): |
|
|
|
if (not self.RDS_data[PI]["RT_"+bytes(ab_flag)]["RT_valid"][i]): |
|
|
|
self.RDS_data[PI]["RT_"+str(ab_flag)]["RT_all_valid"] = False |
|
|
|
self.RDS_data[PI]["RT_"+bytes(ab_flag)]["RT_all_valid"] = False |
|
|
|
if(self.RDS_data[PI]["RT_"+str(ab_flag)]["RT_all_valid"]): |
|
|
|
if(self.RDS_data[PI]["RT_"+bytes(ab_flag)]["RT_all_valid"]): |
|
|
|
#textcolor="black" |
|
|
|
#textcolor="black" |
|
|
|
textcolor=""#use default color (white if background is black) |
|
|
|
textcolor=""#use default color (white if background is black) |
|
|
|
l=list(self.RDS_data[PI]["RT_"+str(ab_flag)]["RT"]) |
|
|
|
l=list(self.RDS_data[PI]["RT_"+bytes(ab_flag)]["RT"]) |
|
|
|
rt="".join(l[0:text_end])#remove underscores(default symbol) after line end marker |
|
|
|
rt="".join(l[0:text_end])#remove underscores(default symbol) after line end marker |
|
|
|
if not self.RDS_data[PI]["internals"]["last_valid_rt"]==rt:#ignore duplicates #TODO add 2nd order duplicates ABAB |
|
|
|
if not self.RDS_data[PI]["internals"]["last_valid_rt"]==rt:#ignore duplicates #TODO add 2nd order duplicates ABAB |
|
|
|
self.RDS_data[PI]["internals"]["RT_history"].append(l) |
|
|
|
self.RDS_data[PI]["internals"]["RT_history"].append(l) |
|
|
|
@ -604,23 +604,23 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
self.RDS_data[PI]["internals"]["RT_history"].pop(0) |
|
|
|
self.RDS_data[PI]["internals"]["RT_history"].pop(0) |
|
|
|
if self.writeDB: |
|
|
|
if self.writeDB: |
|
|
|
t=( |
|
|
|
t=( |
|
|
|
str(datetime.now()),PI,self.RDS_data[PI]["PSN"], |
|
|
|
bytes(datetime.now()),PI,self.RDS_data[PI]["PSN"], |
|
|
|
"RT",self.decode_chars(rt) |
|
|
|
"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, |
|
|
|
t=(bytes(datetime.now()),PI, |
|
|
|
self.RDS_data[PI]["PSN"],"RT+", |
|
|
|
self.RDS_data[PI]["PSN"],"RT+", |
|
|
|
self.decode_chars(str(self.RDS_data[PI]["RT+"])) |
|
|
|
self.decode_chars(bytes(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" |
|
|
|
display_text=self.decode_chars(self.RDS_data[PI]["RT_"+str(ab_flag)]["RT"].split("\r")[0]) |
|
|
|
display_text=self.decode_chars(self.RDS_data[PI]["RT_"+bytes(ab_flag)]["RT"].split("\r")[0]) |
|
|
|
formatted_text=self.color_text(display_text,adr*4,adr*4+4,textcolor,segmentcolor) |
|
|
|
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}) |
|
|
|
@ -630,9 +630,9 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
app_data=int((array[4]<<8)|(array[5]))#content defined by ODA-app |
|
|
|
app_data=int((array[4]<<8)|(array[5]))#content defined by ODA-app |
|
|
|
app_group_raw=int(array[3]&0x1f) #group type in which this app is sent |
|
|
|
app_group_raw=int(array[3]&0x1f) #group type in which this app is sent |
|
|
|
if (app_group_raw&0x1 == 0): |
|
|
|
if (app_group_raw&0x1 == 0): |
|
|
|
app_group=str(app_group_raw >> 1)+"A" |
|
|
|
app_group=bytes(app_group_raw >> 1)+"A" |
|
|
|
else: |
|
|
|
else: |
|
|
|
app_group=str(app_group_raw >> 1)+"B" |
|
|
|
app_group=bytes(app_group_raw >> 1)+"B" |
|
|
|
|
|
|
|
|
|
|
|
if not self.RDS_data[PI]["AID_list"].has_key(AID):#new ODA found |
|
|
|
if not self.RDS_data[PI]["AID_list"].has_key(AID):#new ODA found |
|
|
|
try: |
|
|
|
try: |
|
|
|
@ -715,7 +715,7 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
self.RDS_data[PI]["time"]["datestring"]=datestring |
|
|
|
self.RDS_data[PI]["time"]["datestring"]=datestring |
|
|
|
self.RDS_data[PI]["time"]["datetime"]=datetime(date.year,date.month,date.day,hours,minutes)+timedelta(hours=local_time_offset) |
|
|
|
self.RDS_data[PI]["time"]["datetime"]=datetime(date.year,date.month,date.day,hours,minutes)+timedelta(hours=local_time_offset) |
|
|
|
if self.writeDB: |
|
|
|
if self.writeDB: |
|
|
|
t=(str(datetime.now()),PI,self.RDS_data[PI]["PSN"],"CT",datestring+" "+timestring+"; datecode(MJD):"+str(datecode)) |
|
|
|
t=(bytes(datetime.now()),PI,self.RDS_data[PI]["PSN"],"CT",datestring+" "+timestring+"; datecode(MJD):"+bytes(datecode)) |
|
|
|
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 ValueError as e: |
|
|
|
except ValueError as e: |
|
|
|
print("ERROR: could not interpret time or date:") |
|
|
|
print("ERROR: could not interpret time or date:") |
|
|
|
@ -738,7 +738,7 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
self.IH_data[PI][ih_data]={} |
|
|
|
self.IH_data[PI][ih_data]={} |
|
|
|
self.IH_data[PI][ih_data]["count"]=0 |
|
|
|
self.IH_data[PI][ih_data]["count"]=0 |
|
|
|
self.IH_data[PI][ih_data]["count"]+=1 |
|
|
|
self.IH_data[PI][ih_data]["count"]+=1 |
|
|
|
self.IH_data[PI][ih_data]["last_time"]=str(datetime.now()) |
|
|
|
self.IH_data[PI][ih_data]["last_time"]=bytes(datetime.now()) |
|
|
|
#TMC-alert-c (grouptype mostly 8A): |
|
|
|
#TMC-alert-c (grouptype mostly 8A): |
|
|
|
elif (self.RDS_data[PI]["AID_list"].has_key(52550) |
|
|
|
elif (self.RDS_data[PI]["AID_list"].has_key(52550) |
|
|
|
and self.RDS_data[PI]["AID_list"][52550]["groupType"]==groupType):#TMC alert-C |
|
|
|
and self.RDS_data[PI]["AID_list"][52550]["groupType"]==groupType):#TMC alert-C |
|
|
|
@ -763,7 +763,7 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
})#this gnuradio instance doesnt seem to be able to convert from numpy.int64 to pmt |
|
|
|
})#this gnuradio instance doesnt seem to be able to convert from numpy.int64 to pmt |
|
|
|
self.message_port_pub(pmt.intern('tmc_raw'), send_pmt) |
|
|
|
self.message_port_pub(pmt.intern('tmc_raw'), send_pmt) |
|
|
|
|
|
|
|
|
|
|
|
#~ tmc_hash=hashlib.md5(str([PI,tmc_x,tmc_y,tmc_z])).hexdigest() |
|
|
|
#~ tmc_hash=hashlib.md5(bytes([PI,tmc_x,tmc_y,tmc_z])).hexdigest() |
|
|
|
tmc_T=tmc_x>>4 #0:TMC-message 1:tuning info/service provider name |
|
|
|
tmc_T=tmc_x>>4 #0:TMC-message 1:tuning info/service provider name |
|
|
|
#~ tmc_F=int((tmc_x>>3)&0x1) #identifies the message as a Single Group (F = 1) or Multi Group (F = 0) |
|
|
|
#~ tmc_F=int((tmc_x>>3)&0x1) #identifies the message as a Single Group (F = 1) or Multi Group (F = 0) |
|
|
|
#~ Y15=int(tmc_y>>15) |
|
|
|
#~ Y15=int(tmc_y>>15) |
|
|
|
@ -839,11 +839,11 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
tag2_start=int((tag2>>5)&(2**6-1)) |
|
|
|
tag2_start=int((tag2>>5)&(2**6-1)) |
|
|
|
tag2_len=int(tag2&(2**5-1)) |
|
|
|
tag2_len=int(tag2&(2**5-1)) |
|
|
|
if not self.RDS_data[PI]["RT+"]["last_item_toggle_bit"] == item_toggle_bit: #new item |
|
|
|
if not self.RDS_data[PI]["RT+"]["last_item_toggle_bit"] == item_toggle_bit: #new item |
|
|
|
#self.RDS_data[PI]["RT+"]["history"][str(datetime.now())]=self.RDS_data[PI]["internals"]["last_rt_tooltip"] |
|
|
|
#self.RDS_data[PI]["RT+"]["history"][bytes(datetime.now())]=self.RDS_data[PI]["internals"]["last_rt_tooltip"] |
|
|
|
t=(str(datetime.now()),PI,self.RDS_data[PI]["PSN"],"RT+",str(self.RDS_data[PI]["RT+"])) |
|
|
|
t=(bytes(datetime.now()),PI,self.RDS_data[PI]["PSN"],"RT+",bytes(self.RDS_data[PI]["RT+"])) |
|
|
|
if self.writeDB: |
|
|
|
if self.writeDB: |
|
|
|
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]["RT+_history"][str(datetime.now())]=copy.deepcopy(self.RDS_data[PI]["RT+"])#save old item |
|
|
|
self.RDS_data[PI]["RT+_history"][bytes(datetime.now())]=copy.deepcopy(self.RDS_data[PI]["RT+"])#save old item |
|
|
|
self.RDS_data[PI]["RT+"]["last_item_toggle_bit"] = item_toggle_bit |
|
|
|
self.RDS_data[PI]["RT+"]["last_item_toggle_bit"] = item_toggle_bit |
|
|
|
rtcol=self.colorder.index('text') |
|
|
|
rtcol=self.colorder.index('text') |
|
|
|
if self.debug: |
|
|
|
if self.debug: |
|
|
|
@ -851,8 +851,8 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
self.signals.DataUpdateEvent.emit({'col':rtcol,'row':port,'PI':PI,'tooltip':""}) |
|
|
|
self.signals.DataUpdateEvent.emit({'col':rtcol,'row':port,'PI':PI,'tooltip':""}) |
|
|
|
if self.RDS_data[PI].has_key("RT_0"): |
|
|
|
if self.RDS_data[PI].has_key("RT_0"): |
|
|
|
ab_flag=self.RDS_data[PI]["RT_last_ab_flag"] |
|
|
|
ab_flag=self.RDS_data[PI]["RT_last_ab_flag"] |
|
|
|
rt=self.RDS_data[PI]["RT_"+str(ab_flag)]["RT"] |
|
|
|
rt=self.RDS_data[PI]["RT_"+bytes(ab_flag)]["RT"] |
|
|
|
rt_valid=self.RDS_data[PI]["RT_"+str(ab_flag)]["RT_valid"] |
|
|
|
rt_valid=self.RDS_data[PI]["RT_"+bytes(ab_flag)]["RT_valid"] |
|
|
|
if not tag1_type=="DUMMY_CLASS" and all(rt_valid[tag1_start:tag1_start+tag1_len+1]): |
|
|
|
if not tag1_type=="DUMMY_CLASS" and all(rt_valid[tag1_start:tag1_start+tag1_len+1]): |
|
|
|
self.RDS_data[PI]["RT+"][tag1_type]=rt[tag1_start:tag1_start+tag1_len+1] |
|
|
|
self.RDS_data[PI]["RT+"][tag1_type]=rt[tag1_start:tag1_start+tag1_len+1] |
|
|
|
self.RDS_data[PI]["internals"]["RT+_times"][tag1_type]=time.time() |
|
|
|
self.RDS_data[PI]["internals"]["RT+_times"][tag1_type]=time.time() |
|
|
|
@ -872,8 +872,8 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
self.signals.DataUpdateEvent.emit({'col':rtpcol,'row':port,'PI':PI,'string':tags}) |
|
|
|
self.signals.DataUpdateEvent.emit({'col':rtpcol,'row':port,'PI':PI,'string':tags}) |
|
|
|
if(tag2_type=="ITEM.TITLE" and self.RDS_data[PI].has_key("RT_0")):#TODO remove duplicate code |
|
|
|
if(tag2_type=="ITEM.TITLE" and self.RDS_data[PI].has_key("RT_0")):#TODO remove duplicate code |
|
|
|
ab_flag=self.RDS_data[PI]["RT_last_ab_flag"] |
|
|
|
ab_flag=self.RDS_data[PI]["RT_last_ab_flag"] |
|
|
|
rt=self.RDS_data[PI]["RT_"+str(ab_flag)]["RT"] |
|
|
|
rt=self.RDS_data[PI]["RT_"+bytes(ab_flag)]["RT"] |
|
|
|
rt_valid=self.RDS_data[PI]["RT_"+str(ab_flag)]["RT_valid"] |
|
|
|
rt_valid=self.RDS_data[PI]["RT_"+bytes(ab_flag)]["RT_valid"] |
|
|
|
artist="?" |
|
|
|
artist="?" |
|
|
|
song="?" |
|
|
|
song="?" |
|
|
|
if all(rt_valid[tag1_start:tag1_start+tag1_len+1]): |
|
|
|
if all(rt_valid[tag1_start:tag1_start+tag1_len+1]): |
|
|
|
@ -1050,7 +1050,7 @@ class rds_parser_table_qt(gr.sync_block):#START |
|
|
|
print("symbol not decoded: "+"?%02X?"%ord(char)+ |
|
|
|
print("symbol not decoded: "+"?%02X?"%ord(char)+ |
|
|
|
"in string:"+return_string) |
|
|
|
"in string:"+return_string) |
|
|
|
pass |
|
|
|
pass |
|
|
|
if not type(return_string)==unicode: |
|
|
|
if not type(return_string)==str: |
|
|
|
code.interact(local=locals()) |
|
|
|
code.interact(local=locals()) |
|
|
|
return return_string |
|
|
|
return return_string |
|
|
|
def color_text(self, text, start,end,textcolor,segmentcolor): |
|
|
|
def color_text(self, text, start,end,textcolor,segmentcolor): |
|
|
|
@ -1075,42 +1075,42 @@ class rds_parser_table_qt_Widget(QtWidgets.QWidget): |
|
|
|
self.setLayout(layout) |
|
|
|
self.setLayout(layout) |
|
|
|
#self.decoder_to_PI={} |
|
|
|
#self.decoder_to_PI={} |
|
|
|
self.PI_to_row={} |
|
|
|
self.PI_to_row={} |
|
|
|
self.table=QtGui.QTableWidget(self) |
|
|
|
self.table=QtWidgets.QTableWidget(self) |
|
|
|
rowcount=0 |
|
|
|
rowcount=0 |
|
|
|
self.table.setRowCount(rowcount) |
|
|
|
self.table.setRowCount(rowcount) |
|
|
|
#self.colorder=['ID','freq','name','buttons','PTY','AF','time','text','quality'] |
|
|
|
#self.colorder=['ID','freq','name','buttons','PTY','AF','time','text','quality'] |
|
|
|
self.colorder=tableobj.colorder |
|
|
|
self.colorder=tableobj.colorder |
|
|
|
self.table.setColumnCount(len(self.colorder)) |
|
|
|
self.table.setColumnCount(len(self.colorder)) |
|
|
|
self.table.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) #disallow editing |
|
|
|
self.table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) #disallow editing |
|
|
|
|
|
|
|
|
|
|
|
layout.addWidget(self.table) |
|
|
|
layout.addWidget(self.table) |
|
|
|
self.table.setHorizontalHeaderLabels(self.colorder) |
|
|
|
self.table.setHorizontalHeaderLabels(self.colorder) |
|
|
|
#self.table.setMaximumHeight(300)#TODO use dynamic value |
|
|
|
#self.table.setMaximumHeight(300)#TODO use dynamic value |
|
|
|
|
|
|
|
|
|
|
|
button_layout = Qt.QHBoxLayout() |
|
|
|
button_layout = Qt.QHBoxLayout() |
|
|
|
codebutton = QtGui.QPushButton("code.interact") |
|
|
|
codebutton = QtWidgets.QPushButton("code.interact") |
|
|
|
codebutton.clicked.connect(self.onCLick) |
|
|
|
codebutton.clicked.connect(self.onCLick) |
|
|
|
button_layout.addWidget(codebutton) |
|
|
|
button_layout.addWidget(codebutton) |
|
|
|
ih_button = QtGui.QPushButton("show IH data") |
|
|
|
ih_button = QtWidgets.QPushButton("show IH data") |
|
|
|
ih_button.clicked.connect(self.showIHdata) |
|
|
|
ih_button.clicked.connect(self.showIHdata) |
|
|
|
button_layout.addWidget(ih_button) |
|
|
|
button_layout.addWidget(ih_button) |
|
|
|
save_button = QtGui.QPushButton("save") |
|
|
|
save_button = QtWidgets.QPushButton("save") |
|
|
|
save_button.clicked.connect(self.saveData) |
|
|
|
save_button.clicked.connect(self.saveData) |
|
|
|
button_layout.addWidget(save_button) |
|
|
|
button_layout.addWidget(save_button) |
|
|
|
print_button = QtGui.QPushButton("print profile") |
|
|
|
print_button = QtWidgets.QPushButton("print profile") |
|
|
|
print_button.clicked.connect(self.printProfile) |
|
|
|
print_button.clicked.connect(self.printProfile) |
|
|
|
button_layout.addWidget(print_button) |
|
|
|
button_layout.addWidget(print_button) |
|
|
|
mode_button = QtGui.QPushButton("searchMode") |
|
|
|
mode_button = QtWidgets.QPushButton("searchMode") |
|
|
|
mode_button.clicked.connect(self.switchMode) |
|
|
|
mode_button.clicked.connect(self.switchMode) |
|
|
|
button_layout.addWidget(mode_button) |
|
|
|
button_layout.addWidget(mode_button) |
|
|
|
layout.addLayout(button_layout) |
|
|
|
layout.addLayout(button_layout) |
|
|
|
label_layout = Qt.QHBoxLayout() |
|
|
|
label_layout = Qt.QHBoxLayout() |
|
|
|
self.freq_label=QtGui.QLabel("decoder frequencies:") |
|
|
|
self.freq_label=QtWidgets.QLabel("decoder frequencies:") |
|
|
|
self.freq_label.setWordWrap(True) |
|
|
|
self.freq_label.setWordWrap(True) |
|
|
|
self.freq_label.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, |
|
|
|
self.freq_label.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, |
|
|
|
QtGui.QSizePolicy.Ignored))#expand in horizontal direction and only wrap if window too small |
|
|
|
QtWidgets.QSizePolicy.Ignored))#expand in horizontal direction and only wrap if window too small |
|
|
|
self.freq_label.setTextFormat(QtCore.Qt.RichText)#instead of AutoText |
|
|
|
self.freq_label.setTextFormat(QtCore.Qt.RichText)#instead of AutoText |
|
|
|
self.count_label=QtGui.QLabel("count:") |
|
|
|
self.count_label=QtWidgets.QLabel("count:") |
|
|
|
self.count_label.setAlignment(QtCore.Qt.AlignRight) |
|
|
|
self.count_label.setAlignment(QtCore.Qt.AlignRight) |
|
|
|
label_layout.addWidget(self.freq_label) |
|
|
|
label_layout.addWidget(self.freq_label) |
|
|
|
label_layout.addWidget(self.count_label) |
|
|
|
label_layout.addWidget(self.count_label) |
|
|
|
@ -1118,7 +1118,7 @@ class rds_parser_table_qt_Widget(QtWidgets.QWidget): |
|
|
|
#self.setMinimumSize(Qt.QSize(500,40*self.tableobj.nPorts)) |
|
|
|
#self.setMinimumSize(Qt.QSize(500,40*self.tableobj.nPorts)) |
|
|
|
self.setMinimumSize(Qt.QSize(500,40*(4+self.tableobj.nPorts))) |
|
|
|
self.setMinimumSize(Qt.QSize(500,40*(4+self.tableobj.nPorts))) |
|
|
|
self.lastResizeTime=0 |
|
|
|
self.lastResizeTime=0 |
|
|
|
self.clip = QtGui.QApplication.clipboard() |
|
|
|
self.clip = QtWidgets.QApplication.clipboard() |
|
|
|
#self.cb.clear(mode=cb.Clipboard ) |
|
|
|
#self.cb.clear(mode=cb.Clipboard ) |
|
|
|
#self.cb.setText("Clipboard Text", mode=cb.Clipboard) |
|
|
|
#self.cb.setText("Clipboard Text", mode=cb.Clipboard) |
|
|
|
def keyPressEvent(self, e): |
|
|
|
def keyPressEvent(self, e): |
|
|
|
@ -1129,7 +1129,7 @@ class rds_parser_table_qt_Widget(QtWidgets.QWidget): |
|
|
|
if e.key() == QtCore.Qt.Key_C: #copy |
|
|
|
if e.key() == QtCore.Qt.Key_C: #copy |
|
|
|
try: |
|
|
|
try: |
|
|
|
qs = self.table.cellWidget(selected.topRow(),selected.leftColumn()).text()#get QString from table |
|
|
|
qs = self.table.cellWidget(selected.topRow(),selected.leftColumn()).text()#get QString from table |
|
|
|
s=re.sub("<.*?>","", str(qs))#remove html tags |
|
|
|
s=re.sub("<.*?>","", bytes(qs))#remove html tags |
|
|
|
self.clip.setText(s) |
|
|
|
self.clip.setText(s) |
|
|
|
except Exception as e: |
|
|
|
except Exception as e: |
|
|
|
print(e) |
|
|
|
print(e) |
|
|
|
@ -1138,25 +1138,25 @@ class rds_parser_table_qt_Widget(QtWidgets.QWidget): |
|
|
|
rowPosition = self.table.rowCount() |
|
|
|
rowPosition = self.table.rowCount() |
|
|
|
self.table.insertRow(rowPosition) |
|
|
|
self.table.insertRow(rowPosition) |
|
|
|
#for col in range(self.table.columnCount()-1):#all labels except in last column -> buttons |
|
|
|
#for col in range(self.table.columnCount()-1):#all labels except in last column -> buttons |
|
|
|
# self.table.setCellWidget(rowPosition,col,QtGui.QLabel()) |
|
|
|
# self.table.setCellWidget(rowPosition,col,QtWidgets.QLabel()) |
|
|
|
#initialize labels everywhere: |
|
|
|
#initialize labels everywhere: |
|
|
|
for col in range(self.table.columnCount()): |
|
|
|
for col in range(self.table.columnCount()): |
|
|
|
self.table.setCellWidget(rowPosition,col,QtGui.QLabel()) |
|
|
|
self.table.setCellWidget(rowPosition,col,QtWidgets.QLabel()) |
|
|
|
button_layout = Qt.QHBoxLayout() |
|
|
|
button_layout = Qt.QHBoxLayout() |
|
|
|
details_button=QtGui.QPushButton("Detail") |
|
|
|
details_button=QtWidgets.QPushButton("Detail") |
|
|
|
details_button.clicked.connect(functools.partial(self.getDetails, row=rowPosition)) |
|
|
|
details_button.clicked.connect(functools.partial(self.getDetails, row=rowPosition)) |
|
|
|
button_layout.addWidget(details_button) |
|
|
|
button_layout.addWidget(details_button) |
|
|
|
#2017-03-17 disabled LR buttons |
|
|
|
#2017-03-17 disabled LR buttons |
|
|
|
#2017-04-24 enabled LR buttons |
|
|
|
#2017-04-24 enabled LR buttons |
|
|
|
left_button=QtGui.QPushButton("L") |
|
|
|
left_button=QtWidgets.QPushButton("L") |
|
|
|
#left_button.clicked.connect(functools.partial(self.setAudio, row=rowPosition,audio_channel="left")) |
|
|
|
#left_button.clicked.connect(functools.partial(self.setAudio, row=rowPosition,audio_channel="left")) |
|
|
|
left_button.clicked.connect(functools.partial(self.setAudio2, row=rowPosition,audio_channel=0)) |
|
|
|
left_button.clicked.connect(functools.partial(self.setAudio2, row=rowPosition,audio_channel=0)) |
|
|
|
button_layout.addWidget(left_button) |
|
|
|
button_layout.addWidget(left_button) |
|
|
|
center_button=QtGui.QPushButton("C") |
|
|
|
center_button=QtWidgets.QPushButton("C") |
|
|
|
#center_button.clicked.connect(functools.partial(self.setAudio, row=rowPosition,audio_channel="center")) |
|
|
|
#center_button.clicked.connect(functools.partial(self.setAudio, row=rowPosition,audio_channel="center")) |
|
|
|
center_button.clicked.connect(functools.partial(self.setAudio2, row=rowPosition,audio_channel=1)) |
|
|
|
center_button.clicked.connect(functools.partial(self.setAudio2, row=rowPosition,audio_channel=1)) |
|
|
|
button_layout.addWidget(center_button) |
|
|
|
button_layout.addWidget(center_button) |
|
|
|
right_button=QtGui.QPushButton("R") |
|
|
|
right_button=QtWidgets.QPushButton("R") |
|
|
|
#right_button.clicked.connect(functools.partial(self.setAudio, row=rowPosition,audio_channel="right")) |
|
|
|
#right_button.clicked.connect(functools.partial(self.setAudio, row=rowPosition,audio_channel="right")) |
|
|
|
right_button.clicked.connect(functools.partial(self.setAudio2, row=rowPosition,audio_channel=2)) |
|
|
|
right_button.clicked.connect(functools.partial(self.setAudio2, row=rowPosition,audio_channel=2)) |
|
|
|
button_layout.addWidget(right_button) |
|
|
|
button_layout.addWidget(right_button) |
|
|
|
@ -1213,7 +1213,7 @@ class rds_parser_table_qt_Widget(QtWidgets.QWidget): |
|
|
|
if event.has_key('AF'): |
|
|
|
if event.has_key('AF'): |
|
|
|
#setAF |
|
|
|
#setAF |
|
|
|
PIcol=self.colorder.index('AF') |
|
|
|
PIcol=self.colorder.index('AF') |
|
|
|
self.table.cellWidget(row,PIcol).setText(str(event['AF']['number'])) |
|
|
|
self.table.cellWidget(row,PIcol).setText(bytes(event['AF']['number'])) |
|
|
|
if event.has_key('PSN'): |
|
|
|
if event.has_key('PSN'): |
|
|
|
#setPSN |
|
|
|
#setPSN |
|
|
|
PSNcol=self.colorder.index('name') |
|
|
|
PSNcol=self.colorder.index('name') |
|
|
|
@ -1231,7 +1231,7 @@ class rds_parser_table_qt_Widget(QtWidgets.QWidget): |
|
|
|
#send_pmt = pmt.string_to_symbol("switch mode") |
|
|
|
#send_pmt = pmt.string_to_symbol("switch mode") |
|
|
|
self.tableobj.message_port_pub(pmt.intern('ctrl'), send_pmt) |
|
|
|
self.tableobj.message_port_pub(pmt.intern('ctrl'), send_pmt) |
|
|
|
def saveData(self): |
|
|
|
def saveData(self): |
|
|
|
filename="RDS_data_"+str(datetime.now())+".txt" |
|
|
|
filename="RDS_data_"+bytes(datetime.now())+".txt" |
|
|
|
f=open(self.tableobj.workdir+filename,"w") |
|
|
|
f=open(self.tableobj.workdir+filename,"w") |
|
|
|
rds_data=copy.deepcopy(self.tableobj.RDS_data) |
|
|
|
rds_data=copy.deepcopy(self.tableobj.RDS_data) |
|
|
|
for PI in sorted(rds_data): |
|
|
|
for PI in sorted(rds_data): |
|
|
|
@ -1246,7 +1246,7 @@ class rds_parser_table_qt_Widget(QtWidgets.QWidget): |
|
|
|
print("data saved in file %s"%filename) |
|
|
|
print("data saved in file %s"%filename) |
|
|
|
def showIHdata(self): |
|
|
|
def showIHdata(self): |
|
|
|
view=Qt.QDialog() |
|
|
|
view=Qt.QDialog() |
|
|
|
l=QtGui.QLabel("In House Data:\n%s"%pp.pformat(self.tableobj.IH_data)) |
|
|
|
l=QtWidgets.QLabel("In House Data:\n%s"%pp.pformat(self.tableobj.IH_data)) |
|
|
|
l.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse | |
|
|
|
l.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse | |
|
|
|
QtCore.Qt.TextSelectableByKeyboard) |
|
|
|
QtCore.Qt.TextSelectableByKeyboard) |
|
|
|
l.setWordWrap(True) |
|
|
|
l.setWordWrap(True) |
|
|
|
@ -1258,7 +1258,7 @@ class rds_parser_table_qt_Widget(QtWidgets.QWidget): |
|
|
|
def setAudio(self,row,audio_channel): |
|
|
|
def setAudio(self,row,audio_channel): |
|
|
|
|
|
|
|
|
|
|
|
PIcol=self.colorder.index('ID') |
|
|
|
PIcol=self.colorder.index('ID') |
|
|
|
PI=str(self.table.cellWidget(row,PIcol).text()) |
|
|
|
PI=bytes(self.table.cellWidget(row,PIcol).text()) |
|
|
|
freq=int(self.tableobj.RDS_data[PI]['AF']['main']) |
|
|
|
freq=int(self.tableobj.RDS_data[PI]['AF']['main']) |
|
|
|
#print("setaudio row:%i, chan:%s, PI:%s,freq:%i"%(row,audio_channel,PI,freq)) |
|
|
|
#print("setaudio row:%i, chan:%s, PI:%s,freq:%i"%(row,audio_channel,PI,freq)) |
|
|
|
send_pmt = pmt.pmt_to_python.pmt_from_dict({"cmd":"set_audio_freq", |
|
|
|
send_pmt = pmt.pmt_to_python.pmt_from_dict({"cmd":"set_audio_freq", |
|
|
|
@ -1271,7 +1271,7 @@ class rds_parser_table_qt_Widget(QtWidgets.QWidget): |
|
|
|
def setAudio2(self,row,audio_channel): |
|
|
|
def setAudio2(self,row,audio_channel): |
|
|
|
|
|
|
|
|
|
|
|
PIcol=self.colorder.index('ID') |
|
|
|
PIcol=self.colorder.index('ID') |
|
|
|
PI=str(self.table.cellWidget(row,PIcol).text()) |
|
|
|
PI=bytes(self.table.cellWidget(row,PIcol).text()) |
|
|
|
#find port: |
|
|
|
#find port: |
|
|
|
for port,decoder in enumerate(self.tableobj.decoders): |
|
|
|
for port,decoder in enumerate(self.tableobj.decoders): |
|
|
|
if decoder['PI']==PI: |
|
|
|
if decoder['PI']==PI: |
|
|
|
@ -1284,7 +1284,7 @@ class rds_parser_table_qt_Widget(QtWidgets.QWidget): |
|
|
|
|
|
|
|
|
|
|
|
def getDetails(self,row): |
|
|
|
def getDetails(self,row): |
|
|
|
PIcol=self.colorder.index('ID') |
|
|
|
PIcol=self.colorder.index('ID') |
|
|
|
PI=str(self.table.cellWidget(row,PIcol).text()) |
|
|
|
PI=bytes(self.table.cellWidget(row,PIcol).text()) |
|
|
|
view = chart.DialogViewer() |
|
|
|
view = chart.DialogViewer() |
|
|
|
if self.tableobj.PI_dict.has_key(PI) and self.tableobj.PI_dict[PI]>3: |
|
|
|
if self.tableobj.PI_dict.has_key(PI) and self.tableobj.PI_dict[PI]>3: |
|
|
|
#dont print piechart if no packets received (detected via EON) |
|
|
|
#dont print piechart if no packets received (detected via EON) |
|
|
|
@ -1297,7 +1297,7 @@ class rds_parser_table_qt_Widget(QtWidgets.QWidget): |
|
|
|
#and sorts based on integer valure of number in front |
|
|
|
#and sorts based on integer valure of number in front |
|
|
|
for key in sorted(blockcounts,key=lambda elem: int(elem[0:-1])): |
|
|
|
for key in sorted(blockcounts,key=lambda elem: int(elem[0:-1])): |
|
|
|
count=blockcounts[key] |
|
|
|
count=blockcounts[key] |
|
|
|
table.addRow([key+": "+str(count),count]) |
|
|
|
table.addRow([key+": "+bytes(count),count]) |
|
|
|
mychart=chart.PieChart(table) |
|
|
|
mychart=chart.PieChart(table) |
|
|
|
view.setGraph(mychart) |
|
|
|
view.setGraph(mychart) |
|
|
|
#view.resize(360, 240) |
|
|
|
#view.resize(360, 240) |
|
|
|
@ -1313,15 +1313,15 @@ class rds_parser_table_qt_Widget(QtWidgets.QWidget): |
|
|
|
#combine char lists into strings (more compact) |
|
|
|
#combine char lists into strings (more compact) |
|
|
|
except KeyError: |
|
|
|
except KeyError: |
|
|
|
pass |
|
|
|
pass |
|
|
|
l=QtGui.QLabel("Data:%s"%pp.pformat(rds_data)) |
|
|
|
l=QtWidgets.QLabel("Data:%s"%pp.pformat(rds_data)) |
|
|
|
l.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse | |
|
|
|
l.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse | |
|
|
|
QtCore.Qt.TextSelectableByKeyboard) |
|
|
|
QtCore.Qt.TextSelectableByKeyboard) |
|
|
|
l.setWordWrap(True) |
|
|
|
l.setWordWrap(True) |
|
|
|
#l=QtGui.QLabel("Data:") |
|
|
|
#l=QtWidgets.QLabel("Data:") |
|
|
|
|
|
|
|
|
|
|
|
#view.layout().addWidget(l) |
|
|
|
#view.layout().addWidget(l) |
|
|
|
|
|
|
|
|
|
|
|
scrollArea = QtGui.QScrollArea(self) |
|
|
|
scrollArea = QtWidgets.QScrollArea(self) |
|
|
|
scrollArea.setWidgetResizable(True) |
|
|
|
scrollArea.setWidgetResizable(True) |
|
|
|
scrollArea.setWidget(l) |
|
|
|
scrollArea.setWidget(l) |
|
|
|
view.layout().addWidget(scrollArea) |
|
|
|
view.layout().addWidget(scrollArea) |
|
|
|
|