From a74a95360b5c53de7d1d50e61ec1ed006bcf1ab7 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Sun, 8 Nov 2020 15:20:24 +0000 Subject: [PATCH] Fix Wires-X passthrough and some code cleanups. --- DGIdGateway/DGIdGateway.cpp | 22 +++++----- DGIdGateway/GPS.cpp | 9 +++- DGIdGateway/GPS.h | 5 ++- DGIdGateway/YSFFICH.cpp | 16 ++++++- DGIdGateway/YSFFICH.h | 2 + YSFGateway/GPS.cpp | 9 +++- YSFGateway/GPS.h | 5 ++- YSFGateway/Version.h | 2 +- YSFGateway/WiresX.cpp | 18 ++++++-- YSFGateway/WiresX.h | 5 ++- YSFGateway/YSFFICH.cpp | 88 ++++++++++++++++++++++++++++++++++--- YSFGateway/YSFFICH.h | 18 +++++++- YSFGateway/YSFGateway.cpp | 18 +++----- YSFGateway/YSFGateway.h | 3 +- YSFGateway/YSFNetwork.cpp | 14 +++++- 15 files changed, 184 insertions(+), 50 deletions(-) diff --git a/DGIdGateway/DGIdGateway.cpp b/DGIdGateway/DGIdGateway.cpp index 9da6881..7e53bb6 100644 --- a/DGIdGateway/DGIdGateway.cpp +++ b/DGIdGateway/DGIdGateway.cpp @@ -420,10 +420,6 @@ int CDGIdGateway::run() CYSFFICH fich; bool valid = fich.decode(buffer + 35U); if (valid) { - unsigned char fi = fich.getFI(); - unsigned char dt = fich.getDT(); - unsigned char fn = fich.getFN(); - unsigned char ft = fich.getFT(); unsigned char dgId = fich.getDGId(); if (dgId == WIRESX_DGID) @@ -456,17 +452,21 @@ int CDGIdGateway::run() } if (m_gps != NULL) - m_gps->data(buffer + 14U, buffer + 35U, fi, dt, fn, ft); + m_gps->data(buffer + 14U, buffer + 35U, fich); if (currentDGId != UNSET_DGID && dgIdNetwork[currentDGId] != NULL) { // Only allow the wanted modes through - if ((dt == YSF_DT_VD_MODE1 && (dgIdNetwork[currentDGId]->m_modes & DT_VD_MODE1) != 0U) || - (dt == YSF_DT_DATA_FR_MODE && (dgIdNetwork[currentDGId]->m_modes & DT_DATA_FR_MODE) != 0U) || - (dt == YSF_DT_VD_MODE2 && (dgIdNetwork[currentDGId]->m_modes & DT_VD_MODE2) != 0U) || + unsigned char dt = fich.getDT(); + if ((dt == YSF_DT_VD_MODE1 && (dgIdNetwork[currentDGId]->m_modes & DT_VD_MODE1) != 0U) || + (dt == YSF_DT_DATA_FR_MODE && (dgIdNetwork[currentDGId]->m_modes & DT_DATA_FR_MODE) != 0U) || + (dt == YSF_DT_VD_MODE2 && (dgIdNetwork[currentDGId]->m_modes & DT_VD_MODE2) != 0U) || (dt == YSF_DT_VOICE_FR_MODE && (dgIdNetwork[currentDGId]->m_modes & DT_VOICE_FR_MODE) != 0U)) { - unsigned int dgId = dgIdNetwork[currentDGId]->getDGId(); - fich.setDGId(dgId); - fich.encode(buffer + 35U); + unsigned char origDGId = fich.getDGId(); + if (origDGId != WIRESX_DGID) { + unsigned int newDGId = dgIdNetwork[currentDGId]->getDGId(); + fich.setDGId(newDGId); + fich.encode(buffer + 35U); + } dgIdNetwork[currentDGId]->write(currentDGId, buffer); } diff --git a/DGIdGateway/GPS.cpp b/DGIdGateway/GPS.cpp index a25118c..50cf2d4 100644 --- a/DGIdGateway/GPS.cpp +++ b/DGIdGateway/GPS.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX +* Copyright (C) 2016,2017,2018,2020 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -45,16 +45,21 @@ CGPS::~CGPS() delete[] m_buffer; } -void CGPS::data(const unsigned char* source, const unsigned char* data, unsigned char fi, unsigned char dt, unsigned char fn, unsigned char ft) +void CGPS::data(const unsigned char* source, const unsigned char* data, const CYSFFICH& fich) { if (m_sent) return; + unsigned char fi = fich.getFI(); if (fi != YSF_FI_COMMUNICATIONS) return; CYSFPayload payload; + unsigned char dt = fich.getDT(); + unsigned char fn = fich.getFN(); + unsigned char ft = fich.getFT(); + if (dt == YSF_DT_VD_MODE1) { if (fn == 0U || fn == 1U || fn == 2U) return; diff --git a/DGIdGateway/GPS.h b/DGIdGateway/GPS.h index cbdf838..28ed617 100644 --- a/DGIdGateway/GPS.h +++ b/DGIdGateway/GPS.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX +* Copyright (C) 2016,2017,2018,2020 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,6 +20,7 @@ #define GPS_H #include "APRSWriter.h" +#include "YSFFICH.h" #include @@ -28,7 +29,7 @@ public: CGPS(CAPRSWriter* writer); ~CGPS(); - void data(const unsigned char* source, const unsigned char* data, unsigned char fi, unsigned char dt, unsigned char fn, unsigned char ft); + void data(const unsigned char* source, const unsigned char* data, const CYSFFICH& fich); void reset(); diff --git a/DGIdGateway/YSFFICH.cpp b/DGIdGateway/YSFFICH.cpp index 36ec305..e4f800a 100644 --- a/DGIdGateway/YSFFICH.cpp +++ b/DGIdGateway/YSFFICH.cpp @@ -63,9 +63,9 @@ m_fich(NULL) } CYSFFICH::CYSFFICH() : -m_fich(NULL) + m_fich(NULL) { - m_fich = new unsigned char[6U]; + m_fich = new unsigned char[6U]; memset(m_fich, 0x00U, 6U); } @@ -235,6 +235,18 @@ void CYSFFICH::setFI(unsigned char fi) m_fich[0U] |= (fi << 6) & 0xC0U; } +void CYSFFICH::setBN(unsigned char bn) +{ + m_fich[0U] &= 0xFCU; + m_fich[0U] |= bn & 0x03U; +} + +void CYSFFICH::setBT(unsigned char bt) +{ + m_fich[1U] &= 0x3FU; + m_fich[1U] |= (bt << 6) & 0xC0U; +} + void CYSFFICH::setFN(unsigned char fn) { m_fich[1U] &= 0xC7U; diff --git a/DGIdGateway/YSFFICH.h b/DGIdGateway/YSFFICH.h index 4a15250..ed2ae71 100644 --- a/DGIdGateway/YSFFICH.h +++ b/DGIdGateway/YSFFICH.h @@ -45,6 +45,8 @@ public: unsigned char getDGId() const; void setFI(unsigned char fi); + void setBN(unsigned char bn); + void setBT(unsigned char bt); void setFN(unsigned char fn); void setFT(unsigned char ft); void setMR(unsigned char mr); diff --git a/YSFGateway/GPS.cpp b/YSFGateway/GPS.cpp index a25118c..50cf2d4 100644 --- a/YSFGateway/GPS.cpp +++ b/YSFGateway/GPS.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX +* Copyright (C) 2016,2017,2018,2020 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -45,16 +45,21 @@ CGPS::~CGPS() delete[] m_buffer; } -void CGPS::data(const unsigned char* source, const unsigned char* data, unsigned char fi, unsigned char dt, unsigned char fn, unsigned char ft) +void CGPS::data(const unsigned char* source, const unsigned char* data, const CYSFFICH& fich) { if (m_sent) return; + unsigned char fi = fich.getFI(); if (fi != YSF_FI_COMMUNICATIONS) return; CYSFPayload payload; + unsigned char dt = fich.getDT(); + unsigned char fn = fich.getFN(); + unsigned char ft = fich.getFT(); + if (dt == YSF_DT_VD_MODE1) { if (fn == 0U || fn == 1U || fn == 2U) return; diff --git a/YSFGateway/GPS.h b/YSFGateway/GPS.h index cbdf838..28ed617 100644 --- a/YSFGateway/GPS.h +++ b/YSFGateway/GPS.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX +* Copyright (C) 2016,2017,2018,2020 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,6 +20,7 @@ #define GPS_H #include "APRSWriter.h" +#include "YSFFICH.h" #include @@ -28,7 +29,7 @@ public: CGPS(CAPRSWriter* writer); ~CGPS(); - void data(const unsigned char* source, const unsigned char* data, unsigned char fi, unsigned char dt, unsigned char fn, unsigned char ft); + void data(const unsigned char* source, const unsigned char* data, const CYSFFICH& fich); void reset(); diff --git a/YSFGateway/Version.h b/YSFGateway/Version.h index 1ac5058..609091c 100644 --- a/YSFGateway/Version.h +++ b/YSFGateway/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20201104"; +const char* VERSION = "20201108"; #endif diff --git a/YSFGateway/WiresX.cpp b/YSFGateway/WiresX.cpp index 1042a85..dcde0b1 100644 --- a/YSFGateway/WiresX.cpp +++ b/YSFGateway/WiresX.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2017,2018,2019 by Jonathan Naylor G4KLX +* Copyright (C) 2016,2017,2018,2019,2020 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -39,10 +39,12 @@ const unsigned char CONN_RESP[] = {0x5DU, 0x41U, 0x5FU, 0x26U}; const unsigned char DISC_RESP[] = {0x5DU, 0x41U, 0x5FU, 0x26U}; const unsigned char ALL_RESP[] = {0x5DU, 0x46U, 0x5FU, 0x26U}; -const unsigned char DEFAULT_FICH[] = {0x20U, 0x00U, 0x01U, 0x00U}; +const unsigned char DEFAULT_FICH[] = {0x20U, 0x00U, 0x01U, 0x7FU}; const unsigned char NET_HEADER[] = "YSFD ALL "; +const unsigned char WIRESX_DGID = 127U; + CWiresX::CWiresX(const std::string& callsign, const std::string& suffix, CYSFNetwork* network, CYSFReflectors& reflectors) : m_callsign(callsign), m_node(), @@ -185,19 +187,26 @@ bool CWiresX::start() return true; } -WX_STATUS CWiresX::process(const unsigned char* data, const unsigned char* source, unsigned char fi, unsigned char dt, unsigned char fn, unsigned char ft, bool wiresXCommandPassthrough) +WX_STATUS CWiresX::process(const unsigned char* data, const unsigned char* source, const CYSFFICH& fich, bool wiresXCommandPassthrough) { assert(data != NULL); assert(source != NULL); + unsigned char dt = fich.getDT(); if (dt != YSF_DT_DATA_FR_MODE) return WXS_NONE; + unsigned char dgId = fich.getDGId(); + if (dgId != WIRESX_DGID) + return WXS_NONE; + + unsigned char fi = fich.getFI(); if (fi != YSF_FI_COMMUNICATIONS) return WXS_NONE; CYSFPayload payload; + unsigned char fn = fich.getFN(); if (fn == 0U) return WXS_NONE; @@ -215,6 +224,7 @@ WX_STATUS CWiresX::process(const unsigned char* data, const unsigned char* sourc return WXS_NONE; } + unsigned char ft = fich.getFT(); if (fn == ft) { bool valid = false; @@ -503,7 +513,7 @@ void CWiresX::createReply(const unsigned char* data, unsigned int length, CYSFNe CSync::add(buffer + 35U); CYSFFICH fich; - fich.load(DEFAULT_FICH); + fich.setRaw(DEFAULT_FICH); fich.setFI(YSF_FI_HEADER); fich.setBT(bt); fich.setFT(ft); diff --git a/YSFGateway/WiresX.h b/YSFGateway/WiresX.h index 3ff6d0c..9966b8c 100644 --- a/YSFGateway/WiresX.h +++ b/YSFGateway/WiresX.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2017,2018,2019 by Jonathan Naylor G4KLX +* Copyright (C) 2016,2017,2018,2019,2020 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,7 @@ #include "YSFReflectors.h" #include "YSFNetwork.h" +#include "YSFFICH.h" #include "Timer.h" #include "StopWatch.h" #include "RingBuffer.h" @@ -59,7 +60,7 @@ public: bool start(); bool isBusy() const; - WX_STATUS process(const unsigned char* data, const unsigned char* source, unsigned char fi, unsigned char dt, unsigned char fn, unsigned char ft, bool wiresXCommandPassthrough); + WX_STATUS process(const unsigned char* data, const unsigned char* source, const CYSFFICH& fich, bool wiresXCommandPassthrough); CYSFReflector* getReflector() const; void setReflector(CYSFReflector* reflector); diff --git a/YSFGateway/YSFFICH.cpp b/YSFGateway/YSFFICH.cpp index 1198ed3..fb0726e 100644 --- a/YSFGateway/YSFFICH.cpp +++ b/YSFGateway/YSFFICH.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2016 by Jonathan Naylor G4KLX + * Copyright (C) 2016,2017,2019,2020 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -52,12 +52,22 @@ const unsigned int INTERLEAVE_TABLE[] = { 32U, 72U, 112U, 152U, 192U, 34U, 74U, 114U, 154U, 194U, 36U, 76U, 116U, 156U, 196U, - 38U, 78U, 118U, 158U, 198U}; + 38U, 78U, 118U, 158U, 198U }; -CYSFFICH::CYSFFICH() : +CYSFFICH::CYSFFICH(const CYSFFICH& fich) : m_fich(NULL) { - m_fich = new unsigned char[6U]; + m_fich = new unsigned char[6U]; + + ::memcpy(m_fich, fich.m_fich, 6U); +} + +CYSFFICH::CYSFFICH() : + m_fich(NULL) +{ + m_fich = new unsigned char[6U]; + + memset(m_fich, 0x00U, 6U); } CYSFFICH::~CYSFFICH() @@ -159,6 +169,16 @@ void CYSFFICH::encode(unsigned char* bytes) } } +void CYSFFICH::setRaw(const unsigned char* bytes) +{ + ::memcpy(m_fich, bytes, 4U); +} + +void CYSFFICH::getRaw(unsigned char* bytes) const +{ + ::memcpy(bytes, m_fich, 4U); +} + unsigned char CYSFFICH::getFI() const { return (m_fich[0U] >> 6) & 0x03U; @@ -169,6 +189,16 @@ unsigned char CYSFFICH::getCM() const return (m_fich[0U] >> 2) & 0x03U; } +unsigned char CYSFFICH::getBN() const +{ + return m_fich[0U] & 0x03U; +} + +unsigned char CYSFFICH::getBT() const +{ + return (m_fich[1U] >> 6) & 0x03U; +} + unsigned char CYSFFICH::getFN() const { return (m_fich[1U] >> 3) & 0x07U; @@ -184,11 +214,19 @@ unsigned char CYSFFICH::getDT() const return m_fich[2U] & 0x03U; } -void CYSFFICH::load(const unsigned char* fich) +unsigned char CYSFFICH::getMR() const +{ + return (m_fich[2U] >> 3) & 0x03U; +} + +bool CYSFFICH::getDev() const { - assert(fich != NULL); + return (m_fich[2U] & 0x40U) == 0x40U; +} - ::memcpy(m_fich, fich, 4U); +unsigned char CYSFFICH::getDGId() const +{ + return m_fich[3U] & 0x7FU; } void CYSFFICH::setFI(unsigned char fi) @@ -220,3 +258,39 @@ void CYSFFICH::setFT(unsigned char ft) m_fich[1U] &= 0xF8U; m_fich[1U] |= ft & 0x07U; } + +void CYSFFICH::setMR(unsigned char mr) +{ + m_fich[2U] &= 0xC7U; + m_fich[2U] |= (mr << 3) & 0x38U; +} + +void CYSFFICH::setVoIP(bool on) +{ + if (on) + m_fich[2U] |= 0x04U; + else + m_fich[2U] &= 0xFBU; +} + +void CYSFFICH::setDev(bool on) +{ + if (on) + m_fich[2U] |= 0x40U; + else + m_fich[2U] &= 0xBFU; +} + +void CYSFFICH::setDGId(unsigned char id) +{ + m_fich[3U] &= 0x80U; + m_fich[3U] |= id & 0x7FU; +} + +CYSFFICH& CYSFFICH::operator=(const CYSFFICH& fich) +{ + if (&fich != this) + ::memcpy(m_fich, fich.m_fich, 6U); + + return *this; +} diff --git a/YSFGateway/YSFFICH.h b/YSFGateway/YSFFICH.h index 8dc8211..0edad10 100644 --- a/YSFGateway/YSFFICH.h +++ b/YSFGateway/YSFFICH.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016 by Jonathan Naylor G4KLX + * Copyright (C) 2016,2017,2019,2020 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,7 @@ class CYSFFICH { public: + CYSFFICH(const CYSFFICH& fich); CYSFFICH(); ~CYSFFICH(); @@ -28,19 +29,32 @@ public: void encode(unsigned char* bytes); + void setRaw(const unsigned char* bytes); + + void getRaw(unsigned char* bytes) const; + unsigned char getFI() const; unsigned char getCM() const; + unsigned char getBN() const; + unsigned char getBT() const; unsigned char getFN() const; unsigned char getFT() const; unsigned char getDT() const; + unsigned char getMR() const; + bool getDev() const; + unsigned char getDGId() const; void setFI(unsigned char fi); void setBN(unsigned char bn); void setBT(unsigned char bt); void setFN(unsigned char fn); void setFT(unsigned char ft); + void setMR(unsigned char mr); + void setVoIP(bool set); + void setDev(bool set); + void setDGId(unsigned char id); - void load(const unsigned char* fich); + CYSFFICH& operator=(const CYSFFICH& fich); private: unsigned char* m_fich; diff --git a/YSFGateway/YSFGateway.cpp b/YSFGateway/YSFGateway.cpp index 49f0dc6..1318ca5 100644 --- a/YSFGateway/YSFGateway.cpp +++ b/YSFGateway/YSFGateway.cpp @@ -122,8 +122,7 @@ int CYSFGateway::run() if (pid == -1) { ::fprintf(stderr, "Couldn't fork() , exiting\n"); return -1; - } - else if (pid != 0) { + } else if (pid != 0) { exit(EXIT_SUCCESS); } @@ -191,7 +190,7 @@ int CYSFGateway::run() m_callsign = m_conf.getCallsign(); m_suffix = m_conf.getSuffix(); - bool debug = m_conf.getNetworkDebug(); + bool debug = m_conf.getDebug(); sockaddr_storage rptAddr; unsigned int rptAddrLen; if (CUDPSocket::lookup(m_conf.getRptAddress(), m_conf.getRptPort(), rptAddr, rptAddrLen) != 0) { @@ -277,22 +276,19 @@ int CYSFGateway::run() bool valid = fich.decode(buffer + 35U); m_exclude = false; if (valid) { - unsigned char fi = fich.getFI(); unsigned char dt = fich.getDT(); - unsigned char fn = fich.getFN(); - unsigned char ft = fich.getFT(); CYSFReflector* reflector = m_wiresX->getReflector(); if (m_ysfNetwork != NULL && m_linkType == LINK_YSF && wiresXCommandPassthrough && reflector->m_wiresX) { processDTMF(buffer, dt); - m_exclude = processWiresX(buffer, fi, dt, fn, ft, true, wiresXCommandPassthrough); + m_exclude = processWiresX(buffer, fich, true, wiresXCommandPassthrough); } else { processDTMF(buffer, dt); - m_exclude = processWiresX(buffer, fi, dt, fn, ft, false, wiresXCommandPassthrough); + m_exclude = processWiresX(buffer, fich, false, wiresXCommandPassthrough); } if (m_gps != NULL) - m_gps->data(buffer + 14U, buffer + 35U, fi, dt, fn, ft); + m_gps->data(buffer + 14U, buffer + 35U, fich); } if (m_ysfNetwork != NULL && m_linkType == LINK_YSF && !m_exclude) { @@ -534,13 +530,13 @@ void CYSFGateway::createWiresX(CYSFNetwork* rptNetwork) m_wiresX->start(); } -bool CYSFGateway::processWiresX(const unsigned char* buffer, unsigned char fi, unsigned char dt, unsigned char fn, unsigned char ft, bool dontProcessWiresXLocal, bool wiresXCommandPassthrough) +bool CYSFGateway::processWiresX(const unsigned char* buffer, const CYSFFICH& fich, bool dontProcessWiresXLocal, bool wiresXCommandPassthrough) { bool ret=true; assert(buffer != NULL); - WX_STATUS status = m_wiresX->process(buffer + 35U, buffer + 14U, fi, dt, fn, ft, dontProcessWiresXLocal); + WX_STATUS status = m_wiresX->process(buffer + 35U, buffer + 14U, fich, dontProcessWiresXLocal); switch (status) { case WXS_CONNECT_YSF: { if (m_linkType == LINK_YSF) diff --git a/YSFGateway/YSFGateway.h b/YSFGateway/YSFGateway.h index c0d75ce..069a95c 100644 --- a/YSFGateway/YSFGateway.h +++ b/YSFGateway/YSFGateway.h @@ -23,6 +23,7 @@ #include "YSFReflectors.h" #include "FCSNetwork.h" #include "APRSWriter.h" +#include "YSFFICH.h" #include "WiresX.h" #include "Timer.h" #include "Conf.h" @@ -68,7 +69,7 @@ private: void startupLinking(); std::string calculateLocator(); - bool processWiresX(const unsigned char* buffer, unsigned char fi, unsigned char dt, unsigned char fn, unsigned char ft, bool dontProcessWiresXLocal, bool wiresXCommandPassthrough); + bool processWiresX(const unsigned char* buffer, const CYSFFICH& fich, bool dontProcessWiresXLocal, bool wiresXCommandPassthrough); void processDTMF(unsigned char* buffer, unsigned char dt); void createWiresX(CYSFNetwork* rptNetwork); void createGPS(); diff --git a/YSFGateway/YSFNetwork.cpp b/YSFGateway/YSFNetwork.cpp index e32d913..f139c53 100644 --- a/YSFGateway/YSFNetwork.cpp +++ b/YSFGateway/YSFNetwork.cpp @@ -119,7 +119,13 @@ bool CYSFNetwork::setDestination(const std::string& name, const sockaddr_storage m_addrLen = addrLen; m_linked = false; - return open(); + bool ret = open(); + if (ret) { + m_pollTimer.start(); + return true; + } else { + return false; + } } void CYSFNetwork::clearDestination() @@ -152,6 +158,9 @@ void CYSFNetwork::writePoll(unsigned int count) m_pollTimer.start(); + if (m_debug) + CUtils::dump(1U, "YSF Network Data Sent", m_poll, 14U); + for (unsigned int i = 0U; i < count; i++) m_socket.write(m_poll, 14U, m_addr, m_addrLen); @@ -181,6 +190,9 @@ void CYSFNetwork::writeUnlink(unsigned int count) if (m_addrLen == 0U) return; + if (m_debug) + CUtils::dump(1U, "YSF Network Data Sent", m_unlink, 14U); + for (unsigned int i = 0U; i < count; i++) m_socket.write(m_unlink, 14U, m_addr, m_addrLen);