From b21ff09151ca7e87348f1ea38944decc1f46f5db Mon Sep 17 00:00:00 2001 From: Janis Streib <me@janis-streib.de> Date: Fr., 19 Mai 2023 18:12:03 +0200 Subject: [PATCH] FIXUP --- src/G4Export.cpp | 93 ++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 76 insertions(+), 17 deletions(-) diff --git a/src/G4Export.cpp b/src/G4Export.cpp index 0897ceb..18adf0b 100644 --- a/src/G4Export.cpp +++ b/src/G4Export.cpp @@ -6,20 +6,31 @@ #include "G4Hub.h" #include <string.h> #include <unistd.h> -#include "config.h" +#include <memory> #include "clipp.h" +#include <ip/UdpSocket.h> +#include <osc/OscOutboundPacketStream.h> +#include <sstream> +#include <signal.h> +#include <chrono> +#include <thread> + using namespace clipp; using std::cout; using std::string; +#define OUTPUT_BUFFER_SIZE 512 int RunCollect=0; +std::unique_ptr<UdpTransmitSocket> transmitSocket; +bool use_text = false; +int pollPeriod; void* Collect(REND_STRUCT* prs){ - int i = 0; + int iter = 0; CG4Trk* pTrk = prs->pTrk; while (RunCollect){ // periodically check for new hubs coming on line - if(i % 1000 == 0) { + if(iter % 1000 == 0) { int numHubs; if (prs->tot_hubs_on_system!=prs->numHub){ prs->numHub=numHubs=prs->tot_hubs_on_system=pTrk->UpdateHubs(); @@ -37,19 +48,57 @@ } } - i++; + iter++; prs->hubreadmap=0; prs->tot_hubs_on_system=prs->pTrk->GetHubsPno(prs); - for (int i=0;i<prs->numHub;i++){ - auto dat = prs->hubList[i].GetPnoData()[0]; - printf("sns: %i: [%f;%f;%f],[%f,%f,%f]\n",i, dat[0],dat[1],dat[2], dat[3],dat[4],dat[5]); - } + char buffer[OUTPUT_BUFFER_SIZE]; - usleep(15000); - // usleep(8000); + for (int i=0;i<prs->numHub;i++){ + osc::OutboundPacketStream p( buffer, OUTPUT_BUFFER_SIZE ); + if(!use_text) { + p << osc::BeginBundleImmediate; + } + p << osc::BeginMessage( (string("/g4/hub/") + std::to_string(prs->hubList[i].GetId()) + string("/digio")).c_str()); + std::ostringstream ss; + if(use_text) { + ss << prs->hubList[i].GetDigIOData(); + auto res = ss.str(); + p << res.c_str(); + } else { + p << osc::int64(prs->hubList[i].GetDigIOData()); + } + p << osc::EndMessage; + auto dat = prs->hubList[i].GetPnoData(); + for(int j=0;j<G4_SENSORS_PER_HUB;j++) { + if(!prs->hubList[i].IsSenActive(j)){ + continue; + } + p << osc::BeginMessage( (string("/g4/hub/") + std::to_string(prs->hubList[i].GetId()) + string("/") + std::to_string(j)).c_str()); + std::ostringstream ss; + if(use_text) { + ss << "[" << dat[j][0] << "," << dat[j][1] << "," << dat[j][2] << "," << dat[j][3] << "," << dat[j][4] << "," << dat[j][5] << "]"; + auto res = ss.str(); + p << res.c_str(); + } else { + p << dat[j][0] << dat[j][1] << dat[j][2] << dat[j][3] << dat[j][4] << dat[j][5]; + } + p << osc::EndMessage; + } + if(!use_text) { + p << osc::EndBundle; + } + transmitSocket->Send( p.Data(), p.Size() ); + } + std::this_thread::sleep_for(std::chrono::milliseconds(pollPeriod)); } + g4_close_tracker(); return NULL; +} + +void sighandler(int s){ + printf("Caught signal %d\n",s); + RunCollect=0; } int main(int argc,char* argv[]){ @@ -57,22 +106,26 @@ CG4Trk trk; REND_STRUCT rs; string cfgFile; - string oscSink; + string oscSinkAddr; + int oscSinkPort; auto cli = ( + option("-t", "--text").set(use_text).doc("send strings in osc messages instead of a float bundle"), value("c4g configuration file", cfgFile), - value("osc sink", oscSink) + value("osc sink address", oscSinkAddr), + integer("osc sink port", oscSinkPort), + integer("polling period in ms (imprecise). You realistically won't need less than 8 ms.", pollPeriod) ); - if(!parse(argc, argv, cli)) { + if(!parse(argc, argv, cli) || pollPeriod <= 0) { cout << make_man_page(cli, argv[0]); return 1; } + transmitSocket = std::make_unique<UdpTransmitSocket>( IpEndpointName( oscSinkAddr.c_str(), oscSinkPort ) ); memset(rs.viewTrans,0,sizeof(float)*3); rs.srcScale=rs.senScale=0.5; rs.counter=0; - cfgFile="config.g4c"; int resp=trk.Connect(const_cast<char*>(cfgFile.c_str())); // whaaaaa if (!resp){ printf("Error Connecting to G4\n"); @@ -97,10 +150,16 @@ RunCollect=1; - Collect(&rs); + // register signal handler + struct sigaction sigIntHandler; - delete[] rs.srcList; - delete[] rs.hubList; + sigIntHandler.sa_handler = sighandler; + sigemptyset(&sigIntHandler.sa_mask); + sigIntHandler.sa_flags = 0; + + sigaction(SIGINT, &sigIntHandler, NULL); + + Collect(&rs); return 0; } -- Gitblit v1.9.1