diff --git a/.vscode/launch.json b/.vscode/launch.json index 94b71b0..d6dd4ae 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -109,7 +109,7 @@ "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/DGWVoiceTransmit/dgwvoicetransmit", - "args": ["F4FXL B", "${workspaceFolder}/Sandbox/Announce_F5ZEE__B.dvtool", "-text", "www.F5KAV.fr"], + "args": ["F4FXL B", "${workspaceFolder}/Sandbox/Announce_F5ZEE__B.dvtool", "-text", "www.F5KAV.fr", "-dprs", "!4858.72ND00736.91E&RNG0037/A=000098 440 Voice 439.80000MHz -9.4000MHz"], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], diff --git a/APRS/APRSUtils.cpp b/APRS/APRSUtils.cpp index 2309344..5684088 100644 --- a/APRS/APRSUtils.cpp +++ b/APRS/APRSUtils.cpp @@ -37,8 +37,12 @@ unsigned int CAPRSUtils::calcGPSAIcomCRC(const std::string& gpsa) { unsigned int icomcrc = 0xFFFFU; + unsigned int dataBegin = 0U; + if(boost::starts_with(gpsa, "$$CRC") && gpsa.length() >= 10 && gpsa[9] == ',') + dataBegin = 10U; + auto length = gpsa.length(); - for (unsigned int j = 10U; j < length; j++) { + for (unsigned int j = dataBegin; j < length; j++) { unsigned char ch = (unsigned char)gpsa[j]; for (unsigned int i = 0U; i < 8U; i++) { diff --git a/Tests/APRSUtils/calcGPSAIcomCRC.cpp b/Tests/APRSUtils/calcGPSAIcomCRC.cpp new file mode 100644 index 0000000..9d5850c --- /dev/null +++ b/Tests/APRSUtils/calcGPSAIcomCRC.cpp @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2021-2022 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 APRStoDPRSTests +{ + class APRSUtils_calcGPSAIcomCRC : public ::testing::Test { + }; + + TEST_F(APRSUtils_calcGPSAIcomCRC, withCRCHeader) + { + auto crc = CAPRSUtils::calcGPSAIcomCRC("$$CRC6F5E,ABCDEF"); + + EXPECT_EQ(crc, 0x6f5e) << "CRC shall be valid"; + } + + TEST_F(APRSUtils_calcGPSAIcomCRC, withoutCRCHeader) + { + auto crc = CAPRSUtils::calcGPSAIcomCRC("ABCDEF"); + + EXPECT_EQ(crc, 0x6f5e) << "CRC shall be valid"; + } +} \ No newline at end of file