From a00326161c25dba722211edaec0743c86104ae94 Mon Sep 17 00:00:00 2001 From: Mike Black W9MDB Date: Wed, 13 Sep 2023 17:25:26 -0500 Subject: [PATCH] Phase I of rig multicast https://github.com/Hamlib/Hamlib/issues/1090 --- bindings/csharp/multicast/multicast.csproj | 2 +- src/multicast.c | 35 +++++++++++++++++++--- src/network.c | 2 ++ src/rig.c | 1 + 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/bindings/csharp/multicast/multicast.csproj b/bindings/csharp/multicast/multicast.csproj index 81870de07..d08b4c72a 100644 --- a/bindings/csharp/multicast/multicast.csproj +++ b/bindings/csharp/multicast/multicast.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net7.0 diff --git a/src/multicast.c b/src/multicast.c index a79a78863..2a3da70fd 100644 --- a/src/multicast.c +++ b/src/multicast.c @@ -282,7 +282,7 @@ static int multicast_send_json(RIG *rig) void *multicast_thread(void *vrig) { - int retval; + //int retval; RIG *rig = (RIG *)vrig; rig_debug(RIG_DEBUG_TRACE, "%s: multicast_thread started\n", __func__); @@ -293,8 +293,14 @@ void *multicast_thread(void *vrig) freq_t freqA, freqAsave = 0; freq_t freqB, freqBsave = 0; + mode_t modeA, modeAsave = 0; + mode_t modeB, modeBsave = 0; + ptt_t ptt, pttsave = 0; + rig->state.multicast->runflag = 1; + while (rig->state.multicast->runflag) { +#if 0 if ((retval = rig_get_freq(rig, RIG_VFO_A, &freqA)) != RIG_OK) { rig_debug(RIG_DEBUG_ERR, "%s: rig_get_freqA:%s\n", __func__, rigerror(retval)); @@ -309,17 +315,37 @@ void *multicast_thread(void *vrig) { freqB = rig->state.cache.freqMainB; } +#else + freqA = rig->state.cache.freqMainA; + freqB = rig->state.cache.freqMainB; + modeA = rig->state.cache.modeMainA; + modeB = rig->state.cache.modeMainB; + ptt = rig->state.cache.ptt; +#endif - if (freqA != freqAsave || freqB != freqBsave || loopcount-- <= 0) + if (freqA != freqAsave + || freqB != freqBsave + || modeA != modeAsave + || modeB != modeBsave + || ptt != pttsave + || loopcount-- <= 0) { - multicast_status_changed(rig); + if (loopcount <= 0) + rig_debug(RIG_DEBUG_CACHE, "%s: sending multicast packet timeout\n", __func__); + else rig_debug(RIG_DEBUG_ERR, "%s: sending multicast packet due to change\n", __func__); +// multicast_status_changed(rig); multicast_send_json(rig); loopcount = 8; freqAsave = freqA; freqBsave = freqB; + modeAsave = modeA; + modeBsave = modeB; + pttsave = ptt; + loopcount = 8; } else { + //rig_debug(RIG_DEBUG_VERBOSE, "%s: loop\n", __func__); hl_usleep(100 * 1000); } @@ -354,6 +380,7 @@ static char *GetWinsockLastError(char *errorBuffer, DWORD errorBufferSize) int multicast_init(RIG *rig, char *addr, int port) { + if (rig->state.multicast && rig->state.multicast->multicast_running) return RIG_OK; #ifdef _WIN32 WSADATA wsaData; @@ -453,7 +480,7 @@ int multicast_init(RIG *rig, char *addr, int port) rig->state.multicast->dest_addr.sin_addr.s_addr = inet_addr(addr); rig->state.multicast->dest_addr.sin_port = htons(port); -#if 0 +#if 1 rig->state.multicast->runflag = 1; pthread_create(&rig->state.multicast->threadid, NULL, multicast_thread, (void *)rig); diff --git a/src/network.c b/src/network.c index ecd963bc9..7621d6911 100644 --- a/src/network.c +++ b/src/network.c @@ -902,6 +902,8 @@ void *multicast_publisher(void *arg) dest_addr.sin_addr.s_addr = inet_addr(args->multicast_addr); dest_addr.sin_port = htons(args->multicast_port); + rs->multicast_publisher_run = 1; + while (rs->multicast_publisher_run) { result = multicast_publisher_read_packet(args, &packet_type, &spectrum_line, diff --git a/src/rig.c b/src/rig.c index 6b17b5520..77c3121e3 100644 --- a/src/rig.c +++ b/src/rig.c @@ -1486,6 +1486,7 @@ int HAMLIB_API rig_open(RIG *rig) memcpy(&rs->pttport_deprecated, &rs->pttport, sizeof(hamlib_port_t_deprecated)); memcpy(&rs->dcdport_deprecated, &rs->dcdport, sizeof(hamlib_port_t_deprecated)); rig_flush_force(&rs->rigport, 1); + if (rig->caps->rig_model != RIG_MODEL_NETRIGCTL) multicast_init(rig, "224.0.0.1", 4532); RETURNFUNC2(RIG_OK); }