// 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 #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 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); } }