diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 6d6532b..9f00615 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -13,10 +13,7 @@ "USE_GPSD=1", "all" ], - "group": { - "kind": "build", - "isDefault": true - }, + "group": "build", "problemMatcher": [] }, { @@ -94,7 +91,10 @@ "ENABLE_DEBUG=1", "USE_GPSD=1" ], - "group": "build", + "group": { + "kind": "build", + "isDefault": true + }, "problemMatcher": [] } ] diff --git a/Common/HeardData.cpp b/Common/HeardData.cpp index 8db0434..1b1ac8d 100644 --- a/Common/HeardData.cpp +++ b/Common/HeardData.cpp @@ -67,8 +67,8 @@ bool CHeardData::setIcomRepeaterData(const unsigned char *data, unsigned int len std::string suser((const char *)data + 10U); std::string srptr((const char *)data + 18U); - m_user = suser.substr(LONG_CALLSIGN_LENGTH); - m_repeater = srptr.substr(LONG_CALLSIGN_LENGTH); + m_user = suser.substr(0, LONG_CALLSIGN_LENGTH); + m_repeater = srptr.substr(0, LONG_CALLSIGN_LENGTH); m_address = address; m_port = port; diff --git a/Common/NMEASentenceCollector.cpp b/Common/NMEASentenceCollector.cpp index 5136a61..4ad660c 100644 --- a/Common/NMEASentenceCollector.cpp +++ b/Common/NMEASentenceCollector.cpp @@ -107,6 +107,13 @@ bool CNMEASentenceCollector::getDataInt(std::string& data) std::string fromCall = getMyCall1(); CAPRSUtils::dstarCallsignToAPRS(fromCall); + + // 20230425 Fix for https://github.com/F4FXL/DStarGateway/issues/33 + size_t hyphenIndex = fromCall.find('-'); + if(hyphenIndex != std::string::npos) { + fromCall = fromCall.substr(0, hyphenIndex); + } + std::string aprsFrame(fromCall); aprsFrame.append("-5>GPS30,DSTAR*:") .append(nmea); diff --git a/README.md b/README.md index b709a3a..2a95cc1 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,7 @@ The testing framwework used is Google Test. # 5. Version History ## 5.1. Version 0.7 +- [**Bugfix**] Malformed callsign in some cases when using DV-G (NMEA) ([#33](https://github.com/F4FXL/DStarGateway/issues/33)) - [**Bugfix**] Crash on startup with Icom Hardware. Thanks to Josh AB9FT for reporting the issue.([#31](https://github.com/F4FXL/DStarGateway/issues/31)) - [**Improvement**] Add/Fix DPRS Object support([#28](https://github.com/F4FXL/DStarGateway/issues/28)) - [**Improvement**] Log incoming DPRS frames so they can be used in e.g. dashboards([#29](https://github.com/F4FXL/DStarGateway/issues/29)) diff --git a/Tests/APRSUtils/calcGPSAIcomCRC.cpp b/Tests/APRSUtils/calcGPSAIcomCRC.cpp index 9d5850c..d6a96d5 100644 --- a/Tests/APRSUtils/calcGPSAIcomCRC.cpp +++ b/Tests/APRSUtils/calcGPSAIcomCRC.cpp @@ -20,7 +20,7 @@ #include "APRSUtils.h" -namespace APRStoDPRSTests +namespace APRSUtilsTests { class APRSUtils_calcGPSAIcomCRC : public ::testing::Test { }; diff --git a/Tests/APRSUtils/dstarCallsignToAPRS.cpp b/Tests/APRSUtils/dstarCallsignToAPRS.cpp new file mode 100644 index 0000000..4f8cdcb --- /dev/null +++ b/Tests/APRSUtils/dstarCallsignToAPRS.cpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2021-2023 by Geoffrey Merck F4FXL / KC3FRA + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include + +#include "APRSUtils.h" + +namespace APRSUtilsTests +{ + class APRSUtils_dstarCallsignToAPRS : public ::testing::Test { + }; + + TEST_F(APRSUtils_dstarCallsignToAPRS, noBlanks) + { + std::string call("N0CALL"); + CAPRSUtils::dstarCallsignToAPRS(call); + + EXPECT_STRCASEEQ(call.c_str(), "N0CALL") << "Call shall not have changed"; + } + + TEST_F(APRSUtils_dstarCallsignToAPRS, twoBlanks) + { + std::string call("F4ABC B"); + CAPRSUtils::dstarCallsignToAPRS(call); + + EXPECT_STRCASEEQ(call.c_str(), "F4ABC-B") << "-H shall have been removed"; + } + + TEST_F(APRSUtils_dstarCallsignToAPRS, threeBlanks) + { + std::string call("F4AB B"); + CAPRSUtils::dstarCallsignToAPRS(call); + + EXPECT_STRCASEEQ(call.c_str(), "F4AB-B") << "-H shall have been removed"; + } +} \ No newline at end of file diff --git a/Tests/NMEASentenceCollector/getData.cpp b/Tests/NMEASentenceCollector/getData.cpp new file mode 100644 index 0000000..1b6eb32 --- /dev/null +++ b/Tests/NMEASentenceCollector/getData.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2021-2023 by Geoffrey Merck F4FXL / KC3FRA + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include + +#include "NMEASentenceCollector.h" + +namespace NMEASentenceCollectorTests +{ + class NMEASentenceCollectorTests_getData: public ::testing::Test + { + protected: + CNMEASentenceCollector * m_collector; + + void SetUp() override + { + m_collector = new CNMEASentenceCollector("$GPRMC"); + + std::string nmea("$GPRMC,092751.000,A,5321.6802,N,00630.3371,W,0.06,31.66,280511,,,A*45\x0A"); + + unsigned char data[3]; + unsigned int len = nmea.length() + (nmea.length() % 3); + bool first = true; + + for (unsigned int i = 0; i < len;) { + if(first) { + data[0] = SLOW_DATA_TYPE_GPS ^ SCRAMBLER_BYTE1; + first = false; + } + else { + data[0] = (i < nmea.length() ? nmea[i] : 'f') ^ SCRAMBLER_BYTE1; + i++; + first = true; + } + data[1] = (i < nmea.length() ? nmea[i] : 'f') ^ SCRAMBLER_BYTE2; + i++; + data[2] = (i < nmea.length() ? nmea[i] : 'f') ^ SCRAMBLER_BYTE3; + i++; + + m_collector->writeData(data); + } + + } + + void TearDown() override + { + delete m_collector; + } + }; + + TEST_F(NMEASentenceCollectorTests_getData, noSSIDinCallsign) + { + std::string data; + + m_collector->setMyCall1("N0CALL"); + m_collector->setMyCall2("5100"); + m_collector->getData(data); + + EXPECT_STREQ(data.c_str(), "N0CALL-5>GPS30,DSTAR*:$GPRMC,092751.000,A,5321.6802,N,00630.3371,W,0.06,31.66,280511,,,A*45"); + } + + TEST_F(NMEASentenceCollectorTests_getData, SSIDinCallsign) + { + std::string data; + + m_collector->setMyCall1("N0CALL H"); + m_collector->setMyCall2("5100"); + m_collector->getData(data); + + EXPECT_STREQ(data.c_str(), "N0CALL-5>GPS30,DSTAR*:$GPRMC,092751.000,A,5321.6802,N,00630.3371,W,0.06,31.66,280511,,,A*45"); + } +} \ No newline at end of file