def getOrbPosFromNit(self, currentProcess): if self.DVB_type.value != "DVB-S" or not dvbreader_available or self.frontend is None or self.demux < 0: return adapter = 0 demuxer_device = "/dev/dvb/adapter%d/demux%d" % (adapter, self.demux) nit_current_pid = 0x10 nit_current_table_id = 0x40 nit_other_table_id = 0x00 # don't read other table if nit_other_table_id == 0x00: mask = 0xff else: mask = nit_current_table_id ^ nit_other_table_id ^ 0xff nit_current_timeout = 60 # maximum time allowed to read the network information table (seconds) nit_current_version_number = -1 nit_current_sections_read = [] nit_current_sections_count = 0 nit_current_content = [] nit_current_completed = False fd = dvbreader.open(demuxer_device, nit_current_pid, nit_current_table_id, mask, self.feid) if fd < 0: print "[Satfinder][getOrbPosFromNit] Cannot open the demuxer" return timeout = datetime.datetime.now() timeout += datetime.timedelta(0, nit_current_timeout) while True: if datetime.datetime.now() > timeout: print "[Satfinder][getOrbPosFromNit] Timed out reading NIT" break if self.currentProcess != currentProcess or not self.tunerLock(): dvbreader.close(fd) return section = dvbreader.read_nit(fd, nit_current_table_id, nit_other_table_id) if section is None: time.sleep(0.1) # no data.. so we wait a bit continue if section["header"]["table_id"] == nit_current_table_id and not nit_current_completed: if section["header"]["version_number"] != nit_current_version_number: nit_current_version_number = section["header"]["version_number"] nit_current_sections_read = [] nit_current_sections_count = section["header"]["last_section_number"] + 1 nit_current_content = [] if section["header"]["section_number"] not in nit_current_sections_read: nit_current_sections_read.append(section["header"]["section_number"]) nit_current_content += section["content"] if len(nit_current_sections_read) == nit_current_sections_count: nit_current_completed = True if nit_current_completed: break dvbreader.close(fd) if not nit_current_content: print "[Satfinder][getOrbPosFromNit] current transponder not found" return transponders = [t for t in nit_current_content if "descriptor_tag" in t and t["descriptor_tag"] == 0x43 and t["original_network_id"] == self.onid and t["transport_stream_id"] == self.tsid] transponders2 = [t for t in nit_current_content if "descriptor_tag" in t and t["descriptor_tag"] == 0x43 and t["transport_stream_id"] == self.tsid] if transponders and "orbital_position" in transponders[0]: orb_pos = self.getOrbitalPosition(transponders[0]["orbital_position"], transponders[0]["west_east_flag"]) self["pos"].setText(_("%s") % orb_pos) print "[satfinder][getOrbPosFromNit] orb_pos", orb_pos elif transponders2 and "orbital_position" in transponders2[0]: orb_pos = self.getOrbitalPosition(transponders2[0]["orbital_position"], transponders2[0]["west_east_flag"]) self["pos"].setText(_("%s?") % orb_pos) print "[satfinder][getOrbPosFromNit] orb_pos tentative, tsid match, onid mismatch between NIT and SDT", orb_pos else: print "[satfinder][getOrbPosFromNit] no orbital position found"
def getOrbPosFromNit(self, currentProcess): if not dvbreader_available: return print "[Satfinder][getOrbPosFromNit] starting" if self.demux < 0: print "[Satfinder][getOrbPosFromNit] Demux not allocated" return self.orb_pos = '' adapter = 0 demuxer_device = "/dev/dvb/adapter%d/demux%d" % (adapter, self.demux) nit_current_pid = 0x10 nit_current_table_id = 0x40 nit_other_table_id = 0x00 # don't read other table if nit_other_table_id == 0x00: mask = 0xff else: mask = nit_current_table_id ^ nit_other_table_id ^ 0xff nit_current_timeout = 60 # time allowed to get table data nit_current_version_number = -1 nit_current_sections_read = [] nit_current_sections_count = 0 nit_current_content = [] nit_current_completed = False fd = dvbreader.open(demuxer_device, nit_current_pid, nit_current_table_id, mask, self.feid) if fd < 0: print "[Satfinder][getOrbPosFromNit] Cannot open the demuxer" return timeout = datetime.datetime.now() timeout += datetime.timedelta(0, nit_current_timeout) while True: if datetime.datetime.now() > timeout: print "[Satfinder][getOrbPosFromNit] Timed out reading NIT" break if self.currentProcess != currentProcess: print "[satfinder][getOrbPosFromNit] killed: %s, currentProcess: %s" % ( currentProcess, self.currentProcess) dvbreader.close(fd) return section = dvbreader.read_nit(fd, nit_current_table_id, nit_other_table_id) if section is None: time.sleep(0.1) # no data.. so we wait a bit continue if section["header"][ "table_id"] == nit_current_table_id and not nit_current_completed: if section["header"][ "version_number"] != nit_current_version_number: nit_current_version_number = section["header"][ "version_number"] nit_current_sections_read = [] nit_current_sections_count = section["header"][ "last_section_number"] + 1 nit_current_content = [] if section["header"][ "section_number"] not in nit_current_sections_read: nit_current_sections_read.append( section["header"]["section_number"]) nit_current_content += section["content"] if len(nit_current_sections_read ) == nit_current_sections_count: nit_current_completed = True if nit_current_completed: break dvbreader.close(fd) if not nit_current_content: print "[Satfinder][getOrbPosFromNit] current transponder not found" return transponders = [ t for t in nit_current_content if "descriptor_tag" in t and t["descriptor_tag"] == 0x43 and t["original_network_id"] == self.onid and t["transport_stream_id"] == self.tsid ] if transponders and "orbital_position" in transponders[0]: self.orb_pos = self.getOrbitalPosition( transponders[0]["orbital_position"], transponders[0]["west_east_flag"]) print "[satfinder][getOrbPosFromNit] self.orb_pos", self.orb_pos else: print "[satfinder][getOrbPosFromNit] no orbital position found"
def getCurrentTsidOnid(self, from_retune = False): self.currentProcess = currentProcess = datetime.datetime.now() self["tsid"].setText("") self["onid"].setText("") self["pos"].setText("") #(self.DVB_type.value) self["key_yellow"].setText("") self["actions2"].setEnabled(False) self.serviceList = [] if not dvbreader_available or self.frontend is None or self.demux < 0: return if from_retune: # give the tuner a chance to retune or we will be reading the old stream time.sleep(1.0) if not self.tunerLock() and not self.waitTunerLock(currentProcess): # dont even try to read the transport stream if tuner is not locked return thread.start_new_thread(self.monitorTunerLock, (currentProcess,)) # if tuner loses lock we start again from scratch adapter = 0 demuxer_device = "/dev/dvb/adapter%d/demux%d" % (adapter, self.demux) sdt_pid = 0x11 sdt_current_table_id = 0x42 mask = 0xff tsidOnidTimeout = 60 # maximum time allowed to read the service descriptor table (seconds) self.tsid = None self.onid = None sdt_current_version_number = -1 sdt_current_sections_read = [] sdt_current_sections_count = 0 sdt_current_content = [] sdt_current_completed = False fd = dvbreader.open(demuxer_device, sdt_pid, sdt_current_table_id, mask, self.feid) if fd < 0: print "[Satfinder][getCurrentTsidOnid] Cannot open the demuxer" return None timeout = datetime.datetime.now() timeout += datetime.timedelta(0, tsidOnidTimeout) while True: if datetime.datetime.now() > timeout: print "[Satfinder][getCurrentTsidOnid] Timed out" break if self.currentProcess != currentProcess or not self.tunerLock(): dvbreader.close(fd) return section = dvbreader.read_sdt(fd, sdt_current_table_id, 0x00) if section is None: time.sleep(0.1) # no data.. so we wait a bit continue if section["header"]["table_id"] == sdt_current_table_id and not sdt_current_completed: if section["header"]["version_number"] != sdt_current_version_number: sdt_current_version_number = section["header"]["version_number"] sdt_current_sections_read = [] sdt_current_sections_count = section["header"]["last_section_number"] + 1 sdt_current_content = [] if section["header"]["section_number"] not in sdt_current_sections_read: sdt_current_sections_read.append(section["header"]["section_number"]) sdt_current_content += section["content"] if self.tsid is None or self.onid is None: # write first find straight to the screen self.tsid = section["header"]["transport_stream_id"] self.onid = section["header"]["original_network_id"] self["tsid"].setText("%d" % (section["header"]["transport_stream_id"])) self["onid"].setText("%d" % (section["header"]["original_network_id"])) print "[Satfinder][getCurrentTsidOnid] tsid %d, onid %d" % (section["header"]["transport_stream_id"], section["header"]["original_network_id"]) if len(sdt_current_sections_read) == sdt_current_sections_count: sdt_current_completed = True if sdt_current_completed: break dvbreader.close(fd) if not sdt_current_content: print "[Satfinder][getCurrentTsidOnid] no services found on transponder" return for i in range(len(sdt_current_content)): if not sdt_current_content[i]["service_name"]: # if service name is empty use SID sdt_current_content[i]["service_name"] = "0x%x" % sdt_current_content[i]["service_id"] self.serviceList = sorted(sdt_current_content, key=lambda listItem: listItem["service_name"]) if self.serviceList: self["key_yellow"].setText(_("Service list")) self["actions2"].setEnabled(True) self.getOrbPosFromNit(currentProcess)
def getCurrentTsidOnid(self, currentProcess): self.serviceList = [] if not dvbreader_available or self.frontend is None: return adapter = 0 demuxer_device = "/dev/dvb/adapter%d/demux%d" % (adapter, self.demux) sdt_pid = 0x11 sdt_current_table_id = 0x42 mask = 0xff tsidOnidTimeout = 60 self.tsid = None self.onid = None sdt_current_version_number = -1 sdt_current_sections_read = [] sdt_current_sections_count = 0 sdt_current_content = [] sdt_current_completed = False fd = dvbreader.open(demuxer_device, sdt_pid, sdt_current_table_id, mask, self.feid) if fd < 0: print "[Satfinder][getCurrentTsidOnid] Cannot open the demuxer" return None timeout = datetime.datetime.now() timeout += datetime.timedelta(0, tsidOnidTimeout) while True: if datetime.datetime.now() > timeout: print "[Satfinder][getCurrentTsidOnid] Timed out" break if self.currentProcess != currentProcess: dvbreader.close(fd) print "[satfinder][getCurrentTsidOnid] killed: %s, currentProcess: %s" % ( currentProcess, self.currentProcess) return section = dvbreader.read_sdt(fd, sdt_current_table_id, 0x00) if section is None: time.sleep(0.1) # no data.. so we wait a bit continue if section["header"][ "table_id"] == sdt_current_table_id and not sdt_current_completed: if section["header"][ "version_number"] != sdt_current_version_number: sdt_current_version_number = section["header"][ "version_number"] sdt_current_sections_read = [] sdt_current_sections_count = section["header"][ "last_section_number"] + 1 sdt_current_content = [] if section["header"][ "section_number"] not in sdt_current_sections_read: sdt_current_sections_read.append( section["header"]["section_number"]) sdt_current_content += section["content"] if self.tsid is None or self.onid is None: # write first find straight to the screen self.tsid = section["header"]["transport_stream_id"] self.onid = section["header"]["original_network_id"] self["tsid"].setText( "%d" % (section["header"]["transport_stream_id"])) self["onid"].setText( "%d" % (section["header"]["original_network_id"])) #self["introduction"].setText("TSID: %d, ONID: %d" % (section["header"]["transport_stream_id"], section["header"]["original_network_id")) print "[Satfinder][getCurrentTsidOnid] tsid %d, onid %d" % ( section["header"]["transport_stream_id"], section["header"]["original_network_id"]) if len(sdt_current_sections_read ) == sdt_current_sections_count: sdt_current_completed = True if sdt_current_completed: break dvbreader.close(fd) if not sdt_current_content: print "[Satfinder][keyReadServices] no services found on transponder" return for i in range(len(sdt_current_content)): if not sdt_current_content[i][ "service_name"]: # if service name is empty use SID sdt_current_content[i][ "service_name"] = "0x%x" % sdt_current_content[i][ "service_id"] self.serviceList = sorted( sdt_current_content, key=lambda listItem: listItem["service_name"]) if self.serviceList: self["key_yellow"].setText(_("Service list")) try: self.getOrbPosFromNit(currentProcess) if self.orb_pos: self["pos"].setText(_("%s") % self.orb_pos) #self["introduction"].setText("TSID: %d, ONID: %d, %s" % (self.tsid, self.onid, self.orb_pos)) except Exception, e: print "[satfinder][getCurrentTsidOnid] exception", e