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) {
00110 configFile.close();
00111 return configLine;
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
00153
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 }