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>
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.
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.
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.
25 \brief DVBFrontendHandle non-inline non-template implementation */
27 #include "DVBFrontendHandle.hh"
28 //#include "DVBFrontendHandle.ih"
31 #include <boost/format.hpp>
32 #include <sys/socket.h>
33 #include "../../../Utils/Exception.hh"
34 #include <sys/ioctl.h>
37 //#include "DVBFrontendHandle.mpp"
39 ///////////////////////////////cc.p////////////////////////////////////////
41 ///////////////////////////////////////////////////////////////////////////
42 // senf::DVBFrontendHandle
45 prefix_ void senf::DVBFrontendSocketProtocol::init_client(unsigned short adapter, unsigned short device, int flags)
48 string devFrontend = str( boost::format("/dev/dvb/adapter%d/frontend%d") % adapter % device);
49 int f = open(devFrontend.c_str(), flags);
51 SENF_THROW_SYSTEM_EXCEPTION("")<< "Could not open frontend device of DVB adapter " << devFrontend << ".";
55 prefix_ unsigned senf::DVBFrontendSocketProtocol::available()
61 prefix_ bool senf::DVBFrontendSocketProtocol::eof()
67 prefix_ void senf::DVBFrontendSocketProtocol::tune(const struct dvb_frontend_parameters & frontend)
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.";;
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
87 struct dvb_ofdm_parameters ofdm; /* DVB-T Parameters */
88 struct dvb_frontend_parameters frontend;
90 ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
91 ::memset(&ofdm, 0, sizeof(struct dvb_ofdm_parameters));
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;
100 frontend.frequency = frequency;
101 frontend.inversion = inversion;
102 frontend.u.ofdm = ofdm;
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) */
114 struct dvb_qpsk_parameters qpsk; /* DVB-S Parameters*/
115 struct dvb_frontend_parameters frontend;
117 ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
118 ::memset(&qpsk, 0, sizeof(struct dvb_qpsk_parameters));
120 qpsk.symbol_rate = symbole_rate;
121 qpsk.fec_inner = fec_inner;
123 frontend.frequency = frequency;
124 frontend.inversion = inversion;
125 frontend.u.qpsk = qpsk;
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
138 struct dvb_qam_parameters qam; /* DVB-C Parameters*/
139 struct dvb_frontend_parameters frontend;
141 ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
142 ::memset(&qam, 0, sizeof(struct dvb_qam_parameters));
144 qam.symbol_rate = symbol_rate;
145 qam.fec_inner = fec_inner;
146 qam.modulation = modulation;
149 frontend.frequency = frequency;
150 frontend.inversion = inversion;
151 frontend.u.qam = qam;
155 prefix_ void senf::DVBFrontendSocketProtocol::setNonBlock(bool on)
159 ::fcntl(fd(), F_SETFL, ::fcntl(fd(), F_GETFL) | O_NONBLOCK);
161 ::fcntl(fd(), F_SETFL, ::fcntl(fd(), F_GETFL) & ~O_NONBLOCK);
164 prefix_ dvb_frontend_info senf::DVBFrontendSocketProtocol::getInfo()
167 struct dvb_frontend_info info;
168 ::memset(&info, 0, sizeof(struct dvb_frontend_info));
170 if( ::ioctl(fd(), FE_GET_INFO, &info) ) {
171 SENF_THROW_SYSTEM_EXCEPTION("") << "Could not read on fildescriptor.";
176 prefix_ dvb_frontend_parameters senf::DVBFrontendSocketProtocol::getFrontendParam() const {
177 struct dvb_frontend_parameters frontend_;
179 ::memset(&frontend_, 0, sizeof(struct dvb_frontend_parameters));
181 if(::ioctl(fd(), FE_GET_FRONTEND, &frontend_)) {
184 SENF_THROW_SYSTEM_EXCEPTION("fd is not a valid open file descriptor.");
187 SENF_THROW_SYSTEM_EXCEPTION( "frontend_ points to invalid address." );
190 SENF_THROW_SYSTEM_EXCEPTION( "Maximum supported symbol rate reached. This call may not be implemented by kernel driver!" );
193 SENF_THROW_SYSTEM_EXCEPTION("Errno: ") << errno;
199 prefix_ dvb_frontend_event senf::DVBFrontendSocketProtocol::getEvent() const{
200 struct dvb_frontend_event ev ;
202 ::memset(&ev, 0, sizeof(struct dvb_frontend_event));
204 if(::ioctl(fd(), FE_GET_EVENT, &ev)) {
207 SENF_THROW_SYSTEM_EXCEPTION("Could not read from frontend device, read-only access to the device is sufficient.");
210 SENF_THROW_SYSTEM_EXCEPTION( "No event pending and device is in nonblocking mode." );
213 SENF_THROW_SYSTEM_EXCEPTION("Errno: ") << errno;
219 prefix_ int16_t senf::DVBFrontendSocketProtocol::signalStrength()
223 if (::ioctl(fd(), FE_READ_SIGNAL_STRENGTH, &strength) < 0)
224 SENF_THROW_SYSTEM_EXCEPTION("Could not get signal strength of DVB adapter.");
228 prefix_ int16_t senf::DVBFrontendSocketProtocol::signalNoiseRatio()
232 if (::ioctl(fd(), FE_READ_SNR, &snr) < 0)
233 SENF_THROW_SYSTEM_EXCEPTION("Could not get signal-to-noise ratio of DVB adapter.");
237 prefix_ uint32_t senf::DVBFrontendSocketProtocol::bitErrorRate()
241 if (::ioctl(fd(), FE_READ_BER, &ber) < 0)
242 SENF_THROW_SYSTEM_EXCEPTION("Could not get bit error rate of DVB adapter.");
246 prefix_ uint32_t senf::DVBFrontendSocketProtocol::uncorrectedBlocks()
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;
256 prefix_ fe_status_t senf::DVBFrontendSocketProtocol::status()
260 if (::ioctl(fd(), FE_READ_STATUS, &status) < 0)
261 SENF_THROW_SYSTEM_EXCEPTION("Could not get bit error rate of DVB adapter.");
266 ///////////////////////////////cc.e////////////////////////////////////////
268 //#include "DVBFrontendHandle.mpp"
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