Janis Streib
09.01.22 f457af0604089c8f85fd6bb68fd4d975dc194686
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <stdio.h>
#include <iostream>
#include "Quaternion.h"
#include "struct.h"
#include "G4Trk.h"
#include "G4Hub.h"
#include <string.h>
#include <unistd.h>
#include <memory>
#include "clipp.h"
#include <ip/UdpSocket.h>
#include <osc/OscOutboundPacketStream.h>
using namespace clipp; using std::cout; using std::string;
 
#define OUTPUT_BUFFER_SIZE 512
 
int RunCollect=0;
std::unique_ptr<UdpTransmitSocket> transmitSocket;
 
 
void* Collect(REND_STRUCT* prs){
    int i = 0;
    CG4Trk* pTrk = prs->pTrk;
    while (RunCollect){
        // periodically check for new hubs coming on line
        if(i % 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;i<numHubs;i++){
                    prs->hubList[i].SetId(hubIds[i]);
                }
                delete[] hubIds;
            }
 
        }
        i++;
        prs->hubreadmap=0;
        prs->tot_hubs_on_system=prs->pTrk->GetHubsPno(prs);
        char buffer[OUTPUT_BUFFER_SIZE];
        osc::OutboundPacketStream p( buffer, OUTPUT_BUFFER_SIZE );
 
        p << osc::BeginBundleImmediate;
        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]);
            p << osc::BeginMessage( (string("/hub/") + std::to_string(i)).c_str() )
                << dat[0] << dat[1] << dat[2] << dat[3] << dat[4] << dat[5] << osc::EndMessage;
        }
        p << osc::EndBundle;
        transmitSocket->Send( p.Data(), p.Size() );
        usleep(15000);
        // usleep(8000);
    }
 
    return NULL;
}
 
int main(int argc,char* argv[]){
 
  CG4Trk trk;
  REND_STRUCT rs;
  string cfgFile;
  string oscSinkAddr;
  int oscSinkPort;
 
  auto cli = (
        value("c4g configuration file", cfgFile),
        value("osc sink address", oscSinkAddr),
        integer("osc sink port", oscSinkPort)
  );
 
  if(!parse(argc, argv, cli)) {
      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");
    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<rs.numHub;i++){
    rs.hubList[i].SetId(hubIds[i]);
  }
  delete[] hubIds;
 
  rs.pTrk=&trk;
 
  RunCollect=1;
 
  Collect(&rs);
 
  delete[] rs.srcList;
  delete[] rs.hubList;
 
  return 0;
}