Janis Streib
19.05.23 3dfc1c543feb12d381b6c0b8f9712e362fb90972
commit | author | age
929277 1 #include <stdio.h>
e9b870 2 #include <iostream>
929277 3 #include "Quaternion.h"
JS 4 #include "struct.h"
5 #include "G4Trk.h"
6 #include "G4Hub.h"
7 #include <string.h>
8 #include <unistd.h>
e43149 9 #include <memory>
e9b870 10 #include "clipp.h"
e43149 11 #include <ip/UdpSocket.h>
JS 12 #include <osc/OscOutboundPacketStream.h>
d6f0ba 13 #include <sstream>
3dfc1c 14 #include <signal.h>
d6f0ba 15
e9b870 16 using namespace clipp; using std::cout; using std::string;
929277 17
e43149 18 #define OUTPUT_BUFFER_SIZE 512
929277 19
JS 20 int RunCollect=0;
e43149 21 std::unique_ptr<UdpTransmitSocket> transmitSocket;
d6f0ba 22 bool use_text = false;
929277 23
JS 24
25 void* Collect(REND_STRUCT* prs){
3dfc1c 26     int iter = 0;
929277 27     CG4Trk* pTrk = prs->pTrk;
JS 28     while (RunCollect){
29         // periodically check for new hubs coming on line
3dfc1c 30         if(iter % 1000 == 0) {
929277 31             int numHubs;
JS 32             if (prs->tot_hubs_on_system!=prs->numHub){
33                 prs->numHub=numHubs=prs->tot_hubs_on_system=pTrk->UpdateHubs();
34                 int colorInd=0;
35                 if (prs->hubList) {
36                     delete[] prs->hubList;
37                 }
38                 prs->hubList=new CG4Hub[numHubs];
39                 int* hubIds=new int[numHubs];
40                 pTrk->GetHubList(hubIds,numHubs);
41                 for (int i=0;i<numHubs;i++){
42                     prs->hubList[i].SetId(hubIds[i]);
43                 }
44                 delete[] hubIds;
45             }
46
47         }
3dfc1c 48         iter++;
929277 49         prs->hubreadmap=0;
JS 50         prs->tot_hubs_on_system=prs->pTrk->GetHubsPno(prs);
e43149 51         char buffer[OUTPUT_BUFFER_SIZE];
JS 52
929277 53         for (int i=0;i<prs->numHub;i++){
ee3cd1 54             osc::OutboundPacketStream p( buffer, OUTPUT_BUFFER_SIZE );
95f3f3 55             if(!use_text) {
JS 56                 p << osc::BeginBundleImmediate;
57             }
3dfc1c 58             auto dat = prs->hubList[i].GetPnoData();
d05d79 59             for(int j=0;j<G4_SENSORS_PER_HUB;j++) {
JS 60                 if(!prs->hubList[i].IsSenActive(j)){
61                     continue;
62                 }
a59e92 63                 p << osc::BeginMessage( (string("/g4/hub/") + std::to_string(prs->hubList[i].GetId()) + string("/") + std::to_string(j)).c_str());
d05d79 64                 std::ostringstream ss;
JS 65                 if(use_text) {
3dfc1c 66                     ss << "[" << dat[j][0] << "," << dat[j][1] << "," << dat[j][2] << "," << dat[j][3] << "," << dat[j][4] << "," << dat[j][5] << "]";
d05d79 67                     auto res = ss.str();
JS 68                     p << res.c_str();
69                 } else {
3dfc1c 70                     p << dat[j][0] << dat[j][1] << dat[j][2] << dat[j][3] << dat[j][4] << dat[j][5];
d05d79 71                 }
JS 72                 p << osc::EndMessage;
d6f0ba 73             }
d05d79 74             if(!use_text) {
JS 75                 p << osc::EndBundle;
76             }
77             transmitSocket->Send( p.Data(), p.Size() );
929277 78         }
JS 79         usleep(15000);
80         // usleep(8000);
81     }
82
83     return NULL;
3dfc1c 84 }
JS 85
86 void sighandler(int s){
87     printf("Caught signal %d\n",s);
88     RunCollect = 0;
929277 89 }
JS 90
91 int main(int argc,char* argv[]){
92
93   CG4Trk trk;
94   REND_STRUCT rs;
e9b870 95   string cfgFile;
e43149 96   string oscSinkAddr;
JS 97   int oscSinkPort;
929277 98
e9b870 99   auto cli = (
d6f0ba 100     option("-t", "--text").set(use_text).doc("send strings in osc messages instead of a float bundle"),
e9b870 101         value("c4g configuration file", cfgFile),
e43149 102         value("osc sink address", oscSinkAddr),
JS 103         integer("osc sink port", oscSinkPort)
e9b870 104   );
929277 105
e9b870 106   if(!parse(argc, argv, cli)) {
JS 107       cout << make_man_page(cli, argv[0]);
108     return 1;
109   }
e43149 110   transmitSocket = std::make_unique<UdpTransmitSocket>( IpEndpointName( oscSinkAddr.c_str(), oscSinkPort ) );
929277 111   memset(rs.viewTrans,0,sizeof(float)*3);
JS 112   rs.srcScale=rs.senScale=0.5;
113   rs.counter=0;
114
e9b870 115   int resp=trk.Connect(const_cast<char*>(cfgFile.c_str())); // whaaaaa
929277 116   if (!resp){
JS 117     printf("Error Connecting to G4\n");
118     return -1;
119   }
120  
121   usleep(500000);
122   rs.numSrc=trk.GetNumSrc();
123   rs.srcList=new float[rs.numSrc][6];
124   trk.GetSrcLoc(rs.srcList);
125
126   rs.numHub=trk.UpdateHubs();
127   rs.hubList=new CG4Hub[rs.numHub];
128   int* hubIds=new int[rs.numHub];
129   trk.GetHubList(hubIds,rs.numHub);
130   for (int i=0;i<rs.numHub;i++){
131     rs.hubList[i].SetId(hubIds[i]);
132   }
133   delete[] hubIds;
134
135   rs.pTrk=&trk;
136  
137   RunCollect=1;
138
3dfc1c 139   // register signal handler
JS 140   struct sigaction sigIntHandler;
141
142   sigIntHandler.sa_handler = sighandler;
143   sigemptyset(&sigIntHandler.sa_mask);
144   sigIntHandler.sa_flags = 0;
145
146   sigaction(SIGINT, &sigIntHandler, NULL);
147
929277 148   Collect(&rs);
JS 149
150   delete[] rs.srcList;
151   delete[] rs.hubList;
152
153   return 0;
154 }
155