Janis Streib
25.01.22 d6f0ba3d592d52580d0b8e2829d1c3d2d88d831c
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>
JS 14
e9b870 15 using namespace clipp; using std::cout; using std::string;
929277 16
e43149 17 #define OUTPUT_BUFFER_SIZE 512
929277 18
JS 19 int RunCollect=0;
e43149 20 std::unique_ptr<UdpTransmitSocket> transmitSocket;
d6f0ba 21 bool use_text = false;
929277 22
JS 23
24 void* Collect(REND_STRUCT* prs){
25     int i = 0;
26     CG4Trk* pTrk = prs->pTrk;
27     while (RunCollect){
28         // periodically check for new hubs coming on line
29         if(i % 1000 == 0) {
30             int numHubs;
31             if (prs->tot_hubs_on_system!=prs->numHub){
32                 prs->numHub=numHubs=prs->tot_hubs_on_system=pTrk->UpdateHubs();
33                 int colorInd=0;
34                 if (prs->hubList) {
35                     delete[] prs->hubList;
36                 }
37                 prs->hubList=new CG4Hub[numHubs];
38                 int* hubIds=new int[numHubs];
39                 pTrk->GetHubList(hubIds,numHubs);
40                 for (int i=0;i<numHubs;i++){
41                     prs->hubList[i].SetId(hubIds[i]);
42                 }
43                 delete[] hubIds;
44             }
45
46         }
47         i++;
48         prs->hubreadmap=0;
49         prs->tot_hubs_on_system=prs->pTrk->GetHubsPno(prs);
e43149 50         char buffer[OUTPUT_BUFFER_SIZE];
JS 51         osc::OutboundPacketStream p( buffer, OUTPUT_BUFFER_SIZE );
52
d6f0ba 53         if(!use_text) {
JS 54             p << osc::BeginBundleImmediate;
55         }
929277 56         for (int i=0;i<prs->numHub;i++){
JS 57             auto dat = prs->hubList[i].GetPnoData()[0];
e43149 58             //printf("sns: %i: [%f;%f;%f],[%f,%f,%f]\n",i, dat[0],dat[1],dat[2], dat[3],dat[4],dat[5]);
d6f0ba 59             p << osc::BeginMessage( (string("/hub/") + std::to_string(i)).c_str() );
JS 60             std::ostringstream ss;
61             if(use_text) {
62                 ss << "[" << dat[0] << "," << dat[1] << "," << dat[2] << "," << dat[3] << "," << dat[4] << "," << dat[5] << "]";
63                 auto res = ss.str();
64                 p << res.c_str();
65             } else {
66                 p << dat[0] << dat[1] << dat[2] << dat[3] << dat[4] << dat[5];
67             }
68             p << osc::EndMessage;
929277 69         }
d6f0ba 70         if(!use_text) {
JS 71             p << osc::EndBundle;
72         }
e43149 73         transmitSocket->Send( p.Data(), p.Size() );
929277 74         usleep(15000);
JS 75         // usleep(8000);
76     }
77
78     return NULL;
79 }
80
81 int main(int argc,char* argv[]){
82
83   CG4Trk trk;
84   REND_STRUCT rs;
e9b870 85   string cfgFile;
e43149 86   string oscSinkAddr;
JS 87   int oscSinkPort;
929277 88
e9b870 89   auto cli = (
d6f0ba 90     option("-t", "--text").set(use_text).doc("send strings in osc messages instead of a float bundle"),
e9b870 91         value("c4g configuration file", cfgFile),
e43149 92         value("osc sink address", oscSinkAddr),
JS 93         integer("osc sink port", oscSinkPort)
e9b870 94   );
929277 95
e9b870 96   if(!parse(argc, argv, cli)) {
JS 97       cout << make_man_page(cli, argv[0]);
98     return 1;
99   }
e43149 100   transmitSocket = std::make_unique<UdpTransmitSocket>( IpEndpointName( oscSinkAddr.c_str(), oscSinkPort ) );
929277 101   memset(rs.viewTrans,0,sizeof(float)*3);
JS 102   rs.srcScale=rs.senScale=0.5;
103   rs.counter=0;
104
105   cfgFile="config.g4c";
e9b870 106   int resp=trk.Connect(const_cast<char*>(cfgFile.c_str())); // whaaaaa
929277 107   if (!resp){
JS 108     printf("Error Connecting to G4\n");
109     return -1;
110   }
111  
112   usleep(500000);
113   rs.numSrc=trk.GetNumSrc();
114   rs.srcList=new float[rs.numSrc][6];
115   trk.GetSrcLoc(rs.srcList);
116
117   rs.numHub=trk.UpdateHubs();
118   rs.hubList=new CG4Hub[rs.numHub];
119   int* hubIds=new int[rs.numHub];
120   trk.GetHubList(hubIds,rs.numHub);
121   for (int i=0;i<rs.numHub;i++){
122     rs.hubList[i].SetId(hubIds[i]);
123   }
124   delete[] hubIds;
125
126   rs.pTrk=&trk;
127  
128   RunCollect=1;
129
130   Collect(&rs);
131
132   delete[] rs.srcList;
133   delete[] rs.hubList;
134
135   return 0;
136 }
137