ee3cd19bc4219fb78cbce560fb334b5d404d36f7..c3b1e1f0860b157fdd0e0fe54dd743687e4065ab
19.05.23 Janis Streib
ADD: configurable pollPeriod
c3b1e1 diff | tree
19.05.23 Janis Streib
ADD: signal handler
3dfc1c diff | tree
1 files modified
36 ■■■■ changed files
src/G4Export.cpp 36 ●●●● patch | view | raw | blame | history
src/G4Export.cpp
@@ -11,6 +11,7 @@
#include <ip/UdpSocket.h>
#include <osc/OscOutboundPacketStream.h>
#include <sstream>
#include <signal.h>
using namespace clipp; using std::cout; using std::string;
@@ -19,14 +20,15 @@
int RunCollect=0;
std::unique_ptr<UdpTransmitSocket> transmitSocket;
bool use_text = false;
int pollPeriod = 8;
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();
@@ -44,7 +46,7 @@
            }
        }
        i++;
        iter++;
        prs->hubreadmap=0;
        prs->tot_hubs_on_system=prs->pTrk->GetHubsPno(prs);
        char buffer[OUTPUT_BUFFER_SIZE];
@@ -54,20 +56,19 @@
            if(!use_text) {
                p << osc::BeginBundleImmediate;
            }
            auto dat = prs->hubList[i].GetPnoData();
            for(int j=0;j<G4_SENSORS_PER_HUB;j++) {
                if(!prs->hubList[i].IsSenActive(j)){
                    continue;
                }
                auto dat = prs->hubList[i].GetPnoData()[j];
                //printf("sns: %i: [%f;%f;%f],[%f,%f,%f]\n",i, dat[0],dat[1],dat[2], dat[3],dat[4],dat[5]);
                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[0] << "," << dat[1] << "," << dat[2] << "," << dat[3] << "," << dat[4] << "," << dat[5] << "]";
                    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[0] << dat[1] << dat[2] << dat[3] << dat[4] << dat[5];
                    p << dat[j][0] << dat[j][1] << dat[j][2] << dat[j][3] << dat[j][4] << dat[j][5];
                }
                p << osc::EndMessage;
            }
@@ -76,11 +77,16 @@
            }
            transmitSocket->Send( p.Data(), p.Size() );
        }
        usleep(15000);
        usleep(pollPeriod*1000);
        // usleep(8000);
    }
    return NULL;
}
void sighandler(int s){
    printf("Caught signal %d\n",s);
    RunCollect = 0;
}
int main(int argc,char* argv[]){
@@ -95,10 +101,11 @@
    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 address", oscSinkAddr),
        integer("osc sink port", oscSinkPort)
        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;
  }
@@ -131,6 +138,15 @@
 
  RunCollect=1;
  // register signal handler
  struct sigaction sigIntHandler;
  sigIntHandler.sa_handler = sighandler;
  sigemptyset(&sigIntHandler.sa_mask);
  sigIntHandler.sa_flags = 0;
  sigaction(SIGINT, &sigIntHandler, NULL);
  Collect(&rs);
  delete[] rs.srcList;