init
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
# Add all the subdirs as projects of the named branch
|
||||
OV_ADD_PROJECTS("EXAMPLES")
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
PROJECT(sdk-examples-communication-client-generator)
|
||||
|
||||
SET(SRC_FILES src/main-generator.cpp)
|
||||
ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES})
|
||||
ADD_DEPENDENCIES(${PROJECT_NAME} openvibe-toolkit)
|
||||
SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER})
|
||||
|
||||
INCLUDE("FindOpenViBE")
|
||||
INCLUDE("FindOpenViBECommon")
|
||||
INCLUDE("FindOpenViBEModuleEBML")
|
||||
INCLUDE("FindOpenViBEModuleSocket")
|
||||
INCLUDE("FindOpenViBEModuleCommunication")
|
||||
|
||||
SET_BUILD_PLATFORM()
|
||||
|
||||
INSTALL(TARGETS ${PROJECT_NAME}
|
||||
RUNTIME DESTINATION ${DIST_BINDIR}
|
||||
LIBRARY DESTINATION ${DIST_LIBDIR}
|
||||
ARCHIVE DESTINATION ${DIST_LIBDIR})
|
||||
|
||||
PROJECT(sdk-examples-communication-client-filter)
|
||||
|
||||
SET(SRC_FILES src/main-filter.cpp)
|
||||
ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES})
|
||||
SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER})
|
||||
|
||||
INCLUDE("FindOpenViBE")
|
||||
INCLUDE("FindOpenViBECommon")
|
||||
INCLUDE("FindOpenViBEModuleSocket")
|
||||
INCLUDE("FindOpenViBEModuleCommunication")
|
||||
INCLUDE("FindOpenViBEToolkit")
|
||||
|
||||
SET_BUILD_PLATFORM()
|
||||
|
||||
INSTALL(TARGETS ${PROJECT_NAME}
|
||||
RUNTIME DESTINATION ${DIST_BINDIR}
|
||||
LIBRARY DESTINATION ${DIST_LIBDIR}
|
||||
ARCHIVE DESTINATION ${DIST_LIBDIR})
|
||||
+190
@@ -0,0 +1,190 @@
|
||||
#include <csignal>
|
||||
#include <cstring>
|
||||
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include <chrono>
|
||||
#include <iostream>
|
||||
#include <thread>
|
||||
|
||||
#include <communication/ovCMessagingClient.h>
|
||||
|
||||
static bool didRequestForcedQuit = false;
|
||||
static void signalHandler(int /* signal */) { didRequestForcedQuit = true; }
|
||||
|
||||
int main(const int argc, char** argv)
|
||||
{
|
||||
std::signal(SIGINT, signalHandler);
|
||||
|
||||
std::string connectionID;
|
||||
size_t port = 49687;
|
||||
|
||||
for (int i = 0; i < argc; ++i)
|
||||
{
|
||||
if (std::strcmp(argv[i], "--connection-id") == 0) { if (argc > i + 1) { connectionID = argv[i + 1]; } }
|
||||
else if (std::strcmp(argv[i], "--port") == 0) { if (argc > i + 1) { port = size_t(std::stoi(argv[i + 1])); } }
|
||||
}
|
||||
didRequestForcedQuit = false;
|
||||
|
||||
Communication::MessagingClient client;
|
||||
|
||||
client.setConnectionID(connectionID);
|
||||
|
||||
while (!client.connect("127.0.0.1", port))
|
||||
{
|
||||
const Communication::MessagingClient::ELibraryError error = client.getLastError();
|
||||
|
||||
if (error == Communication::MessagingClient::ELibraryError::Socket_FailedToConnect)
|
||||
{
|
||||
std::cout << "Server not responding\n";
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(20));
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Error " << error << std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (didRequestForcedQuit) { exit(EXIT_SUCCESS); }
|
||||
}
|
||||
|
||||
std::cout << "Connected to server\n";
|
||||
|
||||
// Initialize
|
||||
|
||||
for (size_t i = 0; i < client.getInputCount(); ++i)
|
||||
{
|
||||
uint64_t id;
|
||||
uint64_t type;
|
||||
std::string name;
|
||||
|
||||
if (client.getInput(i, id, type, name)) { std::cout << "Input:\n\tIndex: " << id << "\n\tType: " << type << "\n\tName: " << name << "\n\n"; }
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < client.getOutputCount(); ++i)
|
||||
{
|
||||
uint64_t id;
|
||||
uint64_t type;
|
||||
std::string name;
|
||||
|
||||
if (client.getOutput(i, id, type, name)) { std::cout << "Output:\n\tIndex: " << id << "\n\tType: " << type << "\n\tName: " << name << "\n\n"; }
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < client.getParameterCount(); ++i)
|
||||
{
|
||||
uint64_t id;
|
||||
uint64_t type;
|
||||
std::string name;
|
||||
std::string value;
|
||||
|
||||
if (client.getParameter(i, id, type, name, value))
|
||||
{
|
||||
std::cout << "Parameter:\n\tIndex: " << id << "\n\tType: " << type << "\n\tName: " << name << "\n\tValue: " << value << "\n\n";
|
||||
}
|
||||
}
|
||||
|
||||
// Announce to server that the box has finished initializing and wait for acknowledgement
|
||||
while (!client.waitForSyncMessage()) { std::this_thread::sleep_for(std::chrono::milliseconds(1)); }
|
||||
client.pushLog(Communication::LogLevel_Info, "Received Ping");
|
||||
|
||||
client.pushSync();
|
||||
client.pushLog(Communication::LogLevel_Info, "Sent Pong");
|
||||
|
||||
// Process
|
||||
|
||||
while (!didRequestForcedQuit)
|
||||
{
|
||||
if (client.isEndReceived())
|
||||
{
|
||||
std::cout << "End message received!\n";
|
||||
break;
|
||||
}
|
||||
|
||||
if (!client.isConnected())
|
||||
{
|
||||
std::cout << "Disconnected!\n";
|
||||
break;
|
||||
}
|
||||
|
||||
if (client.isInErrorState())
|
||||
{
|
||||
std::cerr << "Error state " << client.getLastError() << "\n";
|
||||
break;
|
||||
}
|
||||
|
||||
// EBML
|
||||
|
||||
uint64_t packetId;
|
||||
size_t index;
|
||||
uint64_t startTime;
|
||||
uint64_t endtime;
|
||||
std::shared_ptr<const std::vector<uint8_t>> ebml;
|
||||
|
||||
// We wait for a synchronization message, this means that the client box has finished sending
|
||||
// all of the data it has received during one process() method call.
|
||||
while (!client.waitForSyncMessage())
|
||||
{
|
||||
while (client.popEBML(packetId, index, startTime, endtime, ebml))
|
||||
{
|
||||
// We just push out the received EBML as is
|
||||
if (!client.pushEBML(index, startTime, endtime, ebml))
|
||||
{
|
||||
std::cerr << "Failed to push EBML.\n";
|
||||
std::cerr << "Error " << client.getLastError() << "\n";
|
||||
break;
|
||||
}
|
||||
|
||||
/*if (!client.pushLog(Communication::ELogLevel::LogLevel_Info, "EBML received on index: " + std::to_string(index)))
|
||||
{
|
||||
std::cout << "Failed to push log.\n";
|
||||
client.close();
|
||||
exit(EXIT_FAILURE);
|
||||
}*/
|
||||
}
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||
}
|
||||
|
||||
// Sync message was received, this means that we are now sure that the buffer will not receive
|
||||
// any additional data as the box is blocked until we acknowledge sending all of the processed
|
||||
// data back
|
||||
while (client.popEBML(packetId, index, startTime, endtime, ebml))
|
||||
{
|
||||
if (!client.pushEBML(index, startTime, endtime, ebml))
|
||||
{
|
||||
std::cerr << "Failed to push EBML.\n";
|
||||
std::cerr << "Error " << client.getLastError() << "\n";
|
||||
break;
|
||||
}
|
||||
|
||||
/*if (!client.pushLog(Communication::ELogLevel::LogLevel_Info, "EBML received on index: " + std::to_string(index)))
|
||||
{
|
||||
std::cout << "Failed to push log.\n";
|
||||
client.close();
|
||||
exit(EXIT_FAILURE);
|
||||
}*/
|
||||
}
|
||||
|
||||
// Errors
|
||||
|
||||
Communication::EError error;
|
||||
uint64_t guiltyId;
|
||||
|
||||
while (client.popError(packetId, error, guiltyId))
|
||||
{
|
||||
std::cerr << "Error received:\n";
|
||||
std::cerr << "\tError: " << int(error) << "\n";
|
||||
std::cerr << "\tGuilty Id: " << guiltyId << "\n";
|
||||
}
|
||||
|
||||
// Here, we send a sync message to tell to the server that we have no more
|
||||
// data to send and we can move forward. This will unblock the box.
|
||||
if (!client.pushSync()) { return 0; }
|
||||
}
|
||||
|
||||
std::cout << "Processing stopped.\n";
|
||||
|
||||
|
||||
if (!client.close()) { std::cerr << "Failed to close the connection\n"; }
|
||||
|
||||
return 0;
|
||||
}
|
||||
+291
@@ -0,0 +1,291 @@
|
||||
#include <csignal>
|
||||
#include <cstring>
|
||||
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include <chrono>
|
||||
#include <iostream>
|
||||
#include <thread>
|
||||
#include <cmath>
|
||||
#include <map>
|
||||
|
||||
#include <ebml/IWriterHelper.h>
|
||||
#include <ebml/IWriter.h>
|
||||
#include <ebml/TWriterCallbackProxy.h>
|
||||
#include <communication/ovCMessagingClient.h>
|
||||
|
||||
#include <toolkit/ovtk_defines.h>
|
||||
#include <openvibe/ovIMemoryBuffer.h>
|
||||
#include <openvibe/CTime.hpp>
|
||||
|
||||
static bool didRequestForcedQuit = false;
|
||||
static void signalHandler(int /* signal */) { didRequestForcedQuit = true; }
|
||||
|
||||
class EBMLWriterCallback
|
||||
{
|
||||
public:
|
||||
void write(const void* buffer, const size_t size)
|
||||
{
|
||||
const uint8_t* data = static_cast<const uint8_t*>(buffer);
|
||||
m_buffer.insert(m_buffer.end(), data, data + size);
|
||||
}
|
||||
|
||||
void clear() { m_buffer.clear(); }
|
||||
|
||||
const std::vector<uint8_t>& data() const { return m_buffer; }
|
||||
|
||||
private:
|
||||
std::vector<uint8_t> m_buffer;
|
||||
};
|
||||
|
||||
int main(const int argc, char** argv)
|
||||
{
|
||||
std::signal(SIGINT, signalHandler);
|
||||
|
||||
std::string connectionID;
|
||||
size_t port = 49687;
|
||||
|
||||
for (int i = 0; i < argc; ++i)
|
||||
{
|
||||
if (std::strcmp(argv[i], "--connection-id") == 0) { if (argc > i + 1) { connectionID = argv[i + 1]; } }
|
||||
else if (std::strcmp(argv[i], "--port") == 0) { if (argc > i + 1) { port = size_t(std::stoi(argv[i + 1])); } }
|
||||
}
|
||||
|
||||
// EBML
|
||||
|
||||
EBMLWriterCallback callback;
|
||||
EBML::TWriterCallbackProxy1<EBMLWriterCallback> callbackProxy(callback, &EBMLWriterCallback::write);
|
||||
EBML::IWriter* writer = createWriter(callbackProxy);
|
||||
EBML::IWriterHelper* helper = EBML::createWriterHelper();
|
||||
helper->connect(writer);
|
||||
|
||||
didRequestForcedQuit = false;
|
||||
|
||||
Communication::MessagingClient client;
|
||||
|
||||
client.setConnectionID(connectionID);
|
||||
|
||||
while (!client.connect("127.0.0.1", port))
|
||||
{
|
||||
const Communication::MessagingClient::ELibraryError error = client.getLastError();
|
||||
|
||||
if (error == Communication::MessagingClient::ELibraryError::Socket_FailedToConnect)
|
||||
{
|
||||
std::cout << "Server not responding\n";
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(20));
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Error " << error << std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (didRequestForcedQuit) { exit(EXIT_SUCCESS); }
|
||||
}
|
||||
|
||||
std::cout << "Connected to server\n";
|
||||
|
||||
// Initialize
|
||||
|
||||
if (client.getInputCount() > 0)
|
||||
{
|
||||
std::cerr << "The test generator can not take any inputs, was given " << client.getInputCount() << std::endl;
|
||||
client.close();
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < client.getOutputCount(); ++i)
|
||||
{
|
||||
uint64_t id;
|
||||
uint64_t type;
|
||||
std::string name;
|
||||
|
||||
if (client.getOutput(i, id, type, name)) { std::cout << "Output:\n\tIndex: " << id << "\n\tType: " << type << "\n\tName: " << name << "\n\n"; }
|
||||
}
|
||||
|
||||
std::map<std::string, std::string> parameters;
|
||||
|
||||
for (size_t i = 0; i < client.getParameterCount(); ++i)
|
||||
{
|
||||
uint64_t id;
|
||||
uint64_t type;
|
||||
std::string name;
|
||||
std::string value;
|
||||
|
||||
client.getParameter(i, id, type, name, value);
|
||||
parameters[name] = value;
|
||||
}
|
||||
|
||||
if (!(parameters.count("Channel Count")))
|
||||
{
|
||||
std::cerr << "Missing parameter" << std::endl;
|
||||
client.close();
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
const size_t nChannel = size_t(std::stoul(parameters.at("Channel Count")));
|
||||
const size_t samplingRate = size_t(std::stoul(parameters.at("Sampling Rate")));
|
||||
const size_t samplesPerBuffer = size_t(std::stoul(parameters.at("Samples Per Buffer")));
|
||||
const size_t samplesToSend = size_t(std::stoul(parameters.at("Amount of Samples to Generate")));
|
||||
|
||||
std::vector<double> matrix;
|
||||
matrix.resize(nChannel * samplesPerBuffer);
|
||||
|
||||
// Announce to server that the box has finished initializing and wait for acknowledgement
|
||||
while (!client.waitForSyncMessage()) { std::this_thread::sleep_for(std::chrono::milliseconds(1)); }
|
||||
client.pushLog(Communication::LogLevel_Info, "Received Ping");
|
||||
|
||||
client.pushSync();
|
||||
client.pushLog(Communication::LogLevel_Info, "Sent Pong");
|
||||
|
||||
// Process
|
||||
|
||||
// Send the header
|
||||
callback.clear();
|
||||
helper->openChild(OVTK_NodeId_Header);
|
||||
{
|
||||
helper->openChild(OVTK_NodeId_Header_StreamType);
|
||||
{
|
||||
helper->setUInt(0);
|
||||
helper->closeChild();
|
||||
}
|
||||
helper->openChild(OVTK_NodeId_Header_StreamVersion);
|
||||
{
|
||||
helper->setUInt(0);
|
||||
helper->closeChild();
|
||||
}
|
||||
|
||||
helper->openChild(OVTK_NodeId_Header_Signal);
|
||||
{
|
||||
helper->openChild(OVTK_NodeId_Header_Signal_Sampling);
|
||||
{
|
||||
helper->setUInt(samplingRate);
|
||||
helper->closeChild();
|
||||
}
|
||||
helper->closeChild();
|
||||
}
|
||||
|
||||
helper->openChild(OVTK_NodeId_Header_StreamedMatrix);
|
||||
{
|
||||
helper->openChild(OVTK_NodeId_Header_StreamedMatrix_DimensionCount);
|
||||
{
|
||||
helper->setUInt(2);
|
||||
helper->closeChild();
|
||||
}
|
||||
helper->openChild(OVTK_NodeId_Header_StreamedMatrix_Dimension);
|
||||
{
|
||||
helper->openChild(OVTK_NodeId_Header_StreamedMatrix_Dimension_Size);
|
||||
{
|
||||
helper->setUInt(nChannel);
|
||||
helper->closeChild();
|
||||
}
|
||||
helper->closeChild();
|
||||
}
|
||||
helper->openChild(OVTK_NodeId_Header_StreamedMatrix_Dimension);
|
||||
{
|
||||
helper->openChild(OVTK_NodeId_Header_StreamedMatrix_Dimension_Size);
|
||||
{
|
||||
helper->setUInt(samplesPerBuffer);
|
||||
helper->closeChild();
|
||||
}
|
||||
helper->closeChild();
|
||||
}
|
||||
helper->closeChild();
|
||||
}
|
||||
helper->closeChild();
|
||||
}
|
||||
if (!client.pushEBML(0, 0, 0, std::make_shared<const std::vector<uint8_t>>(callback.data())))
|
||||
{
|
||||
std::cerr << "Failed to push EBML.\n";
|
||||
std::cerr << "Error " << client.getLastError() << "\n";
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
client.pushSync();
|
||||
|
||||
size_t sentSamples = 0;
|
||||
while (!didRequestForcedQuit || (samplesToSend != 0 && sentSamples < samplesToSend))
|
||||
{
|
||||
if (client.isEndReceived())
|
||||
{
|
||||
std::cout << "End message received!\n";
|
||||
break;
|
||||
}
|
||||
|
||||
if (!client.isConnected())
|
||||
{
|
||||
std::cout << "Disconnected!\n";
|
||||
break;
|
||||
}
|
||||
|
||||
if (client.isInErrorState())
|
||||
{
|
||||
std::cerr << "Error state " << client.getLastError() << "\n";
|
||||
break;
|
||||
}
|
||||
|
||||
// Send data
|
||||
|
||||
while (!client.waitForSyncMessage()) { std::this_thread::sleep_for(std::chrono::milliseconds(1)); }
|
||||
|
||||
const uint64_t expectedSamples = OpenViBE::CTime(client.getTime()).toSampleCount(samplingRate);
|
||||
|
||||
while (sentSamples < expectedSamples && (samplesToSend == 0 || sentSamples < samplesToSend))
|
||||
{
|
||||
for (size_t channel = 0; channel < nChannel; ++channel)
|
||||
{
|
||||
for (size_t sample = 0; sample < samplesPerBuffer; ++sample)
|
||||
{
|
||||
matrix[channel * samplesPerBuffer + sample] = sin((sentSamples + sample) / double(samplingRate));
|
||||
}
|
||||
}
|
||||
|
||||
callback.clear();
|
||||
helper->openChild(OVTK_NodeId_Buffer);
|
||||
{
|
||||
helper->openChild(OVTK_NodeId_Buffer_StreamedMatrix);
|
||||
{
|
||||
helper->openChild(OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer);
|
||||
{
|
||||
helper->setBinary(matrix.data(), matrix.size() * sizeof(double));
|
||||
helper->closeChild();
|
||||
}
|
||||
helper->closeChild();
|
||||
}
|
||||
helper->closeChild();
|
||||
}
|
||||
|
||||
|
||||
const uint64_t tStart = OpenViBE::CTime(samplingRate, sentSamples).time();
|
||||
const uint64_t tEnd = OpenViBE::CTime(samplingRate, sentSamples + samplesPerBuffer).time();
|
||||
|
||||
if (!client.pushEBML(0, tStart, tEnd, std::make_shared<const std::vector<uint8_t>>(callback.data())))
|
||||
{
|
||||
std::cerr << "Failed to push EBML.\n";
|
||||
std::cerr << "Error " << client.getLastError() << "\n";
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
sentSamples += samplesPerBuffer;
|
||||
}
|
||||
|
||||
// Errors
|
||||
uint64_t packetId;
|
||||
Communication::EError error;
|
||||
uint64_t guiltyId;
|
||||
|
||||
while (client.popError(packetId, error, guiltyId)) { std::cerr << "Error received:\n\tError: " << int(error) << "\n\tGuilty Id: " << guiltyId << "\n"; }
|
||||
// Here, we send a sync message to tell to the server that we have no more data to send and we can move forward.
|
||||
if (!client.pushSync()) { exit(EXIT_FAILURE); }
|
||||
}
|
||||
|
||||
std::cout << "Processing stopped.\n";
|
||||
|
||||
helper->disconnect();
|
||||
helper->release();
|
||||
writer->release();
|
||||
|
||||
if (!client.close()) { std::cerr << "Failed to close the connection\n"; }
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user