cc3200: Improve usability and robustness of the servers.
This commit is contained in:
parent
c1c23e2f6a
commit
77791b5633
@ -66,8 +66,8 @@
|
||||
#define FTP_UNIX_TIME_20000101 946684800
|
||||
#define FTP_UNIX_TIME_20150101 1420070400
|
||||
#define FTP_UNIX_SECONDS_180_DAYS 15552000
|
||||
#define FTP_DATA_TIMEOUT_MS 5000 // 5 seconds
|
||||
#define FTP_CMD_TIMEOUT_MS 120000 // 2 minutes
|
||||
#define FTP_DATA_TIMEOUT_MS 5000 // 5 seconds
|
||||
#define FTP_CMD_TIMEOUT_MS 300000 // 5 minutes
|
||||
#define FTP_SOCKETFIFO_ELEMENTS_MAX 4
|
||||
#define FTP_CYCLE_TIME_MS (SERVERS_CYCLE_TIME_MS * 2)
|
||||
|
||||
@ -119,6 +119,7 @@ typedef enum {
|
||||
|
||||
typedef struct {
|
||||
uint8_t *dBuffer;
|
||||
uint32_t ctimeout;
|
||||
union {
|
||||
DIR dp;
|
||||
FIL fp;
|
||||
@ -126,7 +127,6 @@ typedef struct {
|
||||
int16_t lc_sd;
|
||||
int16_t ld_sd;
|
||||
int16_t c_sd;
|
||||
int16_t ctimeout;
|
||||
int16_t d_sd;
|
||||
int16_t dtimeout;
|
||||
ftp_state_t state;
|
||||
@ -212,7 +212,6 @@ static void ftp_process_cmd (void);
|
||||
static void ftp_close_files (void);
|
||||
static void ftp_close_filesystem_on_error (void);
|
||||
static void ftp_close_cmd_data (void);
|
||||
static void ftp_reset (void);
|
||||
static ftp_cmd_index_t ftp_pop_command (char **str);
|
||||
static void ftp_pop_param (char **str, char *param);
|
||||
static int ftp_print_eplf_item (char *dest, uint32_t destsize, FILINFO *fno);
|
||||
@ -406,6 +405,16 @@ void ftp_disable (void) {
|
||||
ftp_data.state = E_FTP_STE_DISABLED;
|
||||
}
|
||||
|
||||
void ftp_reset (void) {
|
||||
// close all connections and start all over again
|
||||
servers_close_socket(&ftp_data.lc_sd);
|
||||
servers_close_socket(&ftp_data.ld_sd);
|
||||
ftp_close_cmd_data();
|
||||
ftp_data.state = E_FTP_STE_START;
|
||||
ftp_data.substate.data = E_FTP_STE_SUB_DISCONNECTED;
|
||||
SOCKETFIFO_Flush();
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
DEFINE PRIVATE FUNCTIONS
|
||||
******************************************************************************/
|
||||
@ -848,16 +857,6 @@ static void ftp_close_cmd_data (void) {
|
||||
ftp_close_filesystem_on_error ();
|
||||
}
|
||||
|
||||
static void ftp_reset (void) {
|
||||
// close all connections and start all over again
|
||||
servers_close_socket(&ftp_data.lc_sd);
|
||||
servers_close_socket(&ftp_data.ld_sd);
|
||||
ftp_close_cmd_data();
|
||||
ftp_data.state = E_FTP_STE_START;
|
||||
ftp_data.substate.data = E_FTP_STE_SUB_DISCONNECTED;
|
||||
SOCKETFIFO_Flush();
|
||||
}
|
||||
|
||||
static ftp_cmd_index_t ftp_pop_command (char **str) {
|
||||
char _cmd[FTP_CMD_SIZE_MAX];
|
||||
ftp_pop_param (str, _cmd);
|
||||
|
@ -34,4 +34,6 @@ extern void ftp_init (void);
|
||||
extern void ftp_run (void);
|
||||
extern void ftp_enable (void);
|
||||
extern void ftp_disable (void);
|
||||
extern void ftp_reset (void);
|
||||
|
||||
#endif /* FTP_H_ */
|
||||
|
@ -78,21 +78,22 @@ typedef enum{
|
||||
}e_StatusBits;
|
||||
|
||||
typedef struct _wlan_obj_t {
|
||||
mp_obj_base_t base;
|
||||
SlWlanMode_t mode;
|
||||
uint32_t status;
|
||||
mp_obj_base_t base;
|
||||
SlWlanMode_t mode;
|
||||
uint32_t status;
|
||||
|
||||
uint32_t ip;
|
||||
uint32_t gateway;
|
||||
uint32_t dns;
|
||||
uint32_t ip;
|
||||
uint32_t gateway;
|
||||
uint32_t dns;
|
||||
|
||||
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
|
||||
bool servers_enabled;
|
||||
bool servers_enabled;
|
||||
#endif
|
||||
uint8_t security;
|
||||
uint8_t mac[SL_MAC_ADDR_LEN];
|
||||
uint8_t ssid[33];
|
||||
uint8_t bssid[6];
|
||||
uint8_t security;
|
||||
uint8_t mac[SL_MAC_ADDR_LEN];
|
||||
uint8_t ssid[33];
|
||||
uint8_t bssid[6];
|
||||
volatile uint8_t stasconnected;
|
||||
|
||||
} wlan_obj_t;
|
||||
|
||||
@ -162,6 +163,7 @@ STATIC wlan_obj_t wlan_obj = {
|
||||
.ssid = {0},
|
||||
.bssid = {0},
|
||||
.mac = {0},
|
||||
.stasconnected = 0,
|
||||
};
|
||||
|
||||
STATIC const mp_cb_methods_t wlan_cb_methods;
|
||||
@ -193,7 +195,7 @@ STATIC void wlan_lpds_callback_disable (mp_obj_t self_in);
|
||||
//*****************************************************************************
|
||||
void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent)
|
||||
{
|
||||
if(!pWlanEvent) {
|
||||
if (!pWlanEvent) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -202,44 +204,34 @@ void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent)
|
||||
case SL_WLAN_CONNECT_EVENT:
|
||||
{
|
||||
SET_STATUS_BIT(wlan_obj.status, STATUS_BIT_CONNECTION);
|
||||
//
|
||||
// Information about the connected AP (like name, MAC etc) will be
|
||||
// available in 'slWlanConnectAsyncResponse_t'-Applications
|
||||
// can use it if required
|
||||
//
|
||||
|
||||
slWlanConnectAsyncResponse_t *pEventData = &pWlanEvent->EventData.STAandP2PModeWlanConnected;
|
||||
|
||||
// Copy new connection SSID and BSSID to global parameters
|
||||
// copy the new connection data
|
||||
memcpy(wlan_obj.ssid, pEventData->ssid_name, pEventData->ssid_len);
|
||||
memcpy(wlan_obj.bssid, pEventData->bssid, SL_BSSID_LENGTH);
|
||||
}
|
||||
break;
|
||||
case SL_WLAN_DISCONNECT_EVENT:
|
||||
{
|
||||
slWlanConnectAsyncResponse_t* pEventData = NULL;
|
||||
|
||||
CLR_STATUS_BIT(wlan_obj.status, STATUS_BIT_CONNECTION);
|
||||
CLR_STATUS_BIT(wlan_obj.status, STATUS_BIT_IP_ACQUIRED);
|
||||
|
||||
pEventData = &pWlanEvent->EventData.STAandP2PModeDisconnected;
|
||||
|
||||
// If the user has initiated the 'Disconnect' request,
|
||||
//'reason_code' is SL_USER_INITIATED_DISCONNECTION
|
||||
if (SL_USER_INITIATED_DISCONNECTION == pEventData->reason_code) {
|
||||
// TODO ...
|
||||
}
|
||||
else {
|
||||
// TODO: Maybe trow an exception?
|
||||
}
|
||||
memset(wlan_obj.ssid, 0, sizeof(wlan_obj.ssid));
|
||||
memset(wlan_obj.bssid, 0, sizeof(wlan_obj.bssid));
|
||||
}
|
||||
break;
|
||||
case SL_WLAN_STA_CONNECTED_EVENT:
|
||||
// TODO
|
||||
wlan_obj.stasconnected++;
|
||||
break;
|
||||
case SL_WLAN_STA_DISCONNECTED_EVENT:
|
||||
// TODO
|
||||
if (wlan_obj.stasconnected > 0) {
|
||||
if (--wlan_obj.stasconnected == 0) {
|
||||
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
|
||||
servers_reset();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SL_WLAN_P2P_DEV_FOUND_EVENT:
|
||||
// TODO
|
||||
|
@ -54,12 +54,13 @@ typedef struct {
|
||||
volatile bool enabled;
|
||||
volatile bool do_disable;
|
||||
volatile bool do_enable;
|
||||
volatile bool do_reset;
|
||||
}servers_Data_t;
|
||||
|
||||
/******************************************************************************
|
||||
DECLARE PRIVATE DATA
|
||||
******************************************************************************/
|
||||
static servers_Data_t servers_data = {.enabled = false, .do_disable = false, .do_enable = false};
|
||||
static servers_Data_t servers_data = {.enabled = false, .do_disable = false, .do_enable = false, .do_reset = false};
|
||||
|
||||
/******************************************************************************
|
||||
DECLARE PRIVATE FUNCTIONS
|
||||
@ -74,7 +75,6 @@ char *servers_pass;
|
||||
/******************************************************************************
|
||||
DECLARE PUBLIC FUNCTIONS
|
||||
******************************************************************************/
|
||||
|
||||
void TASK_Servers (void *pvParameters) {
|
||||
|
||||
bool cycle = false;
|
||||
@ -91,14 +91,21 @@ void TASK_Servers (void *pvParameters) {
|
||||
|
||||
if (servers_data.enabled) {
|
||||
if (servers_data.do_disable) {
|
||||
servers_data.do_disable = false;
|
||||
// disable all net processes
|
||||
// disable network services
|
||||
telnet_disable();
|
||||
ftp_disable();
|
||||
|
||||
// now clear the flag
|
||||
// now clear the flags
|
||||
servers_data.do_disable = false;
|
||||
servers_data.do_reset = false;
|
||||
servers_data.enabled = false;
|
||||
}
|
||||
else if (servers_data.do_reset) {
|
||||
// reset network services
|
||||
telnet_reset();
|
||||
ftp_reset();
|
||||
// clear the flag
|
||||
servers_data.do_reset = false;
|
||||
}
|
||||
else {
|
||||
if (cycle) {
|
||||
telnet_run();
|
||||
@ -109,15 +116,15 @@ void TASK_Servers (void *pvParameters) {
|
||||
}
|
||||
}
|
||||
else if (servers_data.do_enable) {
|
||||
servers_data.do_enable = false;
|
||||
|
||||
// enable network services
|
||||
telnet_enable();
|
||||
ftp_enable();
|
||||
|
||||
// now set the flag
|
||||
// now set/clear the flags
|
||||
servers_data.enabled = true;
|
||||
servers_data.do_enable = false;
|
||||
}
|
||||
|
||||
// move to the next cycle
|
||||
cycle = cycle ? false : true;
|
||||
HAL_Delay(SERVERS_CYCLE_TIME_MS);
|
||||
// set the alive flag for the wdt
|
||||
@ -130,12 +137,18 @@ void servers_start (void) {
|
||||
servers_data.do_enable = true;
|
||||
}
|
||||
|
||||
void servers_reset (void) {
|
||||
servers_data.do_reset = true;
|
||||
}
|
||||
|
||||
void servers_stop (void) {
|
||||
servers_data.do_enable = false;
|
||||
servers_data.do_disable = true;
|
||||
do {
|
||||
HAL_Delay (SERVERS_CYCLE_TIME_MS);
|
||||
} while (servers_are_enabled());
|
||||
// clear the last command line
|
||||
telnet_reset();
|
||||
}
|
||||
|
||||
bool servers_are_enabled (void) {
|
||||
|
@ -61,6 +61,7 @@ extern char *servers_pass;
|
||||
******************************************************************************/
|
||||
extern void TASK_Servers (void *pvParameters);
|
||||
extern void servers_start (void);
|
||||
extern void servers_reset (void);
|
||||
extern void servers_stop (void);
|
||||
extern bool servers_are_enabled (void);
|
||||
extern void servers_close_socket (int16_t *sd);
|
||||
|
@ -48,7 +48,7 @@
|
||||
#define TELNET_TX_RETRIES_MAX 25
|
||||
#define TELNET_WAIT_TIME_MS 7
|
||||
#define TELNET_LOGIN_RETRIES_MAX 3
|
||||
#define TELNET_TIMEOUT_MS 300000 // 5 minutes
|
||||
#define TELNET_TIMEOUT_MS 1800000 // 30 minutes
|
||||
#define TELNET_CYCLE_TIME_MS (SERVERS_CYCLE_TIME_MS * 2)
|
||||
|
||||
/******************************************************************************
|
||||
@ -87,11 +87,11 @@ typedef union {
|
||||
|
||||
typedef struct {
|
||||
uint8_t *rxBuffer;
|
||||
uint32_t timeout;
|
||||
int16_t sd;
|
||||
int16_t n_sd;
|
||||
int16_t rxWindex;
|
||||
int16_t rxRindex;
|
||||
uint16_t timeout;
|
||||
telnet_state_t state;
|
||||
telnet_substate_t substate;
|
||||
uint8_t txRetries;
|
||||
@ -128,7 +128,7 @@ static telnet_result_t telnet_recv_text_non_blocking (void *buff, _i16 Maxlen, _
|
||||
static void telnet_process (void);
|
||||
static void telnet_parse_input (uint8_t *str, int16_t *len);
|
||||
static bool telnet_send_with_retries (int16_t sd, const void *pBuf, int16_t len);
|
||||
static void telnet_reset (void);
|
||||
static void telnet_reset_buffer (void);
|
||||
|
||||
/******************************************************************************
|
||||
DEFINE PUBLIC FUNCTIONS
|
||||
@ -162,6 +162,8 @@ void telnet_run (void) {
|
||||
telnet_send_and_proceed((void *)telnet_options_user, sizeof(telnet_options_user), E_TELNET_STE_SUB_REQ_USER);
|
||||
break;
|
||||
case E_TELNET_STE_SUB_REQ_USER:
|
||||
// to catch any left over characters from the previous actions
|
||||
telnet_recv_text_non_blocking(telnet_data.rxBuffer, TELNET_RX_BUFFER_SIZE, &rxLen);
|
||||
telnet_send_and_proceed((void *)telnet_request_user, strlen(telnet_request_user), E_TELNET_STE_SUB_GET_USER);
|
||||
break;
|
||||
case E_TELNET_STE_SUB_GET_USER:
|
||||
@ -170,20 +172,20 @@ void telnet_run (void) {
|
||||
if (rxLen < 2 || memcmp(servers_user, (const char *)telnet_data.rxBuffer, MAX((rxLen - 2), strlen(servers_user)))) {
|
||||
telnet_data.credentialsValid = false;
|
||||
}
|
||||
telnet_data.substate.connected = E_TELNET_STE_SUB_SND_PASSWORD_OPTIONS;
|
||||
telnet_data.substate.connected = E_TELNET_STE_SUB_REQ_PASSWORD;
|
||||
}
|
||||
break;
|
||||
case E_TELNET_STE_SUB_SND_PASSWORD_OPTIONS:
|
||||
telnet_send_and_proceed((void *)telnet_options_pass, sizeof(telnet_options_pass), E_TELNET_STE_SUB_REQ_PASSWORD);
|
||||
break;
|
||||
case E_TELNET_STE_SUB_REQ_PASSWORD:
|
||||
telnet_send_and_proceed((void *)telnet_request_password, strlen(telnet_request_password), E_TELNET_STE_SUB_GET_PASSWORD);
|
||||
// to catch a possible "/r/n" that was left
|
||||
telnet_send_and_proceed((void *)telnet_request_password, strlen(telnet_request_password), E_TELNET_STE_SUB_SND_PASSWORD_OPTIONS);
|
||||
break;
|
||||
case E_TELNET_STE_SUB_SND_PASSWORD_OPTIONS:
|
||||
// to catch any left over characters from the previous actions
|
||||
telnet_recv_text_non_blocking(telnet_data.rxBuffer, TELNET_RX_BUFFER_SIZE, &rxLen);
|
||||
telnet_send_and_proceed((void *)telnet_options_pass, sizeof(telnet_options_pass), E_TELNET_STE_SUB_GET_PASSWORD);
|
||||
break;
|
||||
case E_TELNET_STE_SUB_GET_PASSWORD:
|
||||
if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking(telnet_data.rxBuffer, TELNET_RX_BUFFER_SIZE, &rxLen)) {
|
||||
// Skip /r/n
|
||||
// skip /r/n
|
||||
if (rxLen < 2 || memcmp(servers_pass, (const char *)telnet_data.rxBuffer, MAX((rxLen - 2), strlen(servers_pass)))) {
|
||||
telnet_data.credentialsValid = false;
|
||||
}
|
||||
@ -211,7 +213,9 @@ void telnet_run (void) {
|
||||
break;
|
||||
case E_TELNET_STE_SUB_LOGGIN_SUCCESS:
|
||||
if (E_TELNET_RESULT_OK == telnet_send_non_blocking((void *)telnet_loggin_success, strlen(telnet_loggin_success))) {
|
||||
// fake "enter" key pressed to display the prompt
|
||||
// clear the current line
|
||||
telnet_reset_buffer();
|
||||
// fake an "enter" key pressed to display the prompt
|
||||
telnet_data.rxBuffer[telnet_data.rxWindex++] = '\r';
|
||||
telnet_data.state= E_TELNET_STE_LOGGED_IN;
|
||||
}
|
||||
@ -282,6 +286,13 @@ void telnet_disable (void) {
|
||||
telnet_data.state = E_TELNET_STE_DISABLED;
|
||||
}
|
||||
|
||||
void telnet_reset (void) {
|
||||
// close the connection and start all over again
|
||||
servers_close_socket(&telnet_data.n_sd);
|
||||
servers_close_socket(&telnet_data.sd);
|
||||
telnet_data.state = E_TELNET_STE_START;
|
||||
}
|
||||
|
||||
bool telnet_is_enabled (void) {
|
||||
return telnet_data.enabled;
|
||||
}
|
||||
@ -389,7 +400,6 @@ static telnet_result_t telnet_send_non_blocking (void *data, _i16 Len) {
|
||||
|
||||
static telnet_result_t telnet_recv_text_non_blocking (void *buff, _i16 Maxlen, _i16 *rxLen) {
|
||||
*rxLen = sl_Recv(telnet_data.n_sd, buff, Maxlen, 0);
|
||||
|
||||
// if there's data received, parse it
|
||||
if (*rxLen > 0) {
|
||||
telnet_data.timeout = 0;
|
||||
@ -446,7 +456,6 @@ static void telnet_parse_input (uint8_t *str, int16_t *len) {
|
||||
|
||||
static bool telnet_send_with_retries (int16_t sd, const void *pBuf, int16_t len) {
|
||||
int32_t retries = 0;
|
||||
|
||||
// abort sending if we happen to be within interrupt context
|
||||
if ((HAL_NVIC_INT_CTRL_REG & HAL_VECTACTIVE_MASK) == 0) {
|
||||
do {
|
||||
@ -460,13 +469,11 @@ static bool telnet_send_with_retries (int16_t sd, const void *pBuf, int16_t len)
|
||||
HAL_Delay (TELNET_WAIT_TIME_MS);
|
||||
} while (++retries <= TELNET_TX_RETRIES_MAX);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void telnet_reset (void) {
|
||||
// close the connection and start all over again
|
||||
servers_close_socket(&telnet_data.n_sd);
|
||||
servers_close_socket(&telnet_data.sd);
|
||||
telnet_data.state = E_TELNET_STE_START;
|
||||
static void telnet_reset_buffer (void) {
|
||||
memset (telnet_data.rxBuffer, '\b', TELNET_RX_BUFFER_SIZE / 2);
|
||||
telnet_data.rxWindex = TELNET_RX_BUFFER_SIZE / 2;
|
||||
}
|
||||
|
||||
|
@ -38,6 +38,7 @@ extern bool telnet_rx_any (void);
|
||||
extern int telnet_rx_char (void);
|
||||
extern void telnet_enable (void);
|
||||
extern void telnet_disable (void);
|
||||
extern void telnet_reset (void);
|
||||
extern bool telnet_is_enabled (void);
|
||||
extern bool telnet_is_active (void);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user