bool DTMF_HandleCommand()

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;
}