Elmo Terminal provides functionality to test Lora radio and access SX1272 chip registers delivered with Elmo board. Also contains example ping-pong application.

Dependencies:   SX1272lib mbed-src

Commands/PingPongCmd.cpp

Committer:
WGorniak
Date:
2015-10-01
Revision:
6:453b018a9ba0
Parent:
2:8d8295a51f68

File content as of revision 6:453b018a9ba0:

#include "PingPongCmd.h"
#include "dbg.h"

const string PingPongCmd::PingMsg = "PING";
const string PingPongCmd::PongMsg = "PONG";

#define RX_TIMEOUT_VALUE                                3500000   // in us




PingPongCmd::PingPongCmd(Settings* radioSettings)
    : RadioCmd(radioSettings),
        #if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) )
        led(LED2)
        #else
        led(LED1)
        #endif
{
    isMaster = true;
    queryable_ = true;
    led = 0;
}

PingPongCmd::~PingPongCmd()
{
}

string PingPongCmd::cmd()
{
    return "pp";
}

string PingPongCmd::desc()
{
    return "ping pong test";
}

bool PingPongCmd::execute(list<string> args)
{
    debug( "Starting Ping-Pong loop\r\n" );
    getRadioContex()->radio().Rx( RX_TIMEOUT_VALUE );
    getRadioContex()->setState(LOWPOWER);
    return true;
}

Cmd::Status PingPongCmd::process()
{
    RadioContex* p = getRadioContex();
    Radio& Radio = p->radio();
    uint16_t& BufferSize = p->BufferSize;
    uint8_t* Buffer = p->Buffer;


    switch( p->getState() )
    {
    case RX:
        if( isMaster == true )
        {
            if( BufferSize > 0 )
            {
                if( strncmp( ( const char* )Buffer, PongMsg.c_str(), 4 ) == 0 )
                {
                    led = !led;
                    debug( "...Pong\r\n" );

                    p->Send(PingMsg);
                }
                else if( strncmp( ( const char* )Buffer, PingMsg.c_str(), 4 ) == 0 )
                { // A master already exists then become a slave
                    debug( "...Ping\r\n" );
                    led = !led;
                    isMaster = false;
                    p->Send(PongMsg);
                }
                else // valid reception but neither a PING or a PONG message
                {    // Set device as master ans start again
                    isMaster = true;
                    Radio.Rx( RX_TIMEOUT_VALUE );
                }
            }
        }
        else
        {
            if( BufferSize > 0 )
            {
                if( strncmp( ( const char* )Buffer, PingMsg.c_str(), 4 ) == 0 )
                {
                    led = !led;
                    debug( "...Ping\r\n" );
                    p->Send(PongMsg);
                }
                else // valid reception but not a PING as expected
                {    // Set device as master and start again
                    isMaster = true;
                    Radio.Rx( RX_TIMEOUT_VALUE );
                }
            }
        }
        p->setState(LOWPOWER);
        break;
    case TX:
        led = !led;
        if( isMaster == true )
        {
            debug( "Ping...\r\n" );
        }
        else
        {
            debug( "Pong...\r\n" );
        }
        Radio.Rx( RX_TIMEOUT_VALUE );
        p->setState(LOWPOWER);
        break;
    case RX_TIMEOUT:
        if( isMaster == true )
        {
            p->Send(PingMsg);
        }
        else
        {
            Radio.Rx( RX_TIMEOUT_VALUE );
        }
        p->setState(LOWPOWER);
        break;
    case RX_ERROR:
        // We have received a Packet with a CRC error, send reply as if packet was correct
        if( isMaster == true )
        {
            p->Send(PingMsg);
        }
        else
        {
            p->Send(PongMsg);
        }
        p->setState(LOWPOWER);
        break;
    case TX_TIMEOUT:
        Radio.Rx( RX_TIMEOUT_VALUE );
        p->setState(LOWPOWER);
        break;
    case LOWPOWER:
        break;
    default:
        p->setState(LOWPOWER);
        break;
    }
    return CONTINUE;
}

string PingPongCmd::getResponse(void)
{
    return "frequency cmd rulez!";
}