Added remote access to the nano shell, change \n to \r\n + other changes

This commit is contained in:
Th3maz1ng 2022-07-03 18:39:01 +02:00
parent ad70e850cd
commit d1f2e141d8
8 changed files with 249 additions and 110 deletions

1
app/common.h Normal file
View File

@ -0,0 +1 @@
#define NEW_LINE "\r\n"

View File

@ -19,13 +19,15 @@
#include "lwip/netif.h"
#include "FreeRTOS.h"
#include "FreeRTOSConfig.h"
#include "common.h"
tls_os_task_t nano_shell_task_handle = NULL;
tls_os_task_t nano_shell_server_task_handle = NULL;
extern s16 uart0_rx_callback(u16 len, void *user_data);
extern s16 uart1_rx_callback(u16 len, void *user_data);
extern int shell_printf(const char *format, ...);
#define NANO_SHELL_TASK_STK_SIZE 1024
#define NANO_SHELL_TASK_STK_SIZE 640
#define NANO_SHELL_SERVER_TASK_STK_SIZE 640
#define STATUS_LED WM_IO_PB_18
#define PWM_STATUS_LED WM_IO_PB_25
@ -45,47 +47,47 @@ void tls_netif_status_event_cb(u8 status)
switch(status)
{
case NETIF_WIFI_JOIN_SUCCESS:
shell_printf("Evt : NETIF_WIFI_JOIN_SUCCESS\n");
shell_printf("Evt : NETIF_WIFI_JOIN_SUCCESS"NEW_LINE);
break;
case NETIF_WIFI_JOIN_FAILED:
shell_printf("Evt : NETIF_WIFI_JOIN_FAILED\n");
shell_printf("Evt : NETIF_WIFI_JOIN_FAILED"NEW_LINE);
break;
case NETIF_WIFI_DISCONNECTED:
shell_printf("Evt : NETIF_WIFI_DISCONNECTED\n");
shell_printf("Evt : NETIF_WIFI_DISCONNECTED"NEW_LINE);
pulse_rate = PULSE_SLOW;
break;
case NETIF_IP_NET_UP:
shell_printf("Evt : NETIF_IP_NET_UP\nip addr : %v\nnetmask : %v\ngateway : %v\n", netif->ip_addr.addr,
shell_printf("Evt : NETIF_IP_NET_UP"NEW_LINE"ip addr : %v"NEW_LINE"netmask : %v"NEW_LINE"gateway : %v"NEW_LINE, netif->ip_addr.addr,
netif->netmask.addr,
netif->gw.addr);
pulse_rate = PULSE_FAST;
break;
case NETIF_WIFI_SOFTAP_SUCCESS:
shell_printf("Evt : NETIF_WIFI_SOFTAP_SUCCESS\n");
shell_printf("Evt : NETIF_WIFI_SOFTAP_SUCCESS"NEW_LINE);
break;
case NETIF_WIFI_SOFTAP_FAILED:
shell_printf("Evt : NETIF_WIFI_SOFTAP_FAILED\n");
shell_printf("Evt : NETIF_WIFI_SOFTAP_FAILED"NEW_LINE);
break;
case NETIF_WIFI_SOFTAP_CLOSED:
shell_printf("Evt : NETIF_WIFI_SOFTAP_CLOSED\n");
shell_printf("Evt : NETIF_WIFI_SOFTAP_CLOSED"NEW_LINE);
break;
case NETIF_IP_NET2_UP:
shell_printf("Evt : NETIF_IP_NET2_UP\nip addr : %v\nnetmask : %v\ngateway : %v\n", netif->next->ip_addr.addr,
shell_printf("Evt : NETIF_IP_NET2_UP"NEW_LINE"ip addr : %v"NEW_LINE"netmask : %v"NEW_LINE"gateway : %v"NEW_LINE, netif->next->ip_addr.addr,
netif->next->netmask.addr,
netif->next->gw.addr);
break;
case NETIF_IPV6_NET_UP:
shell_printf("Evt : NETIF_IPV6_NET_UP\n");
shell_printf("Evt : NETIF_IPV6_NET_UP"NEW_LINE);
break;
default:
shell_printf("Evt : UNKNOWN\n");
shell_printf("Evt : UNKNOWN"NEW_LINE);
break;
}
}
void touchsensor_cb(u32 status)
{
shell_printf("Touch detected : status(%u)\n", status);
shell_printf("Touch detected : status(%u)"NEW_LINE, status);
}
void tls_gpio_irq_cb(void *arg)
@ -123,6 +125,21 @@ void user_main(void *param)
tls_uart_rx_callback_register(TLS_UART_1, &(uart1_rx_callback), NULL);
nano_shell_server_task_stack = tls_mem_alloc(sizeof(u32) * NANO_SHELL_SERVER_TASK_STK_SIZE);
if(nano_shell_server_task_stack != NULL)
{
tls_os_status_t status = tls_os_task_create(
&nano_shell_server_task_handle,
"shll_srv",
&(nano_shell_server_task),
NULL,
(void*) nano_shell_server_task_stack,
NANO_SHELL_SERVER_TASK_STK_SIZE * sizeof(u32_t),
62,
0
);
if(status != TLS_OS_SUCCESS)
shell_printf("Failed to create nano shell server task."NEW_LINE);
}
nano_shell_task_stack = tls_mem_alloc(sizeof(u32) * NANO_SHELL_TASK_STK_SIZE);
if(nano_shell_task_stack != NULL)
@ -139,23 +156,9 @@ void user_main(void *param)
);
}
shell_printf("Registering netif callback.\n");
shell_printf("Registering netif callback."NEW_LINE);
tls_netif_add_status_event(&(tls_netif_status_event_cb));
//Socket test
/*
char buffer[100] = "", *found = NULL;
struct sockaddr_in server = {
.sin_family = AF_INET,
.sin_addr.s_addr = INADDR_ANY,
.sin_port = htons(80)
};
struct sockaddr_in client;
socklen_t socklent = sizeof(client);
int listening_socket = socket(AF_INET, SOCK_STREAM, 0), client_socket;
bind(listening_socket, (struct sockaddr *)&server, sizeof(server));
listen(listening_socket, 1);*/
for(;;)
{
tls_pwm_duty_set(3, pwm_led_duty_cycle);
@ -173,17 +176,6 @@ void user_main(void *param)
pwm_led_duty_cycle+=fading_direction;
tls_os_time_delay(pdMS_TO_TICKS(pulse_rate));
/*client_socket = accept(listening_socket, (struct sockaddr *)&client, &socklent);
shell_printf("Client got accepted\n");
while(recv(client_socket, buffer, 99, 0) > 0)
{
if((found = strchr(buffer, '\r')) != NULL)
*found = '\0';
if(buffer[0])
shell_printf("Recv data : #%s#\n", buffer);
memset(buffer, 0, sizeof buffer);
}
close(client_socket);*/
}
}

View File

@ -6,6 +6,7 @@
#include "FreeRTOS.h"
#include "task.h"
#include "lwip/netif.h"
#include "common.h"
extern int shell_printf(const char *format, ...);
extern int wm_printf(const char *fmt,...);
@ -20,7 +21,7 @@ void tls_wifi_client_event_cb(u8 *mac, enum tls_wifi_client_event_type event)
{
struct tls_sta_info_t *mac_addr = (struct tls_sta_info_t *)mac;
shell_printf("Client event(%d), MAC : %M\n", event, mac_addr);
shell_printf("Client event(%d), MAC : %M"NEW_LINE, event, mac_addr);
}
void wifi_scan_result_cb(void)
@ -29,14 +30,14 @@ void wifi_scan_result_cb(void)
u8 *buf = tls_mem_alloc(buffer_size);
if(buf == NULL)
{
shell_printf("Failed to allocate result buffer\n");
shell_printf("Failed to allocate result buffer"NEW_LINE);
return;
}
struct tls_scan_bss_t *scan_result = (struct tls_scan_bss_t *)buf;
struct tls_bss_info_t *station_list = scan_result->bss;
tls_wifi_get_scan_rslt(buf, buffer_size);
shell_printf("Found %u nearby station(s) - info size(%u/%u)\n",
shell_printf("Found %u nearby station(s) - info size(%u/%u)"NEW_LINE,
scan_result->count,
scan_result->length,
buffer_size);
@ -44,7 +45,7 @@ void wifi_scan_result_cb(void)
for(u8 i = 0; i < scan_result->count; i++)
{
station_list[i].ssid[station_list[i].ssid_len] = '\0';
shell_printf("station %u :\nSSID : %s\nBSSID : %02X:%02X:%02X:%02X:%02X:%02X\nRSSI : %d dB\nChannel : %u\nMax DR : %u Mbps\nMode %u\nAuth :%u\nWPS supported : %u\n\n",
shell_printf("station %u :"NEW_LINE"SSID : %s"NEW_LINE"BSSID : %02X:%02X:%02X:%02X:%02X:%02X"NEW_LINE"RSSI : %d dB"NEW_LINE"Channel : %u"NEW_LINE"Max DR : %u Mbps"NEW_LINE"Mode %u"NEW_LINE"Auth :%u"NEW_LINE"WPS supported : %u"NEW_LINE NEW_LINE,
i,
(char *)station_list[i].ssid,
station_list[i].bssid[0], station_list[i].bssid[1], station_list[i].bssid[2], station_list[i].bssid[3], station_list[i].bssid[4], station_list[i].bssid[5],
@ -61,14 +62,14 @@ void wifi_scan_result_cb(void)
void tls_wifi_data_ext_recv_cb(u8* data, u32 data_len, struct tls_wifi_ext_t *ext)
{
shell_printf("recv packet :\nrssi : %d\nrate : %u\n", (s8)ext->rssi, ext->rx_rate);
shell_printf("recv packet :"NEW_LINE"rssi : %d\nrate : %u"NEW_LINE, (s8)ext->rssi, ext->rx_rate);
for(u32 i = 0; i < data_len; i++)
{
shell_printf("%02X", data[i]);
if(i % 30 == 0)
shell_printf("\n");
shell_printf(NEW_LINE);
}
shell_printf("\n");
shell_printf(NEW_LINE);
}
void tls_rtc_irq_cb(void *arg)
@ -76,7 +77,7 @@ void tls_rtc_irq_cb(void *arg)
struct tm rtc_time;
tls_get_rtc(&rtc_time);
shell_printf("rtc isr called\ntime is :\n%d:%d:%d %d/%d/%d\n",
shell_printf("rtc isr called"NEW_LINE"time is :"NEW_LINE"%d:%d:%d %d/%d/%d"NEW_LINE,
rtc_time.tm_hour,
rtc_time.tm_min,
rtc_time.tm_sec,
@ -101,22 +102,22 @@ int _system(const shell_cmd_t *pcmd, int argc, char *const argv[])
#if configUSE_TRACE_FACILITY
vTaskList(buf);
#endif
shell_printf("\n%s\nbuf_len : %d\n", buf, strlen(buf));
shell_printf(NEW_LINE"%s"NEW_LINE"buf_len : %d"NEW_LINE, buf, strlen(buf));
tls_mem_free(buf);
buf = NULL;
}
else if(strcmp(argv[1], "ram_usage") == 0)
{
shell_printf("Free OS heap : %u/%u byte(s)\ntls heap size : %u\n", xPortGetFreeHeapSize(), configTOTAL_HEAP_SIZE, tls_mem_get_avail_heapsize());
shell_printf("Free OS heap : %u/%u byte(s)"NEW_LINE"tls heap size : %u"NEW_LINE, xPortGetFreeHeapSize(), configTOTAL_HEAP_SIZE, tls_mem_get_avail_heapsize());
}
else
{
shell_printf("Unknown %s action\n", argv[0]);
shell_printf("Unknown %s action"NEW_LINE, argv[0]);
}
}
else
{
shell_printf("List of system actions :\nlist_task\nram_usage\n");
shell_printf("List of system actions :"NEW_LINE"list_task"NEW_LINE"ram_usage"NEW_LINE);
}
return 0;
}
@ -133,7 +134,7 @@ int _soft_ap(const shell_cmd_t *pcmd, int argc, char *const argv[])
{
if(strcmp(argv[1], "state") == 0)
{
shell_printf("SOFT AP state : %u\n", tls_wifi_softap_get_state());
shell_printf("SOFT AP state : %u"NEW_LINE, tls_wifi_softap_get_state());
}
else if(strcmp(argv[1], "create") == 0)
{
@ -143,7 +144,7 @@ int _soft_ap(const shell_cmd_t *pcmd, int argc, char *const argv[])
tls_wifi_set_oneshot_flag(0);
tls_wifi_softap_destroy();
shell_printf("Registering client event callback\n");
shell_printf("Registering client event callback"NEW_LINE);
tls_wifi_softap_client_event_register(&(tls_wifi_client_event_cb));
strncpy((char *)ap_info.ssid, argv[2], 32);
@ -167,23 +168,23 @@ int _soft_ap(const shell_cmd_t *pcmd, int argc, char *const argv[])
ip_info.dnsname[0] = '\0';
int result = tls_wifi_softap_create(&ap_info, &ip_info);
shell_printf("Create AP with SSID : %s, key(%d) : %s -> %d\n", ap_info.ssid, ap_info.keyinfo.key_len, ap_info.keyinfo.key, result);
shell_printf("Create AP with SSID : %s, key(%d) : %s -> %d"NEW_LINE, ap_info.ssid, ap_info.keyinfo.key_len, ap_info.keyinfo.key, result);
}
else if(strcmp(argv[1], "destroy") == 0)
{
tls_wifi_softap_client_event_register(NULL);
tls_wifi_set_oneshot_flag(0);
tls_wifi_softap_destroy();
shell_printf("Stopping SOFT AP\n");
shell_printf("Stopping SOFT AP"NEW_LINE);
}
else
{
shell_printf("Unknown %s action\n", argv[0]);
shell_printf("Unknown %s action"NEW_LINE, argv[0]);
}
}
else
{
shell_printf("List of soft_ap actions :\nstate\ncreate <SSID> <PWD>\ndestroy\n");
shell_printf("List of soft_ap actions :"NEW_LINE"state"NEW_LINE"create <SSID> <PWD>"NEW_LINE"destroy"NEW_LINE);
}
return 0;
}
@ -198,43 +199,43 @@ int _station(const shell_cmd_t *pcmd, int argc, char *const argv[])
if(tls_wifi_scan() == WM_SUCCESS)
{
shell_printf("Scanning nearby stations...\n");
shell_printf("Scanning nearby stations..."NEW_LINE);
}
else
{
shell_printf("Failed to start wifi scan\n");
shell_printf("Failed to start wifi scan"NEW_LINE);
}
}
else if(strcmp(argv[1], "state") == 0)
{
shell_printf("Station state : %u\n", tls_wifi_get_state());
shell_printf("Station state : %u"NEW_LINE, tls_wifi_get_state());
}
else if(strcmp(argv[1], "connect") == 0)
{
shell_printf("Connecting to %s with pwd : %s\n", argv[2], argv[3]);
shell_printf("Connecting to %s with pwd : %s"NEW_LINE, argv[2], argv[3]);
if(tls_wifi_connect((u8 *)argv[2], strlen(argv[2]), (u8 *)argv[3], strlen(argv[3])) == WM_SUCCESS)
{
shell_printf("Connected\n");
shell_printf("Connecting..."NEW_LINE);
}
else
{
shell_printf("Failed to connect !\n");
shell_printf("Failed to connect !"NEW_LINE);
}
}
else if(strcmp(argv[1], "disconnect") == 0)
{
shell_printf("Disconnecting from current station\n");
shell_printf("Disconnecting from current station"NEW_LINE);
tls_wifi_set_oneshot_flag(0);
tls_wifi_disconnect();
}
else
{
shell_printf("Unknown %s action\n", argv[0]);
shell_printf("Unknown %s action"NEW_LINE, argv[0]);
}
}
else
{
shell_printf("List of station actions :\nscan\nstate\nconnect <SSID> <PWD>\ndisconnect\n");
shell_printf("List of station actions :"NEW_LINE"scan"NEW_LINE"state"NEW_LINE"connect <SSID> <PWD>"NEW_LINE"disconnect"NEW_LINE);
}
return 0;
}
@ -243,7 +244,7 @@ int _cpu_temp(const shell_cmd_t *pcmd, int argc, char *const argv[])
{
int temperature = adc_temp();
shell_printf("CPU temp is %d.%03d\n", temperature/1000, temperature%1000);
shell_printf("CPU temp is %d.%03d"NEW_LINE, temperature/1000, temperature%1000);
return 0;
}
@ -255,26 +256,26 @@ int _wifi(const shell_cmd_t *pcmd, int argc, char *const argv[])
{
tls_wifi_softap_destroy();
tls_wifi_disconnect();
shell_printf("set one shot flg : %d\n",tls_wifi_set_oneshot_flag(0));
shell_printf("Stopping WIFI interface\n");
shell_printf("set one shot flg : %d"NEW_LINE,tls_wifi_set_oneshot_flag(0));
shell_printf("Stopping WIFI interface"NEW_LINE);
}
else if(strcmp(argv[1], "error") == 0)
{
shell_printf("Error : %s\n", tls_wifi_get_errinfo(tls_wifi_get_errno()));
shell_printf("Error : %s"NEW_LINE, tls_wifi_get_errinfo(tls_wifi_get_errno()));
}
else if(strcmp(argv[1], "promiscuous_on") == 0)
{
shell_printf("WiFi promiscuous on\n");
shell_printf("WiFi promiscuous on"NEW_LINE);
tls_wifi_data_ext_recv_cb_register(&(tls_wifi_data_ext_recv_cb));
}
else if(strcmp(argv[1], "promiscuous_off") == 0)
{
shell_printf("WiFi promiscuous off\n");
shell_printf("WiFi promiscuous off"NEW_LINE);
tls_wifi_data_ext_recv_cb_register(NULL);
}
else if(strcmp(argv[1], "mode") == 0)
{
shell_printf("Mode is : %d\n", tls_wifi_get_oneshot_flag());
shell_printf("Mode is : %d"NEW_LINE, tls_wifi_get_oneshot_flag());
}
else if(strcmp(argv[1], "get_ip") == 0)
{
@ -282,30 +283,30 @@ int _wifi(const shell_cmd_t *pcmd, int argc, char *const argv[])
if(netif)
{
shell_printf("netif 1\nip addr : %v\nnetmask : %v\ngateway : %v\n", netif->ip_addr.addr,
shell_printf("netif 1"NEW_LINE"ip addr : %v"NEW_LINE"netmask : %v"NEW_LINE"gateway : %v"NEW_LINE, netif->ip_addr.addr,
netif->netmask.addr,
netif->gw.addr);
if(netif->next)
{
shell_printf("netif 2\nip addr : %v\nnetmask : %v\ngateway : %v\n", netif->next->ip_addr.addr,
shell_printf("netif 2"NEW_LINE"ip addr : %v"NEW_LINE"netmask : %v"NEW_LINE"gateway : %v"NEW_LINE, netif->next->ip_addr.addr,
netif->next->netmask.addr,
netif->next->gw.addr);
}
}
else
{
shell_printf("No netif yet, connect to sta or create soft_ap !\n");
shell_printf("No netif yet, connect to sta or create soft_ap !"NEW_LINE);
}
}
else
{
shell_printf("Unknown %s action\n", argv[0]);
shell_printf("Unknown %s action"NEW_LINE, argv[0]);
}
}
else
{
shell_printf("List of wifi actions :\noff\nerror\npromiscuous_on\npromiscuous_off\nmode\nget_ip\n");
shell_printf("List of wifi actions :"NEW_LINE"off"NEW_LINE"error"NEW_LINE"promiscuous_on"NEW_LINE"promiscuous_off"NEW_LINE"mode"NEW_LINE"get_ip"NEW_LINE);
}
return 0;
}
@ -316,7 +317,7 @@ int _wifi_sleep(const shell_cmd_t *pcmd, int argc, char *const argv[])
{
if(strcmp(argv[1], "query") == 0)
{
shell_printf("power saving : 0x%X, psm chip sleep : 0x%X\n",
shell_printf("power saving : 0x%X, psm chip sleep : 0x%X"NEW_LINE,
tls_wifi_get_psflag(),
tls_wifi_get_psm_chipsleep_flag());
}
@ -326,13 +327,13 @@ int _wifi_sleep(const shell_cmd_t *pcmd, int argc, char *const argv[])
}
else
{
shell_printf("Unknown %s action\n", argv[0]);
shell_printf("Unknown %s action"NEW_LINE, argv[0]);
}
}
else
{
shell_printf("List of wifi_sleep actions :\nquery\nset\n");
shell_printf("List of wifi_sleep actions :"NEW_LINE"query"NEW_LINE"set"NEW_LINE);
}
return 0;
}
@ -344,29 +345,29 @@ int _pmu(const shell_cmd_t *pcmd, int argc, char *const argv[])
if(strcmp(argv[1], "sleep") == 0)
{
u32 duration = strtoul(argv[2], NULL, 10);
shell_printf("Going to sleep mode for %u s\n", duration);
shell_printf("Going to sleep mode for %u s"NEW_LINE, duration);
tls_pmu_timer0_start(duration);
tls_pmu_sleep_start();
shell_printf("Waking up out of sleep mode\n");
shell_printf("Waking up out of sleep mode"NEW_LINE);
tls_pmu_timer0_stop();
}
else if(strcmp(argv[1], "standby") == 0)
{
u32 duration = strtoul(argv[2], NULL, 10);
shell_printf("Going to standby mode for %u s\n", duration);
shell_printf("Going to standby mode for %u s"NEW_LINE, duration);
tls_pmu_timer0_start(duration);
tls_pmu_standby_start();
shell_printf("Waking up out of standby mode\n");
shell_printf("Waking up out of standby mode"NEW_LINE);
tls_pmu_timer0_stop();
}
else
{
shell_printf("Unknown %s action\n", argv[0]);
shell_printf("Unknown %s action"NEW_LINE, argv[0]);
}
}
else
{
shell_printf("List of pmu actions :\nsleep <duration(s)>\nstandby <duration(s)>\n");
shell_printf("List of pmu actions :"NEW_LINE"sleep <duration(s)>"NEW_LINE"standby <duration(s)>"NEW_LINE);
}
return 0;
}
@ -380,7 +381,7 @@ int _rtc(const shell_cmd_t *pcmd, int argc, char *const argv[])
struct tm rtc_time;
tls_get_rtc(&rtc_time);
shell_printf("rtc time is :\n%d:%d:%d %d/%d/%d\n",
shell_printf("rtc time is :"NEW_LINE"%d:%d:%d %d/%d/%d"NEW_LINE,
rtc_time.tm_hour,
rtc_time.tm_min,
rtc_time.tm_sec,
@ -399,7 +400,7 @@ int _rtc(const shell_cmd_t *pcmd, int argc, char *const argv[])
rtc_time.tm_mon = strtoul(argv[6], NULL, 10);
rtc_time.tm_year = strtoul(argv[7], NULL, 10);
shell_printf("Setting rtc to :\n%d:%d:%d %d/%d/%d\nisr callback registered !\n",
shell_printf("Setting rtc to :"NEW_LINE"%d:%d:%d %d/%d/%d"NEW_LINE"isr callback registered !"NEW_LINE,
rtc_time.tm_hour,
rtc_time.tm_min,
rtc_time.tm_sec,
@ -421,7 +422,7 @@ int _rtc(const shell_cmd_t *pcmd, int argc, char *const argv[])
rtc_time.tm_mon = strtoul(argv[6], NULL, 10);
rtc_time.tm_year = strtoul(argv[7], NULL, 10);
shell_printf("Setting rtc alarm to :\n%d:%d:%d %d/%d/%d\n",
shell_printf("Setting rtc alarm to :"NEW_LINE"%d:%d:%d %d/%d/%d"NEW_LINE,
rtc_time.tm_hour,
rtc_time.tm_min,
rtc_time.tm_sec,
@ -433,12 +434,12 @@ int _rtc(const shell_cmd_t *pcmd, int argc, char *const argv[])
}
else
{
shell_printf("Unknown %s action\n", argv[0]);
shell_printf("Unknown %s action"NEW_LINE, argv[0]);
}
}
else
{
shell_printf("List of rtc actions :\nget\nset <h> <m> <s> <d> <m> <y>\nalarm <h> <m> <s> <d> <m> <y>\n");
shell_printf("List of rtc actions :"NEW_LINE"get"NEW_LINE"set <h> <m> <s> <d> <m> <y>"NEW_LINE"alarm <h> <m> <s> <d> <m> <y>"NEW_LINE);
}
return 0;
}
@ -449,30 +450,30 @@ int _bluetooth(const shell_cmd_t *pcmd, int argc, char *const argv[])
{
if(strcmp(argv[1], "enable") == 0)
{
//shell_printf("Enabling bluetooth : %d\n", demo_bt_enable());
shell_printf("Enabling bluetooth test\n");
//shell_printf("Enabling bluetooth : %d"NEW_LINE, demo_bt_enable());
shell_printf("Enabling bluetooth test"NEW_LINE);
}
else if(strcmp(argv[1], "disable") == 0)
{
//shell_printf("Disabling bluetooth : %d\n", demo_bt_destroy());
shell_printf("Disabling bluetooth test\n");
//shell_printf("Disabling bluetooth : %d"NEW_LINE, demo_bt_destroy());
shell_printf("Disabling bluetooth test"NEW_LINE);
}
else if(strcmp(argv[1], "start_demo") == 0)
{
shell_printf("Starting demo : %d\nUse a BLE app to find the device\n", demo_ble_server_on());
shell_printf("Starting demo : %d"NEW_LINE"Use a BLE app to find the device"NEW_LINE, demo_ble_server_on());
}
else if(strcmp(argv[1], "stop_demo") == 0)
{
shell_printf("Stopping demo : %d\n", demo_ble_server_off());
shell_printf("Stopping demo : %d"NEW_LINE, demo_ble_server_off());
}
else
{
shell_printf("Unknown %s action\n", argv[0]);
shell_printf("Unknown %s action"NEW_LINE, argv[0]);
}
}
else
{
shell_printf("List of bluetooth actions :\nenable\ndisable\nstart_demo\nstop_demo\n");
shell_printf("List of bluetooth actions :"NEW_LINE"enable"NEW_LINE"disable"NEW_LINE"start_demo"NEW_LINE"stop_demo"NEW_LINE);
}
return 0;
}
@ -480,40 +481,40 @@ int _bluetooth(const shell_cmd_t *pcmd, int argc, char *const argv[])
NANO_SHELL_ADD_CMD(system,
_system,
"Query system information",
" Use this command to get system information\r\n");
" Use this command to get system information"NEW_LINE);
NANO_SHELL_ADD_CMD(reset,
_reset,
"Reset the system",
" Use this command reset the system\r\n");
" Use this command reset the system"NEW_LINE);
NANO_SHELL_ADD_CMD(soft_ap,
_soft_ap,
"Command to control SOFT AP",
" Use this command to control the SOFT AP subsystem\r\n");
" Use this command to control the SOFT AP subsystem"NEW_LINE);
NANO_SHELL_ADD_CMD(station,
_station,
"Command to control STATION mode",
" Use this command to connect to a WiFi access point\r\n");
" Use this command to connect to a WiFi access point"NEW_LINE);
NANO_SHELL_ADD_CMD(wifi,
_wifi,
"Command to control WIFI interface",
" Use this command to control the WIFI interface\r\n");
" Use this command to control the WIFI interface"NEW_LINE);
NANO_SHELL_ADD_CMD(cpu_temp,
_cpu_temp,
"Command to read the CPU temperature",
" Use this command to read the CPU temperature\r\n");
" Use this command to read the CPU temperature"NEW_LINE);
NANO_SHELL_ADD_CMD(wifi_sleep,
_wifi_sleep,
"Command to control WiFi sleep",
" Use this command to control WiFi sleep feature\r\n");
" Use this command to control WiFi sleep feature"NEW_LINE);
NANO_SHELL_ADD_CMD(pmu,
_pmu,
"Command to control the power management unit",
" Use this command to control power management unit feature\r\n");
" Use this command to control power management unit feature"NEW_LINE);
NANO_SHELL_ADD_CMD(rtc,
_rtc,
"Command to query and set up the rtc",
" Use this command to interact with the rtc module\n");
" Use this command to interact with the rtc module"NEW_LINE);
NANO_SHELL_ADD_CMD(bluetooth,
_bluetooth,
"Command to control bluetooth functionality",
" Use this command to interact use bluetooth\n");
" Use this command to interact use bluetooth"NEW_LINE);

View File

@ -64,6 +64,8 @@ int shell_getc(char *ch)
return 1;
}
bool got_linefeed = false;
void low_level_write_char(char ch)
{
(void)sendchar((int)ch);

View File

@ -1,6 +1,119 @@
#include "string.h"
#include "lwip/netif.h"
#include "wm_include.h"
#include "FreeRTOS.h"
#include "FreeRTOSConfig.h"
#include "nano_shell_server_task.h"
#include "common.h"
extern int shell_printf(const char *format, ...);
extern void network_rx_callback(u16 len, char *data);
int nano_shell_srv_sock = 0, client_sock = 0;
const char greeting_buffer[] = "\r\n"
" _ _ ____ _ _ _\r\n"
"| \\ | | __ _ _ __ ___ / ___|| |__ ___| | |\r\n"
"| \\| |/ _` | '_ \\ / _ \\ \\___ \\| '_ \\ / _ \\ | |\r\n"
"| |\\ | (_| | | | | (_) | ___) | | | | __/ | |\r\n"
"|_| \\_|\\__,_|_| |_|\\___/ |____/|_| |_|\\___|_|_|\r\n"
"\r\n"
"Welcome to Nano-Shell remote access\r\n"
"\r\n"
" * Source: https://github.com/lebinlv/nano-shell\r\n"
" * Copyright: (c) Liber 2020\r\n"
"\r\n";
void network_write(char c)
{
if(client_sock > 0)
{
if(send(client_sock, &c, 1, 0) < 0)
{
shell_printf("Failed to send data to client - errno(%d)."NEW_LINE, errno);
}
}
}
void nano_shell_server_task(void* param)
{
(void)param;
bool setup_error = false;
char recv_buffer[256] = "";
//We setup the listening socket :
struct sockaddr_in nano_shell_srv_addr = { .sin_family = AF_INET, .sin_addr.s_addr = INADDR_ANY, .sin_port = htons(NANO_SHELL_SERVER_PORT)}, client_addr;
socklen_t sockaddr_in_len = sizeof(struct sockaddr_in);
if((nano_shell_srv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
{
shell_printf("Failed to create nano_shell listening socket."NEW_LINE);
setup_error = true;
}
if(bind(nano_shell_srv_sock, (struct sockaddr *) &nano_shell_srv_addr, sockaddr_in_len) < 0)
{
shell_printf("Failed to bind nano_shell listening socket to addr."NEW_LINE);
setup_error = true;
}
//We only wait for one connection at a time because the nano_shell is not multi user anyway
if(listen(nano_shell_srv_sock, 0) < 0)
{
shell_printf("Failed to mark nano_shell_sock as a listening socket."NEW_LINE);
setup_error = true;
}
if(setup_error)
{
for(;;)
tls_os_time_delay(portMAX_DELAY);
}
for(;;)
{
if((client_sock = accept(nano_shell_srv_sock, (struct sockaddr *)&client_addr, &sockaddr_in_len)) < 0)
{
shell_printf("Failed to accept incoming connection."NEW_LINE);
}
if(send(client_sock, greeting_buffer, sizeof greeting_buffer, 0) < 0)
{
shell_printf("Failed to send greetings to client - errno(%d)."NEW_LINE, errno);
}
for(;client_sock > 0;)
{
int result = recv(client_sock, recv_buffer, 255, 0);
if(result < 0)
{
shell_printf("Failed to receive data from client - errno(%d)."NEW_LINE"Closing connection."NEW_LINE, errno);
if(close(client_sock) < 0)
{
shell_printf("Failed to close socket - errno(%d)."NEW_LINE, errno);
}
client_sock = 0;
}
else if(result == 0)
{
shell_printf("Client disconnected."NEW_LINE);
if(close(client_sock) < 0)
{
shell_printf("Failed to close socket - errno(%d)."NEW_LINE, errno);
}
client_sock = 0;
}
else //We pass the received data to the nano shell process
{
//Need to remove the \n at the end
char *pos = strchr(recv_buffer, '\r');
if(pos)
{
*pos = '\n';
result = pos + 1 - recv_buffer;
}
network_rx_callback(result, recv_buffer);
}
}
}
}

View File

@ -0,0 +1,3 @@
#define NANO_SHELL_SERVER_PORT 21
void nano_shell_server_task(void* param);

View File

@ -835,6 +835,33 @@ typedef QueueHandle_t SemaphoreHandle_t;
*/
#define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) )
/**
* semphr.h
* @code{c}
* UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore );
* @endcode
*
* If the semaphore is a counting semaphore then uxSemaphoreGetCount() returns
* its current count value. If the semaphore is a binary semaphore then
* uxSemaphoreGetCount() returns 1 if the semaphore is available, and 0 if the
* semaphore is not available.
*
*/
#define uxSemaphoreGetCount( xSemaphore ) uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) )
/**
* semphr.h
* @code{c}
* UBaseType_t uxSemaphoreGetCountFromISR( SemaphoreHandle_t xSemaphore );
* @endcode
*
* If the semaphore is a counting semaphore then uxSemaphoreGetCountFromISR() returns
* its current count value. If the semaphore is a binary semaphore then
* uxSemaphoreGetCountFromISR() returns 1 if the semaphore is available, and 0 if the
* semaphore is not available.
*
*/
#define uxSemaphoreGetCountFromISR( xSemaphore ) uxQueueMessagesWaitingFromISR( ( QueueHandle_t ) ( xSemaphore ) )
#endif /* SEMAPHORE_H */

View File

@ -515,7 +515,7 @@ tls_os_status_t tls_os_task_resume_from_isr(tls_os_task_t task)
u16 tls_os_sem_get_count(tls_os_sem_t *sem)
{
return (u16)xSemaphoreGetCount((xQUEUE *)sem);
return (u16)uxSemaphoreGetCount((xQUEUE *)sem);
}
/*