#include #include #include "Quaternion.h" #include "struct.h" #include "G4Trk.h" #include "G4Hub.h" #include #include #include #include "clipp.h" #include #include #include #include #include #include using namespace clipp; using std::cout; using std::string; #define OUTPUT_BUFFER_SIZE 512 int RunCollect=0; std::unique_ptr transmitSocket; bool use_text = false; int pollPeriod; void* Collect(REND_STRUCT* prs){ int iter = 0; CG4Trk* pTrk = prs->pTrk; while (RunCollect){ // periodically check for new hubs coming on line if(iter % 1000 == 0) { int numHubs; if (prs->tot_hubs_on_system!=prs->numHub){ prs->numHub=numHubs=prs->tot_hubs_on_system=pTrk->UpdateHubs(); int colorInd=0; if (prs->hubList) { delete[] prs->hubList; } prs->hubList=new CG4Hub[numHubs]; int* hubIds=new int[numHubs]; pTrk->GetHubList(hubIds,numHubs); for (int i=0;ihubList[i].SetId(hubIds[i]); } delete[] hubIds; } } iter++; prs->hubreadmap=0; prs->tot_hubs_on_system=prs->pTrk->GetHubsPno(prs); char buffer[OUTPUT_BUFFER_SIZE]; for (int i=0;inumHub;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;jhubList[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[]){ CG4Trk trk; REND_STRUCT rs; string cfgFile; 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 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) || pollPeriod <= 0) { cout << make_man_page(cli, argv[0]); return 1; } transmitSocket = std::make_unique( IpEndpointName( oscSinkAddr.c_str(), oscSinkPort ) ); memset(rs.viewTrans,0,sizeof(float)*3); rs.srcScale=rs.senScale=0.5; rs.counter=0; int resp=trk.Connect(const_cast(cfgFile.c_str())); // whaaaaa if (!resp){ printf("Error Connecting to G4\n"); return -1; } usleep(500000); rs.numSrc=trk.GetNumSrc(); rs.srcList=new float[rs.numSrc][6]; trk.GetSrcLoc(rs.srcList); rs.numHub=trk.UpdateHubs(); rs.hubList=new CG4Hub[rs.numHub]; int* hubIds=new int[rs.numHub]; trk.GetHubList(hubIds,rs.numHub); for (int i=0;i