M17: added callsign-based squelch for incoming transmissions

pull/227/head
Morgan Diepart 2023-10-22 21:13:27 -07:00 zatwierdzone przez Silvano Seva
rodzic 5ec0587c48
commit 2653ee01aa
2 zmienionych plików z 42 dodań i 1 usunięć

Wyświetl plik

@ -121,6 +121,19 @@ private:
*/
void txState(rtxStatus_t *const status);
/**
* Compare two callsigns in plain text form.
* The comparison does not take into account the country prefixes (strips
* the '/' and whatever is in front from all callsigns). It does take into
* account the dash and whatever is after it. In case the incoming callsign
* is "ALL" the function returns true.
*
* \param localCs plain text callsign from the user
* \param incomingCs plain text destination callsign
* \return true if local an incoming callsigns match.
*/
bool compareCallsigns(const std::string& localCs, const std::string& incomingCs);
bool startRx; ///< Flag for RX management.
bool startTx; ///< Flag for TX management.

Wyświetl plik

@ -268,8 +268,13 @@ void OpMode_M17::rxState(rtxStatus_t *const status)
bool canMatch = (streamType.fields.CAN == status->can)
|| (status->canRxEn == false);
// Check if the destination callsign of the incoming transmission
// matches with ours
bool callMatch = compareCallsigns(std::string(status->source_address), dst);
// Extract audio data
if((type == M17FrameType::STREAM) && (pthSts == PATH_OPEN) && (canMatch == true))
if((type == M17FrameType::STREAM) && (pthSts == PATH_OPEN) &&
(canMatch == true) && (callMatch == true))
{
M17StreamFrame sf = decoder.getStreamFrame();
codec_pushFrame(sf.payload().data(), false);
@ -359,3 +364,26 @@ void OpMode_M17::txState(rtxStatus_t *const status)
modulator.stop();
}
}
bool OpMode_M17::compareCallsigns(const std::string& localCs,
const std::string& incomingCs)
{
if(incomingCs == "ALL")
return true;
std::string truncatedLocal(localCs);
std::string truncatedIncoming(incomingCs);
int slashPos = localCs.find_first_of('/');
if(slashPos <= 2)
truncatedLocal = localCs.substr(slashPos + 1);
slashPos = incomingCs.find_first_of('/');
if(slashPos <= 2)
truncatedIncoming = incomingCs.substr(slashPos + 1);
if(truncatedLocal == truncatedIncoming)
return true;
return false;
}