| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- /*
- * This file is part of the MicroPython project, http://micropython.org/
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2015 Daniel Campora
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
- #include <stdint.h>
- #include <string.h>
- #include "py/mpconfig.h"
- #include "py/misc.h"
- #include "py/runtime.h"
- #include "py/mphal.h"
- #include "serverstask.h"
- #include "simplelink.h"
- #include "debug.h"
- #include "telnet.h"
- #include "ftp.h"
- #include "pybwdt.h"
- #include "modusocket.h"
- #include "mpexception.h"
- #include "modnetwork.h"
- #include "modwlan.h"
- /******************************************************************************
- DEFINE PRIVATE TYPES
- ******************************************************************************/
- typedef struct {
- uint32_t timeout;
- bool enabled;
- bool do_disable;
- bool do_enable;
- bool do_reset;
- bool do_wlan_cycle_power;
- } servers_data_t;
- /******************************************************************************
- DECLARE PRIVATE DATA
- ******************************************************************************/
- static servers_data_t servers_data = {.timeout = SERVERS_DEF_TIMEOUT_MS};
- static volatile bool sleep_sockets = false;
- /******************************************************************************
- DECLARE PRIVATE FUNCTIONS
- ******************************************************************************/
- /******************************************************************************
- DECLARE PUBLIC DATA
- ******************************************************************************/
- // This is the static memory (TCB and stack) for the servers task
- StaticTask_t svTaskTCB __attribute__ ((section (".rtos_heap")));
- StackType_t svTaskStack[SERVERS_STACK_LEN] __attribute__ ((section (".rtos_heap"))) __attribute__((aligned (8)));
- char servers_user[SERVERS_USER_PASS_LEN_MAX + 1];
- char servers_pass[SERVERS_USER_PASS_LEN_MAX + 1];
- /******************************************************************************
- DECLARE PUBLIC FUNCTIONS
- ******************************************************************************/
- void TASK_Servers (void *pvParameters) {
- bool cycle = false;
- strcpy (servers_user, SERVERS_DEF_USER);
- strcpy (servers_pass, SERVERS_DEF_PASS);
- telnet_init();
- ftp_init();
- for ( ;; ) {
- if (servers_data.do_enable) {
- // enable network services
- telnet_enable();
- ftp_enable();
- // now set/clear the flags
- servers_data.enabled = true;
- servers_data.do_enable = false;
- }
- else if (servers_data.do_disable) {
- // disable network services
- telnet_disable();
- ftp_disable();
- // now clear the flags
- servers_data.do_disable = false;
- servers_data.enabled = false;
- }
- else if (servers_data.do_reset) {
- // resetting the servers is needed to prevent half-open sockets
- servers_data.do_reset = false;
- if (servers_data.enabled) {
- telnet_reset();
- ftp_reset();
- }
- // and we should also close all user sockets. We do it here
- // for convinience and to save on code size.
- modusocket_close_all_user_sockets();
- }
- if (cycle) {
- telnet_run();
- }
- else {
- ftp_run();
- }
- if (sleep_sockets) {
- pybwdt_srv_sleeping(true);
- modusocket_enter_sleep();
- pybwdt_srv_sleeping(false);
- mp_hal_delay_ms(SERVERS_CYCLE_TIME_MS * 2);
- if (servers_data.do_wlan_cycle_power) {
- servers_data.do_wlan_cycle_power = false;
- wlan_off_on();
- }
- sleep_sockets = false;
- }
- // set the alive flag for the wdt
- pybwdt_srv_alive();
- // move to the next cycle
- cycle = cycle ? false : true;
- mp_hal_delay_ms(SERVERS_CYCLE_TIME_MS);
- }
- }
- void servers_start (void) {
- servers_data.do_enable = true;
- mp_hal_delay_ms(SERVERS_CYCLE_TIME_MS * 3);
- }
- void servers_stop (void) {
- servers_data.do_disable = true;
- do {
- mp_hal_delay_ms(SERVERS_CYCLE_TIME_MS);
- } while (servers_are_enabled());
- mp_hal_delay_ms(SERVERS_CYCLE_TIME_MS * 3);
- }
- void servers_reset (void) {
- servers_data.do_reset = true;
- }
- void servers_wlan_cycle_power (void) {
- servers_data.do_wlan_cycle_power = true;
- }
- bool servers_are_enabled (void) {
- return servers_data.enabled;
- }
- void server_sleep_sockets (void) {
- sleep_sockets = true;
- mp_hal_delay_ms(SERVERS_CYCLE_TIME_MS + 1);
- }
- void servers_close_socket (int16_t *sd) {
- if (*sd > 0) {
- modusocket_socket_delete(*sd);
- sl_Close(*sd);
- *sd = -1;
- }
- }
- void servers_set_login (char *user, char *pass) {
- if (strlen(user) > SERVERS_USER_PASS_LEN_MAX || strlen(pass) > SERVERS_USER_PASS_LEN_MAX) {
- mp_raise_ValueError(mpexception_value_invalid_arguments);
- }
- memcpy(servers_user, user, SERVERS_USER_PASS_LEN_MAX);
- memcpy(servers_pass, pass, SERVERS_USER_PASS_LEN_MAX);
- }
- void servers_set_timeout (uint32_t timeout) {
- if (timeout < SERVERS_MIN_TIMEOUT_MS) {
- // timeout is too low
- mp_raise_ValueError(mpexception_value_invalid_arguments);
- }
- servers_data.timeout = timeout;
- }
- uint32_t servers_get_timeout (void) {
- return servers_data.timeout;
- }
- /******************************************************************************
- DEFINE PRIVATE FUNCTIONS
- ******************************************************************************/
|