NPR70/NPR_14/source/HMI_telnet.cpp

938 lines
31 KiB
C++

// This file is part of "NPR70 modem firmware" software
// (A GMSK data modem for ham radio 430-440MHz, at several hundreds of kbps)
// Copyright (c) 2017-2020 Guillaume F. F4HDK (amateur radio callsign)
//
// "NPR70 modem firmware" is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// "NPR70 modem firmware" is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with "NPR70 modem firmware". If not, see <http://www.gnu.org/licenses/>
#include "HMI_telnet.h"
#include "mbed.h"
#include "global_variables.h"
#include "Eth_IPv4.h"
#include "signaling.h"
#include "config_flash.h"
#include "W5500.h"
#include "SI4463.h"
#include "TDMA.h"
#include "DHCP_ARP.h"
#include "L1L2_radio.h"
static char current_rx_line[100];
//static char HMI_out_str[100];
static int current_rx_line_count = 0;
static int is_telnet_opened = 0;
static int echo_ON = 1;
static int display_status_ongoing = 0;
static int display_who_ongoing = 0;
static int slow_counter = 0;
static unsigned int telnet_last_activity;
int telnet_loop (W5500_chip* W5500) {
static unsigned char previous_state = 0;
unsigned char RX_data[100];
unsigned char TX_data[100];
unsigned char current_state;
unsigned int timer_snapshot;
char loc_char;
int RX_size = 0;
int i, j;
int result;
result=0;
current_state = W5500_read_byte(W5500, 0x0003, 0x05);
//printf("state: %x\r\n", current_state);
if ((current_state == 0x17) && (previous_state != 0x17)) {
W5500_read_long(W5500, 0x000C, 0x05, RX_data, 4);
printf("\r\n\r\nnew telnet connexion from %i.%i.%i.%i\r\nserial inactive...\r\n", RX_data[0], RX_data[1], RX_data[2], RX_data[3]);
fflush(stdout);
//TX_data[0] = 0xFF; //IAC
//TX_data[1] = 0xFB; //WILL FB DO FD
//TX_data[2] = 1; //echo 1 RTCE 7
//TX_data[3] = 0;
TX_data[0] = 0xFF; //IAC
TX_data[1] = 0xFB; //WILL
TX_data[2] = 0x01; //Echo
//TX_data[3] = 0;
TX_data[3] = 0xFF; //IAC
TX_data[4] = 0xFD; //DO
TX_data[5] = 0x03; //Suppr GA
TX_data[6] = 0xFF; //IAC
TX_data[7] = 0xFB; //WILL
TX_data[8] = 0x03; //Suppr GA
TX_data[9] = 0;
strcat((char*)TX_data, "NPR modem\r\nready> ");
W5500_write_TX_buffer (W5500, 1, TX_data, 27, 0); //27
//HMI_printf("ready>");
is_telnet_opened = 1;
current_rx_line_count = 0;
echo_ON = 1;
display_status_ongoing = 0;
display_who_ongoing = 0;
telnet_last_activity = GLOBAL_timer.read_us();
}
if (current_state==0x1C) { // close wait to close
W5500_write_byte(W5500, 0x0001, 0x05, 0x10);
printf("telnet connexion closed\r\nready> ");
fflush(stdout);
is_telnet_opened = 0;
current_rx_line_count = 0;
echo_ON = 1;
display_status_ongoing = 0;
display_who_ongoing = 0;
}
if (current_state==0x00) { //closed to open
W5500_write_byte(W5500, 0x0001, 0x05, 0x01);
//printf("open \r\n");
result=1;
}
if (current_state==0x13) { //opened to listen
W5500_write_byte(W5500, 0x0001, 0x05, 0x02);
//printf("listen \r\n");
}
previous_state = current_state;
if (is_telnet_opened) {
RX_size = W5500_read_received_size(W5500, 1);
timer_snapshot = GLOBAL_timer.read_us();
if ((timer_snapshot - telnet_last_activity) > 300000000) { //300000000
//HMI_printf("Telnet inactivity timeout. Force exit.\r\n");
W5500_write_byte(W5500_p1, 0x0001, 0x05, 0x08); //close TCP
is_telnet_opened = 0;
echo_ON = 1;
display_status_ongoing = 0;
display_who_ongoing = 0;
printf("telnet connexion closed\r\nready> ");
fflush(stdout);
}
//timeout
}
if (RX_size > 0) {
telnet_last_activity = GLOBAL_timer.read_us();
result=1;
W5500_read_RX_buffer(W5500, 1, RX_data, RX_size);
RX_data[RX_size] = 0;
i = 0;
j = 0;
while (i < RX_size) {
loc_char = (char)RX_data[i];
//printf("%02X %c\r\n", loc_char, loc_char);
if ( (loc_char >= 0x20) && (loc_char <= 0x7E) ) {//displayable char
if ( (current_rx_line_count < 98) && (echo_ON) ) {
TX_data[j]=RX_data[i];
i++;
j++;
current_rx_line[current_rx_line_count] = loc_char;
current_rx_line_count++;
} else {
i++;
}
}
else { // special char
if (loc_char == 0xFF) {//IAC
if (RX_data[i+1] == 244) {//ctrl+C
HMI_cancel_current();
}
i = i + 3;
}
else if ( ( (loc_char == 0x08) || (loc_char == 0x7F) ) && (echo_ON) ) { //backspace
i++;
if (current_rx_line_count>0) {
current_rx_line_count--;
TX_data[j] = 0x08;
TX_data[j+1] = 0x20;
TX_data[j+2] = 0x08;
j=j+3;
}
}
else if ( (loc_char == 0x0D) && (echo_ON) ){ //end of line
TX_data[j] = 0x0D;
TX_data[j+1] = 0x0A;
i++;
j = j + 2;
current_rx_line[current_rx_line_count] = 0;//null termination
current_rx_line_count++;
W5500_write_TX_buffer (W5500, 1, TX_data, j, 0);
j = 0;
HMI_line_parse (current_rx_line, current_rx_line_count);
current_rx_line_count = 0;
}
else if (loc_char == 0x03) { //ctrl + C
HMI_cancel_current();
//printf("CTRL + C\r\n");
i++;
} else {
i++;
}
}
}
if (j > 0) {
W5500_write_TX_buffer (W5500, 1, TX_data, j, 0);
}
//printf("\r\n");
}
return result;
}
int serial_term_loop (void) {
char loc_char;
if (pc.readable()) {
loc_char = getc(pc);
if (is_telnet_opened == 0) {
if ( (loc_char >= 0x20) && (loc_char <= 0x7E) ) {//printable char
if ( (current_rx_line_count < 98) && (echo_ON) ) {
putc(loc_char, pc);
current_rx_line[current_rx_line_count] = loc_char;
current_rx_line_count++;
}
}
else {
if ( ( (loc_char == 0x08) || (loc_char == 0x7F) ) && (echo_ON) ) {//backspace
if (current_rx_line_count>0) {
current_rx_line_count--;
putc(0x08,pc);
putc(0x20,pc);
putc(0x08,pc);
}
}
else if ( (loc_char == 0x0D) && (echo_ON) ) {
printf("\r\n");
current_rx_line[current_rx_line_count] = 0;
current_rx_line_count++;
HMI_line_parse (current_rx_line, current_rx_line_count);
current_rx_line_count = 0;
}
else if (loc_char == 0x03) {//ctrl + c
HMI_cancel_current();
}
}
}
return 1;
} else {
return 0;
}
}
void HMI_line_parse (char* RX_text, int RX_text_count) {
char* loc_command_str;// [100];
char* loc_param1_str;
char* loc_param2_str;
int command_understood = 0;
int temp;
loc_command_str = strtok (RX_text, " ");
loc_param1_str = strtok (NULL, " ");
loc_param2_str = strtok (NULL, " ");
if (loc_command_str) {
if (strcmp(loc_command_str, "radio") == 0) {
command_understood = 1;
if (strcmp(loc_param1_str, "on") == 0) {
if (CONF_radio_state_ON_OFF == 0) {
RADIO_on(1, 1, 1);
}
HMI_printf("OK\r\nready> ");
}
else if (strcmp(loc_param1_str, "off") == 0) {
RADIO_off(1);
HMI_printf("OK\r\nready> ");
}
else {
HMI_printf("unknown radio command\r\nready> ");
}
}
if (strcmp(loc_command_str, "TX_test") == 0) {
command_understood = 1;
HMI_TX_test(loc_param1_str);
}
if (strcmp(loc_command_str, "status") == 0) {//display status
command_understood = 1;
display_status_ongoing = 1;
G_downlink_bandwidth_temp = 0;
G_uplink_bandwidth_temp = 0;
slow_counter = 0;
echo_ON = 0;
HMI_periodic_call();
}
if (strcmp(loc_command_str, "display") == 0) {
command_understood = 1;
if (strcmp(loc_param1_str, "config") == 0) {//display config
HMI_display_config();
}
else if (strcmp(loc_param1_str, "static") == 0) {//display static alloc
HMI_display_static();
}
else if (strcmp(loc_param1_str, "DHCP_ARP") == 0) {//display DHCP_ARP entries
DHCP_ARP_print_entries();
}
else {
HMI_printf("unknown display command\r\nready> ");
}
}
if (strcmp(loc_command_str, "set") == 0) {
HMI_set_command(loc_param1_str, loc_param2_str);
command_understood = 1;
}
if (strcmp(loc_command_str, "who") == 0) {
//HMI_print_who();
command_understood = 1;
display_who_ongoing = 1;
slow_counter = 0;
echo_ON = 0;
HMI_periodic_call();
}
if (strcmp(loc_command_str, "reboot") == 0) {
command_understood = 1;
HMI_reboot();
}
if (strcmp(loc_command_str, "save") == 0) {
command_understood = 1;
RADIO_off_if_necessary(0);
temp = NFPR_config_save();
RADIO_restart_if_necessary(0, 0, 1);
HMI_printf("saved index:%i\r\nready> ", temp);
}
if (strcmp(loc_command_str, "reset_to_default") == 0) {
command_understood = 1;
HMI_printf("clearing saved config...\r\n");
RADIO_off_if_necessary(0);
virt_EEPROM_errase_all();
HMI_printf("Done. Now rebooting...\r\n");
NVIC_SystemReset();
}
if (strcmp(loc_command_str, "version") == 0) {
command_understood = 1;
HMI_printf("firmware: %s\r\nfreq band: %s\r\nready> ", FW_VERSION, FREQ_BAND);
}
if (strcmp(loc_command_str, "exit") == 0) {
command_understood = 1;
HMI_exit();
}
if (command_understood == 0) {
HMI_printf("unknown command\r\nready> ");
}
} else {//just a return with nothing
HMI_printf("ready> ");
}
}
void HMI_cancel_current(void) {
if (echo_ON ==0) {
echo_ON = 1;
display_status_ongoing = 0;
display_who_ongoing = 0;
HMI_printf("ready> ");
}
}
int HMI_check_radio_OFF(void) {
if (CONF_radio_state_ON_OFF == 1) {
HMI_printf("radio must be off for this command\r\nready> ");
return 0;
} else {
return 1;
}
}
void HMI_TX_test(char* duration_txt) {
unsigned int duration;
if ( HMI_check_radio_OFF() == 1) {
sscanf (duration_txt, "%i", &duration);
HMI_printf("reconfiguring radio...\r\n");
SI4463_configure_all();
wait_ms(50);
TDMA_init_all();
//SI4463_radio_start();
wait_ms(1);
G_SI4463->RX_TX_state = 0;
SI4463_clear_IT(G_SI4463, 0, 0);
wait_ms(10);
CONF_radio_state_ON_OFF = 1;
SI4463_TX_to_RX_transition();
wait_ms(10);
CONF_radio_state_ON_OFF = 0;
if (is_TDMA_master == 0 ) {
my_client_radio_connexion_state = 1;
my_radio_client_ID = 0x7E;
}
wait_ms(50);
TDMA_NULL_frame_init(70);
HMI_printf("radio transmit test %i seconds...\r\n", duration);
duration = duration * 1000; //milliseconds instead of seconds
SI4432_TX_test(duration);
HMI_printf("ready> ");
}
}
void HMI_reboot(void) {
if (is_telnet_opened == 1) {
W5500_write_byte(W5500_p1, 0x0001, 0x05, 0x08);
}
//extern "C" void mbed_reset();
NVIC_SystemReset();
}
void HMI_force_exit(void) {
unsigned char IP_loc[8];
if (is_telnet_opened == 1) {
IP_int2char (LAN_conf_applied.LAN_modem_IP, IP_loc);
//HMI_printf("\r\n\r\n\r\nNew IP config... force telnet exit.\r\n");
//HMI_printf("\r\n\r\nNew IP config. Open new telnet session with: %i.%i.%i.%i\r\n\r\n", IP_loc[0], IP_loc[1], IP_loc[2], IP_loc[3]);
W5500_write_byte(W5500_p1, 0x0001, 0x05, 0x08); //close TCP
is_telnet_opened = 0;
echo_ON = 1;
display_status_ongoing = 0;
printf("telnet connexion closed\r\nready> ");
fflush(stdout);
}
}
void HMI_exit(void) {
if (is_telnet_opened == 1) {
W5500_write_byte(W5500_p1, 0x0001, 0x05, 0x08); //close TCP
is_telnet_opened = 0;
echo_ON = 1;
display_status_ongoing = 0;
printf("telnet connexion closed\r\nready> ");
fflush(stdout);
} else {
printf("exit only valid for telnet\r\nready> ");
fflush(stdout);
}
}
static char HMI_yes_no[2][4]={'n','o',0,0, 'y','e','s',0};
// static char HMI_trans_modes[2][4]={'I','P',0,0,'E','t','h',0};
static char HMI_master_FDD[3][5]={'n','o',0,0,0,'d','o','w','n',0,'u','p',0,0,0};
void HMI_display_config(void) {
unsigned char IP_loc[8];
HMI_printf("CONFIG:\r\n callsign: '%s'\r\n is_master: %s\r\n MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", CONF_radio_my_callsign+2, HMI_yes_no[is_TDMA_master],CONF_modem_MAC[0],CONF_modem_MAC[1],CONF_modem_MAC[2],CONF_modem_MAC[3],CONF_modem_MAC[4],CONF_modem_MAC[5]);
HMI_printf(" Eth_mode: %i\r\n", CONF_Eth_mode);
HMI_printf(" ext_SRAM: %s\r\n", HMI_yes_no[is_SRAM_ext]);
HMI_printf(" frequency: %.3fMHz\r\n freq_shift: %.3fMHz\r\n RF_power: %i\r\n modulation: %i\r\n", ((float)CONF_frequency_HD/1000)+FREQ_RANGE_MIN, (float)CONF_freq_shift/1000, CONF_radio_PA_PWR, CONF_radio_modulation);
HMI_printf(" radio_netw_ID: %i\r\n radio_on_at_start: %s\r\n", CONF_radio_network_ID, HMI_yes_no[CONF_radio_default_state_ON_OFF]);
HMI_printf(" telnet active: %s\r\n telnet routed: %s\r\n", HMI_yes_no[is_telnet_active], HMI_yes_no[is_telnet_routed]);
IP_int2char (LAN_conf_saved.LAN_modem_IP, IP_loc);
IP_int2char (LAN_conf_saved.LAN_subnet_mask, IP_loc+4);
HMI_printf(" modem_IP: %i.%i.%i.%i\r\n netmask: %i.%i.%i.%i\r\n", IP_loc[0], IP_loc[1],IP_loc[2],IP_loc[3],IP_loc[4],IP_loc[5],IP_loc[6],IP_loc[7]);
if (is_TDMA_master == 1) {
HMI_printf(" master_FDD: %s\r\n", HMI_master_FDD[CONF_master_FDD]);
}
if ( (is_TDMA_master == 1) && ( CONF_master_FDD < 2 ) && (CONF_transmission_method==0) ) {//Master FDD down (or no FDD)
IP_int2char (CONF_radio_IP_start, IP_loc);
IP_int2char (CONF_radio_IP_start+CONF_radio_IP_size-1, IP_loc+4);
HMI_printf(" IP_begin: %i.%i.%i.%i\r\n master_IP_size: %ld (Last IP: %i.%i.%i.%i)\r\n", IP_loc[0], IP_loc[1],IP_loc[2],IP_loc[3],CONF_radio_IP_size, IP_loc[4],IP_loc[5],IP_loc[6],IP_loc[7]);
IP_int2char (LAN_conf_saved.LAN_def_route, IP_loc);
HMI_printf(" def_route_active: %s\r\n def_route_val: %i.%i.%i.%i\r\n", HMI_yes_no[LAN_conf_saved.LAN_def_route_activ], IP_loc[0],IP_loc[1],IP_loc[2],IP_loc[3]);
IP_int2char (LAN_conf_saved.LAN_DNS_value, IP_loc);
HMI_printf(" DNS_active: %s\r\n DNS_value: %i.%i.%i.%i\r\n", HMI_yes_no[LAN_conf_saved.LAN_DNS_activ], IP_loc[0],IP_loc[1],IP_loc[2],IP_loc[3]);
}
if ( (is_TDMA_master == 1) && (CONF_master_FDD == 2) ) {//Master FDD up
IP_int2char (CONF_master_down_IP, IP_loc);
HMI_printf(" master_down_IP: %i.%i.%i.%i\r\n",IP_loc[0],IP_loc[1],IP_loc[2],IP_loc[3]);
}
if (is_TDMA_master == 0) {//client
IP_int2char (CONF_radio_IP_start, IP_loc);
HMI_printf(" IP_begin: %i.%i.%i.%i\r\n", IP_loc[0], IP_loc[1],IP_loc[2],IP_loc[3]);
HMI_printf(" client_req_size: %ld\r\n DHCP_active: %s\r\n", CONF_radio_IP_size_requested, HMI_yes_no[LAN_conf_saved.DHCP_server_active]);
}
HMI_printf("ready> ");
}
void HMI_display_static(void) {
}
void HMI_set_command(char* loc_param1, char* loc_param2) {
int temp;
unsigned char temp_uchar;
unsigned long int temp_uint;
float frequency;
// unsigned char previous_freq_band;
char DHCP_warning[50];
if ((loc_param1) && (loc_param2)) {
if (strcmp(loc_param1, "callsign") == 0) {
RADIO_off_if_necessary(1);
strcpy (CONF_radio_my_callsign+2, loc_param2);
CONF_radio_my_callsign[0] = CONF_modem_MAC[4];
CONF_radio_my_callsign[1] = CONF_modem_MAC[5];
CONF_radio_my_callsign[15] = 0;
RADIO_restart_if_necessary(1, 0, 1);
HMI_printf("new callsign '%s'\r\nready> ", CONF_radio_my_callsign+2);
}
else if (strcmp(loc_param1, "is_master") == 0) {
temp_uchar = HMI_yes_no_2int(loc_param2);
if ( (temp_uchar==0) || (temp_uchar==1) ) {
RADIO_off_if_necessary(1);
is_TDMA_master = temp_uchar;
RADIO_restart_if_necessary(1, 0, 1);
if ( (is_TDMA_master) && (LAN_conf_saved.DHCP_server_active == 1) ) {
strcpy (DHCP_warning, " (warning, DHCP inhibited in master mode)");
} else {
strcpy (DHCP_warning, "");
}
HMI_printf("Master '%s'%s\r\nready> ", loc_param2, DHCP_warning);
}
}
else if (strcmp(loc_param1, "telnet_active") == 0) {
temp_uchar = HMI_yes_no_2int(loc_param2);
if ( (temp_uchar==0) || (temp_uchar==1) ) {
if(is_telnet_opened) { HMI_exit(); }
is_telnet_active = temp_uchar;
HMI_printf("telnet active '%s'\r\nready> ", loc_param2);
}
}
else if (strcmp(loc_param1, "telnet_routed") == 0) {
temp_uchar = HMI_yes_no_2int(loc_param2);
if ( (temp_uchar==0) || (temp_uchar==1) ) {
is_telnet_routed = temp_uchar;
//W5500_re_configure_gateway(W5500_p1);
HMI_printf("telnet routed '%s'\r\nready> ", loc_param2);
}
}
else if (strcmp(loc_param1, "DNS_active") == 0) {
temp_uchar = HMI_yes_no_2int(loc_param2);
if ( (temp_uchar==0) || (temp_uchar==1) ) {
RADIO_off_if_necessary(1);
LAN_conf_saved.LAN_DNS_activ = temp_uchar;
RADIO_restart_if_necessary(1, 0, 1);
HMI_printf("DNS active '%s'\r\nready> ", loc_param2);
}
}
else if (strcmp(loc_param1, "def_route_active") == 0) {
temp_uchar = HMI_yes_no_2int(loc_param2);
if ( (temp_uchar==0) || (temp_uchar==1) ) {
RADIO_off_if_necessary(1);
LAN_conf_saved.LAN_def_route_activ = temp_uchar;
//W5500_re_configure_gateway(W5500_p1);
RADIO_restart_if_necessary(1, 0, 1);
HMI_printf("default route active '%s'\r\nready> ", loc_param2);
}
}
else if (strcmp(loc_param1, "master_FDD") == 0) {
if(strcmp(loc_param2,"no") == 0) {
CONF_master_FDD = 0;
RADIO_off_if_necessary(1);
RADIO_restart_if_necessary(1, 0, 1);
}
else if(strcmp(loc_param2,"down") == 0) {
CONF_master_FDD = 1;
RADIO_off_if_necessary(1);
RADIO_restart_if_necessary(1, 0, 1);
}
else if(strcmp(loc_param2,"up") == 0) {
CONF_master_FDD = 2;
RADIO_off_if_necessary(1);
RADIO_restart_if_necessary(1, 0, 1);
}
else {
HMI_printf(" wrong value\r\n");
}
HMI_printf("ready> ");
}
//else if (strcmp(loc_param1, "trans_method") == 0) {
// if(strcmp(loc_param2,"IP") == 0) {
// CONF_transmission_method = 0;
// RADIO_off_if_necessary(1);
// RADIO_restart_if_necessary(1, 0, 1);
// }
// else if(strcmp(loc_param2,"Eth") == 0) {
// CONF_transmission_method = 1;
// RADIO_off_if_necessary(1);
// RADIO_restart_if_necessary(1, 0, 1);
// }
// else {
// HMI_printf(" wrong value\r\n");
// }
// HMI_printf("ready> ");
//}
//else if (strcmp(loc_param1, "client_static_IP") == 0) {
// temp_uchar = HMI_yes_no_2int(loc_param2);
// if ( (temp_uchar==0) || (temp_uchar==1) ) {
// RADIO_off_if_necessary(1);
// CONF_radio_static_IP_requested = temp_uchar;
// HMI_printf("client static IP '%s'\r\nready> ", loc_param2);
// RADIO_restart_if_necessary(1, 0, 1);
// }
//}
else if (strcmp(loc_param1, "radio_on_at_start") == 0) {
temp_uchar = HMI_yes_no_2int(loc_param2);
if ( (temp_uchar==0) || (temp_uchar==1) ) {
CONF_radio_default_state_ON_OFF = temp_uchar;
HMI_printf("radio_on_at_start '%s'\r\nready> ", loc_param2);
}
}
else if (strcmp(loc_param1, "DHCP_active") == 0) {
temp_uchar = HMI_yes_no_2int(loc_param2);
if ( (temp_uchar==0) || (temp_uchar==1) ) {
LAN_conf_saved.DHCP_server_active = temp_uchar;
if ( (is_TDMA_master) && (LAN_conf_saved.DHCP_server_active == 1) ) {
strcpy (DHCP_warning, " (warning, DHCP inhibited in master mode)");
} else {
strcpy (DHCP_warning, "");
}
HMI_printf("DHCP_active: '%s'%s\r\nready> ", loc_param2, DHCP_warning);
}
}
else if (strcmp(loc_param1, "modem_IP") == 0) {
temp_uint = HMI_str2IP(loc_param2);
if (temp_uint !=0) {
RADIO_off_if_necessary(1);
LAN_conf_saved.LAN_modem_IP = temp_uint;
//HMI_force_exit();
//W5500_re_configure();
RADIO_restart_if_necessary(1, 0, 1);
}
}
else if (strcmp(loc_param1, "netmask") == 0) {
temp_uint = HMI_str2IP(loc_param2);
if (temp_uint !=0) {
RADIO_off_if_necessary(1);
LAN_conf_saved.LAN_subnet_mask = temp_uint;
//HMI_force_exit();
//W5500_re_configure();
RADIO_restart_if_necessary(1, 0, 1);
}
}
else if (strcmp(loc_param1, "def_route_val") == 0) {
temp_uint = HMI_str2IP(loc_param2);
if (temp_uint !=0) {
RADIO_off_if_necessary(1);
LAN_conf_saved.LAN_def_route = temp_uint;
//W5500_re_configure_gateway(W5500_p1);
RADIO_restart_if_necessary(1, 0, 1);
}
}
else if (strcmp(loc_param1, "DNS_value") == 0) {
temp_uint = HMI_str2IP(loc_param2);
if (temp_uint !=0) {
RADIO_off_if_necessary(1);
LAN_conf_saved.LAN_DNS_value = temp_uint;
RADIO_restart_if_necessary(1, 0, 1);
}
}
else if (strcmp(loc_param1, "IP_begin") == 0) {
temp_uint = HMI_str2IP(loc_param2);
if (temp_uint !=0) {
RADIO_off_if_necessary(1);
CONF_radio_IP_start = temp_uint;
RADIO_restart_if_necessary(1, 0, 1);
}
}
else if (strcmp(loc_param1, "master_down_IP") == 0) {
temp_uint = HMI_str2IP(loc_param2);
if (temp_uint !=0) {
RADIO_off_if_necessary(1);
CONF_master_down_IP = temp_uint;
RADIO_restart_if_necessary(1, 0, 1);
}
}
else if (strcmp(loc_param1, "master_IP_size") == 0) {
temp = sscanf (loc_param2, "%ld", &temp_uint);
if ( (temp==1) && (temp_uint!=0) ) {
RADIO_off_if_necessary(1);
CONF_radio_IP_size = temp_uint;
RADIO_restart_if_necessary(1, 0, 1);
HMI_printf("OK\r\nready> ");
}
else {
HMI_printf("wrong value\r\nready> ");
}
}
else if (strcmp(loc_param1, "client_req_size") == 0) {
temp = sscanf (loc_param2, "%ld", &temp_uint);
if ( (temp==1) && (temp_uint!=0) ) {
RADIO_off_if_necessary(1);
CONF_radio_IP_size_requested = temp_uint;
RADIO_restart_if_necessary(1, 0, 1);
HMI_printf("OK\r\nready> ");
}
else {
HMI_printf("wrong value\r\nready> ");
}
}
else if (strcmp(loc_param1, "frequency") == 0) {
temp = sscanf (loc_param2, "%f", &frequency);
if ( (temp == 1) && (frequency<=FREQ_RANGE_MAX) && (frequency>FREQ_RANGE_MIN) ) {
RADIO_off_if_necessary(0);
frequency = (frequency - FREQ_RANGE_MIN)*1000 + 0.3;
CONF_frequency_HD = (short int)frequency;
//RADIO_compute_freq_params();//REMOVE TEST
RADIO_restart_if_necessary(0, 1, 1);
HMI_printf("OK\r\nready> ");
} else {
HMI_printf("wrong freq value\r\nready> ");
}
}
else if (strcmp(loc_param1, "freq_shift") == 0) {
temp = sscanf (loc_param2, "%f", &frequency);
if ( (temp == 1) && (frequency<=10) && (frequency>=-10) ) {
RADIO_off_if_necessary(0);
frequency = (frequency*1000);
CONF_freq_shift = (short int)frequency;
//RADIO_compute_freq_params();//REMOVE TEST
//if (CONF_frequency_band == previous_freq_band) {
// RADIO_restart_if_necessary(0, 0, 1);
//}else {
RADIO_restart_if_necessary(0, 1, 1);
//}
HMI_printf("OK\r\nready> ");
} else {
HMI_printf("wrong freq value\r\nready> ");
}
}
else if (strcmp(loc_param1, "RF_power") == 0) {
temp_uint = sscanf (loc_param2, "%i", &temp);
if ( (temp_uint == 1) && (temp<128) ) {
RADIO_off_if_necessary(0);
CONF_radio_PA_PWR = temp;
SI4463_set_power(G_SI4463);
RADIO_restart_if_necessary(0, 0, 1);
HMI_printf("OK\r\nready> ");
} else {
HMI_printf("error : max RF_power value 127\r\nready> ");
}
}
else if (strcmp(loc_param1, "Eth_mode") == 0) {
temp_uint = sscanf (loc_param2, "%i", &temp);
if ( (temp_uint == 1) && (temp <= 7) ) {
CONF_Eth_mode = temp;
HMI_printf("OK\r\nready> ");
} else {
HMI_printf("error : max Eth_mode value 7\r\nready> ");
}
}
else if (strcmp(loc_param1, "modulation") == 0) {
temp_uint = sscanf (loc_param2, "%i", &temp);
temp_uchar = temp;
//if ( (temp_uint == 1) && ((temp_uchar==13)||(temp_uchar==14)||(temp_uchar==22)||(temp_uchar==23)||(temp_uchar==24)) ) {
if ( (temp_uint == 1) && ( ((temp_uchar>=11)&&(temp_uchar<=14)) || ((temp_uchar>=20)&&(temp_uchar<=24)) ) ) {
RADIO_off_if_necessary(1);
CONF_radio_modulation = temp_uchar;
RADIO_restart_if_necessary(1, 1, 1);
HMI_printf("OK\r\nready> ");
} else {
HMI_printf("wrong modulation value\r\nready> ");
}
}
else if (strcmp(loc_param1, "radio_netw_ID") == 0) {
temp_uint = sscanf (loc_param2, "%i", &temp);
temp_uchar = temp;
if ( (temp_uint == 1) && (temp_uchar <= 15) ) {
RADIO_off_if_necessary(1);
CONF_radio_network_ID = temp_uchar;
RADIO_restart_if_necessary(1, 1, 1);
HMI_printf("OK\r\nready> ");
} else {
HMI_printf("wrong value, 15 max\r\nready> ");
}
}
else {
HMI_printf("unknown config param\r\nready> ");
}
} else {
HMI_printf("set command requires 2 param\r\nready> ");
}
}
unsigned long int HMI_str2IP(char* raw_string) {
unsigned int IP_char_t[6];
unsigned char IP_char[6];
unsigned long int answer;
int i;
answer = sscanf(raw_string, "%i.%i.%i.%i", IP_char_t, IP_char_t+1, IP_char_t+2, IP_char_t+3);
for (i=0;i<4; i++) {
IP_char[i] = IP_char_t[i];
}
if (answer == 4) {
answer = IP_char2int(IP_char);
HMI_printf("OK\r\nready> ");
} else {
HMI_printf("bad IP format\r\nready> ");
answer = 0;
}
return answer;
}
unsigned char HMI_yes_no_2int(char* raw_string) {
unsigned char answer;
if (strcmp (raw_string, "yes") == 0) {
answer = 1;
}
else if (strcmp (raw_string, "no") == 0) {
answer = 0;
}
else {
HMI_printf("value must be 'yes' or 'no'\r\nready> ");
answer = -1;
}
return answer;
}
void HMI_print_who(void) {
int i;
unsigned int loc_age;
unsigned int timer_snapshot;
unsigned long int last_IP;
unsigned char IP_c[6];
char temp_string[50] = {0x1B,0x5B,0x41,0x1B,0x5B,0x41,0x1B,0x5B,0x41,0x1B, 0x5B, 0x41,0x1B, 0x5B, 0x41,0x1B, 0x5B, 0x41,0x1B, 0x5B, 0x41,0x1B, 0x5B, 0x41,0x1B, 0x5B, 0x41,0x1B, 0x5B, 0x41,0x1B, 0x5B, 0x41,0x00};
if (slow_counter == 0) { temp_string[0] = 0; }
HMI_printf ("%s%i Master: ID:127 Callsign:%s\r\n", temp_string, slow_counter, CONF_radio_master_callsign+2);
IP_int2char (LAN_conf_applied.LAN_modem_IP, IP_c);
HMI_printf ("ME: Callsign:%s ID:%i modem IP:%i.%i.%i.%i\r\n", CONF_radio_my_callsign+2, my_radio_client_ID, IP_c[0], IP_c[1], IP_c[2], IP_c[3]);
HMI_printf ("Clients:\r\n");
timer_snapshot = GLOBAL_timer.read_us();
for (i=0; i<radio_addr_table_size; i++) {
}
for (i=0; i<radio_addr_table_size; i++) {
loc_age = timer_snapshot - CONF_radio_addr_table_date[i];
loc_age = loc_age / 1000000;
if (is_TDMA_master) {loc_age = 0;} // master : already timeout in state machine
//printf ("age:%i ", loc_age);
if ( (CONF_radio_addr_table_status[i]) && (loc_age < CONNECTION_TIMEOUT) ) {
HMI_printf (" ID:%i Callsign:%s ", i, CONF_radio_addr_table_callsign[i]+2);
IP_int2char (CONF_radio_addr_table_IP_begin[i], IP_c);
HMI_printf ("IP start:%i.%i.%i.%i ", IP_c[0], IP_c[1], IP_c[2], IP_c[3]);
last_IP = CONF_radio_addr_table_IP_begin[i] + CONF_radio_addr_table_IP_size[i] - 1;
IP_int2char (last_IP, IP_c);
HMI_printf ("IP end:%i.%i.%i.%i\r\n", IP_c[0], IP_c[1], IP_c[2], IP_c[3]);
} else {
HMI_printf (" \r\n");
}
}
HMI_printf("CTRL+c to exit...\r\n");
}
void HMI_print_status(void) {
static char text_radio_status[3][22] = {
"waiting connection",
"connected",
"connection rejected"
};
static char text_reject_reason[2][15] = {
"IP requested",
"clients",
};
char temp_string[22];
float loc_downlink_bw;
float loc_uplink_bw;
int TA_loc;
temp_string[0]=0x1B;
temp_string[1]=0x5B;
temp_string[2]=0x41;
temp_string[3]=0x1B;
temp_string[4]=0x5B;
temp_string[5]=0x41;
temp_string[6]=0x1B;
temp_string[7]=0x5B;
temp_string[8]=0x41;
temp_string[9]=0x1B;
temp_string[10]=0x5B;
temp_string[11]=0x41;
temp_string[12]=0x1B;
temp_string[13]=0x5B;
temp_string[14]=0x41;
temp_string[15]=0x00;
//temp_string[15]=0x1B;
//temp_string[16]=0x5B;
//temp_string[17]=0x41;
//temp_string[18]=0x00;
if (slow_counter == 0) { temp_string[0] = 0; }
if (is_TDMA_master) {
loc_downlink_bw = G_uplink_bandwidth_temp * 0.004;
loc_uplink_bw = G_downlink_bandwidth_temp * 0.004;
TA_loc = 0;
} else {
loc_downlink_bw = G_downlink_bandwidth_temp * 0.004;
loc_uplink_bw = G_uplink_bandwidth_temp * 0.004;
TA_loc = TDMA_table_TA[my_radio_client_ID];
}
if (CONF_radio_state_ON_OFF == 0) {
HMI_printf("%s %i status: radio OFF \r\n", temp_string, slow_counter);
}
else if (my_client_radio_connexion_state == 0x03) {
HMI_printf("%s %i status: rejected because too many %s \r\n", temp_string, slow_counter, text_reject_reason[G_connect_rejection_reason-2]);
} else {
HMI_printf("%s %i status: %s TA:%.1fkm Temp:%idegC \r\n", temp_string, slow_counter, text_radio_status[my_client_radio_connexion_state-1], 0.15*(float)TA_loc, G_temperature_SI4463);
}
//HMI_printf(" TX buff filling %i\r\n", (TX_buff_ext_WR_pointer - TX_buff_ext_RD_pointer)*128);//!!!test
if ( (is_TDMA_master == 1) && (CONF_master_FDD == 2) ) {
HMI_printf(" RX tops from master FDD down %i\r\n", RX_top_FDD_up_counter);
} else {
HMI_printf(" RX_Eth_IPv4 %i ;TX_radio_IPv4 %i ; RX_radio_IPv4 %i \r\n", RX_Eth_IPv4_counter, TX_radio_IPv4_counter, RX_radio_IPv4_counter);
//HMI_printf(" RX_Eth_IPv4 %i ;TX_radio_IPv4 %i ; RX_radio_IPv4 %i \r\n", RX_Eth_IPv4_counter, TX_radio_IPv4_counter, (TX_buff_ext_WR_pointer - TX_buff_ext_RD_pointer)*128);//!!!! debug FIFO filling
}
if ( (is_TDMA_master == 0) && (RSSI_stat_pkt_nb > 0) ) {
//HMI_printf("RSSI: %i\r\nCTRL+c to exit...\r\n", (RSSI_total_stat / RSSI_stat_pkt_nb) );
HMI_printf(" DOWNLINK - bandwidth:%.1f RSSI:%.1f ERR:%.2f%% \r\n", loc_downlink_bw, ((float)G_downlink_RSSI/256/2-136), ((float)G_downlink_BER)/500); // /500
RSSI_total_stat = 0;
RSSI_stat_pkt_nb = 0;
} else {
HMI_printf(" DOWNLINK - bandwidth: %.1f RSSI: ERR: \r\n", loc_downlink_bw);
}
if ( (is_TDMA_master == 0) && (my_client_radio_connexion_state == 2) ) {
HMI_printf(" UPLINK - bandwidth:%.1f RSSI:%.1f ERR:%.2f%% \r\nCTRL+c to exit...\r\n", loc_uplink_bw, ((float)G_radio_addr_table_RSSI[my_radio_client_ID]/2-136), ((float)G_radio_addr_table_BER[my_radio_client_ID])/500);
} else {
HMI_printf(" UPLINK - bandwidth:%.1f RSSI: ERR: \r\nCTRL+c to exit...\r\n", loc_uplink_bw);
}
G_downlink_bandwidth_temp = 0;
G_uplink_bandwidth_temp = 0;
}
void HMI_periodic_call (void) {
if (display_status_ongoing) {
HMI_print_status();
slow_counter++;
}
if (display_who_ongoing) {
HMI_print_who();
slow_counter++;
}
}
void HMI_printf_detail (void) {
int size;
if (is_telnet_opened) {
size = strlen (HMI_out_str);
W5500_write_TX_buffer (W5500_p1, 1, (unsigned char*)HMI_out_str, size, 0);
}
else {
printf("%s", HMI_out_str);
fflush(stdout);
}
}