4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Thorsten Horstmann <tho@berlios.de>
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 \brief DVBFrontendHandle non-inline non-template implementation */
26 #include "DVBFrontendHandle.hh"
27 //#include "DVBFrontendHandle.ih"
30 #include <boost/format.hpp>
31 #include <sys/socket.h>
32 #include "senf/Utils/Exception.hh"
33 #include <sys/ioctl.h>
36 //#include "DVBFrontendHandle.mpp"
38 ///////////////////////////////cc.p////////////////////////////////////////
40 ///////////////////////////////////////////////////////////////////////////
41 // senf::DVBFrontendHandle
44 prefix_ void senf::DVBFrontendSocketProtocol::init_client(unsigned short adapter, unsigned short device, int flags)
47 string devFrontend = str( boost::format("/dev/dvb/adapter%d/frontend%d") % adapter % device);
48 int f = open(devFrontend.c_str(), flags);
50 SENF_THROW_SYSTEM_EXCEPTION("")<< "Could not open frontend device of DVB adapter " << devFrontend << ".";
54 prefix_ unsigned senf::DVBFrontendSocketProtocol::available()
60 prefix_ bool senf::DVBFrontendSocketProtocol::eof()
66 prefix_ void senf::DVBFrontendSocketProtocol::tune(const struct dvb_frontend_parameters & frontend)
70 if (::ioctl(fd(), FE_SET_FRONTEND, &frontend) )
71 SENF_THROW_SYSTEM_EXCEPTION("") << "ioctl FE_SET_FRONTEND failed. Socket should initialized with r/w permissions.";;
74 prefix_ void senf::DVBFrontendSocketProtocol::tuneDVB_T(unsigned int frequency,
75 fe_spectral_inversion_t inversion,
76 fe_bandwidth_t bandwidth,
77 fe_code_rate_t code_rate_HP, /* high priority stream code rate */
78 fe_code_rate_t code_rate_LP, /* low priority stream code rate */
79 fe_modulation_t constellation, /* modulation type */
80 fe_transmit_mode_t transmission_mode,
81 fe_guard_interval_t guard_interval,
82 fe_hierarchy_t hierarchy_information
86 struct dvb_ofdm_parameters ofdm; /* DVB-T Parameters */
87 struct dvb_frontend_parameters frontend;
89 ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
90 ::memset(&ofdm, 0, sizeof(struct dvb_ofdm_parameters));
92 ofdm.bandwidth = bandwidth;
93 ofdm.code_rate_HP = code_rate_HP;
94 ofdm.code_rate_LP = code_rate_LP;
95 ofdm.constellation = constellation;
96 ofdm.guard_interval = guard_interval;
97 ofdm.hierarchy_information = hierarchy_information;
99 frontend.frequency = frequency;
100 frontend.inversion = inversion;
101 frontend.u.ofdm = ofdm;
106 prefix_ void senf::DVBFrontendSocketProtocol::tuneDVB_S(unsigned int frequency,
107 fe_spectral_inversion_t inversion,
108 unsigned int symbole_rate, /* symbol rate in Symbols per second */
109 fe_code_rate_t fec_inner /* forward error correction (see above) */
113 struct dvb_qpsk_parameters qpsk; /* DVB-S Parameters*/
114 struct dvb_frontend_parameters frontend;
116 ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
117 ::memset(&qpsk, 0, sizeof(struct dvb_qpsk_parameters));
119 qpsk.symbol_rate = symbole_rate;
120 qpsk.fec_inner = fec_inner;
122 frontend.frequency = frequency;
123 frontend.inversion = inversion;
124 frontend.u.qpsk = qpsk;
129 prefix_ void senf::DVBFrontendSocketProtocol::tuneDVB_C(unsigned int frequency,
130 fe_spectral_inversion_t inversion,
131 unsigned int symbol_rate,
132 fe_code_rate_t fec_inner,
133 fe_modulation_t modulation
137 struct dvb_qam_parameters qam; /* DVB-C Parameters*/
138 struct dvb_frontend_parameters frontend;
140 ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
141 ::memset(&qam, 0, sizeof(struct dvb_qam_parameters));
143 qam.symbol_rate = symbol_rate;
144 qam.fec_inner = fec_inner;
145 qam.modulation = modulation;
148 frontend.frequency = frequency;
149 frontend.inversion = inversion;
150 frontend.u.qam = qam;
154 prefix_ void senf::DVBFrontendSocketProtocol::setNonBlock(bool on)
158 ::fcntl(fd(), F_SETFL, ::fcntl(fd(), F_GETFL) | O_NONBLOCK);
160 ::fcntl(fd(), F_SETFL, ::fcntl(fd(), F_GETFL) & ~O_NONBLOCK);
163 prefix_ dvb_frontend_info senf::DVBFrontendSocketProtocol::getInfo()
166 struct dvb_frontend_info info;
167 ::memset(&info, 0, sizeof(struct dvb_frontend_info));
169 if( ::ioctl(fd(), FE_GET_INFO, &info) ) {
170 SENF_THROW_SYSTEM_EXCEPTION("") << "Could not read on fildescriptor.";
175 prefix_ dvb_frontend_parameters senf::DVBFrontendSocketProtocol::getFrontendParam() const {
176 struct dvb_frontend_parameters frontend_;
178 ::memset(&frontend_, 0, sizeof(struct dvb_frontend_parameters));
180 if(::ioctl(fd(), FE_GET_FRONTEND, &frontend_)) {
183 SENF_THROW_SYSTEM_EXCEPTION("fd is not a valid open file descriptor.");
186 SENF_THROW_SYSTEM_EXCEPTION( "frontend_ points to invalid address." );
189 SENF_THROW_SYSTEM_EXCEPTION( "Maximum supported symbol rate reached. This call may not be implemented by kernel driver!" );
192 SENF_THROW_SYSTEM_EXCEPTION("Errno: ") << errno;
198 prefix_ dvb_frontend_event senf::DVBFrontendSocketProtocol::getEvent() const{
199 struct dvb_frontend_event ev ;
201 ::memset(&ev, 0, sizeof(struct dvb_frontend_event));
203 if(::ioctl(fd(), FE_GET_EVENT, &ev)) {
206 SENF_THROW_SYSTEM_EXCEPTION("Could not read from frontend device, read-only access to the device is sufficient.");
209 SENF_THROW_SYSTEM_EXCEPTION( "No event pending and device is in nonblocking mode." );
212 SENF_THROW_SYSTEM_EXCEPTION("Errno: ") << errno;
218 prefix_ int16_t senf::DVBFrontendSocketProtocol::signalStrength()
222 if (::ioctl(fd(), FE_READ_SIGNAL_STRENGTH, &strength) < 0)
223 SENF_THROW_SYSTEM_EXCEPTION("Could not get signal strength of DVB adapter.");
227 prefix_ int16_t senf::DVBFrontendSocketProtocol::signalNoiseRatio()
231 if (::ioctl(fd(), FE_READ_SNR, &snr) < 0)
232 SENF_THROW_SYSTEM_EXCEPTION("Could not get signal-to-noise ratio of DVB adapter.");
236 prefix_ uint32_t senf::DVBFrontendSocketProtocol::bitErrorRate()
240 if (::ioctl(fd(), FE_READ_BER, &ber) < 0)
241 SENF_THROW_SYSTEM_EXCEPTION("Could not get bit error rate of DVB adapter.");
245 prefix_ uint32_t senf::DVBFrontendSocketProtocol::uncorrectedBlocks()
248 uint32_t uncorrected_blocks;
249 if (::ioctl(fd(), FE_READ_UNCORRECTED_BLOCKS, &uncorrected_blocks) < 0)
250 SENF_THROW_SYSTEM_EXCEPTION("Could not get bit error rate of DVB adapter.");
251 return uncorrected_blocks;
255 prefix_ fe_status_t senf::DVBFrontendSocketProtocol::status()
259 if (::ioctl(fd(), FE_READ_STATUS, &status) < 0)
260 SENF_THROW_SYSTEM_EXCEPTION("Could not get bit error rate of DVB adapter.");
265 ///////////////////////////////cc.e////////////////////////////////////////
267 //#include "DVBFrontendHandle.mpp"
273 // c-file-style: "senf"
274 // indent-tabs-mode: nil
275 // ispell-local-dictionary: "american"
276 // compile-command: "scons -u test"
277 // comment-column: 40