X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FProtocols%2FDVB%2FDVBSocketController.cc;h=e8eb3f0ae6edc3782258584b750521bc18566e5b;hb=3863d46dd898b7bc35ea8c6ccd8563b18762a6b6;hp=85b5222c9d5e3334061afe0a224d67510fb13586;hpb=797cc66c49bb69e0bd084d1b7ec4269ba52de50d;p=senf.git diff --git a/Socket/Protocols/DVB/DVBSocketController.cc b/Socket/Protocols/DVB/DVBSocketController.cc index 85b5222..e8eb3f0 100644 --- a/Socket/Protocols/DVB/DVBSocketController.cc +++ b/Socket/Protocols/DVB/DVBSocketController.cc @@ -20,26 +20,34 @@ // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +/** \file + \brief DVBSocketControlle-r 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 "DVBSocketController.hh" -#include -using namespace std; #define prefix_ +///////////////////////////////cc.p//////////////////////////////////////// +using namespace std; +unsigned int senf::DVBSocketController::controllerNr(0); -senf::DVBSocketController::DVBSocketController(DVBFrontendHandle frontendHandle_, DVBDemuxSectionHandle sectionHandle_ , const Callback & cb_) : - dir( this ), - frontendHandle( frontendHandle_ ), - sectionHandle( sectionHandle_ ), - type( frontendHandle.protocol().getInfo().type ), - parser( type ), - cb( cb_ ), - event( "senf::DVBSocketController::readEvent", senf::membind(&DVBSocketController::readEvent, this), frontendHandle, senf::scheduler::FdEvent::EV_PRIO, false ) +senf::DVBSocketController::DVBSocketController(DVBFrontendHandle frontendHandle_, const Callback & cb_) + : dir( this ), + frontendHandle( frontendHandle_ ), + type( frontendHandle.protocol().getInfo().type ), + parser( type ), + cb( cb_ ), + sectionNr(1), + pesNr(1), + event( "senf::DVBSocketController::readEvent", senf::membind(&DVBSocketController::readEvent, this), frontendHandle, senf::scheduler::FdEvent::EV_PRIO, false ) { initConsole(); } @@ -47,10 +55,40 @@ senf::DVBSocketController::DVBSocketController(DVBFrontendHandle frontendHandle_ prefix_ senf::DVBSocketController::~DVBSocketController() { } -prefix_ void senf::DVBSocketController::tuneToCMD(const string & input, const string & mode){ + +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 ) + this->addToConsole(pesHandle); + return pesHandle; + +} + +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){ + 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) +{ struct dvb_frontend_parameters frontend; - - + // no valid configline, so it will be treaten like a channel name if (input.find(":")==string::npos){ if (mode.c_str()[0]=='a') @@ -61,7 +99,7 @@ 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'){ switch (type) { case FE_QPSK: @@ -79,7 +117,7 @@ prefix_ void senf::DVBSocketController::tuneToCMD(const string & input, const st } else { switch (type) { - case FE_QPSK: if (mode.c_str()[0]=='a') + case FE_QPSK: tuneDVB_S_sync(frontend.frequency, frontend.inversion, frontend.u.qpsk.symbol_rate, frontend.u.qpsk.fec_inner); break; case FE_QAM: @@ -97,9 +135,9 @@ prefix_ void senf::DVBSocketController::tuneToCMD(const string & input, const st prefix_ void senf::DVBSocketController::tuneTo(const string & channel) { struct dvb_frontend_parameters frontend; - + string configLine = parser.getConfigLine(channel); - + frontend = parser.getFrontendParam(configLine); switch (type) { case FE_QPSK: @@ -113,61 +151,62 @@ prefix_ void senf::DVBSocketController::tuneTo(const string & channel) break; default: SENF_THROW_SYSTEM_EXCEPTION("Could not determine type of card."); - } + } } -prefix_ void senf::DVBSocketController::tuneDVB_T(unsigned int frequency, +prefix_ void senf::DVBSocketController::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 (see above) */ - fe_transmit_mode_t transmission_mode, + fe_transmit_mode_t transmission_mode, fe_guard_interval_t guard_interval, 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!"; - + event.enable(); - + frontendHandle.protocol().setNonBlock(); - frontendHandle.protocol().tuneDVB_T(frequency, - inversion, - bandwidth, - code_rate_HP, - code_rate_LP, - constellation, - transmission_mode, - guard_interval, + frontendHandle.protocol().tuneDVB_T(frequency, + inversion, + bandwidth, + code_rate_HP, + code_rate_LP, + constellation, + transmission_mode, + guard_interval, 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!"; - + event.enable(); - + frontendHandle.protocol().setNonBlock(); frontendHandle.protocol().tuneDVB_S(frequency, inversion, symbole_rate, code_rate); } -prefix_ void senf::DVBSocketController::tuneDVB_C(unsigned int frequency, +prefix_ void senf::DVBSocketController::tuneDVB_C(unsigned int frequency, fe_spectral_inversion_t inversion, unsigned int symbol_rate, fe_code_rate_t fec_inner, 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!"; - + event.enable(); - + frontendHandle.protocol().setNonBlock(); - + frontendHandle.protocol().tuneDVB_C(frequency, inversion, symbol_rate, fec_inner, modulation); } @@ -176,7 +215,7 @@ prefix_ dvb_frontend_event senf::DVBSocketController::tuneTo_sync(const string & struct dvb_frontend_parameters frontend; dvb_frontend_event ev; string configLine = parser.getConfigLine(channel); - + frontend = parser.getFrontendParam(configLine); switch (type) { case FE_QPSK: @@ -194,69 +233,69 @@ prefix_ dvb_frontend_event senf::DVBSocketController::tuneTo_sync(const string & return ev; } -prefix_ dvb_frontend_event senf::DVBSocketController::tuneDVB_T_sync(unsigned int frequency, +prefix_ dvb_frontend_event senf::DVBSocketController::tuneDVB_T_sync(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 (see above) */ - fe_transmit_mode_t transmission_mode, + fe_transmit_mode_t transmission_mode, fe_guard_interval_t guard_interval, 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!"; - + event.disable(); - + frontendHandle.protocol().setNonBlock(false); - - frontendHandle.protocol().tuneDVB_T(frequency, - inversion, - bandwidth, - code_rate_HP, - code_rate_LP, - constellation, - transmission_mode, - guard_interval, + + frontendHandle.protocol().tuneDVB_T(frequency, + inversion, + bandwidth, + code_rate_HP, + code_rate_LP, + constellation, + transmission_mode, + guard_interval, hierarchy_information); - + 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!"; - + event.disable(); - + frontendHandle.protocol().setNonBlock(false); - + frontendHandle.protocol().tuneDVB_S(frequency, inversion, symbole_rate, code_rate); - + 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_C_sync(unsigned int frequency, +prefix_ dvb_frontend_event senf::DVBSocketController::tuneDVB_C_sync(unsigned int frequency, fe_spectral_inversion_t inversion, unsigned int symbol_rate, fe_code_rate_t fec_inner, 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!"; - + event.disable(); - + frontendHandle.protocol().setNonBlock(false); - + frontendHandle.protocol().tuneDVB_C(frequency, inversion, symbol_rate, fec_inner, modulation); if(!frontendHandle.waitOOBReadable(senf::ClockService::seconds(2))) SENF_THROW_SYSTEM_EXCEPTION("Could not tune to channel!"); @@ -265,7 +304,8 @@ prefix_ dvb_frontend_event senf::DVBSocketController::tuneDVB_C_sync(unsigned in } -prefix_ string senf::DVBSocketController::getTypeString(){ +prefix_ string senf::DVBSocketController::getTypeString() +{ switch (type) { case FE_QPSK: return "DVB-S"; @@ -276,24 +316,28 @@ prefix_ string senf::DVBSocketController::getTypeString(){ default: SENF_THROW_SYSTEM_EXCEPTION("Could not determine type of card."); } - } -prefix_ unsigned int senf::DVBSocketController::bitErrorRate(){ + +prefix_ unsigned int senf::DVBSocketController::bitErrorRate() +{ return frontendHandle.protocol().bitErrorRate(); } -prefix_ unsigned int senf::DVBSocketController::signalToNoiseRatio(){ +prefix_ unsigned int senf::DVBSocketController::signalToNoiseRatio() +{ return frontendHandle.protocol().signalNoiseRatio(); } -prefix_ unsigned int senf::DVBSocketController::signalStrength(){ +prefix_ unsigned int senf::DVBSocketController::signalStrength() +{ return frontendHandle.protocol().signalStrength(); } -prefix_ string senf::DVBSocketController::getTuneInfo(const string & conf){ +prefix_ string senf::DVBSocketController::getTuneInfo(const string & conf) +{ const char* cConf = conf.c_str(); stringstream info; - + fe_status_t status; frontendHandle.protocol().setNonBlock(false); uint16_t snr, signal; @@ -303,9 +347,9 @@ prefix_ string senf::DVBSocketController::getTuneInfo(const string & conf){ signal = frontendHandle.protocol().signalStrength(); ber = frontendHandle.protocol().bitErrorRate(); uncorrected_blocks = frontendHandle.protocol().uncorrectedBlocks(); - + info << hex; - + for(unsigned int i = 0; i < conf.size(); ++i){ if(i>0) info << " | "; @@ -313,7 +357,7 @@ prefix_ string senf::DVBSocketController::getTuneInfo(const string & conf){ case 'S' : info << "signal " << signal; break; - case 's' : + case 's' : info << "snr " << snr; break; case 'b' : @@ -331,69 +375,51 @@ prefix_ string senf::DVBSocketController::getTuneInfo(const string & conf){ } return info.str(); } -prefix_ string senf::DVBSocketController::status2String(fe_status_t status){ - string s(""); + +prefix_ string senf::DVBSocketController::status2String(fe_status_t status) +{ + string s(""); if (status & FE_HAS_LOCK) - return s += "HAS LOCK"; + return s += "HAS LOCK"; if (status & FE_HAS_CARRIER) - s += "HAS CARRIER"; + s += "HAS CARRIER "; if (status & FE_HAS_VITERBI) - s += "HAS VITERBI"; + s += "HAS VITERBI "; if (status & FE_HAS_SYNC) - s += "HAS SYNC"; + s += "HAS SYNC "; if (status & FE_HAS_SIGNAL) - s += "HAS SIGNAL"; + s += "HAS SIGNAL "; if (status & FE_TIMEDOUT) - s += "TIMED OUT"; + s += "TIMED OUT "; if (status & FE_REINIT) - s += "REINIT"; + s += "REINIT "; return s; } -prefix_ void senf::DVBSocketController::setSectionFilter(unsigned short int pid, - u_int8_t filter, - unsigned int flags, - u_int8_t mask, - u_int8_t mode, - unsigned int timeout) -{ - sectionHandle.protocol().setSectionFilter(pid, timeout, flags, filter, mask, mode); - -} -prefix_ void senf::DVBSocketController::setBufferSize(unsigned long size) -{ - sectionHandle.protocol().setBufferSize(size); -} - -prefix_ void senf::DVBSocketController::startFiltering() -{ - sectionHandle.protocol().startFiltering(); -} -prefix_ void senf::DVBSocketController::stopFiltering() +prefix_ fe_type_t senf::DVBSocketController::getType() { - sectionHandle.protocol().stopFiltering(); -} - -prefix_ fe_type_t senf::DVBSocketController::getType(){ return type; } -prefix_ void senf::DVBSocketController::readEvent(int event){ +prefix_ void senf::DVBSocketController::readEvent(int event) +{ if(cb) cb(frontendHandle.protocol().getEvent()); } -prefix_ void senf::DVBSocketController::initConsole(){ +prefix_ void senf::DVBSocketController::initConsole() +{ // binding functions to console namespace kw = senf::console::kw; - dir.doc("DVB Controller"); - + 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\ @@ -405,31 +431,12 @@ prefix_ void senf::DVBSocketController::initConsole(){ 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("buffersize", &DVBSocketController::setBufferSize) - .doc("Set the size of the circular buffer used for filtered data.") - .arg("size", "in byte"); - - dir.add("start", &DVBSocketController::startFiltering) - .doc("Starts filtering"); - - dir.add("stop", &DVBSocketController::setBufferSize) - .doc("Stops filtering"); - - dir.add("filter", &DVBSocketController::setSectionFilter) - .arg("pid", "pid to filter") - .arg("filter", "filter", kw::default_value = 62) - .arg("flags", "or-able: DMX_CHECK_CRC(0x01), DMX_ONESHOT(0x02), DMX_IMMEDIATE_START(0x04), DMX_KERNEL_CLIENT(0x8000)", kw::default_value = DMX_IMMEDIATE_START | DMX_CHECK_CRC) - .arg("mask", "mask", kw::default_value = 0xff) - .arg("mode", "mode", kw::default_value = 0) - .arg("timeout", "timeout", kw::default_value = 0) - .doc("Sets parameters for section filter."); - - dir.add("stop", &DVBSocketController::setBufferSize) - .doc("Stops filtering"); } + +///////////////////////////////cc.e//////////////////////////////////////// +#undef prefix_