1 #include "DVBConfigParser.hh"
2 #include <boost/assign/std/map.hpp>
3 #include <senf/Utils/Exception.hh>
4 #include <senf/Utils/Logger.hh>
8 senf::DVBConfigParser::DVBParams const senf::DVBConfigParser::params;
10 prefix_ senf::DVBConfigParser::DVBParams::DVBParams()
13 boost::assign::insert(inversion)
14 ( "INVERSION_OFF", INVERSION_OFF )
15 ( "INVERSION_ON", INVERSION_ON )
16 ( "INVERSION_AUTO", INVERSION_AUTO );
17 boost::assign::insert(bandwidth)
18 ( "BANDWIDTH_6_MHZ", BANDWIDTH_6_MHZ)
19 ( "BANDWIDTH_7_MHZ", BANDWIDTH_7_MHZ)
20 ( "BANDWIDTH_8_MHZ", BANDWIDTH_8_MHZ);
21 boost::assign::insert(code_rate)
30 ( "FEC_AUTO", FEC_AUTO)
31 ( "FEC_NONE", FEC_NONE);
32 boost::assign::insert(guard_interval)
33 ( "GUARD_INTERVAL_1_16", GUARD_INTERVAL_1_16)
34 ( "GUARD_INTERVAL_1_32", GUARD_INTERVAL_1_32)
35 ( "GUARD_INTERVAL_1_4", GUARD_INTERVAL_1_4)
36 ( "GUARD_INTERVAL_1_8", GUARD_INTERVAL_1_8);
37 boost::assign::insert(hierarchy)
38 ( "HIERARCHY_1", HIERARCHY_1)
39 ( "HIERARCHY_2", HIERARCHY_2)
40 ( "HIERARCHY_4", HIERARCHY_4)
41 ( "HIERARCHY_NONE", HIERARCHY_NONE);
42 boost::assign::insert(modulation)
49 boost::assign::insert(transmit_mode)
50 ( "TRANSMISSION_MODE_2K", TRANSMISSION_MODE_2K)
51 ( "TRANSMISSION_MODE_8K", TRANSMISSION_MODE_8K);
54 senf::DVBConfigParser::DVBConfigParser(fe_type_t type_, const string & configFilePath_) :
58 initConfigFile(configFilePath_);
61 senf::DVBConfigParser::~DVBConfigParser()
66 prefix_ void senf::DVBConfigParser::initConfigFile(string configFilePath_)
68 if (configFilePath_.size() == 0) {
69 if ( !(::getenv ("HOME")) )
70 SENF_THROW_SYSTEM_EXCEPTION("$HOME not set! You need it to use default configfile.");
71 string configPath(::getenv ("HOME"));
74 configPath += string("/.szap/channels.conf");
77 configPath += string("/.czap/channels.conf");
80 configPath += string("/.tzap/channels.conf");
83 SENF_THROW_SYSTEM_EXCEPTION("Could not determine type of card.");
85 configFilePath_ = configPath;
87 configFilePath = configFilePath_;
88 configFile.open( configFilePath.c_str(), ios_base::in);
90 SENF_LOG((senf::log::IMPORTANT) ("Could not open channels file"<< configFilePath << "." ));
93 prefix_ string senf::DVBConfigParser::getConfigLine(string channel)
97 transform(channel.begin(), channel.end(), channel.begin(), ::toupper);
99 configFile.open( configFilePath.c_str(), ios_base::in);
100 if (configFile.bad())
101 SENF_THROW_SYSTEM_EXCEPTION("Could not read channels file: ") << configFilePath << ".";
103 while (configFile.good()) {
104 getline( configFile, configLine );
105 SENF_LOG((senf::log::NOTICE) ("configLine: " << configLine ));
106 transform(configLine.begin(), configLine.end(), configLine.begin(), ::toupper);
107 pos = configLine.find(channel);
109 if (pos != string::npos && pos == 0) { // only first matching number should be interpreted as channel number
111 return configLine; // Line found!
115 SENF_THROW_SYSTEM_EXCEPTION("Channel \"")<< channel << "\" not found!";
119 prefix_ dvb_frontend_parameters senf::DVBConfigParser::getFrontendParam(string configLine)
121 struct dvb_frontend_parameters frontend;
122 transform(configLine.begin(), configLine.end(), configLine.begin(), ::toupper);
123 boost::char_separator<char> sep(":");
124 tokenizer tokens(configLine, sep);
127 frontend = getFrontendParamDVB_S(tokens);
130 frontend = getFrontendParamDVB_C(tokens);
133 frontend = getFrontendParamDVB_T(tokens);
136 SENF_THROW_SYSTEM_EXCEPTION("Could not determine type of card.");
141 prefix_ dvb_frontend_parameters
142 senf::DVBConfigParser::getFrontendParamDVB_T(const tokenizer & tokens)
144 struct dvb_frontend_parameters frontend;
147 enum { p_Frequency=1, p_Inversion, p_Bandwidth, p_hp_code_rate, p_lp_code_rate, p_Mudualtion, p_Transmission, p_guard, p_hierarchy};
148 vector<string> words( tokens.begin(), tokens.end() );
150 ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
152 /*if (words.size() < 10)
153 SENF_THROW_SYSTEM_EXCEPTION("Too few arguments! There must be at least 10, but there are only: ") << words.size();*/
155 isst.str(words[p_Frequency]);
158 SENF_THROW_SYSTEM_EXCEPTION("Cant parse frequency");
159 frontend.frequency = number;
161 if (params.inversion.find(words[p_Inversion]) == params.inversion.end())
162 SENF_THROW_SYSTEM_EXCEPTION("Cant parse inversion");
163 frontend.inversion = params.inversion.find(words[p_Inversion])->second;
165 if (params.bandwidth.find(words[p_Bandwidth]) == params.bandwidth.end())
166 SENF_THROW_SYSTEM_EXCEPTION("Cant parse bandwidth");
167 frontend.u.ofdm.bandwidth = params.bandwidth.find(words[p_Bandwidth])->second;
169 if (params.code_rate.find(words[p_hp_code_rate]) == params.code_rate.end())
170 SENF_THROW_SYSTEM_EXCEPTION("Cant parse high priority stream code rate");
171 frontend.u.ofdm.code_rate_HP = params.code_rate.find(words[p_hp_code_rate])->second;
173 if (params.code_rate.find(words[p_lp_code_rate]) == params.code_rate.end())
174 SENF_THROW_SYSTEM_EXCEPTION("Cant parse low priority stream code rate");
175 frontend.u.ofdm.code_rate_LP = params.code_rate.find(words[p_lp_code_rate])->second;
177 if (params.modulation.find(words[p_Mudualtion]) == params.modulation.end())
178 SENF_THROW_SYSTEM_EXCEPTION("Cant parse modulation");
179 frontend.u.ofdm.constellation = params.modulation.find(words[p_Mudualtion])->second;
181 if (params.transmit_mode.find(words[p_Transmission]) == params.transmit_mode.end())
182 SENF_THROW_SYSTEM_EXCEPTION("Cant parse transmission mode");
183 frontend.u.ofdm.transmission_mode = params.transmit_mode.find(words[p_Transmission])->second;
185 if (params.guard_interval.find(words[p_guard]) == params.guard_interval.end())
186 SENF_THROW_SYSTEM_EXCEPTION("Cant parse guard interval");
187 frontend.u.ofdm.guard_interval = params.guard_interval.find(words[p_guard])->second;
189 if (params.hierarchy.find(words[p_hierarchy]) == params.hierarchy.end())
190 SENF_THROW_SYSTEM_EXCEPTION("Cant parse hierarchy");
191 frontend.u.ofdm.hierarchy_information = params.hierarchy.find(words[p_hierarchy])->second;
196 prefix_ dvb_frontend_parameters
197 senf::DVBConfigParser::getFrontendParamDVB_S(const tokenizer & tokens)
199 struct dvb_frontend_parameters frontend;
202 enum { p_Frequency=1, p_Inversion, p_Symbole, p_code_rate};
203 vector<string> words( tokens.begin(), tokens.end() ) ;
205 ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
207 if (words.size() < 5)
208 SENF_THROW_SYSTEM_EXCEPTION("Too few arguments! There must be at least 5, but there are only: ") << words.size();
210 isst.str(words[p_Frequency]);
213 SENF_THROW_SYSTEM_EXCEPTION("Cant parse frequency");
214 frontend.frequency = number;
216 if (params.inversion.find(words[p_Inversion]) == params.inversion.end())
217 SENF_THROW_SYSTEM_EXCEPTION("Cant parse inversion");
218 frontend.inversion = params.inversion.find(words[p_Inversion])->second;
220 isst.str(words[p_Symbole]);
223 SENF_THROW_SYSTEM_EXCEPTION("Cant parse symbole rate");
224 frontend.u.qpsk.symbol_rate = number;
226 if (params.code_rate.find(words[p_code_rate]) == params.code_rate.end())
227 SENF_THROW_SYSTEM_EXCEPTION("Cant parse code rate");
228 frontend.u.qpsk.fec_inner = params.code_rate.find(words[p_code_rate])->second;
233 prefix_ dvb_frontend_parameters
234 senf::DVBConfigParser::getFrontendParamDVB_C(const tokenizer & tokens)
236 struct dvb_frontend_parameters frontend;
239 enum { p_Frequency=1, p_Inversion, p_Symbole, p_code_rate, p_modulation};
240 vector<string> words( ++tokens.begin(), tokens.end() ) ;
242 ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
244 if (words.size() < 6)
245 SENF_THROW_SYSTEM_EXCEPTION("Too few arguments! There must be at least 6, but there are only: ") << words.size();
247 isst.str(words[p_Frequency]);
250 SENF_THROW_SYSTEM_EXCEPTION("Cant parse frequency");
251 frontend.frequency = number;
253 if (params.inversion.find(words[p_Inversion]) == params.inversion.end())
254 SENF_THROW_SYSTEM_EXCEPTION("Cant parse inversion");
255 frontend.inversion = params.inversion.find(words[p_Inversion])->second;
257 isst.str(words[p_Symbole]);
260 SENF_THROW_SYSTEM_EXCEPTION("Cant parse symbole rate");
261 frontend.u.qam.symbol_rate = number;
263 if (params.code_rate.find(words[p_code_rate]) == params.code_rate.end())
264 SENF_THROW_SYSTEM_EXCEPTION("Cant parse code rate");
265 frontend.u.qam.fec_inner = params.code_rate.find(words[p_code_rate])->second;
267 if (params.modulation.find(words[p_modulation]) == params.modulation.end())
268 SENF_THROW_SYSTEM_EXCEPTION("Cant parse modulation");
269 frontend.u.qam.modulation = params.modulation.find(words[p_modulation])->second;