2020-04-01 23:22:12 +02:00
/*
2025-03-15 18:03:06 +01:00
* Copyright ( C ) 2017 , 2020 , 2025 by Jonathan Naylor G4KLX
2020-04-01 23:22:12 +02:00
*
* 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 0213 9 , USA .
*/
# include "RewriteDynTGRF.h"
# include "DMRDefines.h"
# include "Log.h"
# include <cstdio>
# include <cassert>
2020-04-08 00:03:27 +02:00
# include <algorithm>
2020-04-01 23:22:12 +02:00
2020-04-08 00:03:27 +02:00
CRewriteDynTGRF : : CRewriteDynTGRF ( const std : : string & name , unsigned int slot , unsigned int fromTG , unsigned int toTG , unsigned int discPC , unsigned int statusPC , unsigned int range , const std : : vector < unsigned int > & exclTGs , CRewriteDynTGNet * rewriteNet , CDynVoice * voice ) :
2020-04-01 23:22:12 +02:00
CRewrite ( ) ,
m_name ( name ) ,
m_slot ( slot ) ,
m_fromTGStart ( fromTG ) ,
m_fromTGEnd ( fromTG + range - 1U ) ,
m_toTG ( toTG ) ,
2020-04-05 14:43:57 +02:00
m_discPC ( discPC ) ,
m_statusPC ( statusPC ) ,
2020-04-08 00:03:27 +02:00
m_exclTGs ( exclTGs ) ,
2020-04-01 23:22:12 +02:00
m_rewriteNet ( rewriteNet ) ,
2020-04-03 17:54:35 +02:00
m_voice ( voice ) ,
2020-04-01 23:22:12 +02:00
m_currentTG ( 0U )
{
assert ( slot = = 1U | | slot = = 2U ) ;
2025-03-15 18:03:06 +01:00
assert ( rewriteNet ! = nullptr ) ;
2020-04-01 23:22:12 +02:00
}
CRewriteDynTGRF : : ~ CRewriteDynTGRF ( )
{
}
2020-04-03 16:10:41 +02:00
PROCESS_RESULT CRewriteDynTGRF : : process ( CDMRData & data , bool trace )
2020-04-01 23:22:12 +02:00
{
2020-04-03 17:54:35 +02:00
FLCO flco = data . getFLCO ( ) ;
unsigned int dstId = data . getDstId ( ) ;
2020-04-01 23:22:12 +02:00
unsigned int slotNo = data . getSlotNo ( ) ;
2020-04-03 17:54:35 +02:00
unsigned char type = data . getDataType ( ) ;
2020-04-01 23:22:12 +02:00
2025-03-15 18:03:06 +01:00
if ( flco = = FLCO : : GROUP & & slotNo = = m_slot & & dstId = = m_toTG ) {
2020-04-01 23:56:48 +02:00
if ( trace )
LogDebug ( " Rule Trace, \t RewriteDynTGRF from %s Slot=%u Dst=TG%u: matched " , m_name . c_str ( ) , m_slot , m_toTG ) ;
2020-04-08 18:28:43 +02:00
if ( m_currentTG ! = 0U ) {
data . setDstId ( m_currentTG ) ;
2020-04-01 23:56:48 +02:00
2020-04-08 18:28:43 +02:00
processMessage ( data ) ;
2020-04-08 00:03:27 +02:00
2025-03-15 18:03:06 +01:00
return PROCESS_RESULT : : MATCHED ;
2020-04-08 18:28:43 +02:00
} else {
2025-03-15 18:03:06 +01:00
return PROCESS_RESULT : : IGNORED ;
2020-04-08 18:28:43 +02:00
}
2020-04-08 00:03:27 +02:00
}
2020-04-08 18:28:43 +02:00
if ( slotNo = = m_slot & & dstId = = m_discPC ) {
2020-04-01 23:56:48 +02:00
if ( trace )
2020-04-05 14:43:57 +02:00
LogDebug ( " Rule Trace, \t RewriteDynTGRF from %s Slot=%u Dst=%u: matched " , m_name . c_str ( ) , m_slot , m_discPC ) ;
2020-04-08 18:28:43 +02:00
if ( m_currentTG ! = 0U ) {
2025-03-15 18:03:06 +01:00
data . setFLCO ( FLCO : : GROUP ) ;
2020-04-01 23:56:48 +02:00
2020-04-08 18:28:43 +02:00
processMessage ( data ) ;
2020-04-06 17:00:55 +02:00
2020-04-08 18:28:43 +02:00
if ( type = = DT_TERMINATOR_WITH_LC ) {
m_rewriteNet - > setCurrentTG ( 0U ) ;
m_currentTG = 0U ;
2025-03-15 18:03:06 +01:00
if ( m_voice ! = nullptr )
2020-04-08 18:28:43 +02:00
m_voice - > unlinked ( ) ;
}
2025-03-15 18:03:06 +01:00
return PROCESS_RESULT : : MATCHED ;
2020-04-08 18:28:43 +02:00
} else {
2025-03-15 18:03:06 +01:00
return PROCESS_RESULT : : IGNORED ;
2020-04-08 18:28:43 +02:00
}
}
if ( slotNo = = m_slot & & dstId = = m_statusPC ) {
if ( trace )
LogDebug ( " Rule Trace, \t RewriteDynTGRF from %s Slot=%u Dst=%u: matched " , m_name . c_str ( ) , m_slot , m_statusPC ) ;
2025-03-15 18:03:06 +01:00
if ( type = = DT_TERMINATOR_WITH_LC & & m_voice ! = nullptr ) {
2020-04-08 18:28:43 +02:00
if ( m_currentTG = = 0U )
2020-04-03 17:54:35 +02:00
m_voice - > unlinked ( ) ;
2020-04-08 18:28:43 +02:00
else
m_voice - > linkedTo ( m_currentTG ) ;
2020-04-03 17:54:35 +02:00
}
2020-04-01 23:56:48 +02:00
2025-03-15 18:03:06 +01:00
return PROCESS_RESULT : : IGNORED ;
2020-04-01 23:56:48 +02:00
}
2020-04-13 21:53:05 +02:00
if ( slotNo = = m_slot & & std : : find ( m_exclTGs . cbegin ( ) , m_exclTGs . cend ( ) , dstId ) ! = m_exclTGs . cend ( ) ) {
2020-04-08 18:28:43 +02:00
if ( trace )
2020-04-08 20:41:19 +02:00
LogDebug ( " Rule Trace, \t RewriteDynTGRF from %s Slot=%u Dst=%u: not matched " , m_name . c_str ( ) , m_slot , dstId ) ;
2020-04-08 18:28:43 +02:00
2025-03-15 18:03:06 +01:00
return PROCESS_RESULT : : UNMATCHED ;
2020-04-08 18:28:43 +02:00
}
if ( slotNo = = m_slot & & dstId > = m_fromTGStart & & dstId < = m_fromTGEnd ) {
2020-04-01 23:22:12 +02:00
if ( trace ) {
if ( m_fromTGStart = = m_fromTGEnd )
2020-04-05 14:43:57 +02:00
LogDebug ( " Rule Trace, \t RewriteDynTGRF from %s Slot=%u Dst=%u: matched " , m_name . c_str ( ) , m_slot , m_fromTGStart ) ;
2020-04-01 23:22:12 +02:00
else
2020-04-05 14:43:57 +02:00
LogDebug ( " Rule Trace, \t RewriteDynTGRF from %s Slot=%u Dst=%u-%u: matched " , m_name . c_str ( ) , m_slot , m_fromTGStart , m_fromTGEnd ) ;
2020-04-01 23:22:12 +02:00
}
2025-03-15 18:03:06 +01:00
data . setFLCO ( FLCO : : GROUP ) ;
2020-04-03 17:54:35 +02:00
2020-04-06 17:00:55 +02:00
processMessage ( data ) ;
2020-04-03 17:54:35 +02:00
if ( type = = DT_TERMINATOR_WITH_LC ) {
m_rewriteNet - > setCurrentTG ( dstId ) ;
m_currentTG = dstId ;
2025-03-15 18:03:06 +01:00
if ( m_voice ! = nullptr )
2020-04-03 17:54:35 +02:00
m_voice - > linkedTo ( dstId ) ;
}
2020-04-01 23:22:12 +02:00
2025-03-15 18:03:06 +01:00
return PROCESS_RESULT : : MATCHED ;
2020-04-01 23:22:12 +02:00
}
if ( trace ) {
if ( m_fromTGStart = = m_fromTGEnd )
2020-04-05 14:43:57 +02:00
LogDebug ( " Rule Trace, \t RewriteDynTGRF from %s Slot=%u Dst=%u or Dst=TG%u or Dst=%u or Dst=%u: not matched " , m_name . c_str ( ) , m_slot , m_fromTGStart , m_toTG , m_discPC , m_statusPC ) ;
2020-04-01 23:22:12 +02:00
else
2020-04-05 14:43:57 +02:00
LogDebug ( " Rule Trace, \t RewriteDynTGRF from %s Slot=%u Dst=%u-%u or Dst=TG%u or Dst=%u or Dst=%u: not matched " , m_name . c_str ( ) , m_slot , m_fromTGStart , m_fromTGEnd , m_toTG , m_discPC , m_statusPC ) ;
2020-04-01 23:22:12 +02:00
}
2025-03-15 18:03:06 +01:00
return PROCESS_RESULT : : UNMATCHED ;
2020-04-01 23:22:12 +02:00
}
2020-04-13 15:15:21 +02:00
void CRewriteDynTGRF : : tgChange ( unsigned int slot , unsigned int tg )
{
2020-04-13 18:53:36 +02:00
if ( slot = = m_slot & & tg = = m_discPC ) {
if ( m_currentTG ! = 0U ) {
m_currentTG = 0U ;
m_rewriteNet - > setCurrentTG ( 0U ) ;
2025-03-15 18:03:06 +01:00
if ( m_voice ! = nullptr )
2020-04-13 18:53:36 +02:00
m_voice - > unlinked ( ) ;
}
return ;
2020-04-13 15:15:21 +02:00
}
2020-04-13 21:53:05 +02:00
if ( slot = = m_slot & & tg = = m_statusPC )
return ;
if ( slot = = m_slot & & std : : find ( m_exclTGs . cbegin ( ) , m_exclTGs . cend ( ) , tg ) ! = m_exclTGs . cend ( ) )
return ;
2020-04-13 18:53:36 +02:00
if ( slot = = m_slot & & tg > = m_fromTGStart & & tg < = m_fromTGEnd ) {
if ( m_currentTG ! = tg ) {
m_currentTG = tg ;
m_rewriteNet - > setCurrentTG ( tg ) ;
2025-03-15 18:03:06 +01:00
if ( m_voice ! = nullptr )
2020-04-13 18:53:36 +02:00
m_voice - > linkedTo ( tg ) ;
}
return ;
2020-04-13 15:15:21 +02:00
}
2020-04-18 23:33:24 +02:00
}
void CRewriteDynTGRF : : stopVoice ( unsigned int slot )
{
2025-03-15 18:03:06 +01:00
if ( slot = = m_slot & & m_voice ! = nullptr )
2020-04-18 23:33:24 +02:00
m_voice - > abort ( ) ;
}