DESERT 4.0.0
uwevologicss2cmodem.h
Go to the documentation of this file.
1//
2// Copyright (c) 2019 Regents of the SIGNET lab, University of Padova.
3// All rights reserved.
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions
7// are met:
8// 1. Redistributions of source code must retain the above copyright
9// notice, this list of conditions and the following disclaimer.
10// 2. Redistributions in binary form must reproduce the above copyright
11// notice, this list of conditions and the following disclaimer in the
12// documentation and/or other materials provided with the distribution.
13// 3. Neither the name of the University of Padova (SIGNET lab) nor the
14// names of its contributors may be used to endorse or promote products
15// derived from this software without specific prior written permission.
16//
17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
21// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
24// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
27// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
37#ifndef UWEVOLOGICSS2CSMODEM_H
38#define UWEVOLOGICSS2CSMODEM_H
39
40#include <uwconnector.h>
41#include <uwinterpreters2c.h>
42#include <uwmodem.h>
43
44#include <atomic>
45#include <condition_variable>
46#include <map>
47#include <memory>
48#include <mutex>
49#include <thread>
50#include <vector>
51
57typedef std::map<int, double> TransmissionDurationLUT;
58
64
66{
71 enum class Config {
72 ATL_GET,
73 ATL_SET,
79 };
80
81public:
85 enum class TransmissionMode { BURST = 0, IM = 1 };
86
92
100
104 virtual ~UwEvoLogicsS2CModem();
105
112 virtual void recv(Packet *p);
113
123 virtual int command(int argc, const char *const *argv);
124
131 virtual int recvSyncClMsg(ClMessage *m);
132
140 virtual double getTxDuration(Packet *p);
141
151 virtual bool configure(Config cmd);
152
157 virtual void initializeLUT();
158
159private:
165 virtual void startTx(Packet *p);
166
173 virtual void startRx(Packet *p);
174
180 virtual void endRx(Packet *p);
181
186 virtual void start();
187
193 virtual void stop();
194
198 virtual void transmittingData();
199
203 virtual void receivingData();
204
212
219 void setFailedTx(Packet *p);
220
226 void createRxPacket(Packet *p);
227
229 std::unique_ptr<UwConnector> p_connector;
231 std::unique_ptr<UwInterpreterS2C> p_interpreter;
232
239 std::mutex status_m;
241 std::mutex tx_status_m;
243 std::mutex tx_queue_m;
245 std::condition_variable status_cv;
247 std::condition_variable tx_status_cv;
249 std::condition_variable tx_queue_cv;
251 std::atomic<bool> receiving;
253 std::atomic<bool> transmitting;
255 std::atomic<bool> im_status_updated;
257 std::thread rx_thread;
259 std::thread tx_thread;
261 std::string rx_payload;
263 const static std::chrono::milliseconds MODEM_TIMEOUT;
266 const static std::chrono::milliseconds WAIT_DELIVERY_IM;
269 const static std::chrono::seconds WAIT_DELIVERY_BURST;
270
272 bool ack_mode;
282 std::string txdur_file_name_;
284 bool initLUT_;
288 static const double EPSILON_S;
292};
293
294#endif
Definition uwevologicss2cmodem.h:66
std::mutex status_m
Definition uwevologicss2cmodem.h:239
int n_rx_failed
Definition uwevologicss2cmodem.h:275
static uint MAX_N_STATUS_QUERIES
Definition uwevologicss2cmodem.h:291
bool initLUT_
Definition uwevologicss2cmodem.h:284
TransmissionMode tx_mode
Definition uwevologicss2cmodem.h:271
TransmissionState tx_status
Definition uwevologicss2cmodem.h:235
void setFailedTx(Packet *p)
Definition uwevologicss2cmodem.cpp:970
virtual void recv(Packet *p)
Definition uwevologicss2cmodem.cpp:118
std::atomic< bool > transmitting
Definition uwevologicss2cmodem.h:253
std::condition_variable status_cv
Definition uwevologicss2cmodem.h:245
std::atomic< bool > im_status_updated
Definition uwevologicss2cmodem.h:255
int pend_source_level
Definition uwevologicss2cmodem.h:276
std::condition_variable tx_status_cv
Definition uwevologicss2cmodem.h:247
void updateStatus(UwInterpreterS2C::Response cmd)
Definition uwevologicss2cmodem.cpp:729
void createRxPacket(Packet *p)
Definition uwevologicss2cmodem.cpp:977
std::thread rx_thread
Definition uwevologicss2cmodem.h:257
UwEvoLogicsS2CModem()
Definition uwevologicss2cmodem.cpp:77
std::mutex tx_queue_m
Definition uwevologicss2cmodem.h:243
virtual void transmittingData()
Definition uwevologicss2cmodem.cpp:648
virtual void initializeLUT()
Definition uwevologicss2cmodem.cpp:251
static const std::chrono::seconds WAIT_DELIVERY_BURST
Definition uwevologicss2cmodem.h:269
bool source_level_change
Definition uwevologicss2cmodem.h:277
virtual void stop()
Definition uwevologicss2cmodem.cpp:624
static const std::chrono::milliseconds MODEM_TIMEOUT
Definition uwevologicss2cmodem.h:263
bool ack_mode
Definition uwevologicss2cmodem.h:272
std::string rx_payload
Definition uwevologicss2cmodem.h:261
std::atomic< bool > receiving
Definition uwevologicss2cmodem.h:251
Config
Definition uwevologicss2cmodem.h:71
TransmissionMode
Definition uwevologicss2cmodem.h:85
TransmissionState
Definition uwevologicss2cmodem.h:91
virtual void startRx(Packet *p)
Definition uwevologicss2cmodem.cpp:576
std::condition_variable tx_queue_cv
Definition uwevologicss2cmodem.h:249
virtual void receivingData()
Definition uwevologicss2cmodem.cpp:673
virtual void endRx(Packet *p)
Definition uwevologicss2cmodem.cpp:585
static const double EPSILON_S
Definition uwevologicss2cmodem.h:288
char txdur_token_separator_
Definition uwevologicss2cmodem.h:283
virtual void start()
Definition uwevologicss2cmodem.cpp:592
double virtual_time_ref
Definition uwevologicss2cmodem.h:273
ModemState status
Definition uwevologicss2cmodem.h:233
virtual ~UwEvoLogicsS2CModem()
Definition uwevologicss2cmodem.cpp:112
TransmissionDurationLUT size2dur_
Definition uwevologicss2cmodem.h:281
int curr_source_level
Definition uwevologicss2cmodem.h:274
std::string txdur_file_name_
Definition uwevologicss2cmodem.h:282
virtual bool configure(Config cmd)
Definition uwevologicss2cmodem.cpp:402
static const std::chrono::milliseconds WAIT_DELIVERY_IM
Definition uwevologicss2cmodem.h:266
virtual double getTxDuration(Packet *p)
Definition uwevologicss2cmodem.cpp:386
virtual int command(int argc, const char *const *argv)
Definition uwevologicss2cmodem.cpp:162
std::unique_ptr< UwInterpreterS2C > p_interpreter
Definition uwevologicss2cmodem.h:231
std::mutex tx_status_m
Definition uwevologicss2cmodem.h:241
std::thread tx_thread
Definition uwevologicss2cmodem.h:259
virtual int recvSyncClMsg(ClMessage *m)
Definition uwevologicss2cmodem.cpp:313
std::unique_ptr< UwConnector > p_connector
Definition uwevologicss2cmodem.h:229
virtual void startTx(Packet *p)
Definition uwevologicss2cmodem.cpp:464
Response
Definition uwinterpreters2c.h:70
Definition uwmodem.h:62
Generic class that provides a method to interface with the devices. Will be specialized for,...
ModemState
Definition uwevologicss2cmodem.h:63
std::map< int, double > TransmissionDurationLUT
Definition uwevologicss2cmodem.h:57
Header of the interepreter class: this class is used ot translate form DESERT software to/from EvoLog...
Header of the main class that implements the general interface between DESERT and real acoustic modem...