diff --git a/src/zapit/include/zapit/scan.h b/src/zapit/include/zapit/scan.h index 0320a36f4..93bd1118f 100644 --- a/src/zapit/include/zapit/scan.h +++ b/src/zapit/include/zapit/scan.h @@ -11,7 +11,7 @@ #include #include -#include +#include #include #include #include "bouquets.h" @@ -45,6 +45,7 @@ class CServiceScan : public OpenThreads::Thread uint32_t found_radio_chans; uint32_t found_data_chans; uint32_t failed_transponders; + unsigned short cable_nid; short curr_sat; @@ -78,6 +79,7 @@ class CServiceScan : public OpenThreads::Thread void run(); + CFrontend * frontend; static CServiceScan * scan; CServiceScan(); @@ -96,8 +98,12 @@ class CServiceScan : public OpenThreads::Thread void Abort() { abort_scan = 1; }; bool Aborted() { return abort_scan; }; + bool SetFrontend(t_satellite_position satellitePosition); + CFrontend * GetFrontend() { return frontend; }; + uint32_t & FoundTransponders() { return found_transponders; }; uint32_t & FoundChannels() { return found_channels; }; + void SetCableNID(unsigned short nid) { cable_nid = nid; } }; #endif /* __scan_h__ */ diff --git a/src/zapit/src/scan.cpp b/src/zapit/src/scan.cpp index bfa348a6d..c987630aa 100644 --- a/src/zapit/src/scan.cpp +++ b/src/zapit/src/scan.cpp @@ -26,13 +26,11 @@ #include #include -#include #include #include #include #include #include -#include #include #include @@ -63,6 +61,8 @@ CServiceScan::CServiceScan() started = false; scan_nit = false; running = false; + cable_nid = 0; + frontend = CFEManager::getInstance()->getFE(0); } CServiceScan::~CServiceScan() @@ -128,8 +128,8 @@ void CServiceScan::run() bool CServiceScan::tuneFrequency(FrontendParameters *feparams, uint8_t polarization, t_satellite_position satellitePosition) { - CFrontend::getInstance()->setInput(satellitePosition, feparams->frequency, polarization); - int ret = CFrontend::getInstance()->driveToSatellitePosition(satellitePosition, false); //true); + frontend->setInput(satellitePosition, feparams->frequency, polarization); + int ret = frontend->driveToSatellitePosition(satellitePosition, false); //true); if(ret > 0) { printf("[scan] waiting %d seconds for motor to turn satellite dish.\n", ret); CZapit::getInstance()->SendEvent(CZapitClient::EVT_SCAN_PROVIDER, (void *) "moving rotor", 13); @@ -139,7 +139,7 @@ bool CServiceScan::tuneFrequency(FrontendParameters *feparams, uint8_t polarizat return false; } } - return CFrontend::getInstance()->tuneFrequency(feparams, polarization, false); + return frontend->tuneFrequency(feparams, polarization, false); } bool CServiceScan::AddTransponder(transponder_id_t TsidOnid, FrontendParameters *feparams, uint8_t polarity, bool fromnit) @@ -256,19 +256,21 @@ _repeat: if(abort_scan) return false; -#ifdef NIT_THREAD - pthread_t nthread; - if(scan_nit) - if(pthread_create(&nthread, 0, nit_thread, (void*)satellitePosition)) { - ERROR("pthread_create"); - nthread = 0; - } -#endif freq_id_t freq; if(cable) freq = tI->second.feparams.frequency/100; else freq = tI->second.feparams.frequency/1000; + +#ifdef NIT_THREAD + pthread_t nthread; + nit_thread_args_t threadArgs(satellitePosition, freq, cable_nid); + if(scan_nit) + if(pthread_create(&nthread, 0, nit_thread, (void*)&threadArgs)) { + ERROR("pthread_create"); + nthread = 0; + } +#endif //INFO("parsing SDT (tsid:onid %04x:%04x)", tI->second.transport_stream_id, tI->second.original_network_id); int status = parse_sdt(&tI->second.transport_stream_id, &tI->second.original_network_id, satellitePosition, freq /*tI->second.feparams.frequency/1000*/); if(status < 0) { @@ -361,7 +363,7 @@ bool CServiceScan::AddTransponder(xmlNodePtr transponder, uint8_t diseqc_pos, t_ feparams.u.qam.modulation = (fe_modulation_t) xmlGetNumericAttribute(transponder, "modulation", 0); diseqc_pos = 0; } - else if (CFrontend::getInstance()->getInfo()->type == FE_QPSK) { + else if (frontend->getInfo()->type == FE_QPSK) { feparams.u.qpsk.symbol_rate = xmlGetNumericAttribute(transponder, "symbol_rate", 0); polarization = xmlGetNumericAttribute(transponder, "polarization", 0); system = xmlGetNumericAttribute(transponder, "system", 0); @@ -411,14 +413,10 @@ bool CServiceScan::ScanProvider(xmlNodePtr search, t_satellite_position satellit processed_transponders = 0; TIMER_START(); - sat_iterator_t sit = satellitePositions.find(satellitePosition); - if(sit == satellitePositions.end()) { - printf("[zapit] WARNING satellite position %d not found!\n", satellitePosition); - return false; - } + std::string satname = CServiceManager::getInstance()->GetSatelliteName(satellitePosition); CZapit::getInstance()->SendEvent(CZapitClient::EVT_SCAN_REPORT_NUM_SCANNED_TRANSPONDERS, &processed_transponders, sizeof(processed_transponders)); - CZapit::getInstance()->SendEvent(CZapitClient::EVT_SCAN_SATELLITE, sit->second.name.c_str(), sit->second.name.size() + 1); + CZapit::getInstance()->SendEvent(CZapitClient::EVT_SCAN_SATELLITE, satname.c_str(), satname.size() + 1); tps = search->xmlChildrenNode; /* TPs from current service list */ for(tI = transponders.begin(); tI != transponders.end(); tI++) { @@ -470,6 +468,19 @@ void CServiceScan::Cleanup(const bool success) service_types.clear(); } +bool CServiceScan::SetFrontend(t_satellite_position satellitePosition) +{ + CFrontend * fe = CFEManager::getInstance()->getScanFrontend(satellitePosition); + if(fe == NULL) { + INFO("No frontend found for satellite %d\n", satellitePosition); + return false; + } + + frontend = fe; + CFEManager::getInstance()->setLiveFE(frontend); + return true; +} + bool CServiceScan::ScanProviders() { scan_list_iterator_t spI; @@ -482,7 +493,7 @@ bool CServiceScan::ScanProviders() curr_sat = 0; - cable = (CFrontend::getInstance()->getInfo()->type == FE_QAM); + cable = (frontend->getInfo()->type == FE_QAM);//FIXME if (cable) frontendType = "cable"; else @@ -492,7 +503,7 @@ bool CServiceScan::ScanProviders() int scan_sat_mode = mode & 0xFF00; // single = 0, all = 1 printf("[zapit] scan mode %s, satellites %s\n", scan_nit ? "NIT" : "fast", scan_sat_mode ? "all" : "single"); - // CZapitClient myZapitClient; + CZapitClient myZapitClient; /* get first child */ //xmlNodePtr search = xmlDocGetRootElement(scanInputParser)->xmlChildrenNode; @@ -518,6 +529,8 @@ bool CServiceScan::ScanProviders() /* provider is not wanted - jump to the next one */ if (spI != scanProviders.end()) { + if(!SetFrontend(position)) + break; /* get name of current satellite oder cable provider */ strcpy(providerName, xmlGetAttribute(search, "name")); @@ -562,24 +575,10 @@ bool CServiceScan::ScanProviders() g_bouquetManager->loadBouquets(); printf("[scan] save bouquets done\n"); Cleanup(true); -#if 1 - CZapitClient myZapitClient; myZapitClient.reloadCurrentServices(); -#else - /* this can hang as the thread handling the connections - * could already be in g_Zapit->stopScan(), waiting for - * *this* thread to join(). - myZapitClient.reloadCurrentServices(); - * so let's do another ugly, layer-violating hack... - */ - CFrontend::getInstance()->setTsidOnid(0); - t_channel_id live_channel_id = CZapit::getInstance()->GetCurrentChannelID(); - CZapit::getInstance()->ZapIt(live_channel_id, false); - CZapit::getInstance()->SendEvent(CZapitClient::EVT_SERVICES_CHANGED); -#endif } else { Cleanup(false); - CFrontend::getInstance()->setTsidOnid(0); + frontend->setTsidOnid(0); t_channel_id live_channel_id = CZapit::getInstance()->GetCurrentChannelID(); CZapit::getInstance()->ZapIt(live_channel_id, false); } @@ -593,13 +592,18 @@ bool CServiceScan::ScanTransponder() char providerName[32] = ""; t_satellite_position satellitePosition = 0; + satellitePosition = scanProviders.begin()->first; + if(!SetFrontend(satellitePosition)) { + Cleanup(false); + return false; + } + scanBouquetManager = new CBouquetManager(); - cable = (CFrontend::getInstance()->getInfo()->type == FE_QAM); + cable = (frontend->getInfo()->type == FE_QAM);//FIXME strcpy(providerName, scanProviders.size() > 0 ? scanProviders.begin()->second.c_str() : "unknown provider"); - satellitePosition = scanProviders.begin()->first; printf("[scan_transponder] scanning sat %s position %d\n", providerName, satellitePosition); CZapit::getInstance()->SendEvent(CZapitClient::EVT_SCAN_SATELLITE, providerName, strlen(providerName) + 1); @@ -628,7 +632,7 @@ bool CServiceScan::ScanTransponder() if(abort_scan) found_channels = 0; - // CZapitClient myZapitClient; + CZapitClient myZapitClient; //FIXME move to Cleanup() ? if(found_channels) { CServiceManager::getInstance()->SaveServices(true); @@ -639,21 +643,10 @@ bool CServiceScan::ScanTransponder() //g_bouquetManager->clearAll(); g_bouquetManager->loadBouquets(); Cleanup(true); -#if 1 - CZapitClient myZapitClient; myZapitClient.reloadCurrentServices(); -#else - /* see the explanation in CServiceScan::ScanProviders() in why this is a bad idea - myZapitClient.reloadCurrentServices(); - */ - CFrontend::getInstance()->setTsidOnid(0); - t_channel_id live_channel_id = CZapit::getInstance()->GetCurrentChannelID(); - CZapit::getInstance()->ZapIt(live_channel_id, false); - CZapit::getInstance()->SendEvent(CZapitClient::EVT_SERVICES_CHANGED); -#endif } else { Cleanup(false); - CFrontend::getInstance()->setTsidOnid(0); + frontend->setTsidOnid(0); t_channel_id live_channel_id = CZapit::getInstance()->GetCurrentChannelID(); CZapit::getInstance()->ZapIt(live_channel_id, false); }