X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FSocket%2FProtocols%2FDVB%2FDVBSocketController.cc;h=f9078da4dc58529f8b139512caf2fad021b01b82;hb=8a6697d11e9a6557d9a5c42b4052666fce32bc10;hp=e8eb3f0ae6edc3782258584b750521bc18566e5b;hpb=601d1f509f5bb24df167a4dd5a20da67a0af9af8;p=senf.git diff --git a/senf/Socket/Protocols/DVB/DVBSocketController.cc b/senf/Socket/Protocols/DVB/DVBSocketController.cc index e8eb3f0..f9078da 100644 --- a/senf/Socket/Protocols/DVB/DVBSocketController.cc +++ b/senf/Socket/Protocols/DVB/DVBSocketController.cc @@ -2,44 +2,49 @@ // // Copyright (C) 2007 // Fraunhofer Institute for Open Communication Systems (FOKUS) -// Competence Center NETwork research (NET), St. Augustin, GERMANY -// Anton Gillert // -// 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): +// Anton Gillert /** \file - \brief DVBSocketControlle-r non-inline non-template implementation */ + \brief DVBSocketController non-inline non-template implementation */ #include "DVBSocketController.hh" // Custom includes #include -#include "senf/Utils/Exception.hh" -#include "senf/Utils/Logger/Logger.hh" -#include "senf/Utils/membind.hh" +#include +#include +#include +#include #include +#include "DVBProtocolWrapper.hh" #define prefix_ -///////////////////////////////cc.p//////////////////////////////////////// - -using namespace std; +//-///////////////////////////////////////////////////////////////////////////////////////////////// unsigned int senf::DVBSocketController::controllerNr(0); -senf::DVBSocketController::DVBSocketController(DVBFrontendHandle frontendHandle_, const Callback & cb_) +senf::DVBSocketController::DVBSocketController(DVBFrontendHandle frontendHandle_, + const Callback & cb_) : dir( this ), frontendHandle( frontendHandle_ ), type( frontendHandle.protocol().getInfo().type ), @@ -47,50 +52,61 @@ senf::DVBSocketController::DVBSocketController(DVBFrontendHandle frontendHandle_ cb( cb_ ), sectionNr(1), pesNr(1), - event( "senf::DVBSocketController::readEvent", senf::membind(&DVBSocketController::readEvent, this), frontendHandle, senf::scheduler::FdEvent::EV_PRIO, false ) + event( "senf::DVBSocketController::readEvent", + senf::membind(&DVBSocketController::readEvent, this), frontendHandle, + senf::scheduler::FdEvent::EV_PRIO, false ) { initConsole(); } prefix_ senf::DVBSocketController::~DVBSocketController() -{ -} +{} -prefix_ senf::DVBDemuxSectionHandle senf::DVBSocketController::createDVBDemuxSectionHandle( int adapternumber, int demuxnumber, bool addToConsole ){ - DVBDemuxSectionHandle sectionHandle(adapternumber, demuxnumber); - if(addToConsole) +prefix_ senf::DVBDemuxSectionHandle +senf::DVBSocketController::createDVBDemuxSectionHandle(int adapternumber, int demuxnumber, + bool addToConsole) +{ + DVBDemuxSectionHandle sectionHandle(adapternumber, demuxnumber); + if (addToConsole) this->addToConsole(sectionHandle); return sectionHandle; - + } -prefix_ senf::DVBDemuxPESHandle senf::DVBSocketController::createDVBDemuxPESHandle( int adapternumber, int demuxnumber, bool addToConsole ){ - DVBDemuxPESHandle pesHandle(adapternumber, demuxnumber); - if(addToConsole ) +prefix_ senf::DVBDemuxPESHandle +senf::DVBSocketController::createDVBDemuxPESHandle(int adapternumber, int demuxnumber, + bool addToConsole) +{ + DVBDemuxPESHandle pesHandle(adapternumber, demuxnumber); + if (addToConsole) this->addToConsole(pesHandle); return pesHandle; - + } -prefix_ void senf::DVBSocketController::addToConsole(senf::DVBDemuxSectionHandle sh){ +prefix_ void senf::DVBSocketController::addToConsole(senf::DVBDemuxSectionHandle sh) +{ boost::shared_ptr wrap(new DVBSectionProtocolWrapper(sh)); sh.protocol().addWrapper(wrap); dir.node().add("section" + senf::str(sectionNr), wrap->dir); sectionNr++; } -prefix_ void senf::DVBSocketController::addToConsole(senf::DVBDemuxPESHandle sh){ + +prefix_ void senf::DVBSocketController::addToConsole(senf::DVBDemuxPESHandle sh) +{ boost::shared_ptr wrap(new DVBPESProtocolWrapper(sh)); sh.protocol().addWrapper(wrap); dir.node().add("pes"+ senf::str(pesNr), wrap->dir); pesNr++; } -prefix_ void senf::DVBSocketController::tuneToCMD(const string & input, const string & mode) +prefix_ void senf::DVBSocketController::tuneToCMD(std::string const & input, std::string const & mode) { struct dvb_frontend_parameters frontend; // no valid configline, so it will be treaten like a channel name - if (input.find(":")==string::npos){ + if (input.find(":") == std::string::npos) + { if (mode.c_str()[0]=='a') tuneTo(input); else @@ -100,16 +116,21 @@ prefix_ void senf::DVBSocketController::tuneToCMD(const string & input, const st // add psydo name "foo" to complete configline syntax frontend = parser.getFrontendParam("foo:"+input); - if (mode.c_str()[0]=='a'){ + if (mode.c_str()[0]=='a') { switch (type) { case FE_QPSK: - tuneDVB_S(frontend.frequency, frontend.inversion, frontend.u.qpsk.symbol_rate, frontend.u.qpsk.fec_inner); + tuneDVB_S(frontend.frequency, frontend.inversion, frontend.u.qpsk.symbol_rate, + frontend.u.qpsk.fec_inner); break; case FE_QAM: - tuneDVB_C(frontend.frequency, frontend.inversion, frontend.u.qam.symbol_rate, frontend.u.qam.fec_inner, frontend.u.qam.modulation); + tuneDVB_C(frontend.frequency, frontend.inversion, frontend.u.qam.symbol_rate, + frontend.u.qam.fec_inner, frontend.u.qam.modulation); break; case FE_OFDM: - tuneDVB_T(frontend.frequency, frontend.inversion, frontend.u.ofdm.bandwidth, frontend.u.ofdm.code_rate_HP, frontend.u.ofdm.code_rate_LP, frontend.u.ofdm.constellation, frontend.u.ofdm.transmission_mode, frontend.u.ofdm.guard_interval, frontend.u.ofdm.hierarchy_information); + tuneDVB_T(frontend.frequency, frontend.inversion, frontend.u.ofdm.bandwidth, + frontend.u.ofdm.code_rate_HP, frontend.u.ofdm.code_rate_LP, + frontend.u.ofdm.constellation, frontend.u.ofdm.transmission_mode, + frontend.u.ofdm.guard_interval, frontend.u.ofdm.hierarchy_information); break; default: SENF_THROW_SYSTEM_EXCEPTION("Could not determine type of card."); @@ -118,13 +139,19 @@ prefix_ void senf::DVBSocketController::tuneToCMD(const string & input, const st else { switch (type) { case FE_QPSK: - tuneDVB_S_sync(frontend.frequency, frontend.inversion, frontend.u.qpsk.symbol_rate, frontend.u.qpsk.fec_inner); + tuneDVB_S_sync(frontend.frequency, frontend.inversion, frontend.u.qpsk.symbol_rate, + frontend.u.qpsk.fec_inner); break; case FE_QAM: - tuneDVB_C_sync(frontend.frequency, frontend.inversion, frontend.u.qam.symbol_rate, frontend.u.qam.fec_inner, frontend.u.qam.modulation); + tuneDVB_C_sync(frontend.frequency, frontend.inversion, frontend.u.qam.symbol_rate, + frontend.u.qam.fec_inner, frontend.u.qam.modulation); break; case FE_OFDM: - tuneDVB_T_sync(frontend.frequency, frontend.inversion, frontend.u.ofdm.bandwidth, frontend.u.ofdm.code_rate_HP, frontend.u.ofdm.code_rate_LP, frontend.u.ofdm.constellation, frontend.u.ofdm.transmission_mode, frontend.u.ofdm.guard_interval, frontend.u.ofdm.hierarchy_information); + tuneDVB_T_sync(frontend.frequency, frontend.inversion, frontend.u.ofdm.bandwidth, + frontend.u.ofdm.code_rate_HP, frontend.u.ofdm.code_rate_LP, + frontend.u.ofdm.constellation, frontend.u.ofdm.transmission_mode, + frontend.u.ofdm.guard_interval, + frontend.u.ofdm.hierarchy_information); break; default: SENF_THROW_SYSTEM_EXCEPTION("Could not determine type of card."); @@ -132,22 +159,27 @@ prefix_ void senf::DVBSocketController::tuneToCMD(const string & input, const st } } -prefix_ void senf::DVBSocketController::tuneTo(const string & channel) +prefix_ void senf::DVBSocketController::tuneTo(std::string const & channel) { struct dvb_frontend_parameters frontend; - string configLine = parser.getConfigLine(channel); + std::string configLine = parser.getConfigLine(channel); frontend = parser.getFrontendParam(configLine); switch (type) { case FE_QPSK: - tuneDVB_S(frontend.frequency, frontend.inversion, frontend.u.qpsk.symbol_rate, frontend.u.qpsk.fec_inner); + tuneDVB_S(frontend.frequency, frontend.inversion, frontend.u.qpsk.symbol_rate, + frontend.u.qpsk.fec_inner); break; case FE_QAM: - tuneDVB_C(frontend.frequency, frontend.inversion, frontend.u.qam.symbol_rate, frontend.u.qam.fec_inner, frontend.u.qam.modulation); + tuneDVB_C(frontend.frequency, frontend.inversion, frontend.u.qam.symbol_rate, + frontend.u.qam.fec_inner, frontend.u.qam.modulation); break; case FE_OFDM: - tuneDVB_T(frontend.frequency, frontend.inversion, frontend.u.ofdm.bandwidth, frontend.u.ofdm.code_rate_HP, frontend.u.ofdm.code_rate_LP, frontend.u.ofdm.constellation, frontend.u.ofdm.transmission_mode, frontend.u.ofdm.guard_interval, frontend.u.ofdm.hierarchy_information); + tuneDVB_T(frontend.frequency, frontend.inversion, frontend.u.ofdm.bandwidth, + frontend.u.ofdm.code_rate_HP, frontend.u.ofdm.code_rate_LP, + frontend.u.ofdm.constellation, frontend.u.ofdm.transmission_mode, + frontend.u.ofdm.guard_interval, frontend.u.ofdm.hierarchy_information); break; default: SENF_THROW_SYSTEM_EXCEPTION("Could not determine type of card."); @@ -165,8 +197,9 @@ prefix_ void senf::DVBSocketController::tuneDVB_T(unsigned int frequency, fe_hierarchy_t hierarchy_information ) { - if(type != FE_OFDM) - SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") << getTypeString() << " for this operation you need a DVB-T Card!"; + if (type != FE_OFDM) + SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") + << getTypeString() << " for this operation you need a DVB-T Card!"; event.enable(); @@ -182,10 +215,14 @@ prefix_ void senf::DVBSocketController::tuneDVB_T(unsigned int frequency, hierarchy_information); } -prefix_ void senf::DVBSocketController::tuneDVB_S(unsigned int frequency, fe_spectral_inversion_t inversion, unsigned int symbole_rate, fe_code_rate_t code_rate) +prefix_ void senf::DVBSocketController::tuneDVB_S(unsigned int frequency, + fe_spectral_inversion_t inversion, + unsigned int symbole_rate, + fe_code_rate_t code_rate) { - if(type != FE_QPSK) - SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") << getTypeString() << " for this operation you need a DVB-S Card!"; + if (type != FE_QPSK) + SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") + << getTypeString() << " for this operation you need a DVB-S Card!"; event.enable(); @@ -200,8 +237,9 @@ prefix_ void senf::DVBSocketController::tuneDVB_C(unsigned int frequency, fe_modulation_t modulation ) { - if(type != FE_QAM) - SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") << getTypeString() << " for this operation you need a DVB-C Card!"; + if (type != FE_QAM) + SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") + << getTypeString() << " for this operation you need a DVB-C Card!"; event.enable(); @@ -210,22 +248,28 @@ prefix_ void senf::DVBSocketController::tuneDVB_C(unsigned int frequency, frontendHandle.protocol().tuneDVB_C(frequency, inversion, symbol_rate, fec_inner, modulation); } -prefix_ dvb_frontend_event senf::DVBSocketController::tuneTo_sync(const string & channel) +prefix_ dvb_frontend_event senf::DVBSocketController::tuneTo_sync(std::string const & channel) { struct dvb_frontend_parameters frontend; dvb_frontend_event ev; - string configLine = parser.getConfigLine(channel); + std::string configLine = parser.getConfigLine(channel); frontend = parser.getFrontendParam(configLine); switch (type) { case FE_QPSK: - ev = tuneDVB_S_sync(frontend.frequency, frontend.inversion, frontend.u.qpsk.symbol_rate, frontend.u.qpsk.fec_inner); + ev = tuneDVB_S_sync(frontend.frequency, frontend.inversion, + frontend.u.qpsk.symbol_rate, frontend.u.qpsk.fec_inner); break; case FE_QAM: - ev = tuneDVB_C_sync(frontend.frequency, frontend.inversion, frontend.u.qam.symbol_rate, frontend.u.qam.fec_inner, frontend.u.qam.modulation); + ev = tuneDVB_C_sync(frontend.frequency, frontend.inversion, frontend.u.qam.symbol_rate, + frontend.u.qam.fec_inner, frontend.u.qam.modulation); break; case FE_OFDM: - ev = tuneDVB_T_sync(frontend.frequency, frontend.inversion, frontend.u.ofdm.bandwidth, frontend.u.ofdm.code_rate_HP, frontend.u.ofdm.code_rate_LP, frontend.u.ofdm.constellation, frontend.u.ofdm.transmission_mode, frontend.u.ofdm.guard_interval, frontend.u.ofdm.hierarchy_information); + ev = tuneDVB_T_sync(frontend.frequency, frontend.inversion, frontend.u.ofdm.bandwidth, + frontend.u.ofdm.code_rate_HP, frontend.u.ofdm.code_rate_LP, + frontend.u.ofdm.constellation, frontend.u.ofdm.transmission_mode, + frontend.u.ofdm.guard_interval, + frontend.u.ofdm.hierarchy_information); break; default: SENF_THROW_SYSTEM_EXCEPTION("Could not determine type of card."); @@ -244,8 +288,9 @@ prefix_ dvb_frontend_event senf::DVBSocketController::tuneDVB_T_sync(unsigned in fe_hierarchy_t hierarchy_information ) { - if(type != FE_OFDM) - SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") << getTypeString() << " for this operation you need a DVB-T Card!"; + if (type != FE_OFDM) + SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") + << getTypeString() << " for this operation you need a DVB-T Card!"; event.disable(); @@ -261,15 +306,20 @@ prefix_ dvb_frontend_event senf::DVBSocketController::tuneDVB_T_sync(unsigned in guard_interval, hierarchy_information); - if(!frontendHandle.waitOOBReadable(senf::ClockService::seconds(2))) + if (!frontendHandle.waitOOBReadable(senf::ClockService::seconds(2))) SENF_THROW_SYSTEM_EXCEPTION("Could not tune to channel!"); return frontendHandle.protocol().getEvent(); } -prefix_ dvb_frontend_event senf::DVBSocketController::tuneDVB_S_sync(unsigned int frequency, fe_spectral_inversion_t inversion, unsigned int symbole_rate, fe_code_rate_t code_rate){ - if(type != FE_QPSK) - SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") << getTypeString() << " for this operation you need a DVB-S Card!"; +prefix_ dvb_frontend_event +senf::DVBSocketController::tuneDVB_S_sync(unsigned int frequency, + fe_spectral_inversion_t inversion, + unsigned int symbole_rate, fe_code_rate_t code_rate) +{ + if (type != FE_QPSK) + SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") + << getTypeString() << " for this operation you need a DVB-S Card!"; event.disable(); @@ -277,7 +327,7 @@ prefix_ dvb_frontend_event senf::DVBSocketController::tuneDVB_S_sync(unsigned in frontendHandle.protocol().tuneDVB_S(frequency, inversion, symbole_rate, code_rate); - if(!frontendHandle.waitOOBReadable(senf::ClockService::seconds(2))) + if (!frontendHandle.waitOOBReadable(senf::ClockService::seconds(2))) SENF_THROW_SYSTEM_EXCEPTION("Could not tune to channel!"); return frontendHandle.protocol().getEvent(); } @@ -289,22 +339,23 @@ prefix_ dvb_frontend_event senf::DVBSocketController::tuneDVB_C_sync(unsigned in fe_modulation_t modulation ) { - if(type != FE_QAM) - SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") << getTypeString() << " for this operation you need a DVB-C Card!"; + if (type != FE_QAM) + SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") + << getTypeString() << " for this operation you need a DVB-C Card!"; event.disable(); frontendHandle.protocol().setNonBlock(false); frontendHandle.protocol().tuneDVB_C(frequency, inversion, symbol_rate, fec_inner, modulation); - if(!frontendHandle.waitOOBReadable(senf::ClockService::seconds(2))) + if (!frontendHandle.waitOOBReadable(senf::ClockService::seconds(2))) SENF_THROW_SYSTEM_EXCEPTION("Could not tune to channel!"); return frontendHandle.protocol().getEvent(); } -prefix_ string senf::DVBSocketController::getTypeString() +prefix_ std::string senf::DVBSocketController::getTypeString() { switch (type) { case FE_QPSK: @@ -333,10 +384,10 @@ prefix_ unsigned int senf::DVBSocketController::signalStrength() return frontendHandle.protocol().signalStrength(); } -prefix_ string senf::DVBSocketController::getTuneInfo(const string & conf) +prefix_ std::string senf::DVBSocketController::getTuneInfo(std::string const & conf) { const char* cConf = conf.c_str(); - stringstream info; + std::stringstream info; fe_status_t status; frontendHandle.protocol().setNonBlock(false); @@ -348,12 +399,12 @@ prefix_ string senf::DVBSocketController::getTuneInfo(const string & conf) ber = frontendHandle.protocol().bitErrorRate(); uncorrected_blocks = frontendHandle.protocol().uncorrectedBlocks(); - info << hex; + info << std::hex; - for(unsigned int i = 0; i < conf.size(); ++i){ - if(i>0) + for (unsigned int i = 0; i < conf.size(); ++i) { + if (i>0) info << " | "; - switch(cConf[i]){ + switch (cConf[i]) { case 'S' : info << "signal " << signal; break; @@ -376,9 +427,9 @@ prefix_ string senf::DVBSocketController::getTuneInfo(const string & conf) return info.str(); } -prefix_ string senf::DVBSocketController::status2String(fe_status_t status) +prefix_ std::string senf::DVBSocketController::status2String(fe_status_t status) { - string s(""); + std::string s(""); if (status & FE_HAS_LOCK) return s += "HAS LOCK"; if (status & FE_HAS_CARRIER) @@ -397,8 +448,6 @@ prefix_ string senf::DVBSocketController::status2String(fe_status_t status) return s; } - - prefix_ fe_type_t senf::DVBSocketController::getType() { return type; @@ -406,37 +455,49 @@ prefix_ fe_type_t senf::DVBSocketController::getType() prefix_ void senf::DVBSocketController::readEvent(int event) { - if(cb) + if (cb) cb(frontendHandle.protocol().getEvent()); } prefix_ void senf::DVBSocketController::initConsole() { - // binding functions to console - namespace kw = senf::console::kw; + namespace fty = console::factory; + namespace kw = console::kw; + dir.doc("DVB Controller " + controllerNr); ++controllerNr; - dir.add("type", &DVBSocketController::getTypeString) - .doc("Shows actual type of card DVB-{T, S, C}"); - - dir.add("info", &DVBSocketController::getTuneInfo) - .doc("Returns a string which shows actual tuning status.\n\ - \"S\" prints signal strength (in hex)\n\ - \"s\" prints singal to noise ration (in hex)\n\ - \"b\" prints bit error rate (in hex)\n\ - \"u\" prints uncorrected blocks (in hex)\n\ - \"f\" prints readable overal status e.g. \"Has Lock\"\n\n\ - These characters can be used to form the output. Be aware, some\n\ - features may not be supported be your current driver implementation\n\ - and could end in throwing an exception!") - .arg("conf", "Ssbuf", kw::default_value = "Ssbuf"); - - dir.add("tune", &DVBSocketController::tuneToCMD) - .doc("tunes to channel listet in the configfile.") - .arg("channel", "channel to tune") - .arg("mode", "mode \"sync\" or \"async\"", kw::default_value = "async"); + dir.add("type", fty::Command(&DVBSocketController::getTypeString, this) + .doc("Shows actual type of card DVB-{T, S, C}") ); + + dir.add("info", fty::Command(&DVBSocketController::getTuneInfo, this) + .doc("Returns a string which shows actual tuning status.\n" + "'S' prints signal strength (in hex)\n" + "'s' prints singal to noise ration (in hex)\n" + "'b' prints bit error rate (in hex)\n" + "'u' prints uncorrected blocks (in hex)\n" + "'f' prints readable overal status e.g. 'Has Lock'\n\n" + "These characters can be used to form the output. Be aware, some\n" + "features may not be supported be your current driver implementation\n" + "and could end in throwing an exception!") + .arg("conf", "Ssbuf", kw::default_value = "Ssbuf") ); + + dir.add("tune", fty::Command(&DVBSocketController::tuneToCMD, this) + .doc("tunes to channel listet in the configfile.") + .arg("channel", "channel to tune") + .arg("mode", "mode 'sync' or 'async'", kw::default_value = "async") ); } -///////////////////////////////cc.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_ + + +// Local Variables: +// mode: c++ +// fill-column: 100 +// c-file-style: "senf" +// indent-tabs-mode: nil +// ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// comment-column: 40 +// End: