EmulatedDVBInterface.cc
Go to the documentation of this file.
1 //
2 // Copyright (c) 2020 Fraunhofer Institute for Applied Information Technology (FIT)
3 // Network Research Group (NET)
4 // Schloss Birlinghoven, 53754 Sankt Augustin, GERMANY
5 // Contact: support@wiback.org
6 //
7 // This file is part of the SENF code tree.
8 // It is licensed under the 3-clause BSD License (aka New BSD License).
9 // See LICENSE.txt in the top level directory for details or visit
10 // https://opensource.org/licenses/BSD-3-Clause
11 //
12 
13 
17 #include "EmulatedDVBInterface.hh"
19 
20 // Custom includes
21 
22 #define prefix_
23 //-/////////////////////////////////////////////////////////////////////////////////////////////////
24 
25 //-/////////////////////////////////////////////////////////////////////////////////////////////////
26 // senf::emu::detail::EmulatedDVBInterface
27 
29  : modulationId_(0), dev_("NetEMU-DVB")
30 {
31  // register all known modulations
33  registerModulation( id);
34  }
35 }
36 
38  const
39 {
40  return dev_;
41 }
42 
44 {
47 
48  namespace fty = console::factory;
49  consoleDir().remove("registerFrequency");
50  consoleDir().add("registerFrequency",
51  fty::Command(SENF_MEMBINDFNP(void, EmulatedDVBInterface, registerFrequency, (unsigned)))
52  .arg("frequency","channel frequency in kHz")
53  .doc("Register valid frequency") );
54  consoleDir().add("registerFrequency",
55  fty::Command(SENF_MEMBINDFNP(void, EmulatedDVBInterface, registerFrequency, (unsigned, unsigned)))
56  .arg("frequencyLower", "lower bound channel frequency in kHz")
57  .arg("frequencyUpper", "upper bound channel frequency in kHz")
58  .doc("Register valid frequencies") );
59 }
60 
63 {
64  ModulationParameter::id_t modId (DVBModulationParameterRegistry::instance().parameterId(fec, mod, gi));
65  DVBModulationParameterRegistry::instance().findModulationById(modId); // will throw if id is unknown
66  modulationId_ = modId;
67  frequency(freq, 8000); // we assume a fixed bandwidth of 8 MHz
68 }
69 
70 //-/////////////////////////////////////////////////////////////////////////////////////////////////
71 // senf::emu::detail::EmulatedDVBSenderInterfaceNet
72 
73 prefix_ senf::emu::detail::EmulatedDVBSenderInterfaceNet::
74 EmulatedDVBSenderInterfaceNet()
75  : transmitFilter_ (self()),
76  transmitInput (transmitFilter_.input),
77  transmitOutput (transmitFilter_.output)
78 {}
79 
80 //-/////////////////////////////////////////////////////////////////////////////////////////////////
81 // senf::emu::detail::EmulatedDVBReceiverInterfaceNet
82 
83 prefix_ senf::emu::detail::EmulatedDVBReceiverInterfaceNet::
84 EmulatedDVBReceiverInterfaceNet()
85  : receiveFilter_(self()),
86  receiveInput (receiveFilter_.input),
87  receiveOutput (receiveFilter_.output)
88 {}
89 
90 
91 //-/////////////////////////////////////////////////////////////////////////////////////////////////
92 // senf::emu::EmulatedDVBSenderInterface
93 
94 namespace {
95  // Arbitrary magic number used to identify the packet type.
96  boost::uint32_t const dvbMagic (0x44564254u);
97 }
98 
100  : WirelessTransmitter(EmulatedDVBSenderInterfaceNet::transmitInput),
101  power_ (0)
102 {
103  ppi::connect(EmulatedDVBSenderInterfaceNet::transmitOutput, transmitterJack);
104 
105  disable();
106  id( uniqueMAC(dvbMagic));
107 
111 // EmulatedWirelessTransmitter::delay(ClockService::milliseconds(20));
112 }
113 
114 prefix_ senf::emu::ModulationParameter::id_t senf::emu::EmulatedDVBSenderInterface::v_modulationId()
115  const
116 {
117  return modulationId_;
118 }
119 
120 prefix_ void senf::emu::EmulatedDVBSenderInterface::v_modulationId(ModulationParameter::id_t id)
121 {
122  DVBModulationParameterRegistry::instance().findModulationById( id); // will throw if id is unknown
123  modulationId_ = id;
124 }
125 
126 //-/////////////////////////////////////////////////////////////////////////////////////////////////
127 // senf::emu::EmulatedDVBReceiverInterface
128 
130  : WirelessReceiver(EmulatedDVBReceiverInterfaceNet::receiveOutput)
131 {
132  ppi::connect(receiverJack, EmulatedDVBReceiverInterfaceNet::receiveInput);
133 
134  disable();
135  id( uniqueMAC(dvbMagic));
136 
140 }
141 
142 //-/////////////////////////////////////////////////////////////////////////////////////////////////
143 // senf::emu::detail::EmulatedDVBReceiverReceiveFilter
144 
145 prefix_ senf::emu::detail::EmulatedDVBReceiverReceiveFilter::
146 EmulatedDVBReceiverReceiveFilter(EmulatedDVBReceiverInterface & iface)
147  : iface_ (iface)
148 {
149  route(input, output);
150  input.onRequest( &EmulatedDVBReceiverReceiveFilter::request);
151 }
152 
153 prefix_ void senf::emu::detail::EmulatedDVBReceiverReceiveFilter::request()
154 {
155  DVBPacketHeader p;
156  try {
157  // in case an emulated WLAN device is tuned on the same frequency this
158  // will cause an exception
159  p = input();
160  }
162  SENF_LOG( (senf::log::CRITICAL) ("ignoring non-emulated DVB frame"));
163  return;
164  }
165 
167  if (! e)
168  return;
169  if (iface_.annotationMode())
171  else
172  output(e);
173 }
174 
175 //-/////////////////////////////////////////////////////////////////////////////////////////////////
176 // senf::emu::detail::EmulatedDVBSenderTransmitFilter
177 
178 prefix_ senf::emu::detail::EmulatedDVBSenderTransmitFilter::
179 EmulatedDVBSenderTransmitFilter(EmulatedDVBSenderInterface & iface)
180  : iface_ (iface)
181 {
182  route(input, output);
183  input.onRequest(&EmulatedDVBSenderTransmitFilter::request);
184 }
185 
186 prefix_ void senf::emu::detail::EmulatedDVBSenderTransmitFilter::request()
187 {
188  EthernetPacket e (input());
189  e->source() = iface_.id();
191  dph.finalizeThis();
192  output(dph);
193 }
194 
195 //-/////////////////////////////////////////////////////////////////////////////////////////////////
196 #undef prefix_
197 
198 
199 
200 // Local Variables:
201 // mode: c++
202 // fill-column: 100
203 // comment-column: 40
204 // c-file-style: "senf"
205 // indent-tabs-mode: nil
206 // ispell-local-dictionary: "american"
207 // compile-command: "scons -u test"
208 // End:
#define SENF_MEMBINDFNP(ret, cls, fn, args)
static ConcretePacket createBefore(Packet const &packet)
EmulatedDVBInterface public header.
static DVBModulationParameterRegistry & instance()
Definition: DVBInterface.hh:77
OtherPacket find() const
#define prefix_
EthernetPacket prependAnnotationsPacket(Packet const &pkt, MACAddress const &src_=senf::MACAddress::None, MACAddress const &dst_=senf::MACAddress::Broadcast)
Emulated DVBReceiver Interface.
console::DirectoryNode & consoleDir() const
Access interface console directory.
NodeType & add(std::string const &name, boost::shared_ptr< NodeType > node)
ppi::connector::ActiveOutputJack receiverJack
unsigned frequency() const
Get current channel frequency.
Receive capable wireless interface base class.
MACAddress const & id() const
Get interface MAC Address.
DVBModulationParameter const & findModulationById(ModulationParameter::id_t id) const
std::string const & v_device() const override
Emulated DVBSender Interface.
nothrow
ModulationParameter::id_t modulationId_
ppi::connector::PassiveInputJack transmitterJack
void registerFrequency(unsigned frequenc)
ppi::connector::ActiveOutputJack< EthernetPacket > output
MACAddress uniqueMAC(boost::uint32_t magic)
Get pseudo-random but unique MACAddress.
virtual void v_tune(DVBModulationParameter::fec_rate_t fec, DVBModulationParameter::modulation_t mod, DVBModulationParameter::guard_interval_t gi, unsigned frequency) override
GenericNode::ptr remove(std::string const &name)
void finalizeThis()
Transmit capable wireless interface base class.
ConcretePacket< EthernetPacketType > EthernetPacket
#define SENF_LOG(args)
AnnotationsPacket public header.
void disable()
Disable interface (aka ifconfig down)
void registerModulation(ModulationParameter::id_t id)
register modulation configuration
__be16 freq