00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00027 #include "DVBFrontendHandle.hh"
00028
00029
00030
00031 #include <boost/format.hpp>
00032 #include <sys/socket.h>
00033 #include <senf/Utils/Exception.hh>
00034 #include <sys/ioctl.h>
00035
00036
00037
00038 #define prefix_
00039
00040
00041
00042
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
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,
00079 fe_code_rate_t code_rate_LP,
00080 fe_modulation_t constellation,
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;
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,
00110 fe_code_rate_t fec_inner
00111 )
00112 const
00113 {
00114 struct dvb_qpsk_parameters qpsk;
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;
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
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
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282