X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FSocket%2FProtocols%2FDVB%2FDVBFrontendHandle.cc;h=d53ef98543abbb1d9a8b7c1c471339eef8f20c5a;hb=HEAD;hp=deaf5f1fe30fe5ca385675c9805d1757b006b7bf;hpb=3fe2ed38b800bcb57afff676698462e763724245;p=senf.git diff --git a/senf/Socket/Protocols/DVB/DVBFrontendHandle.cc b/senf/Socket/Protocols/DVB/DVBFrontendHandle.cc index deaf5f1..d53ef98 100644 --- a/senf/Socket/Protocols/DVB/DVBFrontendHandle.cc +++ b/senf/Socket/Protocols/DVB/DVBFrontendHandle.cc @@ -2,24 +2,29 @@ // // Copyright (C) 2007 // Fraunhofer Institute for Open Communication Systems (FOKUS) -// Competence Center NETwork research (NET), St. Augustin, GERMANY -// Anton Gillert -// Thorsten Horstmann // -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. +// The contents of this file are subject to the Fraunhofer FOKUS Public License +// Version 1.0 (the "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// http://senf.berlios.de/license.html // -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. +// The Fraunhofer FOKUS Public License Version 1.0 is based on, +// but modifies the Mozilla Public License Version 1.1. +// See the full license text for the amendments. // -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the -// Free Software Foundation, Inc., -// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// Software distributed under the License is distributed on an "AS IS" basis, +// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +// for the specific language governing rights and limitations under the License. +// +// The Original Code is Fraunhofer FOKUS code. +// +// The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. +// (registered association), Hansastraße 27 c, 80686 Munich, Germany. +// All Rights Reserved. +// +// Contributor(s): +// Thorsten Horstmann +// Anton Gillert /** \file \brief DVBFrontendHandle non-inline non-template implementation */ @@ -36,9 +41,9 @@ //#include "DVBFrontendHandle.mpp" #define prefix_ -///////////////////////////////cc.p//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::DVBFrontendHandle using namespace std; @@ -48,7 +53,7 @@ prefix_ void senf::DVBFrontendSocketProtocol::init_client(unsigned short adapter string devFrontend = str( boost::format("/dev/dvb/adapter%d/frontend%d") % adapter % device); int f = open(devFrontend.c_str(), flags); if (f < 0) - SENF_THROW_SYSTEM_EXCEPTION("")<< "Could not open frontend device of DVB adapter " << devFrontend << "."; + SENF_THROW_SYSTEM_EXCEPTION("Could not open frontend device of DVB adapter ") << devFrontend << "."; fd(f); } @@ -65,20 +70,20 @@ prefix_ bool senf::DVBFrontendSocketProtocol::eof() } prefix_ void senf::DVBFrontendSocketProtocol::tune(const struct dvb_frontend_parameters & frontend) - const + const { // tuning if (::ioctl(fd(), FE_SET_FRONTEND, &frontend) ) - SENF_THROW_SYSTEM_EXCEPTION("") << "ioctl FE_SET_FRONTEND failed. Socket should initialized with r/w permissions.";; + SENF_THROW_SYSTEM_EXCEPTION("ioctl FE_SET_FRONTEND failed. Socket should initialized with r/w permissions."); } -prefix_ void senf::DVBFrontendSocketProtocol::tuneDVB_T(unsigned int frequency, +prefix_ void senf::DVBFrontendSocketProtocol::tuneDVB_T(unsigned int frequency, fe_spectral_inversion_t inversion, - fe_bandwidth_t bandwidth, + fe_bandwidth_t bandwidth, fe_code_rate_t code_rate_HP, /* high priority stream code rate */ fe_code_rate_t code_rate_LP, /* low priority stream code rate */ fe_modulation_t constellation, /* modulation type */ - fe_transmit_mode_t transmission_mode, + fe_transmit_mode_t transmission_mode, fe_guard_interval_t guard_interval, fe_hierarchy_t hierarchy_information ) @@ -86,26 +91,26 @@ prefix_ void senf::DVBFrontendSocketProtocol::tuneDVB_T(unsigned int frequency, { struct dvb_ofdm_parameters ofdm; /* DVB-T Parameters */ struct dvb_frontend_parameters frontend; - + ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters)); ::memset(&ofdm, 0, sizeof(struct dvb_ofdm_parameters)); - + ofdm.bandwidth = bandwidth; ofdm.code_rate_HP = code_rate_HP; ofdm.code_rate_LP = code_rate_LP; - ofdm.constellation = constellation; + ofdm.constellation = constellation; ofdm.guard_interval = guard_interval; ofdm.hierarchy_information = hierarchy_information; - + frontend.frequency = frequency; frontend.inversion = inversion; frontend.u.ofdm = ofdm; - + tune(frontend); - + } -prefix_ void senf::DVBFrontendSocketProtocol::tuneDVB_S(unsigned int frequency, - fe_spectral_inversion_t inversion, +prefix_ void senf::DVBFrontendSocketProtocol::tuneDVB_S(unsigned int frequency, + fe_spectral_inversion_t inversion, unsigned int symbole_rate, /* symbol rate in Symbols per second */ fe_code_rate_t fec_inner /* forward error correction (see above) */ ) @@ -113,21 +118,21 @@ prefix_ void senf::DVBFrontendSocketProtocol::tuneDVB_S(unsigned int frequency, { struct dvb_qpsk_parameters qpsk; /* DVB-S Parameters*/ struct dvb_frontend_parameters frontend; - + ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters)); ::memset(&qpsk, 0, sizeof(struct dvb_qpsk_parameters)); - + qpsk.symbol_rate = symbole_rate; qpsk.fec_inner = fec_inner; - + frontend.frequency = frequency; frontend.inversion = inversion; frontend.u.qpsk = qpsk; - + tune(frontend); } -prefix_ void senf::DVBFrontendSocketProtocol::tuneDVB_C(unsigned int frequency, +prefix_ void senf::DVBFrontendSocketProtocol::tuneDVB_C(unsigned int frequency, fe_spectral_inversion_t inversion, unsigned int symbol_rate, fe_code_rate_t fec_inner, @@ -137,22 +142,22 @@ const { struct dvb_qam_parameters qam; /* DVB-C Parameters*/ struct dvb_frontend_parameters frontend; - + ::memset(&frontend, 0, sizeof(struct dvb_frontend_parameters)); ::memset(&qam, 0, sizeof(struct dvb_qam_parameters)); - + qam.symbol_rate = symbol_rate; qam.fec_inner = fec_inner; qam.modulation = modulation; - - + + frontend.frequency = frequency; frontend.inversion = inversion; frontend.u.qam = qam; - + tune(frontend); } -prefix_ void senf::DVBFrontendSocketProtocol::setNonBlock(bool on) +prefix_ void senf::DVBFrontendSocketProtocol::setNonBlock(bool on) const { if (on) @@ -166,18 +171,18 @@ prefix_ dvb_frontend_info senf::DVBFrontendSocketProtocol::getInfo() { struct dvb_frontend_info info; ::memset(&info, 0, sizeof(struct dvb_frontend_info)); - + if (::ioctl(fd(), FE_GET_INFO, &info)) { - SENF_THROW_SYSTEM_EXCEPTION("") << "Could not read on fildescriptor."; + SENF_THROW_SYSTEM_EXCEPTION("Could not read on fildescriptor."); } return info; } prefix_ dvb_frontend_parameters senf::DVBFrontendSocketProtocol::getFrontendParam() const { struct dvb_frontend_parameters frontend_; - + ::memset(&frontend_, 0, sizeof(struct dvb_frontend_parameters)); - + if (::ioctl(fd(), FE_GET_FRONTEND, &frontend_)) { switch(errno) { case EBADF: @@ -198,9 +203,9 @@ prefix_ dvb_frontend_parameters senf::DVBFrontendSocketProtocol::getFrontendPara prefix_ dvb_frontend_event senf::DVBFrontendSocketProtocol::getEvent() const{ struct dvb_frontend_event ev ; - + ::memset(&ev, 0, sizeof(struct dvb_frontend_event)); - +std::cerr<<"DVBFrontendSocketProtocol::getEvent\n"; if (::ioctl(fd(), FE_GET_EVENT, &ev)) { switch(errno) { case EBADF: @@ -209,6 +214,9 @@ prefix_ dvb_frontend_event senf::DVBFrontendSocketProtocol::getEvent() const{ case EWOULDBLOCK: SENF_THROW_SYSTEM_EXCEPTION( "No event pending and device is in nonblocking mode." ); break; + case EINTR: + // TODO: ignore EINTR. which might be caused by watchdog signals. This is possibly not the solution, but should work + break; default: SENF_THROW_SYSTEM_EXCEPTION("Errno: ") << errno; } @@ -226,7 +234,7 @@ prefix_ int16_t senf::DVBFrontendSocketProtocol::signalStrength() } prefix_ int16_t senf::DVBFrontendSocketProtocol::signalNoiseRatio() - const + const { int16_t snr; if (::ioctl(fd(), FE_READ_SNR, &snr) < 0) @@ -263,7 +271,7 @@ prefix_ fe_status_t senf::DVBFrontendSocketProtocol::status() } -///////////////////////////////cc.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_ //#include "DVBFrontendHandle.mpp"