Move sourcecode into 'senf/' directory
[senf.git] / senf / Socket / Protocols / DVB / DVBSocketController.hh
diff --git a/senf/Socket/Protocols/DVB/DVBSocketController.hh b/senf/Socket/Protocols/DVB/DVBSocketController.hh
new file mode 100644 (file)
index 0000000..8875041
--- /dev/null
@@ -0,0 +1,238 @@
+// $Id$
+//
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
+//     Anton Gillert <atx@berlios.de>
+//
+// 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.
+//
+// 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.
+//
+// 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.
+
+
+#ifndef HH_SENF_Socket_Protocols_DVB_DVBSocketController_
+#define HH_SENF_Socket_Protocols_DVB_DVBSocketController_ 1
+
+// Custom includes
+#include <string>
+#include <linux/dvb/frontend.h>
+#include "DVBFrontendHandle.hh"
+#include "DVBDemuxHandles.hh"
+#include "DVBConfigParser.hh"
+#include "DVBProtocolWrapper.hh"
+#include "../../../Scheduler/Scheduler.hh"
+#include "../../../Utils/Console/Console.hh"
+
+#define MPE_TABLEID 62
+
+namespace senf {
+
+/** \brief Helperclass for configuration and controlling DVB devices.
+
+     The DVB API provides two methods for tuning. The first method is
+     synchronous, which means e.g. "tuneTo_sync" will return when the tuning operation on the card
+     succeed, no matter how long it takes. The second (preferred) method is to tune asynchronous.
+     The call "tuneTo" will return immediately and (if a callback was set) call the callback when
+     the tuning operation succeeds. <br>
+
+     Note that you may have to take draw backs in using this API. This dues to the implementation
+     of the DVB device driver which you or your kernel choose. It has shown that the completeness
+     of implementations vary from driver to driver. This wrapper provides the full Frontend API which
+     is defined by <a href="http://www.linuxtv.org/docs/dvbapi/DVB_Frontend_API.html">Convergence</a>.
+     You have to find out which parts of these functionality are implemented by your preferred
+     device driver by your own.
+*/
+    
+    
+    
+class DVBSocketController : boost::noncopyable
+{
+public:
+
+    senf::console::ScopedDirectory<DVBSocketController> dir;
+
+    typedef boost::function<void (const struct dvb_frontend_event & )> Callback;
+                                        ///< Callback which is called when an asynchronous tuning succeeds.
+
+    DVBSocketController(DVBFrontendHandle frontendHandle_ = DVBFrontendHandle(0,0), const Callback & cb = NULL);
+    ~DVBSocketController();
+    
+    senf::DVBDemuxSectionHandle createDVBDemuxSectionHandle(  int adapternumber=0, int demuxnumber=0, bool addToConsole=false );
+    senf::DVBDemuxPESHandle createDVBDemuxPESHandle(  int adapternumber=0, int demuxnumber=0, bool addToConsole=false );
+
+    void addToConsole(senf::DVBDemuxSectionHandle sh);
+    ///< Adds an DVBDemuxSectionHandle to the console 
+    /**< Allocates the functionality of DVBDemuxSectionProtocol into the folder 
+         of the DVBSocketController. If the protocol is closed, or all handles are 
+         discarded the console support will automatically removed.
+         \param[in] handle of a protocol*/
+    void addToConsole(senf::DVBDemuxPESHandle sh);
+    ///< Adds an DVBDemuxPESHandle to the console 
+    /**< Allocates the functionality of DVBDemuxPESProtocol into the folder 
+         of the DVBSocketController. If the protocol is closed, or all handles are 
+         discarded the console support will automatically removed.
+         \param[in] handle of a protocol*/
+    
+    void tuneToCMD( const std::string & input, const std::string & mode = "async");
+                                        ///< Tunes a DVB device given by the type of the DVBFrontendHandle
+                                        /**< Tunes a DVB device by a channel name or complete
+                                             configuration line. This method was created for use
+                                             in the SENF-Console.
+                                             \param[in] input A channel name or a complete
+                                               configuration line. If a channel name is given
+                                               it would be searched in the config file.
+                                             \param[in] mode The mode in which it will tune
+                                               "sync" or "async"*/
+    void tuneTo(const std::string & channel);
+                                        ///< Tunes a DVB device to a channel
+                                        /**< Tunes a DVB device to a channel whose parameters
+                                             are stored in a config file. The method determines
+                                             the type of DVB device by it self.
+                                             \param[in] channel A channel name which will be
+                                                 looked up in config file.*/
+
+    void tuneDVB_S(unsigned int frequency, fe_spectral_inversion_t inversion, unsigned int symbole_rate, fe_code_rate_t code_rate);
+                                        ///< Tunes a DVB-S device
+                                        /**< Tunes a DVB-S device in asynchronous mode and calls
+                                             the callback if existing. Needs full configuration */
+
+    void tuneDVB_T(unsigned int frequency,
+                    fe_spectral_inversion_t inversion, 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_guard_interval_t guard_interval,
+                    fe_hierarchy_t hierarchy_information);
+                                        ///< Tunes a DVB-T device
+                                        /**< Tunes a DVB-T device in asynchronous mode and calls
+                                             the callback if existing. Needs full configuration. */
+
+    void tuneDVB_C(unsigned int frequency,
+                    fe_spectral_inversion_t inversion, unsigned int symbol_rate,
+                    fe_code_rate_t fec_inner, fe_modulation_t modulation);
+                                        ///< Tunes a DVB-C device
+                                        /**< Tunes a DVB-C device in asynchronous mode and calls
+                                             the callback if existing. Needs full configuration. */
+
+    dvb_frontend_event tuneTo_sync( const std::string & channel );
+                                        ///< Tunes a DVB device given by the type of the DVBFrontendHandle
+                                        /**< Tunes a DVB device, given by the type of the
+                                             DVBFrontendHandle, by a channel name in synchronous mode
+                                             \param[in] channel A channel name which will be looked
+                                                 up in config file.
+                                             \returns dvb_frontend_event
+                                             \note The member "dvb_frontend_event.status" should be
+                                               correct by the most device driver implementations.
+                                               But "dvb_frontend_event.parameters" maybe not and is
+                                               definitly not set by: Cinergy T� (2.6.27),
+                                               Terratec Cinergy DT USB XS Diversity (2.6.27) */
+
+    dvb_frontend_event tuneDVB_S_sync(unsigned int frequency, fe_spectral_inversion_t inversion, unsigned int symbole_rate, fe_code_rate_t code_rate);
+                                        ///< Tunes a DVB-S device
+                                        /**< Tunes a DVB-S device in synchronous mode. Needs full configuration
+                                             \returns dvb_frontend_event
+                                             \note The member "dvb_frontend_event.status" should be
+                                               correct by the most device driver implementations.
+                                               But "dvb_frontend_event.parameters" maybe not and is
+                                               definitly not set by: Cinergy T� (2.6.27),
+                                               Terratec Cinergy DT USB XS Diversity (2.6.27) */
+
+    dvb_frontend_event tuneDVB_T_sync(unsigned int frequency,
+                fe_spectral_inversion_t inversion, 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_guard_interval_t guard_interval,
+                fe_hierarchy_t hierarsourcechy_information);
+                                        ///< Tunes a DVB-T device
+                                        /**< Tunes a DVB-T device in synchronous mode. Needs full
+                                             configuration
+                                             \returns dvb_frontend_event
+                                             \note The member "dvb_frontend_event.status" should be
+                                               correct by the most device driver implementations.
+                                               But "dvb_frontend_event.parameters" maybe not and is
+                                               definitly not set by: Cinergy T� (2.6.27),
+                                               Terratec Cinergy DT USB XS Diversity (2.6.27) */
+
+    dvb_frontend_event 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);
+                                        ///< Tunes a DVB-C device
+                                        /**< Tunes a DVB-C device in synchronous mode. Needs full configuration
+                                             \returns dvb_frontend_event
+                                             \note The member "dvb_frontend_event.status" should be
+                                               correct by the most device driver implementations.
+                                               But "dvb_frontend_event.parameters" maybe not and is
+                                               definitly not set by: Cinergy T� (2.6.27),
+                                               Terratec Cinergy DT USB XS Diversity (2.6.27) */
+
+    fe_type_t getType();                ///< Returns the type of the card. The type is defined in frontend.h
+
+    std::string getTypeString();        ///< Returns the type of the card.
+                                        /**< Returns the type of the card but human readable e.g.
+                                             "DVB-S", "DVB-T" or "DVB-C"*/
+
+    std::string status2String(fe_status_t status);
+                                        ///< Returns a human readable status information
+                                        /**< Returns a human readable version of fe_status_t
+                                             (defined by frontend.h)*/
+
+    unsigned int bitErrorRate();        ///< Returns the bit error rate
+                                        /**< \note This function may not be implemented by your
+                                             specific driver implementation. In this case the
+                                             output is random. This is true for:
+                                               Cinergy T� (2.6.27),
+                                               Terratec Cinergy DT USB XS Diversity (2.6.27) */
+
+    unsigned int signalToNoiseRatio();  ///< Returns the signal to noise ratio
+                                        /**< \note This function may not be implemented by your
+                                             specific driver implementation. In this case the
+                                             output is random. This is true for:
+                                               Cinergy T� (2.6.27),
+                                               Terratec Cinergy DT USB XS Diversity (2.6.27) */
+
+    unsigned int signalStrength();      ///< Returns the signal strength
+                                        /**< Returns the signal to noise ratio
+                                             \note This function may not be implemented by your
+                                             specific driver implementation. In this case the output is
+                                             random.*/
+
+    std::string getTuneInfo(const std::string & conf ="Ssbuf");
+                                        ///< Returns a string which shows actual tuning status
+                                        /**< <br>"S" prints signal strength (in hex)
+                                             <br>"s" prints singal to noise ration (in hex)
+                                             <br>"b" prints bit error rate (in hex)
+                                             <br>"u" prints uncorrected blocks (in hex)
+                                             <br>"f" prints readable overal status e.g. "Has Lock"<br>
+                                             These characters can be used to form the output. Be
+                                             aware, some features may not be supported be your
+                                             current driver implementation and could end in throwing
+                                             an exception! */
+private:
+    DVBFrontendHandle frontendHandle;
+    fe_type_t type;
+    DVBConfigParser parser;
+    Callback cb;
+    static unsigned int controllerNr;
+    unsigned int sectionNr;
+    unsigned int pesNr;
+    senf::scheduler::FdEvent event;
+    void readEvent(int i);
+    void initConsole();
+};
+
+}
+#endif