@ -1,5 +1,5 @@
/*
* Copyright ( C ) 2021 - 202 4 by Geoffrey Merck F4FXL / KC3FRA
* Copyright ( C ) 2021 - 202 6 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
@ -16,56 +16,125 @@
* Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include <array>
# include <gtest/gtest.h>
# include "DTMF.h"
const unsigned char DTMF_MASK [ ] = { 0x82U , 0x08U , 0x20U , 0x82U , 0x00U , 0x00U , 0x82U , 0x00U , 0x00U } ;
const unsigned char DTMF_SIG [ ] = { 0x82U , 0x08U , 0x20U , 0x82U , 0x00U , 0x00U , 0x00U , 0x00U , 0x00U } ;
const unsigned char DTMF_SYM_MASK [ ] = { 0x10U , 0x40U , 0x08U , 0x20U } ;
const unsigned char DTMF_SYM0 [ ] = { 0x00U , 0x40U , 0x08U , 0x20U } ;
const unsigned char DTMF_SYM1 [ ] = { 0x00U , 0x00U , 0x00U , 0x00U } ;
const unsigned char DTMF_SYM2 [ ] = { 0x00U , 0x40U , 0x00U , 0x00U } ;
const unsigned char DTMF_SYM3 [ ] = { 0x10U , 0x00U , 0x00U , 0x00U } ;
const unsigned char DTMF_SYM4 [ ] = { 0x00U , 0x00U , 0x00U , 0x20U } ;
const unsigned char DTMF_SYM5 [ ] = { 0x00U , 0x40U , 0x00U , 0x20U } ;
const unsigned char DTMF_SYM6 [ ] = { 0x10U , 0x00U , 0x00U , 0x20U } ;
const unsigned char DTMF_SYM7 [ ] = { 0x00U , 0x00U , 0x08U , 0x00U } ;
const unsigned char DTMF_SYM8 [ ] = { 0x00U , 0x40U , 0x08U , 0x00U } ;
const unsigned char DTMF_SYM9 [ ] = { 0x10U , 0x00U , 0x08U , 0x00U } ;
const unsigned char DTMF_SYMA [ ] = { 0x10U , 0x40U , 0x00U , 0x00U } ;
const unsigned char DTMF_SYMB [ ] = { 0x10U , 0x40U , 0x00U , 0x20U } ;
const unsigned char DTMF_SYMC [ ] = { 0x10U , 0x40U , 0x08U , 0x00U } ;
const unsigned char DTMF_SYMD [ ] = { 0x10U , 0x40U , 0x08U , 0x20U } ;
const unsigned char DTMF_SYMS [ ] = { 0x00U , 0x00U , 0x08U , 0x20U } ;
const unsigned char DTMF_SYMH [ ] = { 0x10U , 0x00U , 0x08U , 0x20U } ;
# include "DStarDefines.h"
namespace DTMFTests
{
class DTMF_decode : public : : testing : : Test {
} ;
using Frame = std : : array < unsigned char , 9 > ;
static Frame makeFrame ( const unsigned char sym [ 4 ] )
{
return Frame {
DTMF_SIG [ 0 ] ,
DTMF_SIG [ 1 ] ,
DTMF_SIG [ 2 ] ,
DTMF_SIG [ 3 ] ,
static_cast < unsigned char > ( DTMF_SIG [ 4 ] | sym [ 0 ] ) ,
static_cast < unsigned char > ( DTMF_SIG [ 5 ] | sym [ 1 ] ) ,
DTMF_SIG [ 6 ] ,
static_cast < unsigned char > ( DTMF_SIG [ 7 ] | sym [ 2 ] ) ,
static_cast < unsigned char > ( DTMF_SIG [ 8 ] | sym [ 3 ] ) ,
} ;
}
static void decode4 ( CDTMF & dtmf , const Frame & f , bool last = false )
{
dtmf . decode ( f . data ( ) , false ) ;
dtmf . decode ( f . data ( ) , false ) ;
dtmf . decode ( f . data ( ) , false ) ;
dtmf . decode ( f . data ( ) , last ) ;
}
static void gap ( CDTMF & dtmf , unsigned n = 10 , bool end = false )
{
for ( unsigned i = 0 ; i < n ; + + i )
dtmf . decode ( NULL_AMBE_DATA_BYTES , end ) ;
}
class DTMF_decode : public : : testing : : Test { } ;
TEST_F ( DTMF_decode , decode_reflector_module_as_number )
{
const auto D = makeFrame ( DTMF_SYMD ) ;
const auto Zero = makeFrame ( DTMF_SYM0 ) ;
const auto One = makeFrame ( DTMF_SYM1 ) ;
const auto Eight = makeFrame ( DTMF_SYM8 ) ;
const auto Four = makeFrame ( DTMF_SYM4 ) ;
CDTMF dtmf ;
decode4 ( dtmf , D ) ; gap ( dtmf ) ;
decode4 ( dtmf , Zero ) ; gap ( dtmf ) ;
decode4 ( dtmf , One ) ; gap ( dtmf ) ;
decode4 ( dtmf , Eight ) ; gap ( dtmf ) ;
decode4 ( dtmf , Zero ) ; gap ( dtmf ) ;
decode4 ( dtmf , Four ) ;
gap ( dtmf , 10 , true ) ;
EXPECT_TRUE ( dtmf . hasCommand ( ) ) ;
EXPECT_STREQ ( dtmf . translate ( ) . c_str ( ) , " DCS018DL " ) ;
}
TEST_F ( DTMF_decode , decode_valid_dtmf )
TEST_F ( DTMF_decode , decode_ reflector_module_as_letter )
{
unsigned char ambe [ ] = { DTMF_SIG [ 0 ] ,
DTMF_SIG [ 1 ] ,
DTMF_SIG [ 2 ] ,
DTMF_SIG [ 3 ] ,
( unsigned char ) ( DTMF_SIG [ 4 ] | DTMF_SYM1 [ 0 ] ) ,
( unsigned char ) ( DTMF_SIG [ 5 ] | DTMF_SYM1 [ 1 ] ) ,
DTMF_SIG [ 6 ] ,
( unsigned char ) ( DTMF_SIG [ 7 ] | DTMF_SYM1 [ 2 ] ) ,
( unsigned char ) ( DTMF_SIG [ 8 ] | DTMF_SYM1 [ 3 ] ) } ;
const auto D = makeFrame ( DTMF_SYMD ) ;
const auto Zero = makeFrame ( DTMF_SYM0 ) ;
const auto One = makeFrame ( DTMF_SYM1 ) ;
const auto Eight = makeFrame ( DTMF_SYM8 ) ;
CDTMF dtmf ;
dtmf . decode ( ambe , false ) ;
dtmf . decode ( ambe , false ) ;
dtmf . decode ( ambe , false ) ;
dtmf . decode ( ambe , false ) ;
dtmf . decode ( ambe , false ) ;
dtmf . decode ( ambe , false ) ;
dtmf . decode ( ambe , true ) ;
decode4 ( dtmf , D ) ; gap ( dtmf ) ;
decode4 ( dtmf , Zero ) ; gap ( dtmf ) ;
decode4 ( dtmf , One ) ; gap ( dtmf ) ;
decode4 ( dtmf , Eight ) ; gap ( dtmf ) ;
decode4 ( dtmf , D ) ;
gap ( dtmf , 10 , true ) ;
EXPECT_TRUE ( dtmf . hasCommand ( ) ) ;
EXPECT_STREQ ( dtmf . translate ( ) . c_str ( ) , " DCS018DL " ) ;
}
TEST_F ( DTMF_decode , decode_reflector_short_module_as_letter )
{
const auto D = makeFrame ( DTMF_SYMD ) ;
const auto One = makeFrame ( DTMF_SYM1 ) ;
const auto Eight = makeFrame ( DTMF_SYM8 ) ;
CDTMF dtmf ;
decode4 ( dtmf , D ) ; gap ( dtmf ) ;
decode4 ( dtmf , One ) ; gap ( dtmf ) ;
decode4 ( dtmf , Eight ) ; gap ( dtmf ) ;
decode4 ( dtmf , D ) ;
gap ( dtmf , 10 , true ) ;
EXPECT_TRUE ( dtmf . hasCommand ( ) ) ;
EXPECT_STREQ ( dtmf . translate ( ) . c_str ( ) , " DCS018DL " ) ;
}
TEST_F ( DTMF_decode , decode_reflector_short_module_as_number )
{
const auto D = makeFrame ( DTMF_SYMD ) ;
const auto Zero = makeFrame ( DTMF_SYM0 ) ;
const auto One = makeFrame ( DTMF_SYM1 ) ;
const auto Eight = makeFrame ( DTMF_SYM8 ) ;
const auto Four = makeFrame ( DTMF_SYM4 ) ;
CDTMF dtmf ;
decode4 ( dtmf , D ) ; gap ( dtmf ) ;
decode4 ( dtmf , One ) ; gap ( dtmf ) ;
decode4 ( dtmf , Eight ) ; gap ( dtmf ) ;
decode4 ( dtmf , Zero ) ; gap ( dtmf ) ;
decode4 ( dtmf , Four ) ;
gap ( dtmf , 10 , true ) ;
EXPECT_TRUE ( dtmf . hasCommand ( ) ) ;
EXPECT_STREQ ( dtmf . translate ( ) . c_str ( ) , " DCS018DL " ) ;
}
}
}