diff --git a/python/rds_parser_table_qt.py b/python/rds_parser_table_qt.py index 1e8ee77..354b086 100644 --- a/python/rds_parser_table_qt.py +++ b/python/rds_parser_table_qt.py @@ -53,6 +53,8 @@ class rds_parser_table_qt(gr.sync_block): self.PSNdict={} self.PSNvalid={} self.AFdata={} + self.blockcounts={} + self.printcounter=0 def handle_msg(self, msg, port): #code.interact(local=locals()) array=pmt.to_python(msg)[1] @@ -71,7 +73,7 @@ class rds_parser_table_qt(gr.sync_block): if (groupType == "0A"):#AF PSN adr=array[3]&0b00000011 segment=chr(array[6])+chr(array[7]) - if(not self.PSNdict.has_key(PI)):#initialite dict + if(not self.PSNdict.has_key(PI)):#initialize dict self.PSNdict[PI]="_"*8 self.PSNvalid[PI]=[False]*8 self.AFdata[PI]={} @@ -85,34 +87,35 @@ class rds_parser_table_qt(gr.sync_block): self.signals.DataUpdateEvent.emit({'row':port,'AF':self.AFdata[PI]}) if(array[6]>= 224 and array[6]<= 249): print("AF2 detected") - #determine if text is valid - valid=True - for i in range(0,8): - if (not self.PSNvalid[PI][i]): - valid = False - if(valid): - textcolor="black" - else: - textcolor="gray" name_list=list(self.PSNdict[PI]) if (name_list[adr*2:adr*2+2]==list(segment)):#segment already there segmentcolor="green" - elif(name_list[adr*2:adr*2+2]==['__']): #segment new + elif(name_list[adr*2:adr*2+2]==['_']*2): #segment new segmentcolor="orange" name_list[adr*2:adr*2+2]=segment else:#name changed (böse) segmentcolor="red" + name_list=['_']*8 #reset name name_list[adr*2:adr*2+2]=segment #reset stored text: self.PSNdict[PI]="_"*8 self.PSNvalid[PI]=[False]*8 self.PSNvalid[PI][adr*2:adr*2+2]=[True] *2 self.PSNdict[PI]="".join(name_list) + #determine if text is valid + valid=True + for i in range(0,8): + if (not self.PSNvalid[PI][i]): + valid = False + if(valid): + textcolor="black" + else: + textcolor="gray" formatted_text=self.color_text(self.PSNdict[PI],adr*2,adr*2+2,textcolor,segmentcolor) self.signals.DataUpdateEvent.emit({'col':5,'row':port,'PI':PI,'PSN':formatted_text}) elif (groupType == "2A"):#RT radiotext - if(not self.RTdict.has_key(PI)):#initialite dict + if(not self.RTdict.has_key(PI)):#initialize dict self.RTdict[PI]="_"*64 self.RTvalid[PI]=[False]*64 else: @@ -127,13 +130,7 @@ class rds_parser_table_qt(gr.sync_block): except ValueError: text_end=64 #assume whole string is important pass - #determine if text is valid - valid=True - for i in range(0,text_end): - if (not self.RTvalid[PI][i]): - valid = False - - + if (text_list[adr*4:adr*4+4]==list(segment)):#segment already there segmentcolor="green" elif (text_list[adr*4:adr*4+4]==['_']*4):#segment new @@ -141,30 +138,81 @@ class rds_parser_table_qt(gr.sync_block): text_list[adr*4:adr*4+4]=segment else: segmentcolor="red" + text_list=['_']*64 #clear text text_list[adr*4:adr*4+4]=segment #reset stored text: self.RTdict[PI]="_"*64 self.RTvalid[PI]=[False]*64 + + self.RTvalid[PI][adr*4:adr*4+4]=[True] *4 + self.RTdict[PI]="".join(text_list) + + #determine if (new) text is valid + valid=True + for i in range(0,text_end): + if (not self.RTvalid[PI][i]): + valid = False if(valid): textcolor="black" else: textcolor="gray" - #formatted_text="%s%s%s"% (textcolor,self.RTdict[PI][:adr*4],segmentcolor,self.RTdict[PI][adr*4:adr*4+4],textcolor,self.RTdict[PI][adr*4+4:]) formatted_text=self.color_text(self.RTdict[PI],adr*4,adr*4+4,textcolor,segmentcolor) #print(self.RTdict[PI]+" valid:"+str(valid)+"valarr:"+str(self.RTvalid[PI])) - self.RTvalid[PI][adr*4:adr*4+4]=[True] *4 - self.RTdict[PI]="".join(text_list) - - - - + self.signals.DataUpdateEvent.emit({'col':5,'row':port,'PI':PI,'string':formatted_text}) #code.interact(local=locals()) + elif (groupType == "4A"):#CT clock time + datecode=((array[3] & 0x03) << 15) | (array[4] <<7)|((array[5] >> 1) & 0x7f) + hours=((array[5] & 0x1) << 4) | ((array[6] >> 4) & 0x0f) + minutes=((array[6]>>6)&0x0F)|((array[7] >>6)&0x3) + offsetdir=(array[7]>>5)&0x1 + local_time_offset=0.5*((array[7])&0x1F) + if(offsetdir==1): + local_time_offset*=-1 + year=int((datecode - 15078.2) / 365.25) + month=int((datecode - 14956.1 - int(year * 365.25)) / 30.6001) + day=datecode - 14956 - int(year * 365.25) - int(month * 30.6001) + if(month == 14 or month == 15):#no idea why -> annex g of RDS spec + year += 1; + month -= 13 + year+=1900 + datestring="%02i.%02i.%4i, %02i:%02i (%+.1fh)" % (day,month,year,hours,minutes,local_time_offset) + self.signals.DataUpdateEvent.emit({'col':4,'row':port,'PI':PI,'string':datestring}) + else:#other group + printfreq=100 + self.printcounter+=1 + if self.blockcounts.has_key(PI):#1st group on this station + if self.blockcounts[PI].has_key(groupType):#1st group of this type + self.blockcounts[PI][groupType] +=1 #increment + else: + self.blockcounts[PI][groupType] = 1 #initialize + else: + self.blockcounts[PI]={}#initialize dict + if self.printcounter == printfreq: + pp.pprint(self.blockcounts) + self.printcounter=0 + #print("group of type %s not decoded on station %s"% (groupType,PI)) + def decode_chars(self,charlist): + alphabet={ + 0b1000:u"áàéèíìóòúùÑÇŞßiIJ", + 0b1001:u"âäêëîïôöûüñçş??ij", + 0b1100:u"ÁÀÉÈÍÌÓÒÚÙŘČŠŽĐĿ", + 0b1101:u"áàéèíìóòúùřčšžđŀ"} + for i,char in enumerate(charlist): + if char<= 0b01111111: + charlist[i]=char #use ascii else: - print("group of type %s not decoded on station %s"% (groupType,PI)) - + #split byte + alnr=(ord(char)&0xF0 )>>4 #upper 4 bit + index=ord(char)&0x0F #lower 4 bit + try: + charlist[i]=alphabet[alnr][index] + except KeyError: + charlist[i]=char + pass + return charlist def color_text(self, text, start,end,textcolor,segmentcolor): formatted_text="%s%s%s"% (textcolor,text[:start],segmentcolor,text[start:end],textcolor,text[end:]) return formatted_text @@ -190,7 +238,7 @@ class rds_parser_table_qt_Widget(QtGui.QWidget): 'freq':['','','',''], 'name':[], 'AF':['','','',''], - 'time':['','','',''], + 'time':[], 'text':[], 'buttons':[]} #Enter data onto Table @@ -215,7 +263,11 @@ class rds_parser_table_qt_Widget(QtGui.QWidget): for i in range(0,4):#create name labels label=QtGui.QLabel("_"*8) #label.setFont(QtGui.QFont("Courier New")) - self.table.setCellWidget(i,2,label) + self.table.setCellWidget(i,2,label) + for i in range(0,4):#create time labels + label=QtGui.QLabel() + #label.setFont(QtGui.QFont("Courier New")) + self.table.setCellWidget(i,4,label) #Add Header self.table.setHorizontalHeaderLabels(horHeaders) layout.addWidget(self.label) @@ -243,22 +295,20 @@ class rds_parser_table_qt_Widget(QtGui.QWidget): item=self.table.cellWidget(event['row'],PSNcol) item.setText(event['PSN']) self.table.resizeColumnsToContents() - def reset_color(self): - for i in range(0,self.table.rowCount()): - for j in range(0,self.table.columnCount()): - item = self.table.item(i,j) - #code.interact(local=locals()) - #print(item.type()) - if item != '': - try: - item.setTextColor(QtCore.Qt.black) - except: - pass - #for item in self.table.items(): - #item.setTextColor(QtCore.Qt.black) + #def reset_color(self): + #for i in range(0,self.table.rowCount()): + #for j in range(0,self.table.columnCount()): + #item = self.table.item(i,j) + ##code.interact(local=locals()) + ##print(item.type()) + #if item != '': + #try: + #item.setTextColor(QtCore.Qt.black) + #except: + #pass def onCLick(self): print("button clicked") - self.reset_color() + #self.reset_color() #pp.pprint(event) if __name__ == "__main__": from PyQt4 import Qt