From e43149610e66ce90377df4a56bcf66cbb4980a91 Mon Sep 17 00:00:00 2001
From: Janis Streib <me@janis-streib.de>
Date: Fri, 31 Dec 2021 18:09:05 +0100
Subject: [PATCH] ADD: osc support

---
 src/G4Export.cpp                |   23 +++++++++++++++++++----
 cmake/Modules/FindOscPack.cmake |   18 ++++++++++++++++++
 CMakeLists.txt                  |    5 +++--
 3 files changed, 40 insertions(+), 6 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 15673a3..17e79a0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -5,6 +5,7 @@
 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
 
 find_package(G4Track REQUIRED)
+find_package(OscPack REQUIRED)
 
 set(SOURCE_FILES
 	src/G4Export.cpp
@@ -17,5 +18,5 @@
 	src/struct.h)
 
 add_executable(g4export ${SOURCE_FILES})
-target_include_directories(g4export PRIVATE ${G4Track_INCLUDE_DIRS})
-target_link_libraries(g4export ${G4Track_LIBRARIES})
+target_include_directories(g4export PRIVATE ${G4Track_INCLUDE_DIRS} ${OscPack_INCLUDE_DIRS})
+target_link_libraries(g4export ${G4Track_LIBRARIES} ${OscPack_LIBRARIES})
diff --git a/cmake/Modules/FindOscPack.cmake b/cmake/Modules/FindOscPack.cmake
new file mode 100644
index 0000000..3e7a094
--- /dev/null
+++ b/cmake/Modules/FindOscPack.cmake
@@ -0,0 +1,18 @@
+find_path(OscPack_INCLUDE_DIR NAMES osc/OscPacketListener.h PATH_SUFFIXES oscpack)
+find_library(OscPack_LIBRARY NAMES liboscpack.so)
+
+IF (OscPack_INCLUDE_DIR AND OscPack_LIBRARY)
+   SET(OscPack_FOUND TRUE)
+   SET(OscPack_INCLUDE_DIRS ${OscPack_INCLUDE_DIR})
+   SET(OscPack_LIBRARIES ${OscPack_LIBRARY})
+ENDIF (OscPack_INCLUDE_DIR AND OscPack_LIBRARY)
+
+IF (OscPack_FOUND)
+   IF (NOT OscPack_FIND_QUIETLY)
+      MESSAGE(STATUS "Found liboscpack: ${OscPack_LIBRARIES}")
+   ENDIF (NOT OscPack_FIND_QUIETLY)
+ELSE (OscPack_FOUND)
+   IF (OscPack_FIND_REQUIRED)
+      MESSAGE(FATAL_ERROR "Could not find liboscpack")
+   ENDIF (OscPack_FIND_REQUIRED)
+ENDIF (OscPack_FOUND)
diff --git a/src/G4Export.cpp b/src/G4Export.cpp
index f4e70bf..53f0527 100644
--- a/src/G4Export.cpp
+++ b/src/G4Export.cpp
@@ -6,11 +6,16 @@
 #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){
@@ -39,11 +44,18 @@
 		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]);
+			//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);
 	}
@@ -56,17 +68,20 @@
   CG4Trk trk;
   REND_STRUCT rs;
   string cfgFile;
-  string oscSink;
+  string oscSinkAddr;
+  int oscSinkPort;
 
   auto cli = (
         value("c4g configuration file", cfgFile),
-        value("osc sink", oscSink)
+        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;

--
Gitblit v1.9.1