in usb/tools/ConnectionExerciser/libraries/DTMF/DTMF.cpp [154:340]
bool DTMF_HandleCommand( void )
{
bool SendData = false;
float f;
int i;
uint8_t id;
uint16_t data;
//
// A well formed command is terminated with a #
//
if ( RxIndex >= sizeof( RxBuffer) || RxBuffer[RxIndex] != '#' )
{
goto Exit;
}
//
// Just a # was recieved
//
if ( RxIndex == 0 )
{
TxBuffer[0] = RxBuffer[0];
SendData = true;
goto Exit;
}
//
// Handle single character commands
//
if ( RxIndex == 1 )
{
switch (RxBuffer[0])
{
case '0':
case '1':
case '2':
case '3':
case '4':
if ( SetPort )
{
SetPort( RxBuffer[0] - '0' );
TxBuffer[0] = RxBuffer[0];
TxBuffer[1] = RxBuffer[1];
if ( RxBuffer[0] == '0' )
{
DBGPRINTLN( F("// Turn off ports") );
} else {
DBGPRINT( F("// Set port " ) );
DBGPRINTLN( RxBuffer[0] );
}
SendData = true;
}
break;
case '5':
case '6':
if ( SuperSpeed )
{
if ( RxBuffer[0] == '5' )
{
SuperSpeed(false);
} else {
SuperSpeed(true);
}
TxBuffer[0] = RxBuffer[0];
TxBuffer[1] = RxBuffer[1];
SendData = true;
}
break;
case 'A':
if ( GetPort )
{
TxBuffer[0] = GetPort();
TxBuffer[1] = RxBuffer[1];
DBGPRINT( F("// Get Port : ") );
DBGPRINTLN( TxBuffer[0] );
SendData = true;
}
break;
case 'B':
if ( ReadVoltage )
{
f = ReadVoltage();
i = (int)f;
sprintf_P( TxBuffer, PSTR("%02d%02d#"), i, abs((int)((f - (float)i) * 100.00)) );
DBGPRINT( F("// Volts: "));
DBGPRINTLN( TxBuffer );
SendData = true;
}
break;
case 'C':
if ( ReadCurrent )
{
f = ReadCurrent();
i = (int)f;
if ( f < 0.0 )
sprintf_P( TxBuffer, PSTR("1%d%02d#"), -1 * i, abs((int)((f - (float)i) * 100.00)) );
else
sprintf_P( TxBuffer, PSTR("%02d%02d#"), i, abs((int)((f - (float)i) * 100.00)) );
DBGPRINT( F("// Current: "));
DBGPRINTLN( TxBuffer );
SendData = true;
}
break;
case 'D':
sprintf_P( TxBuffer, PSTR("%02d%02d#"), VERSION, shield );
DBGPRINT( F("// Version : ") );
DBGPRINTLN( TxBuffer );
SendData = true;
break;
}
goto Exit;
}
if ( RxBuffer[1] == '*' )
{
switch ( RxBuffer[0] )
{
case '0':
id = RxBuffer[2] - '0';
data = (RxBuffer[3] - '0') * 10 + (RxBuffer[4] - '0');
if ( id <= 9 )
{
DBGPRINT( F("// Put Data:") );
DBGPRINT( id );
DBGPRINT( F(",") );
DBGPRINTLN( data );
Data[id] = data;
for ( TxIndex = 0; TxIndex <= RxIndex; TxIndex++ )
{
TxBuffer[TxIndex] = RxBuffer[TxIndex];
}
SendData = true;
}
break;
case '1':
id = RxBuffer[2] - '0';
if ( id <= 9 )
{
DBGPRINT( F("// Get data:") );
DBGPRINT( id );
DBGPRINT( F(",") );
DBGPRINTLN( Data[id] );
TxBuffer[0] = (Data[id] / 10) + '0';
TxBuffer[1] = (Data[id] % 10) + '0';
TxBuffer[2] = '#';
SendData = true;
}
break;
case '2':
// Command Delay in seconds. Must transmit two digits: 1 second = 01
cmdDelay = (RxBuffer[2] - '0') * 10 + \
(RxBuffer[3] - '0');
cmdDelay *= 1000;
DBGPRINT(F("// Command Delay: "));
DBGPRINTLN(cmdDelay);
for (TxIndex = 0; TxIndex <= RxIndex; TxIndex++)
{
TxBuffer[TxIndex] = RxBuffer[TxIndex];
}
SendData = true;
break;
case '3':
// Disconnect Timeout in miliseconds. Must transmit 4 digits: 1 ms = 0001
disconnectTimeout = (RxBuffer[2] - '0') * 1000 + \
(RxBuffer[3] - '0') * 100 + \
(RxBuffer[4] - '0') * 10 + \
(RxBuffer[5] - '0');
DBGPRINT(F("// Disconnect Timeout: "));
DBGPRINTLN(disconnectTimeout);
for (TxIndex = 0; TxIndex <= RxIndex; TxIndex++)
{
TxBuffer[TxIndex] = RxBuffer[TxIndex];
}
SendData = true;
break;
}
goto Exit;
}
Exit:
RxIndex = 0;
for ( i = 0; i < sizeof(RxBuffer); i++ )
RxBuffer[i] = 0;
return SendData;
}