2022-07-19 19:05:13 +00:00
|
|
|
/** Node-type webrtc.
|
2022-07-14 10:43:09 +00:00
|
|
|
*
|
|
|
|
* @file
|
|
|
|
* @author Steffen Vogel <svogel2@eonerc.rwth-aachen.de>
|
|
|
|
* @copyright 2014-2022, Institute for Automation of Complex Power Systems, EONERC
|
|
|
|
* @license Apache 2.0
|
|
|
|
*********************************************************************************/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2022-07-19 19:05:13 +00:00
|
|
|
#include <rtc/rtc.hpp>
|
|
|
|
|
|
|
|
#include <villas/nodes/webrtc/peer_connection.hpp>
|
2022-07-14 10:43:09 +00:00
|
|
|
#include <villas/node/config.hpp>
|
|
|
|
#include <villas/node.hpp>
|
|
|
|
#include <villas/timing.hpp>
|
2023-06-13 17:48:04 +02:00
|
|
|
#include <villas/format.hpp>
|
|
|
|
#include <villas/queue_signalled.h>
|
2022-07-14 10:43:09 +00:00
|
|
|
|
|
|
|
namespace villas {
|
|
|
|
namespace node {
|
|
|
|
|
|
|
|
/* Forward declarations */
|
|
|
|
struct Sample;
|
|
|
|
|
|
|
|
class WebRTCNode : public Node {
|
|
|
|
|
|
|
|
protected:
|
2022-07-19 19:05:13 +00:00
|
|
|
std::string server;
|
|
|
|
std::string session;
|
|
|
|
|
2023-06-13 17:48:04 +02:00
|
|
|
int wait_seconds;
|
|
|
|
Format *format;
|
|
|
|
struct CQueueSignalled queue;
|
|
|
|
struct Pool pool;
|
2022-07-19 19:05:13 +00:00
|
|
|
|
|
|
|
std::shared_ptr<webrtc::PeerConnection> conn;
|
|
|
|
rtc::Configuration config;
|
2023-06-13 17:48:04 +02:00
|
|
|
rtc::DataChannelInit dci;
|
2022-07-14 10:43:09 +00:00
|
|
|
|
|
|
|
virtual
|
|
|
|
int _read(struct Sample *smps[], unsigned cnt);
|
|
|
|
|
|
|
|
virtual
|
|
|
|
int _write(struct Sample *smps[], unsigned cnt);
|
|
|
|
|
|
|
|
public:
|
|
|
|
WebRTCNode(const std::string &name = "");
|
|
|
|
|
|
|
|
/* All of the following virtual-declared functions are optional.
|
|
|
|
* Have a look at node.hpp/node.cpp for the default behaviour.
|
|
|
|
*/
|
|
|
|
|
|
|
|
virtual
|
|
|
|
~WebRTCNode();
|
|
|
|
|
|
|
|
virtual
|
|
|
|
int prepare();
|
|
|
|
|
|
|
|
virtual
|
|
|
|
int parse(json_t *json, const uuid_t sn_uuid);
|
|
|
|
|
|
|
|
/** Validate node configuration. */
|
|
|
|
virtual
|
|
|
|
int check();
|
|
|
|
|
|
|
|
virtual
|
|
|
|
int start();
|
|
|
|
|
2023-06-13 17:48:04 +02:00
|
|
|
virtual
|
|
|
|
int stop();
|
2022-07-14 10:43:09 +00:00
|
|
|
|
|
|
|
// virtual
|
|
|
|
// int pause();
|
|
|
|
|
|
|
|
// virtual
|
|
|
|
// int resume();
|
|
|
|
|
|
|
|
// virtual
|
|
|
|
// int restart();
|
|
|
|
|
|
|
|
// virtual
|
|
|
|
// int reverse();
|
|
|
|
|
2023-06-13 17:48:04 +02:00
|
|
|
virtual
|
|
|
|
std::vector<int> getPollFDs();
|
2022-07-14 10:43:09 +00:00
|
|
|
|
|
|
|
// virtual
|
|
|
|
// std::vector<int> getNetemFDs();
|
|
|
|
|
|
|
|
// virtual
|
|
|
|
// struct villas::node::memory::Type * getMemoryType();
|
|
|
|
|
|
|
|
virtual
|
|
|
|
const std::string & getDetails();
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2022-07-19 19:05:13 +00:00
|
|
|
class WebRTCNodeFactory : public NodeFactory {
|
|
|
|
|
|
|
|
public:
|
|
|
|
using NodeFactory::NodeFactory;
|
|
|
|
|
|
|
|
virtual
|
|
|
|
Node * make()
|
|
|
|
{
|
|
|
|
auto *n = new WebRTCNode();
|
|
|
|
|
|
|
|
init(n);
|
|
|
|
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual
|
|
|
|
int getFlags() const
|
|
|
|
{
|
|
|
|
return (int) NodeFactory::Flags::SUPPORTS_READ |
|
|
|
|
(int) NodeFactory::Flags::SUPPORTS_WRITE |
|
|
|
|
(int) NodeFactory::Flags::SUPPORTS_POLL |
|
|
|
|
(int) NodeFactory::Flags::REQUIRES_WEB;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual
|
|
|
|
std::string getName() const
|
|
|
|
{
|
|
|
|
return "webrtc";
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual
|
|
|
|
std::string getDescription() const
|
|
|
|
{
|
|
|
|
return "Web Real-time Communication";
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual
|
|
|
|
int start(SuperNode *sn);
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2022-07-14 10:43:09 +00:00
|
|
|
} /* namespace node */
|
|
|
|
} /* namespace villas */
|