@ -189,6 +189,7 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len)
assert ( data ! = NULL ) ;
assert ( data ! = NULL ) ;
channel : : SACCH sacch ;
channel : : SACCH sacch ;
sacch . setVerbose ( m_verbose ) ;
bool valid = sacch . decode ( data + 2U ) ;
bool valid = sacch . decode ( data + 2U ) ;
if ( valid ) {
if ( valid ) {
uint8_t ran = sacch . getRAN ( ) ;
uint8_t ran = sacch . getRAN ( ) ;
@ -201,9 +202,10 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len)
if ( fct = = NXDN_LICH_USC_SACCH_NS ) {
if ( fct = = NXDN_LICH_USC_SACCH_NS ) {
// the SACCH on a non-superblock frame is usually an idle and not interesting apart from the RAN.
// the SACCH on a non-superblock frame is usually an idle and not interesting apart from the RAN.
channel : : FACCH1 facch ;
channel : : FACCH1 facch ;
bool valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS ) ;
facch . setVerbose ( m_verbose ) ;
bool valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS ) ;
if ( ! valid )
if ( ! valid )
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS + NXDN_FACCH1 _LENGTH_BITS) ;
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS + NXDN_FACCH1 _FEC _LENGTH_BITS) ;
if ( ! valid )
if ( ! valid )
return false ;
return false ;
@ -211,7 +213,8 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len)
facch . getData ( buffer ) ;
facch . getData ( buffer ) ;
lc : : RTCH lc ;
lc : : RTCH lc ;
lc . decode ( buffer , NXDN_FACCH1_LENGTH_BITS ) ;
lc . setVerbose ( m_verbose ) ;
lc . decode ( buffer , NXDN_FACCH1_FEC_LENGTH_BITS ) ;
uint16_t dstId = lc . getDstId ( ) ;
uint16_t dstId = lc . getDstId ( ) ;
uint16_t srcId = lc . getSrcId ( ) ;
uint16_t srcId = lc . getSrcId ( ) ;
bool group = lc . getGroup ( ) ;
bool group = lc . getGroup ( ) ;
@ -252,13 +255,14 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len)
// generate the SACCH
// generate the SACCH
channel : : SACCH sacch ;
channel : : SACCH sacch ;
sacch . setVerbose ( m_verbose ) ;
sacch . setData ( SACCH_IDLE ) ;
sacch . setData ( SACCH_IDLE ) ;
sacch . setRAN ( m_nxdn - > m_ran ) ;
sacch . setRAN ( m_nxdn - > m_ran ) ;
sacch . setStructure ( NXDN_SR_SINGLE ) ;
sacch . setStructure ( NXDN_SR_SINGLE ) ;
sacch . encode ( data + 2U ) ;
sacch . encode ( data + 2U ) ;
facch . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS) ;
facch . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS) ;
facch . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS + NXDN_FACCH1 _LENGTH_BITS) ;
facch . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS + NXDN_FACCH1 _FEC _LENGTH_BITS) ;
m_nxdn - > scrambler ( data + 2U ) ;
m_nxdn - > scrambler ( data + 2U ) ;
@ -311,18 +315,19 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len)
} else {
} else {
if ( m_nxdn - > m_rfState = = RS_RF_LISTENING ) {
if ( m_nxdn - > m_rfState = = RS_RF_LISTENING ) {
channel : : FACCH1 facch ;
channel : : FACCH1 facch ;
facch . setVerbose ( m_verbose ) ;
bool valid = false ;
bool valid = false ;
switch ( option ) {
switch ( option ) {
case NXDN_LICH_STEAL_FACCH :
case NXDN_LICH_STEAL_FACCH :
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS) ;
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS) ;
if ( ! valid )
if ( ! valid )
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_ LENGTH_BITS) ;
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_ FEC_ LENGTH_BITS) ;
break ;
break ;
case NXDN_LICH_STEAL_FACCH1_1 :
case NXDN_LICH_STEAL_FACCH1_1 :
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS) ;
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS) ;
break ;
break ;
case NXDN_LICH_STEAL_FACCH1_2 :
case NXDN_LICH_STEAL_FACCH1_2 :
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS + NXDN_FACCH1 _LENGTH_BITS) ;
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS + NXDN_FACCH1 _FEC _LENGTH_BITS) ;
break ;
break ;
default :
default :
break ;
break ;
@ -334,7 +339,8 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len)
facch . getData ( buffer ) ;
facch . getData ( buffer ) ;
lc : : RTCH lc ;
lc : : RTCH lc ;
lc . decode ( buffer , NXDN_FACCH1_LENGTH_BITS ) ;
lc . setVerbose ( m_verbose ) ;
lc . decode ( buffer , NXDN_FACCH1_FEC_LENGTH_BITS ) ;
hasInfo = lc . getMessageType ( ) = = RTCH_MESSAGE_TYPE_VCALL ;
hasInfo = lc . getMessageType ( ) = = RTCH_MESSAGE_TYPE_VCALL ;
if ( ! hasInfo )
if ( ! hasInfo )
@ -431,6 +437,7 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len)
// generate the SACCH
// generate the SACCH
channel : : SACCH sacch ;
channel : : SACCH sacch ;
sacch . setVerbose ( m_verbose ) ;
sacch . setData ( SACCH_IDLE ) ;
sacch . setData ( SACCH_IDLE ) ;
sacch . setRAN ( m_nxdn - > m_ran ) ;
sacch . setRAN ( m_nxdn - > m_ran ) ;
sacch . setStructure ( NXDN_SR_SINGLE ) ;
sacch . setStructure ( NXDN_SR_SINGLE ) ;
@ -440,8 +447,8 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len)
m_nxdn - > m_rfLC . encode ( buffer , NXDN_RTCH_LC_LENGTH_BITS ) ;
m_nxdn - > m_rfLC . encode ( buffer , NXDN_RTCH_LC_LENGTH_BITS ) ;
facch . setData ( buffer ) ;
facch . setData ( buffer ) ;
facch . encode ( start + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS) ;
facch . encode ( start + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS) ;
facch . encode ( start + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS + NXDN_FACCH1 _LENGTH_BITS) ;
facch . encode ( start + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS + NXDN_FACCH1 _FEC _LENGTH_BITS) ;
m_nxdn - > scrambler ( start + 2U ) ;
m_nxdn - > scrambler ( start + 2U ) ;
@ -472,6 +479,7 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len)
// regenerate SACCH if it's valid
// regenerate SACCH if it's valid
channel : : SACCH sacch ;
channel : : SACCH sacch ;
sacch . setVerbose ( m_verbose ) ;
bool validSACCH = sacch . decode ( data + 2U ) ;
bool validSACCH = sacch . decode ( data + 2U ) ;
if ( validSACCH ) {
if ( validSACCH ) {
sacch . setRAN ( m_nxdn - > m_ran ) ;
sacch . setRAN ( m_nxdn - > m_ran ) ;
@ -510,9 +518,10 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len)
}
}
} else if ( option = = NXDN_LICH_STEAL_FACCH1_1 ) {
} else if ( option = = NXDN_LICH_STEAL_FACCH1_1 ) {
channel : : FACCH1 facch1 ;
channel : : FACCH1 facch1 ;
bool valid = facch1 . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS ) ;
facch1 . setVerbose ( m_verbose ) ;
bool valid = facch1 . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS ) ;
if ( valid )
if ( valid )
facch1 . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS) ;
facch1 . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS) ;
edac : : AMBEFEC ambe ;
edac : : AMBEFEC ambe ;
@ -565,19 +574,22 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len)
}
}
channel : : FACCH1 facch1 ;
channel : : FACCH1 facch1 ;
bool valid = facch1 . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_LENGTH_BITS ) ;
facch1 . setVerbose ( m_verbose ) ;
bool valid = facch1 . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS + NXDN_FACCH1_FEC_LENGTH_BITS ) ;
if ( valid )
if ( valid )
facch1 . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS + NXDN_FACCH1 _LENGTH_BITS) ;
facch1 . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS + NXDN_FACCH1 _FEC _LENGTH_BITS) ;
} else {
} else {
channel : : FACCH1 facch11 ;
channel : : FACCH1 facch11 ;
bool valid1 = facch11 . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS ) ;
facch11 . setVerbose ( m_verbose ) ;
bool valid1 = facch11 . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS ) ;
if ( valid1 )
if ( valid1 )
facch11 . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS) ;
facch11 . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS) ;
channel : : FACCH1 facch12 ;
channel : : FACCH1 facch12 ;
bool valid2 = facch12 . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_LENGTH_BITS ) ;
facch12 . setVerbose ( m_verbose ) ;
bool valid2 = facch12 . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS + NXDN_FACCH1_FEC_LENGTH_BITS ) ;
if ( valid2 )
if ( valid2 )
facch12 . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS + NXDN_FACCH1 _LENGTH_BITS) ;
facch12 . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS + NXDN_FACCH1 _FEC _LENGTH_BITS) ;
}
}
data [ 0U ] = modem : : TAG_DATA ;
data [ 0U ] = modem : : TAG_DATA ;
@ -621,14 +633,16 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t
}
}
channel : : SACCH sacch ;
channel : : SACCH sacch ;
sacch . setVerbose ( m_verbose ) ;
sacch . decode ( data + 2U ) ;
sacch . decode ( data + 2U ) ;
if ( fct = = NXDN_LICH_USC_SACCH_NS ) {
if ( fct = = NXDN_LICH_USC_SACCH_NS ) {
// the SACCH on a non-superblock frame is usually an idle and not interesting apart from the RAN.
// the SACCH on a non-superblock frame is usually an idle and not interesting apart from the RAN.
channel : : FACCH1 facch ;
channel : : FACCH1 facch ;
bool valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS ) ;
facch . setVerbose ( m_verbose ) ;
bool valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS ) ;
if ( ! valid )
if ( ! valid )
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS + NXDN_FACCH1 _LENGTH_BITS) ;
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS + NXDN_FACCH1 _FEC _LENGTH_BITS) ;
if ( ! valid )
if ( ! valid )
return false ;
return false ;
@ -636,7 +650,8 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t
facch . getData ( buffer ) ;
facch . getData ( buffer ) ;
lc : : RTCH lc ;
lc : : RTCH lc ;
lc . decode ( buffer , NXDN_FACCH1_LENGTH_BITS ) ;
lc . setVerbose ( m_verbose ) ;
lc . decode ( buffer , NXDN_FACCH1_FEC_LENGTH_BITS ) ;
uint16_t dstId = lc . getDstId ( ) ;
uint16_t dstId = lc . getDstId ( ) ;
uint16_t srcId = lc . getSrcId ( ) ;
uint16_t srcId = lc . getSrcId ( ) ;
bool group = lc . getGroup ( ) ;
bool group = lc . getGroup ( ) ;
@ -677,13 +692,14 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t
// generate the SACCH
// generate the SACCH
channel : : SACCH sacch ;
channel : : SACCH sacch ;
sacch . setVerbose ( m_verbose ) ;
sacch . setData ( SACCH_IDLE ) ;
sacch . setData ( SACCH_IDLE ) ;
sacch . setRAN ( m_nxdn - > m_ran ) ;
sacch . setRAN ( m_nxdn - > m_ran ) ;
sacch . setStructure ( NXDN_SR_SINGLE ) ;
sacch . setStructure ( NXDN_SR_SINGLE ) ;
sacch . encode ( data + 2U ) ;
sacch . encode ( data + 2U ) ;
facch . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS) ;
facch . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS) ;
facch . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS + NXDN_FACCH1 _LENGTH_BITS) ;
facch . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS + NXDN_FACCH1 _FEC _LENGTH_BITS) ;
m_nxdn - > scrambler ( data + 2U ) ;
m_nxdn - > scrambler ( data + 2U ) ;
@ -719,18 +735,19 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t
} else {
} else {
if ( m_nxdn - > m_netState = = RS_NET_IDLE ) {
if ( m_nxdn - > m_netState = = RS_NET_IDLE ) {
channel : : FACCH1 facch ;
channel : : FACCH1 facch ;
facch . setVerbose ( m_verbose ) ;
bool valid = false ;
bool valid = false ;
switch ( option ) {
switch ( option ) {
case NXDN_LICH_STEAL_FACCH :
case NXDN_LICH_STEAL_FACCH :
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS) ;
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS) ;
if ( ! valid )
if ( ! valid )
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS + NXDN_FACCH1 _LENGTH_BITS) ;
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS + NXDN_FACCH1 _FEC _LENGTH_BITS) ;
break ;
break ;
case NXDN_LICH_STEAL_FACCH1_1 :
case NXDN_LICH_STEAL_FACCH1_1 :
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS) ;
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS) ;
break ;
break ;
case NXDN_LICH_STEAL_FACCH1_2 :
case NXDN_LICH_STEAL_FACCH1_2 :
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS + NXDN_FACCH1 _LENGTH_BITS) ;
valid = facch . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS + NXDN_FACCH1 _FEC _LENGTH_BITS) ;
break ;
break ;
default :
default :
break ;
break ;
@ -742,7 +759,8 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t
facch . getData ( buffer ) ;
facch . getData ( buffer ) ;
lc : : RTCH lc ;
lc : : RTCH lc ;
lc . decode ( buffer , NXDN_FACCH1_LENGTH_BITS ) ;
lc . setVerbose ( m_verbose ) ;
lc . decode ( buffer , NXDN_FACCH1_FEC_LENGTH_BITS ) ;
hasInfo = lc . getMessageType ( ) = = RTCH_MESSAGE_TYPE_VCALL ;
hasInfo = lc . getMessageType ( ) = = RTCH_MESSAGE_TYPE_VCALL ;
if ( ! hasInfo )
if ( ! hasInfo )
@ -832,6 +850,7 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t
// generate the SACCH
// generate the SACCH
channel : : SACCH sacch ;
channel : : SACCH sacch ;
sacch . setVerbose ( m_verbose ) ;
sacch . setData ( SACCH_IDLE ) ;
sacch . setData ( SACCH_IDLE ) ;
sacch . setRAN ( m_nxdn - > m_ran ) ;
sacch . setRAN ( m_nxdn - > m_ran ) ;
sacch . setStructure ( NXDN_SR_SINGLE ) ;
sacch . setStructure ( NXDN_SR_SINGLE ) ;
@ -841,8 +860,8 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t
m_nxdn - > m_rfLC . encode ( buffer , NXDN_RTCH_LC_LENGTH_BITS ) ;
m_nxdn - > m_rfLC . encode ( buffer , NXDN_RTCH_LC_LENGTH_BITS ) ;
facch . setData ( buffer ) ;
facch . setData ( buffer ) ;
facch . encode ( start + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS) ;
facch . encode ( start + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS) ;
facch . encode ( start + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS + NXDN_FACCH1 _LENGTH_BITS) ;
facch . encode ( start + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS + NXDN_FACCH1 _FEC _LENGTH_BITS) ;
m_nxdn - > scrambler ( start + 2U ) ;
m_nxdn - > scrambler ( start + 2U ) ;
@ -869,6 +888,7 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t
// regenerate SACCH if it's valid
// regenerate SACCH if it's valid
channel : : SACCH sacch ;
channel : : SACCH sacch ;
sacch . setVerbose ( m_verbose ) ;
bool validSACCH = sacch . decode ( data + 2U ) ;
bool validSACCH = sacch . decode ( data + 2U ) ;
if ( validSACCH ) {
if ( validSACCH ) {
sacch . setRAN ( m_nxdn - > m_ran ) ;
sacch . setRAN ( m_nxdn - > m_ran ) ;
@ -894,9 +914,10 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t
}
}
} else if ( option = = NXDN_LICH_STEAL_FACCH1_1 ) {
} else if ( option = = NXDN_LICH_STEAL_FACCH1_1 ) {
channel : : FACCH1 facch1 ;
channel : : FACCH1 facch1 ;
bool valid = facch1 . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS ) ;
facch1 . setVerbose ( m_verbose ) ;
bool valid = facch1 . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS ) ;
if ( valid )
if ( valid )
facch1 . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS) ;
facch1 . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS) ;
edac : : AMBEFEC ambe ;
edac : : AMBEFEC ambe ;
@ -926,19 +947,22 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t
LogMessage ( LOG_NET , " NXDN, " NXDN_RTCH_MSG_TYPE_VCALL " , audio, errs = %u/94 (%.1f%%) " , errors , float ( errors ) / 0.94F ) ;
LogMessage ( LOG_NET , " NXDN, " NXDN_RTCH_MSG_TYPE_VCALL " , audio, errs = %u/94 (%.1f%%) " , errors , float ( errors ) / 0.94F ) ;
}
}
channel : : FACCH1 facch1 ;
channel : : FACCH1 facch1 ;
bool valid = facch1 . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_LENGTH_BITS ) ;
facch1 . setVerbose ( m_verbose ) ;
bool valid = facch1 . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS + NXDN_FACCH1_FEC_LENGTH_BITS ) ;
if ( valid )
if ( valid )
facch1 . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS + NXDN_FACCH1 _LENGTH_BITS) ;
facch1 . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS + NXDN_FACCH1 _FEC _LENGTH_BITS) ;
} else {
} else {
channel : : FACCH1 facch11 ;
channel : : FACCH1 facch11 ;
bool valid1 = facch11 . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS ) ;
facch11 . setVerbose ( m_verbose ) ;
bool valid1 = facch11 . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS ) ;
if ( valid1 )
if ( valid1 )
facch11 . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS) ;
facch11 . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS) ;
channel : : FACCH1 facch12 ;
channel : : FACCH1 facch12 ;
bool valid2 = facch12 . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_LENGTH_BITS ) ;
facch12 . setVerbose ( m_verbose ) ;
bool valid2 = facch12 . decode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS + NXDN_FACCH1_FEC_LENGTH_BITS ) ;
if ( valid2 )
if ( valid2 )
facch12 . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ LENGTH_BITS + NXDN_FACCH1 _LENGTH_BITS) ;
facch12 . encode ( data + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_ FEC_ LENGTH_BITS + NXDN_FACCH1 _FEC _LENGTH_BITS) ;
}
}
data [ 0U ] = modem : : TAG_DATA ;
data [ 0U ] = modem : : TAG_DATA ;