From 4623328db2d1eac1bd6f5fc14e850b5dd36fa50e Mon Sep 17 00:00:00 2001 From: "[CST] Focus" Date: Fri, 13 Jan 2012 14:23:18 +0400 Subject: [PATCH] Move global satellitePositions to CServiceManager class; add frontendType member to CServiceManager --- src/zapit/include/zapit/getservices.h | 31 +++++++-- src/zapit/include/zapit/satconfig.h | 27 +++++++- src/zapit/src/getservices.cpp | 90 ++++++++++++++------------- 3 files changed, 97 insertions(+), 51 deletions(-) diff --git a/src/zapit/include/zapit/getservices.h b/src/zapit/include/zapit/getservices.h index ed733d4d5..479308fc6 100644 --- a/src/zapit/include/zapit/getservices.h +++ b/src/zapit/include/zapit/getservices.h @@ -26,10 +26,10 @@ #include -#include "ci.h" -#include "descriptors.h" -#include "sdt.h" -#include "types.h" +#include +#include +#include +#include #include #include #include @@ -99,9 +99,12 @@ class CServiceManager tallchans curchans; tallchans nvodchannels; + fe_type_t frontendType; + satellite_map_t satellitePositions; + bool ParseScanXml(); void ParseTransponders(xmlNodePtr node, t_satellite_position satellitePosition, bool cable); - void ParseChannels(xmlNodePtr node, const t_transport_stream_id transport_stream_id, const t_original_network_id original_network_id, t_satellite_position satellitePosition, freq_id_t freq); + void ParseChannels(xmlNodePtr node, const t_transport_stream_id transport_stream_id, const t_original_network_id original_network_id, t_satellite_position satellitePosition, freq_id_t freq, uint8_t polarization); void FindTransponder(xmlNodePtr search); void ParseSatTransponders(fe_type_t frontendType, xmlNodePtr search, t_satellite_position satellitePosition); int LoadMotorPositions(void); @@ -120,7 +123,7 @@ class CServiceManager static void CopyFile(char * from, char * to); - void InitSatPosition(t_satellite_position position); + bool InitSatPosition(t_satellite_position position, char * name = NULL, bool force = false); bool LoadServices(bool only_current); void SaveServices(bool tocopy); void SaveMotorPositions(); @@ -148,6 +151,22 @@ class CServiceManager bool GetAllSatelliteChannels(ZapitChannelList &list, t_satellite_position position); bool GetAllUnusedChannels(ZapitChannelList &list); + std::string GetSatelliteName(t_satellite_position position) + { + sat_iterator_t it = satellitePositions.find(position); + if(it != satellitePositions.end()) + return it->second.name; + return ""; + } + t_satellite_position GetSatellitePosition(std::string name) + { + for(sat_iterator_t sit = satellitePositions.begin(); sit != satellitePositions.end(); ++sit) { + if(name == sit->second.name) + return sit->second.position; + } + return 0; + } + satellite_map_t & SatelliteList() { return satellitePositions; } xmlDocPtr ScanXml(); }; #endif /* __getservices_h__ */ diff --git a/src/zapit/include/zapit/satconfig.h b/src/zapit/include/zapit/satconfig.h index ac26dbaea..b5bac4989 100644 --- a/src/zapit/include/zapit/satconfig.h +++ b/src/zapit/include/zapit/satconfig.h @@ -1,7 +1,28 @@ +/* + * Copyright (C) 2011 CoolStream International Ltd + * + * License: GPLv2 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + #ifndef _SAT_CONFIG_H_ #define _SAT_CONFIG_H_ typedef struct sat_config { + t_satellite_position position; int diseqc; int commited; int uncommited; @@ -14,8 +35,8 @@ typedef struct sat_config { int use_usals; std::string name; int have_channels; - t_satellite_position position; int input; + int configured; } sat_config_t; typedef enum diseqc_cmd_order { @@ -23,12 +44,14 @@ typedef enum diseqc_cmd_order { COMMITED_FIRST } diseqc_cmd_order_t; +typedef std::pair satellite_pair_t; typedef std::map satellite_map_t; typedef std::map::iterator sat_iterator_t; typedef std::map scan_list_t; typedef std::map ::iterator scan_list_iterator_t; -extern satellite_map_t satellitePositions; +//extern satellite_map_t satellitePositions; extern scan_list_t scanProviders; + #endif diff --git a/src/zapit/src/getservices.cpp b/src/zapit/src/getservices.cpp index ca23ed59a..3dcb612f3 100644 --- a/src/zapit/src/getservices.cpp +++ b/src/zapit/src/getservices.cpp @@ -21,7 +21,7 @@ #include #include -#include +#include #include #include #include @@ -33,7 +33,7 @@ extern transponder_list_t transponders; -satellite_map_t satellitePositions; +//satellite_map_t satellitePositions; std::map select_transponders; extern int zapit_debug; @@ -64,7 +64,8 @@ bool CServiceManager::ParseScanXml(void) delete scanInputParser; scanInputParser = NULL; } - switch (CFrontend::getInstance()->getInfo()->type) { + frontendType = CFEManager::getInstance()->getLiveFE()->getInfo()->type; + switch (frontendType) { case FE_QPSK: scanInputParser = parseXmlFile(SATELLITES_XML); break; @@ -74,7 +75,7 @@ bool CServiceManager::ParseScanXml(void) break; default: - WARN("Unknown type %d", CFrontend::getInstance()->getInfo()->type); + WARN("Unknown type %d", frontendType); return false; } return (scanInputParser != NULL); @@ -307,7 +308,7 @@ void CServiceManager::ParseTransponders(xmlNodePtr node, t_satellite_position sa printf("[zapit] duplicate transponder id %llx freq %d\n", tid, feparams.frequency); /* read channels that belong to the current transponder */ - ParseChannels(node->xmlChildrenNode, transport_stream_id, original_network_id, satellitePosition, freq); + ParseChannels(node->xmlChildrenNode, transport_stream_id, original_network_id, satellitePosition, freq, polarization); /* hop to next transponder */ node = node->xmlNextNode; @@ -315,7 +316,7 @@ void CServiceManager::ParseTransponders(xmlNodePtr node, t_satellite_position sa return; } -void CServiceManager::ParseChannels(xmlNodePtr node, const t_transport_stream_id transport_stream_id, const t_original_network_id original_network_id, t_satellite_position satellitePosition, freq_id_t freq) +void CServiceManager::ParseChannels(xmlNodePtr node, const t_transport_stream_id transport_stream_id, const t_original_network_id original_network_id, t_satellite_position satellitePosition, freq_id_t freq, uint8_t polarization) { t_service_id service_id; std::string name; @@ -377,6 +378,7 @@ void CServiceManager::ParseChannels(xmlNodePtr node, const t_transport_stream_id } else { service_count++; channel->scrambled = scrambled; + channel->polarization = polarization; service_type = channel->getServiceType(); if(pmtpid != 0 && (((service_type == 2) && (apid > 0)) || ( (service_type == 1) && (vpid > 0) && (apid > 0))) ) { DBG("[getserv] preset chan %s vpid %X sid %X tpid %X onid %X\n", name.c_str(), vpid, service_id, transport_stream_id, transport_stream_id); @@ -415,7 +417,7 @@ void CServiceManager::FindTransponder(xmlNodePtr search) } } -void CServiceManager::ParseSatTransponders(fe_type_t frontendType, xmlNodePtr search, t_satellite_position satellitePosition) +void CServiceManager::ParseSatTransponders(fe_type_t fType, xmlNodePtr search, t_satellite_position satellitePosition) { uint8_t polarization = 0; uint8_t system = 0, modulation = 1; @@ -432,7 +434,7 @@ void CServiceManager::ParseSatTransponders(fe_type_t frontendType, xmlNodePtr se feparams.frequency = xmlGetNumericAttribute(tps, "frequency", 0); freq_id_t freq; - if (frontendType == FE_QAM) { + if (fType == FE_QAM) { if (feparams.frequency > 1000*1000) feparams.frequency=feparams.frequency/1000; //transponderlist was read from tuxbox //feparams.frequency = (int) 1000 * (int) round ((double) feparams.frequency / (double) 1000); @@ -445,12 +447,12 @@ void CServiceManager::ParseSatTransponders(fe_type_t frontendType, xmlNodePtr se feparams.inversion = INVERSION_AUTO; - if (frontendType == FE_QAM) { + if (fType == FE_QAM) { feparams.u.qam.symbol_rate = xmlGetNumericAttribute(tps, "symbol_rate", 0); feparams.u.qam.fec_inner = (fe_code_rate_t) xmlGetNumericAttribute(tps, "fec_inner", 0); feparams.u.qam.modulation = (fe_modulation_t) xmlGetNumericAttribute(tps, "modulation", 0); } - else if (frontendType == FE_QPSK) { + else if (fType == FE_QPSK) { feparams.u.qpsk.symbol_rate = xmlGetNumericAttribute(tps, "symbol_rate", 0); polarization = xmlGetNumericAttribute(tps, "polarization", 0); system = xmlGetNumericAttribute(tps, "system", 0); @@ -496,10 +498,10 @@ int CServiceManager::LoadMotorPositions(void) satellitePosition = spos; sat_iterator_t sit = satellitePositions.find(satellitePosition); if(sit != satellitePositions.end()) { - sit->second.motor_position = mpos; sit->second.diseqc = diseqc; sit->second.commited = com; sit->second.uncommited = uncom; + sit->second.motor_position = mpos; sit->second.lnbOffsetLow = offL; sit->second.lnbOffsetHigh = offH; sit->second.lnbSwitch = sw; @@ -539,20 +541,27 @@ void CServiceManager::SaveMotorPositions() fclose(fd); } -void CServiceManager::InitSatPosition(t_satellite_position position) +bool CServiceManager::InitSatPosition(t_satellite_position position, char * name, bool force) { - satellitePositions[position].position = position; - satellitePositions[position].diseqc = -1; - satellitePositions[position].commited = -1; - satellitePositions[position].uncommited = -1; - satellitePositions[position].motor_position = 0; - satellitePositions[position].diseqc_order = 0; - satellitePositions[position].lnbOffsetLow = 9750; - satellitePositions[position].lnbOffsetHigh = 10600; - satellitePositions[position].lnbSwitch = 11700; - satellitePositions[position].use_in_scan = 0; - satellitePositions[position].use_usals = 0; - satellitePositions[position].input = 0; + if(force || (satellitePositions.find(position) == satellitePositions.end())) { + satellitePositions[position].position = position; + satellitePositions[position].diseqc = -1; + satellitePositions[position].commited = -1; + satellitePositions[position].uncommited = -1; + satellitePositions[position].motor_position = 0; + satellitePositions[position].diseqc_order = 0; + satellitePositions[position].lnbOffsetLow = 9750; + satellitePositions[position].lnbOffsetHigh = 10600; + satellitePositions[position].lnbSwitch = 11700; + satellitePositions[position].use_in_scan = 0; + satellitePositions[position].use_usals = 0; + satellitePositions[position].input = 0; + satellitePositions[position].configured = 0; + if(name) + satellitePositions[position].name = name; + return true; + } + return false; } bool CServiceManager::LoadServices(bool only_current) @@ -561,7 +570,7 @@ bool CServiceManager::LoadServices(bool only_current) static bool satcleared = 0;//clear only once, because menu is static service_count = 0; printf("[zapit] Loading services, channel size %d ..\n", sizeof(CZapitChannel)); - fe_type_t frontendType = CFrontend::getInstance()->getInfo()->type; + frontendType = CFEManager::getInstance()->getLiveFE()->getInfo()->type; if(only_current) goto do_current; @@ -575,8 +584,10 @@ bool CServiceManager::LoadServices(bool only_current) if (ParseScanXml()) { t_satellite_position position = 0; - if(!satcleared) + if(!satcleared) { satellitePositions.clear(); + //satelliteList.clear(); + } satcleared = 1; xmlNodePtr search = xmlDocGetRootElement(scanInputParser)->xmlChildrenNode; @@ -584,17 +595,10 @@ bool CServiceManager::LoadServices(bool only_current) if (!(strcmp(xmlGetName(search), "sat"))) { position = xmlGetSignedNumericAttribute(search, "position", 10); char * name = xmlGetAttribute(search, "name"); - /* FIXME reuse this */ - if(satellitePositions.find(position) == satellitePositions.end()) { - InitSatPosition(position); - } - satellitePositions[position].name = name; + InitSatPosition(position, name); } else if(!(strcmp(xmlGetName(search), "cable"))) { char * name = xmlGetAttribute(search, "name"); - if(satellitePositions.find(position) == satellitePositions.end()) { - InitSatPosition(position); - } - satellitePositions[position].name = name; + InitSatPosition(position, name); } ParseSatTransponders(frontendType, search, position); position++; @@ -609,10 +613,7 @@ bool CServiceManager::LoadServices(bool only_current) if (!(strcmp(xmlGetName(search), "sat"))) { t_satellite_position position = xmlGetSignedNumericAttribute(search, "position", 10); char * name = xmlGetAttribute(search, "name"); - if(satellitePositions.find(position) == satellitePositions.end()) { - InitSatPosition(position); - satellitePositions[position].name = name; - } + InitSatPosition(position, name); } search = search->xmlNextNode; @@ -625,6 +626,9 @@ bool CServiceManager::LoadServices(bool only_current) LoadMotorPositions(); } + //FIXME copy, until global satellitePositions removed + //satelliteList = satellitePositions; + printf("[zapit] %d services loaded (%d)...\n", service_count, allchans.size()); TIMER_STOP("[zapit] service loading took"); @@ -668,7 +672,7 @@ void CServiceManager::CopyFile(char * from, char * to) void CServiceManager::WriteSatHeader(FILE * fd, sat_config_t &config) { - switch (CFrontend::getInstance()->getInfo()->type) { + switch (frontendType) { case FE_QPSK: /* satellite */ fprintf(fd, "\t\n", config.name.c_str(), config.position, config.diseqc, config.uncommited); @@ -684,7 +688,7 @@ void CServiceManager::WriteSatHeader(FILE * fd, sat_config_t &config) void CServiceManager::WriteTransponderHeader(FILE * fd, struct transponder &tp) { - switch (CFrontend::getInstance()->getInfo()->type) { + switch (frontendType) { case FE_QPSK: /* satellite */ fprintf(fd, "\t\t\n", tp.transport_stream_id, tp.original_network_id, @@ -771,7 +775,7 @@ void CServiceManager::SaveServices(bool tocopy) if(tpdone) fprintf(fd, "\t\t\n"); } if(satdone) { - switch (CFrontend::getInstance()->getInfo()->type) { + switch (frontendType) { case FE_QPSK: fprintf(fd, "\t\n"); break; @@ -852,7 +856,7 @@ bool CServiceManager::SaveCurrentServices(transponder_id_t tpid) return false; } - switch (CFrontend::getInstance()->getInfo()->type) { + switch (frontendType) { case FE_QPSK: /* satellite */ sprintf(satstr, "\t<%s name=\"%s\" position=\"%hd\">\n", "sat", spos_it->second.name.c_str(), satellitePosition); break;