@ -55,6 +55,7 @@ using namespace lookups;
# include <algorithm>
# include <functional>
# include <vector>
# include <mutex>
# include <sys/types.h>
# include <unistd.h>
@ -755,6 +756,7 @@ int Host::run()
}
bool hasTxShutdown = false ;
std : : mutex clockingMutex ;
// Macro to start DMR duplex idle transmission (or beacon)
# define START_DMR_DUPLEX_IDLE(x) \
@ -767,17 +769,23 @@ int Host::run()
// setup protocol processor threads
/** Digital Mobile Radio */
ThreadFunc dmr Process Thread( [ & , this ] ( ) {
ThreadFunc dmr FrameRead Thread( [ & , this ] ( ) {
# if defined(ENABLE_DMR)
if ( dmr ! = nullptr ) {
LogDebug ( LOG_HOST , " DMR, started frame processor " ) ;
LogDebug ( LOG_HOST , " DMR, started frame processor (modem read) " ) ;
while ( ! g_killed ) {
clockingMutex . lock ( ) ;
{
// ------------------------------------------------------
// -- Write to Modem Processing --
// -- Read from Modem Processing --
// ------------------------------------------------------
// write DMR slot 1 frames to modem
writeFramesDMR1 ( dmr . get ( ) , [ & , this ] ( ) {
// read DMR slot 1 frames from modem
readFramesDMR1 ( dmr . get ( ) , [ & , this ] ( ) {
if ( dmr ! = nullptr ) {
this - > interruptDMRBeacon ( dmr . get ( ) ) ;
}
// if there is a P25 CC running; halt the CC
if ( p25 ! = nullptr ) {
if ( p25 - > getCCRunning ( ) & & ! p25 - > getCCHalted ( ) ) {
@ -793,8 +801,12 @@ int Host::run()
}
} ) ;
// write DMR slot 2 frames to modem
writeFramesDMR2 ( dmr . get ( ) , [ & , this ] ( ) {
// read DMR slot 2 frames from modem
readFramesDMR2 ( dmr . get ( ) , [ & , this ] ( ) {
if ( dmr ! = nullptr ) {
this - > interruptDMRBeacon ( dmr . get ( ) ) ;
}
// if there is a P25 CC running; halt the CC
if ( p25 ! = nullptr ) {
if ( p25 - > getCCRunning ( ) & & ! p25 - > getCCHalted ( ) ) {
@ -809,17 +821,32 @@ int Host::run()
}
}
} ) ;
}
clockingMutex . unlock ( ) ;
// ------------------------------------------------------
// -- Read from Modem Processing --
// ------------------------------------------------------
if ( m_state ! = STATE_IDLE )
Thread : : sleep ( m_activeTickDelay ) ;
if ( m_state = = STATE_IDLE )
Thread : : sleep ( m_idleTickDelay ) ;
}
}
# endif // defined(ENABLE_DMR)
} ) ;
dmrFrameReadThread . run ( ) ;
// read DMR slot 1 frames from modem
readFramesDMR1 ( dmr . get ( ) , [ & , this ] ( ) {
ThreadFunc dmrFrameWriteThread ( [ & , this ] ( ) {
# if defined(ENABLE_DMR)
if ( dmr ! = nullptr ) {
this - > interruptDMRBeacon ( dmr . get ( ) ) ;
}
LogDebug ( LOG_HOST , " DMR, started frame processor (modem write) " ) ;
while ( ! g_killed ) {
clockingMutex . lock ( ) ;
{
// ------------------------------------------------------
// -- Write to Modem Processing --
// ------------------------------------------------------
// write DMR slot 1 frames to modem
writeFramesDMR1 ( dmr . get ( ) , [ & , this ] ( ) {
// if there is a P25 CC running; halt the CC
if ( p25 ! = nullptr ) {
if ( p25 - > getCCRunning ( ) & & ! p25 - > getCCHalted ( ) ) {
@ -835,12 +862,8 @@ int Host::run()
}
} ) ;
// read DMR slot 2 frames from modem
readFramesDMR2 ( dmr . get ( ) , [ & , this ] ( ) {
if ( dmr ! = nullptr ) {
this - > interruptDMRBeacon ( dmr . get ( ) ) ;
}
// write DMR slot 2 frames to modem
writeFramesDMR2 ( dmr . get ( ) , [ & , this ] ( ) {
// if there is a P25 CC running; halt the CC
if ( p25 ! = nullptr ) {
if ( p25 - > getCCRunning ( ) & & ! p25 - > getCCHalted ( ) ) {
@ -855,6 +878,8 @@ int Host::run()
}
}
} ) ;
}
clockingMutex . unlock ( ) ;
if ( m_state ! = STATE_IDLE )
Thread : : sleep ( m_activeTickDelay ) ;
@ -864,20 +889,22 @@ int Host::run()
}
# endif // defined(ENABLE_DMR)
} ) ;
dmr Process Thread. run ( ) ;
dmr FrameWrite Thread. run ( ) ;
/** Project 25 */
ThreadFunc p25 Process Thread( [ & , this ] ( ) {
ThreadFunc p25 FrameRead Thread( [ & , this ] ( ) {
# if defined(ENABLE_P25)
if ( p25 ! = nullptr ) {
LogDebug ( LOG_HOST , " P25, started frame processor " ) ;
LogDebug ( LOG_HOST , " P25, started frame processor (modem read) " ) ;
while ( ! g_killed ) {
clockingMutex . lock ( ) ;
{
// ------------------------------------------------------
// -- Write to Modem Processing --
// -- Read from Modem Processing --
// ------------------------------------------------------
// write P25 frames to modem
w rit eFramesP25( p25 . get ( ) , [ & , this ] ( ) {
// read P25 frames from modem
read FramesP25( p25 . get ( ) , [ & , this ] ( ) {
if ( dmr ! = nullptr ) {
this - > interruptDMRBeacon ( dmr . get ( ) ) ;
}
@ -889,13 +916,32 @@ int Host::run()
}
}
} ) ;
}
clockingMutex . unlock ( ) ;
if ( m_state ! = STATE_IDLE )
Thread : : sleep ( m_activeTickDelay ) ;
if ( m_state = = STATE_IDLE )
Thread : : sleep ( m_idleTickDelay ) ;
}
}
# endif // defined(ENABLE_P25)
} ) ;
p25FrameReadThread . run ( ) ;
ThreadFunc p25FrameWriteThread ( [ & , this ] ( ) {
# if defined(ENABLE_P25)
if ( p25 ! = nullptr ) {
LogDebug ( LOG_HOST , " P25, started frame processor (modem write) " ) ;
while ( ! g_killed ) {
clockingMutex . lock ( ) ;
{
// ------------------------------------------------------
// -- Read from Modem Processing --
// -- Write to Modem Processing --
// ------------------------------------------------------
// read P25 frames from modem
readFramesP25 ( p25 . get ( ) , [ & , this ] ( ) {
// write P25 frames to modem
w rit eFramesP25( p25 . get ( ) , [ & , this ] ( ) {
if ( dmr ! = nullptr ) {
this - > interruptDMRBeacon ( dmr . get ( ) ) ;
}
@ -907,6 +953,8 @@ int Host::run()
}
}
} ) ;
}
clockingMutex . unlock ( ) ;
if ( m_state ! = STATE_IDLE )
Thread : : sleep ( m_activeTickDelay ) ;
@ -916,20 +964,22 @@ int Host::run()
}
# endif // defined(ENABLE_P25)
} ) ;
p25 Process Thread. run ( ) ;
p25 FrameWrite Thread. run ( ) ;
/** Next Generation Digital Narrowband */
ThreadFunc nxdn Process Thread( [ & , this ] ( ) {
ThreadFunc nxdn FrameRead Thread( [ & , this ] ( ) {
# if defined(ENABLE_NXDN)
if ( nxdn ! = nullptr ) {
LogDebug ( LOG_HOST , " NXDN, started frame processor " ) ;
LogDebug ( LOG_HOST , " NXDN, started frame processor (modem read) " ) ;
while ( ! g_killed ) {
clockingMutex . lock ( ) ;
{
// ------------------------------------------------------
// -- Write to Modem Processing --
// -- Read from Modem Processing --
// ------------------------------------------------------
// write NXDN frames to modem
w rit eFramesNXDN( nxdn . get ( ) , [ & , this ] ( ) {
// read NXDN frames from modem
read FramesNXDN( nxdn . get ( ) , [ & , this ] ( ) {
if ( dmr ! = nullptr ) {
this - > interruptDMRBeacon ( dmr . get ( ) ) ;
}
@ -941,13 +991,32 @@ int Host::run()
}
}
} ) ;
}
clockingMutex . unlock ( ) ;
if ( m_state ! = STATE_IDLE )
Thread : : sleep ( m_activeTickDelay ) ;
if ( m_state = = STATE_IDLE )
Thread : : sleep ( m_idleTickDelay ) ;
}
}
# endif // defined(ENABLE_NXDN)
} ) ;
nxdnFrameReadThread . run ( ) ;
ThreadFunc nxdnFrameWriteThread ( [ & , this ] ( ) {
# if defined(ENABLE_NXDN)
if ( nxdn ! = nullptr ) {
LogDebug ( LOG_HOST , " NXDN, started frame processor (modem write) " ) ;
while ( ! g_killed ) {
clockingMutex . lock ( ) ;
{
// ------------------------------------------------------
// -- Read from Modem Processing --
// -- Write to Modem Processing --
// ------------------------------------------------------
// read NXDN frames from modem
readFramesNXDN ( nxdn . get ( ) , [ & , this ] ( ) {
// write NXDN frames to modem
w rit eFramesNXDN( nxdn . get ( ) , [ & , this ] ( ) {
if ( dmr ! = nullptr ) {
this - > interruptDMRBeacon ( dmr . get ( ) ) ;
}
@ -959,6 +1028,8 @@ int Host::run()
}
}
} ) ;
}
clockingMutex . unlock ( ) ;
if ( m_state ! = STATE_IDLE )
Thread : : sleep ( m_activeTickDelay ) ;
@ -968,7 +1039,7 @@ int Host::run()
}
# endif // defined(ENABLE_NXDN)
} ) ;
nxdn Process Thread. run ( ) ;
nxdn FrameWrite Thread. run ( ) ;
// main execution loop
while ( ! killed ) {
@ -1007,6 +1078,8 @@ int Host::run()
}
}
clockingMutex . lock ( ) ;
{
// ------------------------------------------------------
// -- Modem Clocking --
// ------------------------------------------------------
@ -1035,6 +1108,8 @@ int Host::run()
if ( nxdn ! = nullptr )
nxdn - > clock ( ms ) ;
# endif // defined(ENABLE_NXDN)
}
clockingMutex . unlock ( ) ;
// ------------------------------------------------------
// -- Timer Clocking --
@ -1292,9 +1367,12 @@ int Host::run()
if ( g_killed ) {
// shutdown reader threads
dmrProcessThread . wait ( ) ;
p25ProcessThread . wait ( ) ;
nxdnProcessThread . wait ( ) ;
dmrFrameReadThread . wait ( ) ;
dmrFrameWriteThread . wait ( ) ;
p25FrameReadThread . wait ( ) ;
p25FrameWriteThread . wait ( ) ;
nxdnFrameReadThread . wait ( ) ;
nxdnFrameWriteThread . wait ( ) ;
# if defined(ENABLE_DMR)
if ( dmr ! = nullptr ) {