DVBConfigParser.cc

Go to the documentation of this file.
00001 #include "DVBConfigParser.hh"
00002 #include <boost/assign/std/map.hpp>
00003 #include <senf/Utils/Exception.hh>
00004 #include <senf/Utils/Logger.hh>
00005 using namespace std;
00006 #define prefix_
00007 
00008 senf::DVBConfigParser::DVBParams const senf::DVBConfigParser::params;
00009 
00010 prefix_ senf::DVBConfigParser::DVBParams::DVBParams()
00011 {
00012 
00013     boost::assign::insert(inversion)
00014     (   "INVERSION_OFF", INVERSION_OFF )
00015     (   "INVERSION_ON", INVERSION_ON )
00016     (   "INVERSION_AUTO", INVERSION_AUTO );
00017     boost::assign::insert(bandwidth)
00018     (   "BANDWIDTH_6_MHZ", BANDWIDTH_6_MHZ)
00019     (   "BANDWIDTH_7_MHZ", BANDWIDTH_7_MHZ)
00020     (   "BANDWIDTH_8_MHZ", BANDWIDTH_8_MHZ);
00021     boost::assign::insert(code_rate)
00022     (   "FEC_1_2", FEC_1_2)
00023     (   "FEC_2_3", FEC_2_3)
00024     (   "FEC_3_4", FEC_3_4)
00025     (   "FEC_4_5", FEC_4_5)
00026     (   "FEC_5_6", FEC_5_6)
00027     (   "FEC_6_7", FEC_6_7)
00028     (   "FEC_7_8", FEC_7_8)
00029     (   "FEC_8_9", FEC_8_9)
00030     (   "FEC_AUTO", FEC_AUTO)
00031     (   "FEC_NONE", FEC_NONE);
00032     boost::assign::insert(guard_interval)
00033     (   "GUARD_INTERVAL_1_16", GUARD_INTERVAL_1_16)
00034     (   "GUARD_INTERVAL_1_32", GUARD_INTERVAL_1_32)
00035     (   "GUARD_INTERVAL_1_4", GUARD_INTERVAL_1_4)
00036     (   "GUARD_INTERVAL_1_8", GUARD_INTERVAL_1_8);
00037     boost::assign::insert(hierarchy)
00038     (   "HIERARCHY_1", HIERARCHY_1)
00039     (   "HIERARCHY_2", HIERARCHY_2)
00040     (   "HIERARCHY_4", HIERARCHY_4)
00041     (   "HIERARCHY_NONE", HIERARCHY_NONE);
00042     boost::assign::insert(modulation)
00043     (   "QPSK", QPSK)
00044     (   "QAM_128", QAM_128)
00045     (   "QAM_16", QAM_16)
00046     (   "QAM_256", QAM_256)
00047     (   "QAM_32", QAM_32)
00048     (   "QAM_64", QAM_64);
00049     boost::assign::insert(transmit_mode)
00050     (   "TRANSMISSION_MODE_2K", TRANSMISSION_MODE_2K)
00051     (   "TRANSMISSION_MODE_8K", TRANSMISSION_MODE_8K);
00052 }
00053 
00054 senf::DVBConfigParser::DVBConfigParser(fe_type_t type_, const string & configFilePath_) :
00055     type(type_),
00056     configFile()
00057 {
00058     initConfigFile(configFilePath_);
00059 }
00060 
00061 senf::DVBConfigParser::~DVBConfigParser()
00062 {
00063     configFile.close();
00064 }
00065 
00066 prefix_ void senf::DVBConfigParser::initConfigFile(string configFilePath_)
00067 {
00068     if (configFilePath_.size() == 0) {
00069         if ( !(::getenv ("HOME")) )
00070             SENF_THROW_SYSTEM_EXCEPTION("$HOME not set! You need it to use default configfile.");
00071         string configPath(::getenv ("HOME"));
00072         switch(type) {
00073             case FE_QPSK :
00074                 configPath += string("/.szap/channels.conf");
00075                 break;
00076             case FE_QAM :
00077                 configPath += string("/.czap/channels.conf");
00078                 break;
00079             case FE_OFDM :
00080                 configPath += string("/.tzap/channels.conf");
00081                 break;
00082             default:
00083                 SENF_THROW_SYSTEM_EXCEPTION("Could not determine type of card.");
00084         }
00085         configFilePath_ = configPath;
00086     }
00087     configFilePath = configFilePath_;
00088     configFile.open( configFilePath.c_str(), ios_base::in);
00089     if (configFile.bad())
00090         SENF_LOG((senf::log::IMPORTANT)  ("Could not open channels file"<< configFilePath << "." ));
00091     configFile.close();
00092 }
00093 prefix_ string senf::DVBConfigParser::getConfigLine(string channel)
00094 {
00095     string configLine;
00096     size_t pos;
00097     transform(channel.begin(), channel.end(), channel.begin(), ::toupper);
00098 
00099     configFile.open( configFilePath.c_str(), ios_base::in);
00100     if (configFile.bad())
00101            SENF_THROW_SYSTEM_EXCEPTION("Could not read channels file: ") << configFilePath << ".";
00102 
00103     while (configFile.good()) {
00104         getline( configFile, configLine );
00105         SENF_LOG((senf::log::NOTICE)  ("configLine: " << configLine ));
00106         transform(configLine.begin(), configLine.end(), configLine.begin(), ::toupper);
00107         pos = configLine.find(channel);
00108 
00109         if (pos != string::npos && pos == 0) { // only first matching number should be interpreted as channel number
00110             configFile.close();
00111             return configLine; // Line found!
00112         }
00113     }
00114     configFile.close();
00115     SENF_THROW_SYSTEM_EXCEPTION("Channel \"")<< channel << "\" not found!";
00116     return channel;
00117 }
00118 
00119 prefix_ dvb_frontend_parameters senf::DVBConfigParser::getFrontendParam(string configLine)
00120 {
00121     struct dvb_frontend_parameters frontend;
00122     transform(configLine.begin(), configLine.end(), configLine.begin(), ::toupper);
00123     boost::char_separator<char> sep(":");
00124     tokenizer tokens(configLine, sep);
00125     switch (type) {
00126         case FE_QPSK:
00127             frontend = getFrontendParamDVB_S(tokens);
00128             break;
00129         case FE_QAM:
00130             frontend = getFrontendParamDVB_C(tokens);
00131             break;
00132         case FE_OFDM:
00133             frontend = getFrontendParamDVB_T(tokens);
00134             break;
00135         default:
00136             SENF_THROW_SYSTEM_EXCEPTION("Could not determine type of card.");
00137     }
00138     return frontend;
00139 }
00140 
00141 prefix_ dvb_frontend_parameters
00142 senf::DVBConfigParser::getFrontendParamDVB_T(const tokenizer & tokens)
00143 {
00144     struct dvb_frontend_parameters frontend;
00145     istringstream isst;
00146     int number;
00147     enum { p_Frequency=1, p_Inversion, p_Bandwidth, p_hp_code_rate, p_lp_code_rate, p_Mudualtion, p_Transmission, p_guard, p_hierarchy};
00148     vector<string> words( tokens.begin(), tokens.end() );
00149 
00150     ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
00151 
00152     /*if (words.size() < 10)
00153         SENF_THROW_SYSTEM_EXCEPTION("Too few arguments! There must be at least 10, but there are only: ") << words.size();*/
00154 
00155     isst.str(words[p_Frequency]);
00156     isst >> number;
00157     if (isst.fail())
00158         SENF_THROW_SYSTEM_EXCEPTION("Cant parse frequency");
00159     frontend.frequency = number;
00160 
00161     if (params.inversion.find(words[p_Inversion]) == params.inversion.end())
00162         SENF_THROW_SYSTEM_EXCEPTION("Cant parse inversion");
00163     frontend.inversion = params.inversion.find(words[p_Inversion])->second;
00164 
00165     if (params.bandwidth.find(words[p_Bandwidth]) == params.bandwidth.end())
00166         SENF_THROW_SYSTEM_EXCEPTION("Cant parse bandwidth");
00167     frontend.u.ofdm.bandwidth = params.bandwidth.find(words[p_Bandwidth])->second;
00168 
00169     if (params.code_rate.find(words[p_hp_code_rate]) == params.code_rate.end())
00170         SENF_THROW_SYSTEM_EXCEPTION("Cant parse high priority stream code rate");
00171     frontend.u.ofdm.code_rate_HP = params.code_rate.find(words[p_hp_code_rate])->second;
00172 
00173     if (params.code_rate.find(words[p_lp_code_rate]) == params.code_rate.end())
00174         SENF_THROW_SYSTEM_EXCEPTION("Cant parse low priority stream code rate");
00175     frontend.u.ofdm.code_rate_LP = params.code_rate.find(words[p_lp_code_rate])->second;
00176 
00177     if (params.modulation.find(words[p_Mudualtion]) == params.modulation.end())
00178         SENF_THROW_SYSTEM_EXCEPTION("Cant parse modulation");
00179     frontend.u.ofdm.constellation = params.modulation.find(words[p_Mudualtion])->second;
00180 
00181     if (params.transmit_mode.find(words[p_Transmission]) == params.transmit_mode.end())
00182         SENF_THROW_SYSTEM_EXCEPTION("Cant parse transmission mode");
00183     frontend.u.ofdm.transmission_mode = params.transmit_mode.find(words[p_Transmission])->second;
00184 
00185     if (params.guard_interval.find(words[p_guard]) == params.guard_interval.end())
00186         SENF_THROW_SYSTEM_EXCEPTION("Cant parse guard interval");
00187     frontend.u.ofdm.guard_interval = params.guard_interval.find(words[p_guard])->second;
00188 
00189     if (params.hierarchy.find(words[p_hierarchy]) == params.hierarchy.end())
00190         SENF_THROW_SYSTEM_EXCEPTION("Cant parse hierarchy");
00191     frontend.u.ofdm.hierarchy_information = params.hierarchy.find(words[p_hierarchy])->second;
00192 
00193     return frontend;
00194 }
00195 
00196 prefix_ dvb_frontend_parameters
00197 senf::DVBConfigParser::getFrontendParamDVB_S(const tokenizer & tokens)
00198 {
00199     struct dvb_frontend_parameters frontend;
00200     istringstream isst;
00201     int number;
00202     enum { p_Frequency=1, p_Inversion, p_Symbole, p_code_rate};
00203     vector<string> words( tokens.begin(), tokens.end() ) ;
00204 
00205     ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
00206 
00207     if (words.size() < 5)
00208                 SENF_THROW_SYSTEM_EXCEPTION("Too few arguments! There must be at least 5, but there are only: ") << words.size();
00209 
00210     isst.str(words[p_Frequency]);
00211     isst >> number;
00212     if (isst.fail())
00213         SENF_THROW_SYSTEM_EXCEPTION("Cant parse frequency");
00214     frontend.frequency = number;
00215 
00216     if (params.inversion.find(words[p_Inversion]) == params.inversion.end())
00217         SENF_THROW_SYSTEM_EXCEPTION("Cant parse inversion");
00218     frontend.inversion = params.inversion.find(words[p_Inversion])->second;
00219 
00220     isst.str(words[p_Symbole]);
00221     isst >> number;
00222     if (isst.fail())
00223         SENF_THROW_SYSTEM_EXCEPTION("Cant parse symbole rate");
00224     frontend.u.qpsk.symbol_rate = number;
00225 
00226     if (params.code_rate.find(words[p_code_rate]) == params.code_rate.end())
00227         SENF_THROW_SYSTEM_EXCEPTION("Cant parse code rate");
00228     frontend.u.qpsk.fec_inner = params.code_rate.find(words[p_code_rate])->second;
00229 
00230     return frontend;
00231 }
00232 
00233 prefix_ dvb_frontend_parameters
00234 senf::DVBConfigParser::getFrontendParamDVB_C(const tokenizer & tokens)
00235 {
00236     struct dvb_frontend_parameters frontend;
00237     istringstream isst;
00238     int number;
00239     enum { p_Frequency=1, p_Inversion, p_Symbole, p_code_rate, p_modulation};
00240     vector<string> words( ++tokens.begin(), tokens.end() ) ;
00241 
00242     ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
00243 
00244     if (words.size() < 6)
00245         SENF_THROW_SYSTEM_EXCEPTION("Too few arguments! There must be at least 6, but there are only: ") << words.size();
00246 
00247     isst.str(words[p_Frequency]);
00248     isst >> number;
00249     if (isst.fail())
00250         SENF_THROW_SYSTEM_EXCEPTION("Cant parse frequency");
00251     frontend.frequency = number;
00252 
00253     if (params.inversion.find(words[p_Inversion]) == params.inversion.end())
00254         SENF_THROW_SYSTEM_EXCEPTION("Cant parse inversion");
00255     frontend.inversion = params.inversion.find(words[p_Inversion])->second;
00256 
00257     isst.str(words[p_Symbole]);
00258     isst >> number;
00259     if (isst.fail())
00260         SENF_THROW_SYSTEM_EXCEPTION("Cant parse symbole rate");
00261     frontend.u.qam.symbol_rate = number;
00262 
00263     if (params.code_rate.find(words[p_code_rate]) == params.code_rate.end())
00264         SENF_THROW_SYSTEM_EXCEPTION("Cant parse code rate");
00265     frontend.u.qam.fec_inner = params.code_rate.find(words[p_code_rate])->second;
00266 
00267     if (params.modulation.find(words[p_modulation]) == params.modulation.end())
00268         SENF_THROW_SYSTEM_EXCEPTION("Cant parse modulation");
00269     frontend.u.qam.modulation = params.modulation.find(words[p_modulation])->second;
00270 
00271     return frontend;
00272 }