DVBFrontendHandle.cc

Go to the documentation of this file.
00001 // $Id: DVBFrontendHandle.cc 1775 2011-03-30 17:14:02Z jmo $
00002 //
00003 // Copyright (C) 2007
00004 // Fraunhofer (FOKUS)
00005 // Competence Center NETwork research (NET), St. Augustin, GERMANY
00006 //     Anton Gillert <atx@berlios.de>
00007 //     Thorsten Horstmann <tho@berlios.de>
00008 //
00009 // This program is free software; you can redistribute it and/or modify
00010 // it under the terms of the GNU General Public License as published by
00011 // the Free Software Foundation; either version 2 of the License, or
00012 // (at your option) any later version.
00013 //
00014 // This program is distributed in the hope that it will be useful,
00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017 // GNU General Public License for more details.
00018 //
00019 // You should have received a copy of the GNU General Public License
00020 // along with this program; if not, write to the
00021 // Free Software Foundation, Inc.,
00022 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00023 
00027 #include "DVBFrontendHandle.hh"
00028 //#include "DVBFrontendHandle.ih"
00029 
00030 // Custom includes
00031 #include <boost/format.hpp>
00032 #include <sys/socket.h>
00033 #include <senf/Utils/Exception.hh>
00034 #include <sys/ioctl.h>
00035 
00036 
00037 //#include "DVBFrontendHandle.mpp"
00038 #define prefix_
00039 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00040 
00041 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00042 // senf::DVBFrontendHandle
00043 using namespace std;
00044 
00045 prefix_ void senf::DVBFrontendSocketProtocol::init_client(unsigned short adapter, unsigned short device, int flags)
00046     const
00047 {
00048     string devFrontend = str( boost::format("/dev/dvb/adapter%d/frontend%d") % adapter % device);
00049     int f = open(devFrontend.c_str(), flags);
00050     if (f < 0)
00051         SENF_THROW_SYSTEM_EXCEPTION("")<< "Could not open frontend device of DVB adapter " << devFrontend << ".";
00052     fd(f);
00053 }
00054 
00055 prefix_ unsigned senf::DVBFrontendSocketProtocol::available()
00056     const
00057 {
00058     return 0;
00059 }
00060 
00061 prefix_ bool senf::DVBFrontendSocketProtocol::eof()
00062     const
00063 {
00064     return false;
00065 }
00066 
00067 prefix_ void senf::DVBFrontendSocketProtocol::tune(const struct dvb_frontend_parameters & frontend)
00068     const
00069 {
00070     // tuning
00071     if (::ioctl(fd(), FE_SET_FRONTEND, &frontend) )
00072         SENF_THROW_SYSTEM_EXCEPTION("") << "ioctl FE_SET_FRONTEND failed. Socket should initialized with r/w permissions.";;
00073 }
00074 
00075 prefix_ void senf::DVBFrontendSocketProtocol::tuneDVB_T(unsigned int frequency,
00076         fe_spectral_inversion_t inversion,
00077         fe_bandwidth_t bandwidth,
00078         fe_code_rate_t code_rate_HP, /* high priority stream code rate */
00079         fe_code_rate_t code_rate_LP, /* low priority stream code rate */
00080         fe_modulation_t constellation, /* modulation type */
00081         fe_transmit_mode_t transmission_mode,
00082         fe_guard_interval_t guard_interval,
00083         fe_hierarchy_t hierarchy_information
00084         )
00085     const
00086 {
00087     struct dvb_ofdm_parameters ofdm; /* DVB-T Parameters */
00088     struct dvb_frontend_parameters frontend;
00089 
00090     ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
00091     ::memset(&ofdm, 0, sizeof(struct dvb_ofdm_parameters));
00092 
00093     ofdm.bandwidth = bandwidth;
00094     ofdm.code_rate_HP = code_rate_HP;
00095     ofdm.code_rate_LP = code_rate_LP;
00096     ofdm.constellation = constellation;
00097     ofdm.guard_interval = guard_interval;
00098     ofdm.hierarchy_information = hierarchy_information;
00099 
00100     frontend.frequency = frequency;
00101     frontend.inversion = inversion;
00102     frontend.u.ofdm = ofdm;
00103 
00104     tune(frontend);
00105 
00106 }
00107 prefix_ void senf::DVBFrontendSocketProtocol::tuneDVB_S(unsigned int frequency,
00108         fe_spectral_inversion_t inversion,
00109         unsigned int symbole_rate, /* symbol rate in Symbols per second */
00110         fe_code_rate_t fec_inner /* forward error correction (see above) */
00111     )
00112     const
00113 {
00114     struct dvb_qpsk_parameters qpsk; /* DVB-S Parameters*/
00115     struct dvb_frontend_parameters frontend;
00116 
00117     ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
00118     ::memset(&qpsk, 0, sizeof(struct dvb_qpsk_parameters));
00119 
00120     qpsk.symbol_rate = symbole_rate;
00121     qpsk.fec_inner = fec_inner;
00122 
00123     frontend.frequency = frequency;
00124     frontend.inversion = inversion;
00125     frontend.u.qpsk = qpsk;
00126 
00127     tune(frontend);
00128 }
00129 
00130 prefix_ void senf::DVBFrontendSocketProtocol::tuneDVB_C(unsigned int frequency,
00131         fe_spectral_inversion_t inversion,
00132         unsigned int symbol_rate,
00133         fe_code_rate_t fec_inner,
00134         fe_modulation_t modulation
00135         )
00136 const
00137 {
00138     struct dvb_qam_parameters qam; /* DVB-C Parameters*/
00139     struct dvb_frontend_parameters frontend;
00140 
00141     ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters));
00142     ::memset(&qam, 0, sizeof(struct dvb_qam_parameters));
00143 
00144     qam.symbol_rate = symbol_rate;
00145     qam.fec_inner = fec_inner;
00146     qam.modulation = modulation;
00147 
00148 
00149     frontend.frequency = frequency;
00150     frontend.inversion = inversion;
00151     frontend.u.qam = qam;
00152 
00153     tune(frontend);
00154 }
00155 prefix_ void senf::DVBFrontendSocketProtocol::setNonBlock(bool on)
00156     const
00157 {
00158    if (on)
00159        ::fcntl(fd(), F_SETFL, ::fcntl(fd(), F_GETFL) | O_NONBLOCK);
00160    else
00161        ::fcntl(fd(), F_SETFL, ::fcntl(fd(), F_GETFL) & ~O_NONBLOCK);
00162 
00163 }
00164 prefix_ dvb_frontend_info senf::DVBFrontendSocketProtocol::getInfo()
00165     const
00166 {
00167     struct dvb_frontend_info info;
00168     ::memset(&info, 0, sizeof(struct dvb_frontend_info));
00169 
00170     if (::ioctl(fd(), FE_GET_INFO, &info)) {
00171         SENF_THROW_SYSTEM_EXCEPTION("") << "Could not read on fildescriptor.";
00172     }
00173     return info;
00174 }
00175 
00176 prefix_ dvb_frontend_parameters senf::DVBFrontendSocketProtocol::getFrontendParam() const {
00177     struct dvb_frontend_parameters frontend_;
00178 
00179     ::memset(&frontend_, 0, sizeof(struct dvb_frontend_parameters));
00180 
00181     if (::ioctl(fd(), FE_GET_FRONTEND, &frontend_)) {
00182         switch(errno) {
00183             case EBADF:
00184                 SENF_THROW_SYSTEM_EXCEPTION("fd is not a valid open file descriptor.");
00185                 break;
00186             case EFAULT:
00187                 SENF_THROW_SYSTEM_EXCEPTION( "frontend_ points to invalid address." );
00188                 break;
00189             case EINVAL:
00190                 SENF_THROW_SYSTEM_EXCEPTION( "Maximum supported symbol rate reached. This call may not be implemented by kernel driver!" );
00191                 break;
00192             default:
00193                 SENF_THROW_SYSTEM_EXCEPTION("Errno: ") << errno;
00194         }
00195     }
00196     return frontend_;
00197 }
00198 
00199 prefix_ dvb_frontend_event senf::DVBFrontendSocketProtocol::getEvent() const{
00200     struct dvb_frontend_event ev ;
00201 
00202     ::memset(&ev, 0, sizeof(struct dvb_frontend_event));
00203 std::cerr<<"DVBFrontendSocketProtocol::getEvent\n";
00204     if (::ioctl(fd(), FE_GET_EVENT, &ev)) {
00205         switch(errno) {
00206             case EBADF:
00207                 SENF_THROW_SYSTEM_EXCEPTION("Could not read from frontend device, read-only access to the device is sufficient.");
00208                 break;
00209             case EWOULDBLOCK:
00210                 SENF_THROW_SYSTEM_EXCEPTION( "No event pending and device is in nonblocking mode." );
00211                 break;
00212             case EINTR:
00213                 // TODO: ignore EINTR. which might be caused by watchdog signals. This is possibly not the solution, but should work
00214                 break;
00215             default:
00216                 SENF_THROW_SYSTEM_EXCEPTION("Errno: ") << errno;
00217         }
00218     }
00219     return ev;
00220 }
00221 
00222 prefix_ int16_t senf::DVBFrontendSocketProtocol::signalStrength()
00223     const
00224 {
00225     int16_t strength;
00226     if (::ioctl(fd(), FE_READ_SIGNAL_STRENGTH, &strength) < 0)
00227         SENF_THROW_SYSTEM_EXCEPTION("Could not get signal strength of DVB adapter.");
00228     return strength;
00229 }
00230 
00231 prefix_ int16_t senf::DVBFrontendSocketProtocol::signalNoiseRatio()
00232     const
00233 {
00234     int16_t snr;
00235     if (::ioctl(fd(), FE_READ_SNR, &snr) < 0)
00236         SENF_THROW_SYSTEM_EXCEPTION("Could not get signal-to-noise ratio of DVB adapter.");
00237     return snr;
00238 }
00239 
00240 prefix_ uint32_t senf::DVBFrontendSocketProtocol::bitErrorRate()
00241     const
00242 {
00243     uint32_t ber;
00244     if (::ioctl(fd(), FE_READ_BER, &ber) < 0)
00245         SENF_THROW_SYSTEM_EXCEPTION("Could not get bit error rate of DVB adapter.");
00246     return ber;
00247 }
00248 
00249 prefix_ uint32_t senf::DVBFrontendSocketProtocol::uncorrectedBlocks()
00250     const
00251 {
00252     uint32_t uncorrected_blocks;
00253     if (::ioctl(fd(), FE_READ_UNCORRECTED_BLOCKS, &uncorrected_blocks) < 0)
00254         SENF_THROW_SYSTEM_EXCEPTION("Could not get bit error rate of DVB adapter.");
00255     return uncorrected_blocks;
00256 }
00257 
00258 
00259 prefix_ fe_status_t senf::DVBFrontendSocketProtocol::status()
00260     const
00261 {
00262     fe_status_t status;
00263     if (::ioctl(fd(), FE_READ_STATUS, &status) < 0)
00264         SENF_THROW_SYSTEM_EXCEPTION("Could not get bit error rate of DVB adapter.");
00265     return status;
00266 }
00267 
00268 
00269 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00270 #undef prefix_
00271 //#include "DVBFrontendHandle.mpp"
00272 
00273 
00274 // Local Variables:
00275 // mode: c++
00276 // fill-column: 100
00277 // c-file-style: "senf"
00278 // indent-tabs-mode: nil
00279 // ispell-local-dictionary: "american"
00280 // compile-command: "scons -u test"
00281 // comment-column: 40
00282 // End: