Browse Source

ordinals, better mgm, cleaned up old files

master
Clemens Richter 9 years ago
parent
commit
3a6fb5597b
  1. 49038
      data/LCL15.1.D-160122_utf8.csv
  2. 53
      data/RDS_ODA-AIDs_names_only.csv
  3. 65
      data/RTplus_classnames.csv
  4. 1441
      data/event-list_code+de-name_sort.csv
  5. 33
      data/pty-list.csv
  6. 242
      python/rds_parser_table_qt.py

49038
data/LCL15.1.D-160122_utf8.csv

File diff suppressed because it is too large Load Diff

53
data/RDS_ODA-AIDs_names_only.csv

@ -0,0 +1,53 @@
AID,Application name
0,Normal features specified in Standard
147,Cross referencing DAB within RDS
3019,Leisure & Practical Info for Drivers
3108,ELECTRABEL-DSM 7
3265,Wireless Playground broadcast controlsignal
3397,RDS-TMC: ALERT-C / EN ISO 14819-1 (for testing use only )
3467,ELECTRABEL-DSM 18
3628,ELECTRABEL-DSM 3
3633,ELECTRABEL-DSM 13
3975,ELECTRABEL-DSM 2
4703,I-FM-RDS for fixed and mobile devices
7130,ELECTRABEL-DSM 1
7262,ELECTRABEL-DSM 20
7272,ITIS In-vehicle data base
7345,ELECTRABEL-DSM 10
7495,ELECTRABEL-DSM 4
7618,CITIBUS 4
7621,Encrypted TTI using ALERT-Plus only (for testing use only )
7823,ELECTRABEL-DSM 17
19127,ELECTRABEL-DSM 9
19362,ELECTRABEL-DSM 5
19415,RadioText+ / RT+
19545,CITIBUS 2
19847,Radio Commerce System (RCS)
19861,ELECTRABEL-DSM 16
19866,ELECTRABEL-DSM 11
22359,Personal weather station
25938,Enhanced RadioText / eRT
29555,Enhanced early warning system
50000,NRSC Song Title and Artist
50081,Personal Radio Service
50096,iTunes Tagging
50115,NAVTEQ Traffic Plus
50388,eEAS
50505,Smart Grid Broadcast Channel
50531,ID Logic
50999,UMC - Utility Message Channel
52083,CITIBUS 1
52119,ELECTRABEL-DSM 14
52257,CITIBUS 3
52550,RDS-TMC: ALERT-C / EN ISO 14819
52551,RDS-TMC: ALERT-C / EN ISO 14819 –
52638,ELECTRABEL-DSM 8
52843,"Encrypted TTI using ALERT-Plus only (for service use, only)"
57635,APS Gateway
57793,Action code
58137,ELECTRABEL-DSM 12
58385,Beacon downlink
58432,ELECTRABEL-DSM 15
58534,ELECTRABEL-DSM 19
58839,ELECTRABEL-DSM 6
59665,EAS open protocol
1 AID Application name
2 0 Normal features specified in Standard
3 147 Cross referencing DAB within RDS
4 3019 Leisure & Practical Info for Drivers
5 3108 ELECTRABEL-DSM 7
6 3265 Wireless Playground broadcast controlsignal
7 3397 RDS-TMC: ALERT-C / EN ISO 14819-1 (for testing use only )
8 3467 ELECTRABEL-DSM 18
9 3628 ELECTRABEL-DSM 3
10 3633 ELECTRABEL-DSM 13
11 3975 ELECTRABEL-DSM 2
12 4703 I-FM-RDS for fixed and mobile devices
13 7130 ELECTRABEL-DSM 1
14 7262 ELECTRABEL-DSM 20
15 7272 ITIS In-vehicle data base
16 7345 ELECTRABEL-DSM 10
17 7495 ELECTRABEL-DSM 4
18 7618 CITIBUS 4
19 7621 Encrypted TTI using ALERT-Plus only (for testing use only )
20 7823 ELECTRABEL-DSM 17
21 19127 ELECTRABEL-DSM 9
22 19362 ELECTRABEL-DSM 5
23 19415 RadioText+ / RT+
24 19545 CITIBUS 2
25 19847 Radio Commerce System (RCS)
26 19861 ELECTRABEL-DSM 16
27 19866 ELECTRABEL-DSM 11
28 22359 Personal weather station
29 25938 Enhanced RadioText / eRT
30 29555 Enhanced early warning system
31 50000 NRSC Song Title and Artist
32 50081 Personal Radio Service
33 50096 iTunes Tagging
34 50115 NAVTEQ Traffic Plus
35 50388 eEAS
36 50505 Smart Grid Broadcast Channel
37 50531 ID Logic
38 50999 UMC - Utility Message Channel
39 52083 CITIBUS 1
40 52119 ELECTRABEL-DSM 14
41 52257 CITIBUS 3
42 52550 RDS-TMC: ALERT-C / EN ISO 14819
43 52551 RDS-TMC: ALERT-C / EN ISO 14819 –
44 52638 ELECTRABEL-DSM 8
45 52843 Encrypted TTI using ALERT-Plus only (for service use, only)
46 57635 APS Gateway
47 57793 Action code
48 58137 ELECTRABEL-DSM 12
49 58385 Beacon downlink
50 58432 ELECTRABEL-DSM 15
51 58534 ELECTRABEL-DSM 19
52 58839 ELECTRABEL-DSM 6
53 59665 EAS open protocol

65
data/RTplus_classnames.csv

@ -0,0 +1,65 @@
Code,RT+ Classes
0,DUMMY_CLASS
1,ITEM.TITLE
2,ITEM.ALBUM
3,ITEM.TRACKNUMBER
4,ITEM.ARTIST
5,ITEM.COMPOSITION
6,ITEM.MOVEMENT
7,ITEM.CONDUCTOR
8,ITEM.COMPOSER
9,ITEM.BAND
10,ITEM.COMMENT
11,ITEM.GENRE
12,INFO.NEWS
13,INFO.NEWS.LOCAL
14,INFO.STOCKMARKET
15,INFO.SPORT (4)
16,INFO.LOTTERY
17,INFO.HOROSCOPE
18,INFO.DAILY_DIVERSION
19,INFO.HEALTH
20,INFO.EVENT
21,INFO.SZENE
22,INFO.CINEMA
23,INFO.TV
24,INFO.DATE_TIME
25,INFO.WEATHER
26,INFO.TRAFFIC
27,INFO.ALARM
28,INFO.ADVERTISEMENT
29,INFO.URL (4)
30,INFO.OTHER (4)
31,STATIONNAME.SHORT
32,STATIONNAME.LONG
33,PROGRAMME.NOW
34,PROGRAMME.NEXT
35,PROGRAMME.PART
36,PROGRAMME.HOST
37,PROGRAMME.EDITORIAL_STAFF
38,PROGRAMME.FREQUENCY (4)
39,PROGRAMME.HOMEPAGE
40,PROGRAMME.SUBCHANNEL
41,PHONE.HOTLINE
42,PHONE.STUDIO
43,PHONE.OTHER
44,SMS.STUDIO
45,SMS.OTHER (4)
46,EMAIL.HOTLINE
47,EMAIL.STUDIO
48,EMAIL.OTHER
49,MMS.OTHER (4)
50,CHAT
51,CHAT.CENTER
52,VOTE.QUESTION
53,VOTE.CENTER
54,
55,
56,
57,
58,
59,PLACE
60,APPOINTMENT
61,IDENTIFIER
62,PURCHASE
63,GET_DATA
1 Code RT+ Classes
2 0 DUMMY_CLASS
3 1 ITEM.TITLE
4 2 ITEM.ALBUM
5 3 ITEM.TRACKNUMBER
6 4 ITEM.ARTIST
7 5 ITEM.COMPOSITION
8 6 ITEM.MOVEMENT
9 7 ITEM.CONDUCTOR
10 8 ITEM.COMPOSER
11 9 ITEM.BAND
12 10 ITEM.COMMENT
13 11 ITEM.GENRE
14 12 INFO.NEWS
15 13 INFO.NEWS.LOCAL
16 14 INFO.STOCKMARKET
17 15 INFO.SPORT (4)
18 16 INFO.LOTTERY
19 17 INFO.HOROSCOPE
20 18 INFO.DAILY_DIVERSION
21 19 INFO.HEALTH
22 20 INFO.EVENT
23 21 INFO.SZENE
24 22 INFO.CINEMA
25 23 INFO.TV
26 24 INFO.DATE_TIME
27 25 INFO.WEATHER
28 26 INFO.TRAFFIC
29 27 INFO.ALARM
30 28 INFO.ADVERTISEMENT
31 29 INFO.URL (4)
32 30 INFO.OTHER (4)
33 31 STATIONNAME.SHORT
34 32 STATIONNAME.LONG
35 33 PROGRAMME.NOW
36 34 PROGRAMME.NEXT
37 35 PROGRAMME.PART
38 36 PROGRAMME.HOST
39 37 PROGRAMME.EDITORIAL_STAFF
40 38 PROGRAMME.FREQUENCY (4)
41 39 PROGRAMME.HOMEPAGE
42 40 PROGRAMME.SUBCHANNEL
43 41 PHONE.HOTLINE
44 42 PHONE.STUDIO
45 43 PHONE.OTHER
46 44 SMS.STUDIO
47 45 SMS.OTHER (4)
48 46 EMAIL.HOTLINE
49 47 EMAIL.STUDIO
50 48 EMAIL.OTHER
51 49 MMS.OTHER (4)
52 50 CHAT
53 51 CHAT.CENTER
54 52 VOTE.QUESTION
55 53 VOTE.CENTER
56 54
57 55
58 56
59 57
60 58
61 59 PLACE
62 60 APPOINTMENT
63 61 IDENTIFIER
64 62 PURCHASE
65 63 GET_DATA

1441
data/event-list_code+de-name_sort.csv

File diff suppressed because it is too large Load Diff

33
data/pty-list.csv

@ -0,0 +1,33 @@
PTY code,RDS program type (EU),RBDS program type (North America)
0,No PTY or undefined,No PTY or undefined
1,News,News
2,Current affairs,Information
3,Information,Sports
4,Sport,Talk
5,Education,Rock
6,Drama,Classic rock
7,Culture,Adult hits
8,Science,Soft rock
9,Varied,Top 40
10,Pop music,Country
11,Rock music,Oldies
12,Easy listening,Soft
13,Light classical,Nostalgia
14,Serious classical,Jazz
15,Other music,Classical
16,Weather,Rhythm and blues
17,Finance,Soft rhythm and blues
18,Children’s programmes,Language
19,Social affairs,Religious music
20,Religion,Religious talk
21,Phone-in,Personality
22,Travel,Public
23,Leisure,College
24,Jazz music,Spanish Talk
25,Country music,Spanish Music
26,National music,Hip Hop
27,Oldies music,Unassigned
28,Folk music,Unassigned
29,Documentary,Weather
30,Alarm test,Emergency test
31,Alarm,Emergency
1 PTY code RDS program type (EU) RBDS program type (North America)
2 0 No PTY or undefined No PTY or undefined
3 1 News News
4 2 Current affairs Information
5 3 Information Sports
6 4 Sport Talk
7 5 Education Rock
8 6 Drama Classic rock
9 7 Culture Adult hits
10 8 Science Soft rock
11 9 Varied Top 40
12 10 Pop music Country
13 11 Rock music Oldies
14 12 Easy listening Soft
15 13 Light classical Nostalgia
16 14 Serious classical Jazz
17 15 Other music Classical
18 16 Weather Rhythm and blues
19 17 Finance Soft rhythm and blues
20 18 Children’s programmes Language
21 19 Social affairs Religious music
22 20 Religion Religious talk
23 21 Phone-in Personality
24 22 Travel Public
25 23 Leisure College
26 24 Jazz music Spanish Talk
27 25 Country music Spanish Music
28 26 National music Hip Hop
29 27 Oldies music Unassigned
30 28 Folk music Unassigned
31 29 Documentary Weather
32 30 Alarm test Emergency test
33 31 Alarm Emergency

242
python/rds_parser_table_qt.py

@ -31,26 +31,23 @@ pp = pprint.PrettyPrinter()
import cProfile, pstats, StringIO #for profiling
pr = cProfile.Profile()
from threading import Timer#to periodically save DB
#from threading import Timer#to periodically save DB
from PyQt4.QtCore import QObject, pyqtSignal
#from bitarray import bitarray
from bitstring import BitArray
SUFFIXES = {1: 'st', 2: 'nd', 3: 'rd'}
def ordinal(num):
# I'm checking for 10-20 because those are the digits that
# don't follow the normal counting scheme.
if 10 <= num % 100 <= 20:
suffix = 'th'
else:
# the second parameter is a default.
suffix = SUFFIXES.get(num % 10, 'th')
return str(num) + suffix
class tmc_message:
#def ref_locs(self,loc,name_string):
#if(loc==34196):#europe
#return(name_string)
#else:
#try:
#locarray=self.lcl_dict[loc]
#aref=int(locarray[6])
#loc_name=locarray[4]
#return(self.ref_locs(aref,name_string+","+loc_name))
##return(loc_name)
#except KeyError:
#return(name_string)
def __hash__(self):
def __hash__(self):#unused
if self.is_single:
return self.tmc_hash
else:
@ -74,10 +71,10 @@ class tmc_message:
self.tmc_D=Y15 #diversion bit(Y15)
self.tmc_DP=int(tmc_x&0x7) #duration and persistence 3 bits
self.is_complete=True
else:#1st group of multigroup -> no diversion bit
else:#1st group of multigroup -> no diversion bit, no duration (sent in mgm_tags)
self.is_complete=False
self.tmc_D=-1
self.tmc_DP=-1
self.tmc_D=0
self.tmc_DP=0
self.ci=int(tmc_x&0x7) #continuity index
self.data_arr=BitArray()
self.mgm_list=[]
@ -94,7 +91,7 @@ class tmc_message:
self.length=gsi
self.count=self.length
try:
if self.count==self.length: #group in sequence
if self.count==gsi: #group in sequence
data1=int(tmc_y&0xfff)#data block 1
data2=int(tmc_z)#data block 2
#code.interact(local=locals())
@ -110,12 +107,28 @@ class tmc_message:
del self.data_arr[0:fieldlen]
if not (label==0 and data.uint ==0):#ignore trailing zeros
self.mgm_list.append(mgm_tag(label,data))
if label==0:
self.tmc_DP=data.uint
elif label==1 and data.uint==5:
self.tmc_D=1#set diversion bit
self.count-=1
except AttributeError:
#3rd or later group receiver before second
print("out of sequence")
pass
workdir="/media/clemens/intdaten/uni_bulk/forschungsarbeit/data/"
#workdir="/user/wire2/richter/data/" #TODO store in repo
#read location code list:
reader = csv.reader(open(workdir+'LCL15.1.D-160122_utf8.csv'), delimiter=';', quotechar='"')
reader.next()#skip header
lcl_dict=dict((int(rows[0]),rows[1:]) for rows in reader)
#read TMC-event list
reader = csv.reader(open(workdir+'event-list_code+de-name_sort.csv'), delimiter=',', quotechar='"')
#no header
ecl_dict=dict((int(rows[0]),rows[1]) for rows in reader)
class mgm_tag:
class mgm_tag:#mgm=multi group message
field_lengths=[3, 3, 5, 5, 5, 8, 8, 8, 8, 11, 16, 16, 16, 16, 0, 0]
field_names={0:"Duration (value 000 is not allowed)"
,1:"Control code."
@ -133,8 +146,67 @@ class mgm_tag:
,13:"Cross linkage to source of problem, on another route."
,14:"Content Separator."
,15:"Reserved for future use."}
control_codes={0:"Default urgency increased by one level."
,1: "Default urgency reduced by one level."
,2:" Default directionality of message changed."
,3:" Default 'dynamic' or 'longer-lasting' provision interchanged."
,4:" Default spoken or unspoken duration interchanged."
,5:" Equivalent of diversion bit set to '1'."
,6:" Increase the number of steps in the problem extent by 8."
,7:" Increase the number of steps in the problem extent by 16."}
def decode_time_date(self,raw):#label7/8 raw to datestring
if raw<=95:
hrs=int(raw/4)#takes floor
mns=(95%4)*15
return "%i:%i"%(hrs,mns)
elif raw<=200:#hour and day
return "%i hours"%(raw-96)
elif raw<=231:#day of month
return "%s of month"%ordinal(raw-200)
elif raw<=255:#months
return "%s months"%((raw-231)/2.0)
else:
raise ValueError, "label7/8 time must be between 0 and 255"
def length_to_km(self,raw):#label2 raw to km
if raw==0:
return 100
elif raw <=10:
return raw
elif raw <=15:
return 2*raw-10
elif raw <=31:
return 5*raw-55
else:
raise ValueError, "label2-length must be between 0 and 31"
def __repr__(self):
return "%i:%s"%(self.label,str(self.data))
try:
if(self.label==0):
return "duration: %i"%self.data.uint
elif(self.label==1):
return "control code: %i"%self.data.uint
elif(self.label==2):
return "length affected: %i km"%self.length_to_km(self.data.uint)
elif(self.label==3):
return "speed limit: %i km/h"%(self.data.uint*5)
elif(self.label==7):
return "start: %s"%self.decode_time_date(self.data.uint)
elif(self.label==8):
return "stop: %s"%self.decode_time_date(self.data.uint)
elif(self.label==9):
event_string="event: %s"%ecl_dict[self.data.uint]
return event_string
elif(self.label==11):
location_string="dest.: %s"%",".join(lcl_dict[self.data.uint][3:5])#roadname(col3) and firstname (col4)
return location_string
elif(self.label==13):
location_string="crosslink: %s"%",".join(lcl_dict[self.data.uint][3:5])#roadname(col3) and firstname (col4)
return location_string
else:
return "%i:%s"%(self.label,str(self.data))
except KeyError:
return "%i:%s"%(self.label,str(self.data))
def __init__(self,label,data):
assert 0<=label and label <16,"mgm-tag label has to be between 0 and 15"
self.label = label
@ -150,7 +222,7 @@ class rds_parser_table_qt(gr.sync_block):
docstring for block qtguitest
"""
def goodbye(self):
print("rds parser table, closing db")
print("quitting rds parser table, closing db")
self.db.commit()
self.db.close()
def __init__(self,signals,nPorts,slot,freq,log,debug,workdir):
@ -177,13 +249,12 @@ class rds_parser_table_qt(gr.sync_block):
self.decoder_frequencies={}
self.colorder=['ID','freq','name','PTY','AF','time','text','quality','buttons']
self.workdir=workdir
atexit.register(self.goodbye)
self.PI_dict={}#contains PI:numpackets (string:integer)
#create new DB file
self.db_name=workdir+'RDS_data'+datetime.now().strftime("%Y%m%d_%H%M%S")+'.db'
#db=sqlite3.connect(self.db_name)
db=sqlite3.connect(self.db_name, check_same_thread=False)
#self.dbc= self.db.cursor()
#create tables
db.execute('''CREATE TABLE stations
(PI text PRIMARY KEY UNIQUE,PSN text, freq real, PTY text,TP integer)''')
@ -205,12 +276,8 @@ class rds_parser_table_qt(gr.sync_block):
tmc_D=tmc_y>>15 #diversion bit(Y15)
tmc_dir=(tmc_y>>14)&0x1 #+-direction bit (Y14)"""
#db.close()
self.db=db#TODO fix sqlite
t = Timer(10, self.commit_db)#every 10 seconds
t.start()
atexit.register(self.goodbye)
#self.dbc.execute('''CREATE TABLE rtp
@ -239,7 +306,11 @@ class rds_parser_table_qt(gr.sync_block):
reader.next()#skip header
self.pty_dict=dict((int(rows[0]),rows[1]) for rows in reader)
f.close()
def commit_db(self):
self.save_data_timer=time.time()
def clean_data_and_commit_db(self):
for PI in self.PI_dict:
self.PI_dict[PI]-=1
#print(self.PI_dict)
self.db.commit()
def set_freq_tune(self,freq):
self.tuning_frequency=int(freq)
@ -283,6 +354,9 @@ class rds_parser_table_qt(gr.sync_block):
self.RDS_data[PI]["DI"]=[2,2,2,2]
self.RDS_data[PI]["internals"]={"last_rt_tooltip":"","unfinished_TMC":{}}
def handle_msg(self, msg, port):#port from 0 to 3
if time.time()-self.save_data_timer > 10:#every 10 seconds
self.save_data_timer=time.time()
self.clean_data_and_commit_db()
pr.enable()
#code.interact(local=locals())
array=pmt.to_python(msg)[1]
@ -298,11 +372,21 @@ class rds_parser_table_qt(gr.sync_block):
PTY=(block2>>5)&0x1F
wrong_blocks=int(array[12])
#initialize dict 1st packet from station:
if not self.RDS_data.has_key(PI):
self.init_data_for_PI(PI)
if self.log:
print("found station %s"%PI)
try:
self.PI_dict[PI]+=1
except KeyError:
pass
if not self.RDS_data.has_key(PI):#station invalid/new
if not self.PI_dict.has_key(PI):#1st group
self.PI_dict[PI]=1
return#dont decode further if not yet valid
elif self.PI_dict[PI]>2:#count station as valid if more than 2 packets received
self.init_data_for_PI(PI)#initialize dict for station
if self.log:
print("found station %s"%PI)
else:
return#dont decode further if not yet valid
if self.decoder_frequencies.has_key(port):
freq=self.decoder_frequencies[port]
@ -327,7 +411,11 @@ class rds_parser_table_qt(gr.sync_block):
self.RDS_data[PI]["blockcounts"][groupType] +=1 #increment
else:
self.RDS_data[PI]["blockcounts"][groupType] = 1 #initialize (1st group of this type)
t=(PI,groupType,self.RDS_data[PI]["blockcounts"][groupType])
#error 161213:
# db.execute("INSERT OR REPLACE INTO grouptypeCounts (PI,grouptype,count) VALUES (?,?,?)",t)
#InterfaceError: Error binding parameter 0 - probably unsupported type.
#fix?: added str() to PI, but it should already be a string
t=(str(PI),groupType,self.RDS_data[PI]["blockcounts"][groupType])
db.execute("INSERT OR REPLACE INTO grouptypeCounts (PI,grouptype,count) VALUES (?,?,?)",t)
if (groupType == "0A"):#AF PSN
@ -400,6 +488,8 @@ class rds_parser_table_qt(gr.sync_block):
textcolor="black"
t=(str(datetime.now()),PI,self.RDS_data[PI]["PSN"],"PSN_valid",self.RDS_data[PI]["PSN"])
db.execute("INSERT INTO data (time,PI,PSN,dataType,data) VALUES (?,?,?,?,?)",t)
t=(self.RDS_data[PI]["PSN"],PI)
db.execute("UPDATE OR IGNORE stations SET PSN=? WHERE PI IS ?",t)
else:
textcolor="gray"
formatted_text=self.color_text(self.RDS_data[PI]["PSN"],adr*2,adr*2+2,textcolor,segmentcolor)
@ -607,9 +697,12 @@ class rds_parser_table_qt(gr.sync_block):
tmc_msg=self.RDS_data[PI]["internals"]["unfinished_TMC"][ci]
tmc_msg.add_group(tmc_y,tmc_z)
if tmc_msg.is_complete:
self.print_tmc_msg(tmc_msg)
self.print_tmc_msg(tmc_msg)#print and store message
del self.RDS_data[PI]["internals"]["unfinished_TMC"][tmc_msg.ci]#delete finished message
else:
print("ci%i not found, discarding"%ci)
#if not ci==0:
#print("ci %i not found, discarding"%ci)
pass
#if tmc_T == 0: #message #TODO: test message uniqueness here
##print("TMC-message")
@ -792,6 +885,7 @@ class rds_parser_table_qt(gr.sync_block):
valid = False
if(valid):
textcolor="black"
else:
textcolor="gray"
formatted_text=self.color_text(self.RDS_data[PI_ON]["PSN"],variant*2,variant*2+2,textcolor,segmentcolor)
@ -799,6 +893,12 @@ class rds_parser_table_qt(gr.sync_block):
self.RDS_data[PI_ON]["PSN"]=PS_ON_str
#formatted_text="<font face='Courier New' color='%s'>%s</font>"%("purple",PS_ON_str)
self.signals.DataUpdateEvent.emit({'PI':PI_ON,'PSN':formatted_text})
try:
t=(PI_ON,self.RDS_data[PI_ON]["PSN"],float(self.RDS_data[PI_ON]["AF"]["main"]),self.RDS_data[PI_ON]["PTY"],int(self.RDS_data[PI_ON]["TP"]))
db.execute("INSERT OR REPLACE INTO stations (PI,PSN,freq,PTY,TP) VALUES (?,?,?,?,?)",t)
except KeyError:
#not all info present -> no db update
pass
if variant==4:#AF_ON
if self.debug:
print("AF_ON method A")#TODO
@ -884,12 +984,19 @@ class rds_parser_table_qt(gr.sync_block):
self.db.execute("INSERT INTO data (time,PI,PSN,dataType,data) VALUES (?,?,?,?,?)",t)
#(hash,time,PI, F,event,location,DP,div,dir,extent,text)
message_string="%s ,firstname:%s, reflocs:%s"%(event_name,loc_first_name,self.ref_locs(tmc_location,""))
if tmc_msg.is_single:
multi_str="single"
else:
multi_str="complete:%i, list:%s"%(tmc_msg.is_complete,tmc_msg.mgm_list)
t=(tmc_hash,str(datetime.now()),PI, tmc_F,tmc_event,int(tmc_location),tmc_msg.tmc_DP,tmc_msg.tmc_D,tmc_msg.tmc_dir,tmc_msg.tmc_extent,message_string.decode("utf-8"),multi_str)
self.db.execute("INSERT INTO TMC (hash,time,PI, F,event,location,DP,div,dir,extent,text,multi) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)",t)
try:
if tmc_msg.is_single:
multi_str="single"
else:
multi_str="length:%i, list:%s"%(tmc_msg.length,str(tmc_msg.mgm_list))
t=(tmc_hash,str(datetime.now()),PI, tmc_F,tmc_event,int(tmc_location),tmc_msg.tmc_DP,tmc_msg.tmc_D,tmc_msg.tmc_dir,tmc_msg.tmc_extent,message_string.decode("utf-8"),multi_str.decode("utf-8"))
self.db.execute("INSERT INTO TMC (hash,time,PI, F,event,location,DP,div,dir,extent,text,multi) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)",t)
self.signals.DataUpdateEvent.emit({'TMC_log':multi_str})
except Exception as e:
print(e)
#pickle mgm_list:
#"(lp0\n(icrfa.rds_parser_table_qt\nmgm_tag\np1\n(dp2\nS'data'\np3\nccopy_reg\n_reconstructor\np4\n(cbitstring\nBitArray\np5\nc__builtin__\nobject\np6\nNtp7\nRp8\nsS'label'\np9\nI14\nsba(icrfa.rds_parser_table_qt\nmgm_tag\np10\n(dp11\ng3\ng4\n(g5\ng6\nNtp12\nRp13\nsg9\nI9\nsba(icrfa.rds_parser_table_qt\nmgm_tag\np14\n(dp15\ng3\ng4\n(g5\ng6\nNtp16\nRp17\nsg9\nI2\nsba."
code.interact(local=locals())
#print(message_string)
except KeyError:
#print("location '%i' not found"%tmc_location)
@ -1089,16 +1196,6 @@ class rds_parser_table_qt_Widget(QtGui.QWidget):
if event.has_key('tooltip'):
item=self.table.cellWidget(row,event['col'])
item.setToolTip(Qt.QString(event['tooltip']))
#if event.has_key('PI'):
##setPI
#PIcol=self.colorder.index('ID')
##rtpcol=self.colorder.index('RT+')
#rtcol=self.colorder.index('text')
#if not str(self.table.item(row,PIcol).text()) == event['PI']:
##self.table.cellWidget(row,rtpcol).setText("")#clear RT+ on changed PI
#print("PI changed on row %i, cleared RT-tt"%row)
#self.table.cellWidget(row,rtcol).setToolTip(Qt.QString(""))
#self.table.item(row,PIcol).setText(event['PI'])
if event.has_key('AF'):
#setAF
PIcol=self.colorder.index('AF')
@ -1108,16 +1205,10 @@ class rds_parser_table_qt_Widget(QtGui.QWidget):
PSNcol=self.colorder.index('name')
item=self.table.cellWidget(row,PSNcol)
item.setText(event['PSN'])
#end of display-data
if time.time()-self.lastResizeTime > 2:#every 2 seconds
self.table.resizeColumnsToContents()
self.lastResizeTime=time.time()
def resize_columns(self):#doesn't work -> not thread safe
try:
print("resized")
self.table.resizeColumnsToContents()
except:
print("caught exception :(")
#end of display-data
def saveData(self):
filename="RDS_data_"+str(datetime.now())+".txt"
f=open(self.tableobj.workdir+filename,"w")
@ -1146,22 +1237,19 @@ class rds_parser_table_qt_Widget(QtGui.QWidget):
def getDetails(self,row):
PIcol=self.colorder.index('ID')
PI=str(self.table.cellWidget(row,PIcol).text())
#PI=
#print("row:%i,PI:%s"%(row,PI))
#print(self.tableobj.RDS_data[PI])
table=chart.DataTable()
table.addColumn('groupType')
table.addColumn('numPackets')
#ordered_blockcounts=self.tableobj.RDS_data["D00F"]['blockcounts']
blockcounts=copy.deepcopy(self.tableobj.RDS_data[PI]['blockcounts'])
del blockcounts['any']
#lambda function removes last character of PI string (A or B) and sorts based on integer valure of number in front
for key in sorted(blockcounts,key=lambda elem: int(elem[0:-1])):
count=blockcounts[key]
table.addRow([key+": "+str(count),count])
mychart=chart.PieChart(table)
view = chart.DialogViewer()
view.setGraph(mychart)
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)
table=chart.DataTable()
table.addColumn('groupType')
table.addColumn('numPackets')
blockcounts=copy.deepcopy(self.tableobj.RDS_data[PI]['blockcounts'])
del blockcounts['any']
#lambda function removes last character of PI string (A or B) and sorts based on integer valure of number in front
for key in sorted(blockcounts,key=lambda elem: int(elem[0:-1])):
count=blockcounts[key]
table.addRow([key+": "+str(count),count])
mychart=chart.PieChart(table)
view.setGraph(mychart)
#view.resize(360, 240)
#view.resize(380, 550)
rds_data=copy.deepcopy(self.tableobj.RDS_data[PI])

Loading…
Cancel
Save