replaced some tabs with spaces
[senf.git] / Socket / Protocols / DVB / DVBConfigParser.cc
1 #include "DVBConfigParser.hh"
2 #include <boost/assign/std/map.hpp>
3 #include "senf/Utils/Exception.hh"
4 #include "senf/Utils/Logger.hh"
5 using namespace std;
6 #define prefix_
7
8 senf::DVBConfigParser::DVBParams const senf::DVBConfigParser::params;
9
10 prefix_ senf::DVBConfigParser::DVBParams::DVBParams()
11 {
12     
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) 
22     (   "FEC_1_2", FEC_1_2)
23     (   "FEC_2_3", FEC_2_3)
24     (   "FEC_3_4", FEC_3_4)
25     (   "FEC_4_5", FEC_4_5)
26     (   "FEC_5_6", FEC_5_6)
27     (   "FEC_6_7", FEC_6_7)
28     (   "FEC_7_8", FEC_7_8)
29     (   "FEC_8_9", FEC_8_9)
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) 
43     (   "QPSK", QPSK)
44     (   "QAM_128", QAM_128)
45     (   "QAM_16", QAM_16)
46     (   "QAM_256", QAM_256)
47     (   "QAM_32", QAM_32)
48     (   "QAM_64", QAM_64);
49     boost::assign::insert(transmit_mode) 
50     (   "TRANSMISSION_MODE_2K", TRANSMISSION_MODE_2K)
51     (   "TRANSMISSION_MODE_8K", TRANSMISSION_MODE_8K);
52 }
53
54 senf::DVBConfigParser::DVBConfigParser(fe_type_t type_, const string & configFilePath_) :  
55     type(type_), 
56     configFile()
57 {
58     initConfigFile(configFilePath_);
59 }
60
61 senf::DVBConfigParser::~DVBConfigParser()
62 {
63     configFile.close();
64 }
65 prefix_ void senf::DVBConfigParser::initConfigFile(string configFilePath_){
66     if (configFilePath_.size() == 0) {
67         if ( !(::getenv ("HOME")) )
68             SENF_THROW_SYSTEM_EXCEPTION("$HOME not set! You need it to use default configfile.");
69         string configPath(::getenv ("HOME"));
70         switch(type) {
71             case FE_QPSK :
72                 configPath += string("/.szap/channels.conf");
73                 break;
74             case FE_QAM :
75                 configPath += string("/.czap/channels.conf");
76                 break;
77             case FE_OFDM :
78                 configPath += string("/.tzap/channels.conf");
79                 break;
80             default:
81                 SENF_THROW_SYSTEM_EXCEPTION("Could not determine type of card.");
82         }
83         configFilePath_ = configPath;
84     }
85     configFile.open( configFilePath_.c_str(), ios_base::in);
86     if(configFile.bad())
87         SENF_THROW_SYSTEM_EXCEPTION("Could not read configfile: ") << configFilePath_ << ".";
88 }
89 prefix_ string senf::DVBConfigParser::getConfigLine(string channel)
90 {
91     string configLine;
92     size_t pos;
93     transform(channel.begin(), channel.end(), channel.begin(), ::toupper);
94     if(configFile.bad()) 
95         SENF_THROW_SYSTEM_EXCEPTION("Could not read file.");
96     configFile.seekg(0);
97     while (configFile.good()){
98         getline( configFile, configLine );
99         SENF_LOG((senf::log::NOTICE)  ("configLine: " << configLine ));
100         transform(configLine.begin(), configLine.end(), configLine.begin(), ::toupper);
101         pos = configLine.find(channel);
102         
103         if(pos != string::npos && pos == 0){ // only first matching number should be interpreted as channel number 
104             configFile.seekg(0);
105             return configLine; // Line found!
106         }
107     }
108     SENF_THROW_SYSTEM_EXCEPTION("Channel \"")<< channel << "\" not found!";
109     return channel;
110 }
111
112 prefix_ dvb_frontend_parameters senf::DVBConfigParser::getFrontendParam(string configLine){
113     struct dvb_frontend_parameters frontend;
114     transform(configLine.begin(), configLine.end(), configLine.begin(), ::toupper);
115     boost::char_separator<char> sep(":");
116     tokenizer tokens(configLine, sep);
117     switch (type) {
118         case FE_QPSK:
119             frontend = getFrontendParamDVB_S(tokens);
120             break;
121         case FE_QAM:
122             frontend = getFrontendParamDVB_C(tokens);
123             break;
124         case FE_OFDM:
125             frontend = getFrontendParamDVB_T(tokens);
126             break;
127         default:
128             SENF_THROW_SYSTEM_EXCEPTION("Could not determine type of card.");
129     }
130     return frontend;
131 }
132
133 prefix_ dvb_frontend_parameters senf::DVBConfigParser::getFrontendParamDVB_T( const tokenizer & tokens){
134     
135     struct dvb_frontend_parameters frontend;
136     istringstream isst;
137     int number;
138     enum { p_Frequency=1, p_Inversion, p_Bandwidth, p_hp_code_rate, p_lp_code_rate, p_Mudualtion, p_Transmission, p_guard, p_hierarchy};
139     vector<string> words( tokens.begin(), tokens.end() );
140     
141     ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
142     
143     /*if(words.size() < 10)
144         SENF_THROW_SYSTEM_EXCEPTION("Too few arguments! There must be at least 10, but there are only: ") << words.size();*/
145     
146     isst.str(words[p_Frequency]);
147     isst >> number;
148     if(isst.fail())
149         SENF_THROW_SYSTEM_EXCEPTION("Cant parse frequency");
150     frontend.frequency = number;
151     
152     if( params.inversion.find(words[p_Inversion]) == params.inversion.end())
153         SENF_THROW_SYSTEM_EXCEPTION("Cant parse inversion");
154     frontend.inversion = params.inversion.find(words[p_Inversion])->second;
155     
156     if( params.bandwidth.find(words[p_Bandwidth]) == params.bandwidth.end())
157         SENF_THROW_SYSTEM_EXCEPTION("Cant parse bandwidth");
158     frontend.u.ofdm.bandwidth = params.bandwidth.find(words[p_Bandwidth])->second;
159     
160     if( params.code_rate.find(words[p_hp_code_rate]) == params.code_rate.end())
161         SENF_THROW_SYSTEM_EXCEPTION("Cant parse high priority stream code rate");
162     frontend.u.ofdm.code_rate_HP = params.code_rate.find(words[p_hp_code_rate])->second;
163     
164     if( params.code_rate.find(words[p_lp_code_rate]) == params.code_rate.end())
165         SENF_THROW_SYSTEM_EXCEPTION("Cant parse low priority stream code rate");
166     frontend.u.ofdm.code_rate_LP = params.code_rate.find(words[p_lp_code_rate])->second;
167     
168     if( params.modulation.find(words[p_Mudualtion]) == params.modulation.end())
169         SENF_THROW_SYSTEM_EXCEPTION("Cant parse modulation");
170     frontend.u.ofdm.constellation = params.modulation.find(words[p_Mudualtion])->second;
171     
172     if( params.transmit_mode.find(words[p_Transmission]) == params.transmit_mode.end())
173         SENF_THROW_SYSTEM_EXCEPTION("Cant parse transmission mode");
174     frontend.u.ofdm.transmission_mode = params.transmit_mode.find(words[p_Transmission])->second;
175     
176     if( params.guard_interval.find(words[p_guard]) == params.guard_interval.end())
177         SENF_THROW_SYSTEM_EXCEPTION("Cant parse guard interval");
178     frontend.u.ofdm.guard_interval = params.guard_interval.find(words[p_guard])->second;  
179     
180     if( params.hierarchy.find(words[p_hierarchy]) == params.hierarchy.end())
181         SENF_THROW_SYSTEM_EXCEPTION("Cant parse hierarchy");
182     frontend.u.ofdm.hierarchy_information = params.hierarchy.find(words[p_hierarchy])->second;
183     
184     return frontend;
185 }
186
187 prefix_ dvb_frontend_parameters senf::DVBConfigParser::getFrontendParamDVB_S( const  tokenizer & tokens){
188     struct dvb_frontend_parameters frontend;
189     istringstream isst;
190     int number;
191     enum { p_Frequency=1, p_Inversion, p_Symbole, p_code_rate};
192     vector<string> words( tokens.begin(), tokens.end() ) ;
193     
194     ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
195     
196     if(words.size() < 5)
197                 SENF_THROW_SYSTEM_EXCEPTION("Too few arguments! There must be at least 5, but there are only: ") << words.size();
198     
199     isst.str(words[p_Frequency]);
200     isst >> number;
201     if (isst.fail())
202         SENF_THROW_SYSTEM_EXCEPTION("Cant parse frequency");
203     frontend.frequency = number;
204     
205     if (params.inversion.find(words[p_Inversion]) == params.inversion.end())
206         SENF_THROW_SYSTEM_EXCEPTION("Cant parse inversion");
207     frontend.inversion = params.inversion.find(words[p_Inversion])->second;
208     
209     isst.str(words[p_Symbole]);
210     isst >> number;
211     if (isst.fail())
212         SENF_THROW_SYSTEM_EXCEPTION("Cant parse symbole rate");
213     frontend.u.qpsk.symbol_rate = number;
214
215     if (params.code_rate.find(words[p_code_rate]) == params.code_rate.end())
216         SENF_THROW_SYSTEM_EXCEPTION("Cant parse code rate");
217     frontend.u.qpsk.fec_inner = params.code_rate.find(words[p_code_rate])->second;
218     
219     return frontend;
220 }
221
222 prefix_ dvb_frontend_parameters senf::DVBConfigParser::getFrontendParamDVB_C( const  tokenizer & tokens){
223     struct dvb_frontend_parameters frontend;
224     istringstream isst;
225     int number;
226     enum { p_Frequency=1, p_Inversion, p_Symbole, p_code_rate, p_modulation};
227     vector<string> words( ++tokens.begin(), tokens.end() ) ; 
228   
229     ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
230     
231     if(words.size() < 6)
232         SENF_THROW_SYSTEM_EXCEPTION("Too few arguments! There must be at least 6, but there are only: ") << words.size();
233     
234     isst.str(words[p_Frequency]);
235     isst >> number;
236     if (isst.fail())
237         SENF_THROW_SYSTEM_EXCEPTION("Cant parse frequency");
238     frontend.frequency = number;
239     
240     if (params.inversion.find(words[p_Inversion]) == params.inversion.end())
241         SENF_THROW_SYSTEM_EXCEPTION("Cant parse inversion");
242     frontend.inversion = params.inversion.find(words[p_Inversion])->second;
243     
244     isst.str(words[p_Symbole]);
245     isst >> number;
246     if (isst.fail())
247         SENF_THROW_SYSTEM_EXCEPTION("Cant parse symbole rate");
248     frontend.u.qam.symbol_rate = number;
249     
250     if (params.code_rate.find(words[p_code_rate]) == params.code_rate.end())
251         SENF_THROW_SYSTEM_EXCEPTION("Cant parse code rate");
252     frontend.u.qam.fec_inner = params.code_rate.find(words[p_code_rate])->second;
253     
254     if (params.modulation.find(words[p_modulation]) == params.modulation.end())
255         SENF_THROW_SYSTEM_EXCEPTION("Cant parse modulation");
256     frontend.u.qam.modulation = params.modulation.find(words[p_modulation])->second;
257     
258     return frontend;
259 }