Fix documentation build under maverick (doxygen 1.7.1)
[senf.git] / senf / Socket / Protocols / DVB / DVBFrontendHandle.cc
1 // $Id$
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Anton Gillert <atx@berlios.de>
7 //     Thorsten Horstmann <tho@berlios.de>
8 //
9 // This program is free software; you can redistribute it and/or modify
10 // it under the terms of the GNU General Public License as published by
11 // the Free Software Foundation; either version 2 of the License, or
12 // (at your option) any later version.
13 //
14 // This program is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 // GNU General Public License for more details.
18 //
19 // You should have received a copy of the GNU General Public License
20 // along with this program; if not, write to the
21 // Free Software Foundation, Inc.,
22 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23
24 /** \file
25     \brief DVBFrontendHandle non-inline non-template implementation */
26
27 #include "DVBFrontendHandle.hh"
28 //#include "DVBFrontendHandle.ih"
29
30 // Custom includes
31 #include <boost/format.hpp>
32 #include <sys/socket.h>
33 #include <senf/Utils/Exception.hh>
34 #include <sys/ioctl.h>
35
36
37 //#include "DVBFrontendHandle.mpp"
38 #define prefix_
39 //-/////////////////////////////////////////////////////////////////////////////////////////////////
40
41 //-/////////////////////////////////////////////////////////////////////////////////////////////////
42 // senf::DVBFrontendHandle
43 using namespace std;
44
45 prefix_ void senf::DVBFrontendSocketProtocol::init_client(unsigned short adapter, unsigned short device, int flags)
46     const
47 {
48     string devFrontend = str( boost::format("/dev/dvb/adapter%d/frontend%d") % adapter % device);
49     int f = open(devFrontend.c_str(), flags);
50     if (f < 0)
51         SENF_THROW_SYSTEM_EXCEPTION("")<< "Could not open frontend device of DVB adapter " << devFrontend << ".";
52     fd(f);
53 }
54
55 prefix_ unsigned senf::DVBFrontendSocketProtocol::available()
56     const
57 {
58     return 0;
59 }
60
61 prefix_ bool senf::DVBFrontendSocketProtocol::eof()
62     const
63 {
64     return false;
65 }
66
67 prefix_ void senf::DVBFrontendSocketProtocol::tune(const struct dvb_frontend_parameters & frontend)
68     const
69 {
70     // tuning
71     if (::ioctl(fd(), FE_SET_FRONTEND, &frontend) )
72         SENF_THROW_SYSTEM_EXCEPTION("") << "ioctl FE_SET_FRONTEND failed. Socket should initialized with r/w permissions.";;
73 }
74
75 prefix_ void senf::DVBFrontendSocketProtocol::tuneDVB_T(unsigned int frequency,
76         fe_spectral_inversion_t inversion,
77         fe_bandwidth_t bandwidth,
78         fe_code_rate_t code_rate_HP, /* high priority stream code rate */
79         fe_code_rate_t code_rate_LP, /* low priority stream code rate */
80         fe_modulation_t constellation, /* modulation type */
81         fe_transmit_mode_t transmission_mode,
82         fe_guard_interval_t guard_interval,
83         fe_hierarchy_t hierarchy_information
84         )
85     const
86 {
87     struct dvb_ofdm_parameters ofdm; /* DVB-T Parameters */
88     struct dvb_frontend_parameters frontend;
89
90     ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
91     ::memset(&ofdm, 0, sizeof(struct dvb_ofdm_parameters));
92
93     ofdm.bandwidth = bandwidth;
94     ofdm.code_rate_HP = code_rate_HP;
95     ofdm.code_rate_LP = code_rate_LP;
96     ofdm.constellation = constellation;
97     ofdm.guard_interval = guard_interval;
98     ofdm.hierarchy_information = hierarchy_information;
99
100     frontend.frequency = frequency;
101     frontend.inversion = inversion;
102     frontend.u.ofdm = ofdm;
103
104     tune(frontend);
105
106 }
107 prefix_ void senf::DVBFrontendSocketProtocol::tuneDVB_S(unsigned int frequency,
108         fe_spectral_inversion_t inversion,
109         unsigned int symbole_rate, /* symbol rate in Symbols per second */
110         fe_code_rate_t fec_inner /* forward error correction (see above) */
111     )
112     const
113 {
114     struct dvb_qpsk_parameters qpsk; /* DVB-S Parameters*/
115     struct dvb_frontend_parameters frontend;
116
117     ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
118     ::memset(&qpsk, 0, sizeof(struct dvb_qpsk_parameters));
119
120     qpsk.symbol_rate = symbole_rate;
121     qpsk.fec_inner = fec_inner;
122
123     frontend.frequency = frequency;
124     frontend.inversion = inversion;
125     frontend.u.qpsk = qpsk;
126
127     tune(frontend);
128 }
129
130 prefix_ void senf::DVBFrontendSocketProtocol::tuneDVB_C(unsigned int frequency,
131         fe_spectral_inversion_t inversion,
132         unsigned int symbol_rate,
133         fe_code_rate_t fec_inner,
134         fe_modulation_t modulation
135         )
136 const
137 {
138     struct dvb_qam_parameters qam; /* DVB-C Parameters*/
139     struct dvb_frontend_parameters frontend;
140
141     ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
142     ::memset(&qam, 0, sizeof(struct dvb_qam_parameters));
143
144     qam.symbol_rate = symbol_rate;
145     qam.fec_inner = fec_inner;
146     qam.modulation = modulation;
147
148
149     frontend.frequency = frequency;
150     frontend.inversion = inversion;
151     frontend.u.qam = qam;
152
153     tune(frontend);
154 }
155 prefix_ void senf::DVBFrontendSocketProtocol::setNonBlock(bool on)
156     const
157 {
158    if (on)
159        ::fcntl(fd(), F_SETFL, ::fcntl(fd(), F_GETFL) | O_NONBLOCK);
160    else
161        ::fcntl(fd(), F_SETFL, ::fcntl(fd(), F_GETFL) & ~O_NONBLOCK);
162
163 }
164 prefix_ dvb_frontend_info senf::DVBFrontendSocketProtocol::getInfo()
165     const
166 {
167     struct dvb_frontend_info info;
168     ::memset(&info, 0, sizeof(struct dvb_frontend_info));
169
170     if (::ioctl(fd(), FE_GET_INFO, &info)) {
171         SENF_THROW_SYSTEM_EXCEPTION("") << "Could not read on fildescriptor.";
172     }
173     return info;
174 }
175
176 prefix_ dvb_frontend_parameters senf::DVBFrontendSocketProtocol::getFrontendParam() const {
177     struct dvb_frontend_parameters frontend_;
178
179     ::memset(&frontend_, 0, sizeof(struct dvb_frontend_parameters));
180
181     if (::ioctl(fd(), FE_GET_FRONTEND, &frontend_)) {
182         switch(errno) {
183             case EBADF:
184                 SENF_THROW_SYSTEM_EXCEPTION("fd is not a valid open file descriptor.");
185                 break;
186             case EFAULT:
187                 SENF_THROW_SYSTEM_EXCEPTION( "frontend_ points to invalid address." );
188                 break;
189             case EINVAL:
190                 SENF_THROW_SYSTEM_EXCEPTION( "Maximum supported symbol rate reached. This call may not be implemented by kernel driver!" );
191                 break;
192             default:
193                 SENF_THROW_SYSTEM_EXCEPTION("Errno: ") << errno;
194         }
195     }
196     return frontend_;
197 }
198
199 prefix_ dvb_frontend_event senf::DVBFrontendSocketProtocol::getEvent() const{
200     struct dvb_frontend_event ev ;
201
202     ::memset(&ev, 0, sizeof(struct dvb_frontend_event));
203
204     if (::ioctl(fd(), FE_GET_EVENT, &ev)) {
205         switch(errno) {
206             case EBADF:
207                 SENF_THROW_SYSTEM_EXCEPTION("Could not read from frontend device, read-only access to the device is sufficient.");
208                 break;
209             case EWOULDBLOCK:
210                 SENF_THROW_SYSTEM_EXCEPTION( "No event pending and device is in nonblocking mode." );
211                 break;
212             default:
213                 SENF_THROW_SYSTEM_EXCEPTION("Errno: ") << errno;
214         }
215     }
216     return ev;
217 }
218
219 prefix_ int16_t senf::DVBFrontendSocketProtocol::signalStrength()
220     const
221 {
222     int16_t strength;
223     if (::ioctl(fd(), FE_READ_SIGNAL_STRENGTH, &strength) < 0)
224         SENF_THROW_SYSTEM_EXCEPTION("Could not get signal strength of DVB adapter.");
225     return strength;
226 }
227
228 prefix_ int16_t senf::DVBFrontendSocketProtocol::signalNoiseRatio()
229     const
230 {
231     int16_t snr;
232     if (::ioctl(fd(), FE_READ_SNR, &snr) < 0)
233         SENF_THROW_SYSTEM_EXCEPTION("Could not get signal-to-noise ratio of DVB adapter.");
234     return snr;
235 }
236
237 prefix_ uint32_t senf::DVBFrontendSocketProtocol::bitErrorRate()
238     const
239 {
240     uint32_t ber;
241     if (::ioctl(fd(), FE_READ_BER, &ber) < 0)
242         SENF_THROW_SYSTEM_EXCEPTION("Could not get bit error rate of DVB adapter.");
243     return ber;
244 }
245
246 prefix_ uint32_t senf::DVBFrontendSocketProtocol::uncorrectedBlocks()
247     const
248 {
249     uint32_t uncorrected_blocks;
250     if (::ioctl(fd(), FE_READ_UNCORRECTED_BLOCKS, &uncorrected_blocks) < 0)
251         SENF_THROW_SYSTEM_EXCEPTION("Could not get bit error rate of DVB adapter.");
252     return uncorrected_blocks;
253 }
254
255
256 prefix_ fe_status_t senf::DVBFrontendSocketProtocol::status()
257     const
258 {
259     fe_status_t status;
260     if (::ioctl(fd(), FE_READ_STATUS, &status) < 0)
261         SENF_THROW_SYSTEM_EXCEPTION("Could not get bit error rate of DVB adapter.");
262     return status;
263 }
264
265
266 //-/////////////////////////////////////////////////////////////////////////////////////////////////
267 #undef prefix_
268 //#include "DVBFrontendHandle.mpp"
269
270 \f
271 // Local Variables:
272 // mode: c++
273 // fill-column: 100
274 // c-file-style: "senf"
275 // indent-tabs-mode: nil
276 // ispell-local-dictionary: "american"
277 // compile-command: "scons -u test"
278 // comment-column: 40
279 // End: