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

Committer:
WGorniak
Date:
Thu Oct 01 09:40:30 2015 +0200
Revision:
2:8d8295a51f68
added terminal app

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WGorniak 2:8d8295a51f68 1 #include "PingPongCmd.h"
WGorniak 2:8d8295a51f68 2 #include "dbg.h"
WGorniak 2:8d8295a51f68 3
WGorniak 2:8d8295a51f68 4 const string PingPongCmd::PingMsg = "PING";
WGorniak 2:8d8295a51f68 5 const string PingPongCmd::PongMsg = "PONG";
WGorniak 2:8d8295a51f68 6
WGorniak 2:8d8295a51f68 7 #define RX_TIMEOUT_VALUE 3500000 // in us
WGorniak 2:8d8295a51f68 8
WGorniak 2:8d8295a51f68 9
WGorniak 2:8d8295a51f68 10
WGorniak 2:8d8295a51f68 11
WGorniak 2:8d8295a51f68 12 PingPongCmd::PingPongCmd(Settings* radioSettings)
WGorniak 2:8d8295a51f68 13 : RadioCmd(radioSettings),
WGorniak 2:8d8295a51f68 14 #if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) )
WGorniak 2:8d8295a51f68 15 led(LED2)
WGorniak 2:8d8295a51f68 16 #else
WGorniak 2:8d8295a51f68 17 led(LED1)
WGorniak 2:8d8295a51f68 18 #endif
WGorniak 2:8d8295a51f68 19 {
WGorniak 2:8d8295a51f68 20 isMaster = true;
WGorniak 2:8d8295a51f68 21 queryable_ = true;
WGorniak 2:8d8295a51f68 22 led = 0;
WGorniak 2:8d8295a51f68 23 }
WGorniak 2:8d8295a51f68 24
WGorniak 2:8d8295a51f68 25 PingPongCmd::~PingPongCmd()
WGorniak 2:8d8295a51f68 26 {
WGorniak 2:8d8295a51f68 27 }
WGorniak 2:8d8295a51f68 28
WGorniak 2:8d8295a51f68 29 string PingPongCmd::cmd()
WGorniak 2:8d8295a51f68 30 {
WGorniak 2:8d8295a51f68 31 return "pp";
WGorniak 2:8d8295a51f68 32 }
WGorniak 2:8d8295a51f68 33
WGorniak 2:8d8295a51f68 34 string PingPongCmd::desc()
WGorniak 2:8d8295a51f68 35 {
WGorniak 2:8d8295a51f68 36 return "ping pong test";
WGorniak 2:8d8295a51f68 37 }
WGorniak 2:8d8295a51f68 38
WGorniak 2:8d8295a51f68 39 bool PingPongCmd::execute(list<string> args)
WGorniak 2:8d8295a51f68 40 {
WGorniak 2:8d8295a51f68 41 debug( "Starting Ping-Pong loop\r\n" );
WGorniak 2:8d8295a51f68 42 getRadioContex()->radio().Rx( RX_TIMEOUT_VALUE );
WGorniak 2:8d8295a51f68 43 getRadioContex()->setState(LOWPOWER);
WGorniak 2:8d8295a51f68 44 return true;
WGorniak 2:8d8295a51f68 45 }
WGorniak 2:8d8295a51f68 46
WGorniak 2:8d8295a51f68 47 Cmd::Status PingPongCmd::process()
WGorniak 2:8d8295a51f68 48 {
WGorniak 2:8d8295a51f68 49 RadioContex* p = getRadioContex();
WGorniak 2:8d8295a51f68 50 Radio& Radio = p->radio();
WGorniak 2:8d8295a51f68 51 uint16_t& BufferSize = p->BufferSize;
WGorniak 2:8d8295a51f68 52 uint8_t* Buffer = p->Buffer;
WGorniak 2:8d8295a51f68 53
WGorniak 2:8d8295a51f68 54
WGorniak 2:8d8295a51f68 55 switch( p->getState() )
WGorniak 2:8d8295a51f68 56 {
WGorniak 2:8d8295a51f68 57 case RX:
WGorniak 2:8d8295a51f68 58 if( isMaster == true )
WGorniak 2:8d8295a51f68 59 {
WGorniak 2:8d8295a51f68 60 if( BufferSize > 0 )
WGorniak 2:8d8295a51f68 61 {
WGorniak 2:8d8295a51f68 62 if( strncmp( ( const char* )Buffer, PongMsg.c_str(), 4 ) == 0 )
WGorniak 2:8d8295a51f68 63 {
WGorniak 2:8d8295a51f68 64 led = !led;
WGorniak 2:8d8295a51f68 65 debug( "...Pong\r\n" );
WGorniak 2:8d8295a51f68 66
WGorniak 2:8d8295a51f68 67 p->Send(PingMsg);
WGorniak 2:8d8295a51f68 68 }
WGorniak 2:8d8295a51f68 69 else if( strncmp( ( const char* )Buffer, PingMsg.c_str(), 4 ) == 0 )
WGorniak 2:8d8295a51f68 70 { // A master already exists then become a slave
WGorniak 2:8d8295a51f68 71 debug( "...Ping\r\n" );
WGorniak 2:8d8295a51f68 72 led = !led;
WGorniak 2:8d8295a51f68 73 isMaster = false;
WGorniak 2:8d8295a51f68 74 p->Send(PongMsg);
WGorniak 2:8d8295a51f68 75 }
WGorniak 2:8d8295a51f68 76 else // valid reception but neither a PING or a PONG message
WGorniak 2:8d8295a51f68 77 { // Set device as master ans start again
WGorniak 2:8d8295a51f68 78 isMaster = true;
WGorniak 2:8d8295a51f68 79 Radio.Rx( RX_TIMEOUT_VALUE );
WGorniak 2:8d8295a51f68 80 }
WGorniak 2:8d8295a51f68 81 }
WGorniak 2:8d8295a51f68 82 }
WGorniak 2:8d8295a51f68 83 else
WGorniak 2:8d8295a51f68 84 {
WGorniak 2:8d8295a51f68 85 if( BufferSize > 0 )
WGorniak 2:8d8295a51f68 86 {
WGorniak 2:8d8295a51f68 87 if( strncmp( ( const char* )Buffer, PingMsg.c_str(), 4 ) == 0 )
WGorniak 2:8d8295a51f68 88 {
WGorniak 2:8d8295a51f68 89 led = !led;
WGorniak 2:8d8295a51f68 90 debug( "...Ping\r\n" );
WGorniak 2:8d8295a51f68 91 p->Send(PongMsg);
WGorniak 2:8d8295a51f68 92 }
WGorniak 2:8d8295a51f68 93 else // valid reception but not a PING as expected
WGorniak 2:8d8295a51f68 94 { // Set device as master and start again
WGorniak 2:8d8295a51f68 95 isMaster = true;
WGorniak 2:8d8295a51f68 96 Radio.Rx( RX_TIMEOUT_VALUE );
WGorniak 2:8d8295a51f68 97 }
WGorniak 2:8d8295a51f68 98 }
WGorniak 2:8d8295a51f68 99 }
WGorniak 2:8d8295a51f68 100 p->setState(LOWPOWER);
WGorniak 2:8d8295a51f68 101 break;
WGorniak 2:8d8295a51f68 102 case TX:
WGorniak 2:8d8295a51f68 103 led = !led;
WGorniak 2:8d8295a51f68 104 if( isMaster == true )
WGorniak 2:8d8295a51f68 105 {
WGorniak 2:8d8295a51f68 106 debug( "Ping...\r\n" );
WGorniak 2:8d8295a51f68 107 }
WGorniak 2:8d8295a51f68 108 else
WGorniak 2:8d8295a51f68 109 {
WGorniak 2:8d8295a51f68 110 debug( "Pong...\r\n" );
WGorniak 2:8d8295a51f68 111 }
WGorniak 2:8d8295a51f68 112 Radio.Rx( RX_TIMEOUT_VALUE );
WGorniak 2:8d8295a51f68 113 p->setState(LOWPOWER);
WGorniak 2:8d8295a51f68 114 break;
WGorniak 2:8d8295a51f68 115 case RX_TIMEOUT:
WGorniak 2:8d8295a51f68 116 if( isMaster == true )
WGorniak 2:8d8295a51f68 117 {
WGorniak 2:8d8295a51f68 118 p->Send(PingMsg);
WGorniak 2:8d8295a51f68 119 }
WGorniak 2:8d8295a51f68 120 else
WGorniak 2:8d8295a51f68 121 {
WGorniak 2:8d8295a51f68 122 Radio.Rx( RX_TIMEOUT_VALUE );
WGorniak 2:8d8295a51f68 123 }
WGorniak 2:8d8295a51f68 124 p->setState(LOWPOWER);
WGorniak 2:8d8295a51f68 125 break;
WGorniak 2:8d8295a51f68 126 case RX_ERROR:
WGorniak 2:8d8295a51f68 127 // We have received a Packet with a CRC error, send reply as if packet was correct
WGorniak 2:8d8295a51f68 128 if( isMaster == true )
WGorniak 2:8d8295a51f68 129 {
WGorniak 2:8d8295a51f68 130 p->Send(PingMsg);
WGorniak 2:8d8295a51f68 131 }
WGorniak 2:8d8295a51f68 132 else
WGorniak 2:8d8295a51f68 133 {
WGorniak 2:8d8295a51f68 134 p->Send(PongMsg);
WGorniak 2:8d8295a51f68 135 }
WGorniak 2:8d8295a51f68 136 p->setState(LOWPOWER);
WGorniak 2:8d8295a51f68 137 break;
WGorniak 2:8d8295a51f68 138 case TX_TIMEOUT:
WGorniak 2:8d8295a51f68 139 Radio.Rx( RX_TIMEOUT_VALUE );
WGorniak 2:8d8295a51f68 140 p->setState(LOWPOWER);
WGorniak 2:8d8295a51f68 141 break;
WGorniak 2:8d8295a51f68 142 case LOWPOWER:
WGorniak 2:8d8295a51f68 143 break;
WGorniak 2:8d8295a51f68 144 default:
WGorniak 2:8d8295a51f68 145 p->setState(LOWPOWER);
WGorniak 2:8d8295a51f68 146 break;
WGorniak 2:8d8295a51f68 147 }
WGorniak 2:8d8295a51f68 148 return CONTINUE;
WGorniak 2:8d8295a51f68 149 }
WGorniak 2:8d8295a51f68 150
WGorniak 2:8d8295a51f68 151 string PingPongCmd::getResponse(void)
WGorniak 2:8d8295a51f68 152 {
WGorniak 2:8d8295a51f68 153 return "frequency cmd rulez!";
WGorniak 2:8d8295a51f68 154 }
WGorniak 2:8d8295a51f68 155