| | |
| | | #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(); |
| | |
| | | } |
| | | |
| | | } |
| | | 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[]){ |
| | |
| | | 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"); |
| | |
| | | |
| | | 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; |
| | | } |