CaryCoders
/
demo_SX1276_standalone
standalone sx1276 demo program
Fork of SX1276_GPS by
Diff: console_chat.cpp
- Revision:
- 29:0ea07cc7124b
- Child:
- 31:2c813f321db7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/console_chat.cpp Tue Jun 16 11:53:20 2015 +0000 @@ -0,0 +1,323 @@ +#include "mbed.h" +#include "sx1276-hal.h" +#include "main.h" +#include "debug.h" +#include "vt100.h" +#include "serial_api.h" + +void console_chat() +{ + //char pcbuf[64 + if (ackRcvd == false) + { + check_rx_chat(); + return; + } + else + { + printf("\r\n"); + printf("-chat-> "); + fflush(stdout); + } + + int i, len = get_kbd_str(pcbuf, PCBUF_SIZE); + if (len < 0) { + // ctrl.cls(); + printf("Console chat ended\r\n"); + print_help(); + printf("> "); + app = APP_CONSOLE; + return; + } + else + { + + + if (len > 0) + { + for (i = 0; i < len; i++) + BufferTx[i] = pcbuf[i]; + BufferTx[len] = '\0'; + + // debug( "\r\nchat send %s, len is %d, state is %d \r\n", BufferTx, len, State ); + // wait_ms(20); + + + //State = LOWPOWER; + //Radio.Sleep( ); + ackRcvd = false; + txLen = len; + Radio.Send( BufferTx, txLen ); + } + + + + } +} + +void print_help() +{ + ctrl.cls(); + printf(" Radio Utilities \r\n"); + printf("-----------------------------------------\r\n"); + print_status(); + printf("M set mode to Master\r\n"); + printf("S set mode to Slave\r\n"); + //printf("B set mode to Bi-directional\r\n"); + printf("P Start ping pong application\r\n"); + printf("C Start console chat application\r\n"); + printf("H Start hello exchange\r\n"); + printf("G Start GPS exchange\r\n"); + + + //printf("i radio_init\r\n"); + //printf("h hw_reset\r\n"); + //printf("tx[%%d] transmit\r\n"); + //printf("rx receive\r\n"); + //printf("C toggle crcOn\r\n"); + //printf("R read all registers\r\n"); + printf("op[%%d] get/set output power. op14 -> 14dBm...\r\n"); + //printf("d[0-5] change DIO pin assignment\r\n"); + printf("frf[%%f} get/set operating frequency (MHz). frf915 -> 915MHz, fr413 ->413MHz....\r\n"); + //printf("pl[%%d] LORA get/set RegPayloadLength\r\n"); + printf("cr[1234] LORA set coding rate. cr1 -> 4/5, cr2 -> 4/6, cr3 -> 4/7 cr4 ->4/8 \r\n"); + printf("bw[%%d] LORA get/set bandwidth. bw0 -> 125KHz, bw1 -> 250KHz, bw2 -> 500KHz \r\n"); + printf("sf[%%d] LORA get/set spreading factor. sf7-sf12\r\n"); + //printf("T LORA toggle TxContinuousMode\r\n"); + //printf("hp[%%d] LORA get/set hop period\r\n"); + //printf("hm LORA toggle explicit/explicit header mode\r\n"); + + printf("? Display help\r\n"); + printf(". Display configuration\r\n"); +} + +void console() +{ + int len; + // char pcbuf[64]; + + + len = get_kbd_str(pcbuf, PCBUF_SIZE); + + if (len < 0) { + // ctrl.cls(); + Radio.Sleep( ); + debug("Console configuration ended\r\n"); + app = APP_CONSOLE; + print_help(); + printf("> "); + fflush(stdout); + return; + } + + printf("\r\n"); + if (len == 1) { + switch (pcbuf[0]) { + case '?': + print_help(); + break; + case '.': + print_status(); + break; + case 'M': + AlwaysMaster=true; + isMaster = true; + AlwaysSlave=false; + break; + case 'S': + AlwaysSlave=true; + isMaster = false; + AlwaysMaster=false; + break; + case 'B': + AlwaysSlave=false; + isMaster = true; + AlwaysMaster=false; + break; + case 'G': + ctrl.cls(); + debug("Starting GPS exchange\r\n"); + gpsEnabled = true; + fflush(stdout); + app = APP_HELLO; + gpsd.l_latitude = gpsd.l_longitude = gpsd.r_latitude = gpsd.r_longitude = 0; + Radio.Rx( RX_TIMEOUT_VALUE ); + Radio.Tx( TX_TIMEOUT_VALUE ); + break; + case 'P': + ctrl.cls(); + debug("Starting ping pong app\r\n"); + fflush(stdout); + app = APP_PING; + gpsd.l_latitude = gpsd.l_longitude = gpsd.r_latitude = gpsd.r_longitude = 0; + Radio.Rx( RX_TIMEOUT_VALUE ); + Radio.Tx( TX_TIMEOUT_VALUE ); + break; + case 'H': + ctrl.cls(); + debug("Starting hello exchange\r\n"); + gpsEnabled = false; + fflush(stdout); + app = APP_HELLO; + Radio.Rx( RX_TIMEOUT_VALUE ); + Radio.Tx( TX_TIMEOUT_VALUE ); + break; + case 'C': + ctrl.cls(); + printf("Starting chat app\r\n"); + //printf("-chat-> "); + fflush(stdout); + ackRcvd = true; + app = APP_CHAT; + Radio.Rx( RX_TIMEOUT_VALUE ); + //radf Radio.Tx( TX_TIMEOUT_VALUE ); + break; + default: + debug("Unsupported command\r\n"); + break; + } + } else if (pcbuf[0] == 'f' && pcbuf[1] == 'r' && pcbuf[2] == 'f') { + if (pcbuf[3] >= '0' && pcbuf[3] <= '9') { + float MHz; + sscanf(pcbuf+3, "%f", &MHz); + MHz *= 1000000; + // printf("MHz:%f\r\n", MHz); + Frequency = (MHz); + } + Radio.SetChannel( Frequency ); + configRxTx(); + printf("Channel: %.1f MHz\r\n", Radio.GetChannel()); + + } else if (pcbuf[0] == 'o' && pcbuf[1] == 'p') { + if (pcbuf[2] >= '0' && pcbuf[2] <= '9') { + sscanf(pcbuf+2, "%d", &TxPower); + //printf("setting tx power to %d\r\n", TxPower); + configRxTx(); + + } + print_power(); printf("\r\n"); + //printf("OutputPower: %d\r\n", ( uint8_t )( ( uint16_t )( Radio.Read(REG_PACONFIG) - 1 ) & 0x0F )); + + } else if (pcbuf[0] == 'b' && pcbuf[1] == 'w') { + + if (pcbuf[2] >= '0' && pcbuf[2] <= '2') { + Radio.Standby(); + sscanf(&pcbuf[2], "%d", &Bandwidth); + switch (Bandwidth) { + case 0: + printf("setting bandwidth to 125KHz\r\n"); + break; + case 1: + printf("setting bandwidth to 250KHz\r\n"); + break; + case 2: + printf("setting bandwidth to 500KHz\r\n"); + break; + } + configRxTx(); + } + print_bandwidth(); printf("\r\n"); + + } else if (pcbuf[0] == 's' && pcbuf[1] == 'f' ) { + if (pcbuf[2] >= '0' && pcbuf[2] <= '9') { + sscanf(pcbuf+2, "%d", &SpreadingFactor); + configRxTx(); + } + printf("Spreading Factor: %d\r\n",SpreadingFactor); + + } else if (pcbuf[0] == 'c' && pcbuf[1] == 'r' ) { + if (pcbuf[2] >= '0' && pcbuf[2] <= '9') + { + sscanf(pcbuf+2, "%d", &CodingRate); + configRxTx(); + } + + print_cr();printf("\r\n"); + + } else + debug("Unsupported command\r\n"); + + if (app == APP_CONSOLE) + { + printf("> "); + fflush(stdout); + } + +} + +void check_rx_chat() +{ + //wait(1); + switch( State ) + { + case RX: + + if( BufferSize > 0 ) + { + if( strncmp( ( const char* )BufferRx, "ACK", 3 ) != 0 ) + { + // received msg is not an ACK, so ACK it + //red = !red; + printf("\b\b\b\b\b\b\b\bchat received msg: %s \r\n", BufferRx ); + printf("-chat-> "); + fflush(stdout); + memcpy( BufferTx, "ACK", 3 ); + Radio.Send( BufferTx, 3 ); + } + else + { + ackRcvd = true; + // printf("got an ack\r\n"); + } + + } + Radio.Rx( TX_TIMEOUT_VALUE ); + State = LOWPOWER; + break; + case TX: + // red = !red; + // debug("tx in chat mode\r\n"); + ackRcvd = false; + Radio.Rx( RX_TIMEOUT_VALUE ); + State = LOWPOWER; + break; + case RX_TIMEOUT: + static int retryCount=1; + if (ackRcvd == false) + { + if (retryCount <= 4) + { + Radio.Send( BufferTx, txLen ); + ++retryCount; + } + else + { + retryCount = 1; + printf("\r\nLast message (%s) was not acked", BufferTx); + fflush(stdout); + ackRcvd = true; + } + } + Radio.Rx( RX_TIMEOUT_VALUE ); + + State = LOWPOWER; + break; + case RX_ERROR: + debug("rx error in chat mode\r\n"); + State = LOWPOWER; + break; + case TX_TIMEOUT: + //debug("tx timeout in chat mode\r\n"); + Radio.Rx( RX_TIMEOUT_VALUE ); + State = LOWPOWER; + break; + case LOWPOWER: + wait_ms (5); + break; + default: + // debug("state is set to low power\r\n"); + State = LOWPOWER; + break; + } + +} \ No newline at end of file