From bb244d47ab27dc6a2945770b1e93d0f617acc34c Mon Sep 17 00:00:00 2001 From: HuangRui Date: Thu, 5 Feb 2015 10:06:22 +0800 Subject: [PATCH 01/14] Move array about pow form local to global. --- app/libc/c_math.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/libc/c_math.c b/app/libc/c_math.c index 859b143b..97b60797 100644 --- a/app/libc/c_math.c +++ b/app/libc/c_math.c @@ -6,8 +6,6 @@ double floor(double x) return (double) (x < 0.f ? (((int) x) - 1) : ((int) x)); } -double pow(double x, double y) -{ #define MAXEXP 2031 /* (MAX_EXP * 16) - 1 */ #define MINEXP -2047 /* (MIN_EXP * 16) - 1 */ #define HUGE MAXFLOAT @@ -54,7 +52,8 @@ double pow(double x, double y) double q6 = 0.154002904409897646e-3; double q7 = 0.149288526805956082e-4; double k = 0.442695040888963407; - +double pow(double x, double y) +{ double frexp(), g, ldexp(), r, u1, u2, v, w, w1, w2, y1, y2, z; int iw1, m, p; From cca0de9b39daebb17a7ac38060d4164b150c23c6 Mon Sep 17 00:00:00 2001 From: HuangRui Date: Thu, 5 Feb 2015 10:20:20 +0800 Subject: [PATCH 02/14] Align the code of c_math.c --- app/include/user_config.h | 1 - app/libc/c_math.c | 88 ++++++++++++++++++++------------------- 2 files changed, 45 insertions(+), 44 deletions(-) diff --git a/app/include/user_config.h b/app/include/user_config.h index 6dd40d7c..f8e57477 100644 --- a/app/include/user_config.h +++ b/app/include/user_config.h @@ -40,7 +40,6 @@ #define ICACHE_STORE_TYPEDEF_ATTR __attribute__((aligned(4),packed)) #define ICACHE_STORE_ATTR __attribute__((aligned(4))) #define ICACHE_RAM_ATTR __attribute__((section(".iram0.text"))) -// #define ICACHE_RODATA_ATTR __attribute__((section(".rodata2.text"))) #define CLIENT_SSL_ENABLE #define GPIO_INTERRUPT_ENABLE diff --git a/app/libc/c_math.c b/app/libc/c_math.c index 97b60797..ae44335f 100644 --- a/app/libc/c_math.c +++ b/app/libc/c_math.c @@ -9,49 +9,51 @@ double floor(double x) #define MAXEXP 2031 /* (MAX_EXP * 16) - 1 */ #define MINEXP -2047 /* (MIN_EXP * 16) - 1 */ #define HUGE MAXFLOAT - double a1[] = - { - 1.0, - 0.95760328069857365, - 0.91700404320467123, - 0.87812608018664974, - 0.84089641525371454, - 0.80524516597462716, - 0.77110541270397041, - 0.73841307296974966, - 0.70710678118654752, - 0.67712777346844637, - 0.64841977732550483, - 0.62092890603674203, - 0.59460355750136054, - 0.56939431737834583, - 0.54525386633262883, - 0.52213689121370692, - 0.50000000000000000 - }; - double a2[] = - { - 0.24114209503420288E-17, - 0.92291566937243079E-18, - -0.15241915231122319E-17, - -0.35421849765286817E-17, - -0.31286215245415074E-17, - -0.44654376565694490E-17, - 0.29306999570789681E-17, - 0.11260851040933474E-17 - }; - double p1 = 0.833333333333332114e-1; - double p2 = 0.125000000005037992e-1; - double p3 = 0.223214212859242590e-2; - double p4 = 0.434457756721631196e-3; - double q1 = 0.693147180559945296e0; - double q2 = 0.240226506959095371e0; - double q3 = 0.555041086640855953e-1; - double q4 = 0.961812905951724170e-2; - double q5 = 0.133335413135857847e-2; - double q6 = 0.154002904409897646e-3; - double q7 = 0.149288526805956082e-4; - double k = 0.442695040888963407; + +double a1[] = +{ + 1.0, + 0.95760328069857365, + 0.91700404320467123, + 0.87812608018664974, + 0.84089641525371454, + 0.80524516597462716, + 0.77110541270397041, + 0.73841307296974966, + 0.70710678118654752, + 0.67712777346844637, + 0.64841977732550483, + 0.62092890603674203, + 0.59460355750136054, + 0.56939431737834583, + 0.54525386633262883, + 0.52213689121370692, + 0.50000000000000000 +}; +double a2[] = +{ + 0.24114209503420288E-17, + 0.92291566937243079E-18, + -0.15241915231122319E-17, + -0.35421849765286817E-17, + -0.31286215245415074E-17, + -0.44654376565694490E-17, + 0.29306999570789681E-17, + 0.11260851040933474E-17 +}; +double p1 = 0.833333333333332114e-1; +double p2 = 0.125000000005037992e-1; +double p3 = 0.223214212859242590e-2; +double p4 = 0.434457756721631196e-3; +double q1 = 0.693147180559945296e0; +double q2 = 0.240226506959095371e0; +double q3 = 0.555041086640855953e-1; +double q4 = 0.961812905951724170e-2; +double q5 = 0.133335413135857847e-2; +double q6 = 0.154002904409897646e-3; +double q7 = 0.149288526805956082e-4; +double k = 0.442695040888963407; + double pow(double x, double y) { double frexp(), g, ldexp(), r, u1, u2, v, w, w1, w2, y1, y2, z; From 361bedf0b98afcb4df6d0951dca06117aaff1009 Mon Sep 17 00:00:00 2001 From: HuangRui Date: Thu, 5 Feb 2015 12:26:20 +0800 Subject: [PATCH 03/14] Optimization of memory usage when using double pow(double x, double y). --- app/libc/c_math.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/libc/c_math.c b/app/libc/c_math.c index ae44335f..622a942d 100644 --- a/app/libc/c_math.c +++ b/app/libc/c_math.c @@ -1,5 +1,6 @@ #include "c_math.h" #include "c_types.h" +#include "user_config.h" double floor(double x) { @@ -10,7 +11,7 @@ double floor(double x) #define MINEXP -2047 /* (MIN_EXP * 16) - 1 */ #define HUGE MAXFLOAT -double a1[] = +double a1[] ICACHE_STORE_ATTR ICACHE_RODATA_ATTR = { 1.0, 0.95760328069857365, @@ -30,7 +31,7 @@ double a1[] = 0.52213689121370692, 0.50000000000000000 }; -double a2[] = +double a2[] ICACHE_STORE_ATTR ICACHE_RODATA_ATTR = { 0.24114209503420288E-17, 0.92291566937243079E-18, From 0950e48925b9d6024ec02e431506e7edd460f937 Mon Sep 17 00:00:00 2001 From: Till Klocke Date: Thu, 5 Feb 2015 18:40:46 +0100 Subject: [PATCH 04/14] Added support for WS2812 LEDs as a new module --- app/include/user_config.h | 1 + app/modules/modules.h | 12 ++++++- app/modules/ws2812.c | 74 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 app/modules/ws2812.c diff --git a/app/include/user_config.h b/app/include/user_config.h index c812f2fa..0c12edcc 100644 --- a/app/include/user_config.h +++ b/app/include/user_config.h @@ -65,6 +65,7 @@ #define LUA_USE_MODULES_OW #define LUA_USE_MODULES_BIT #define LUA_USE_MODULES_MQTT +#define LUA_USE_MODULES_WS2812 #endif /* LUA_USE_MODULES */ // #define LUA_NUMBER_INTEGRAL diff --git a/app/modules/modules.h b/app/modules/modules.h index f28775d5..aaa98053 100644 --- a/app/modules/modules.h +++ b/app/modules/modules.h @@ -117,6 +117,15 @@ #define ROM_MODULES_BIT #endif +#if defined(LUA_USE_MODULES_WS2812) +#define MODULES_WS2812 "ws2812" +#define ROM_MODULES_WS2812 \ + _ROM(MODULES_WS2812, luaopen_ws2812, ws2812_map) +#else +#define ROM_MODULES_WS2812 +#endif + + #define LUA_MODULES_ROM \ ROM_MODULES_GPIO \ ROM_MODULES_PWM \ @@ -131,7 +140,8 @@ ROM_MODULES_ADC \ ROM_MODULES_UART \ ROM_MODULES_OW \ - ROM_MODULES_BIT + ROM_MODULES_BIT \ + ROM_MODULES_WS2812 #endif diff --git a/app/modules/ws2812.c b/app/modules/ws2812.c new file mode 100644 index 00000000..4cc09efc --- /dev/null +++ b/app/modules/ws2812.c @@ -0,0 +1,74 @@ +#include "lualib.h" +#include "lauxlib.h" +#include "platform.h" +#include "auxmods.h" +#include "lrotable.h" + +// ---------------------------------------------------------------------------- +// -- This WS2812 code must be compiled with -O2 to get the timing right. +// -- http://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/ + +// The ICACHE_FLASH_ATTR is there to trick the compiler and get the very first pulse width correct. +static void ICACHE_FLASH_ATTR send_ws_0(uint8_t gpio) +{ + uint8_t i; + i = 4; while (i--) GPIO_REG_WRITE(GPIO_OUT_W1TS_ADDRESS, 1 << gpio); + i = 9; while (i--) GPIO_REG_WRITE(GPIO_OUT_W1TC_ADDRESS, 1 << gpio); +} + +static void ICACHE_FLASH_ATTR send_ws_1(uint8_t gpio) +{ + uint8_t i; + i = 8; while (i--) GPIO_REG_WRITE(GPIO_OUT_W1TS_ADDRESS, 1 << gpio); + i = 6; while (i--) GPIO_REG_WRITE(GPIO_OUT_W1TC_ADDRESS, 1 << gpio); +} + +// Lua: ws2812(pin, "string") +// Byte triples in the string are interpreted as G R B values. +// gpio.ws2812(4, string.char(0, 255, 0)) uses GPIO2 and sets the first LED red. +// gpio.ws2812(3, string.char(0, 0, 255):rep(10)) uses GPIO0 and sets ten LEDs blue. +// gpio.ws2812(4, string.char(255, 0, 0, 255, 255, 255)) first LED green, second LED white. +static int ICACHE_FLASH_ATTR lgpio_ws2812(lua_State* L) +{ + const uint8_t pin = luaL_checkinteger(L, 1); + size_t length; + const char *buffer = luaL_checklstring(L, 2, &length); + + platform_gpio_mode(pin, PLATFORM_GPIO_OUTPUT, PLATFORM_GPIO_FLOAT); + platform_gpio_write(pin, 0); + os_delay_us(10); + + os_intr_lock(); + const char * const end = buffer + length; + while (buffer != end) { + uint8_t mask = 0x80; + while (mask) { + (*buffer & mask) ? send_ws_1(pin_num[pin]) : send_ws_0(pin_num[pin]); + mask >>= 1; + } + ++buffer; + } + os_intr_unlock(); + + return 0; +} + +#define MIN_OPT_LEVEL 2 +#include "lrodefs.h" +const LUA_REG_TYPE ws2812_map[] = +{ + { LSTRKEY( "write" ), LFUNCVAL( lgpio_ws2812 ) }, + { LNILKEY, LNILVAL} +}; + +LUALIB_API int ws2812( lua_State *L ) +{ + // Make sure that the GPIO system is initialized + LREGISTER( L, "ws2812", ws2812_map ); + return 1; +} + +// ---------------------------------------------------------------------------- + + + From c30002b8df4fb04c17bd22eafaeb2b46a144a6d9 Mon Sep 17 00:00:00 2001 From: Till Klocke Date: Thu, 5 Feb 2015 18:43:29 +0100 Subject: [PATCH 05/14] Fixed typo in method name --- app/modules/ws2812.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/modules/ws2812.c b/app/modules/ws2812.c index 4cc09efc..2f0ef3ad 100644 --- a/app/modules/ws2812.c +++ b/app/modules/ws2812.c @@ -61,9 +61,9 @@ const LUA_REG_TYPE ws2812_map[] = { LNILKEY, LNILVAL} }; -LUALIB_API int ws2812( lua_State *L ) +LUALIB_API int luaopen_ws2812( lua_State *L ) { - // Make sure that the GPIO system is initialized + // TODO: Make sure that the GPIO system is initialized LREGISTER( L, "ws2812", ws2812_map ); return 1; } From 284ee8c46ea17238935d000bf6b66db027447378 Mon Sep 17 00:00:00 2001 From: Till Klocke Date: Thu, 5 Feb 2015 18:47:08 +0100 Subject: [PATCH 06/14] Added attribution and fixed documentation in comments --- app/modules/ws2812.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/app/modules/ws2812.c b/app/modules/ws2812.c index 2f0ef3ad..4a91b3f2 100644 --- a/app/modules/ws2812.c +++ b/app/modules/ws2812.c @@ -3,6 +3,13 @@ #include "platform.h" #include "auxmods.h" #include "lrotable.h" +/** + * All this code is mostly from http://www.esp8266.com/viewtopic.php?f=21&t=1143&sid=a620a377672cfe9f666d672398415fcb + * from user Markus Gritsch. + * I just put this code into its own module and pushed into a forked repo, + * to easily create a pull request. Thanks to Markus Gritsch for the code. + * + */ // ---------------------------------------------------------------------------- // -- This WS2812 code must be compiled with -O2 to get the timing right. @@ -23,11 +30,11 @@ static void ICACHE_FLASH_ATTR send_ws_1(uint8_t gpio) i = 6; while (i--) GPIO_REG_WRITE(GPIO_OUT_W1TC_ADDRESS, 1 << gpio); } -// Lua: ws2812(pin, "string") +// Lua: ws2812.write(pin, "string") // Byte triples in the string are interpreted as G R B values. -// gpio.ws2812(4, string.char(0, 255, 0)) uses GPIO2 and sets the first LED red. -// gpio.ws2812(3, string.char(0, 0, 255):rep(10)) uses GPIO0 and sets ten LEDs blue. -// gpio.ws2812(4, string.char(255, 0, 0, 255, 255, 255)) first LED green, second LED white. +// ws2812.write(4, string.char(0, 255, 0)) uses GPIO2 and sets the first LED red. +// ws2812.write(3, string.char(0, 0, 255):rep(10)) uses GPIO0 and sets ten LEDs blue. +// ws2812.write(4, string.char(255, 0, 0, 255, 255, 255)) first LED green, second LED white. static int ICACHE_FLASH_ATTR lgpio_ws2812(lua_State* L) { const uint8_t pin = luaL_checkinteger(L, 1); From c5d83590bd9ee1667c8139fa50bbc5bf993b0ea7 Mon Sep 17 00:00:00 2001 From: Till Klocke Date: Thu, 5 Feb 2015 19:04:09 +0100 Subject: [PATCH 07/14] Updated README.md with instructions for the ws2812 module --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 674c44e4..653a8e7c 100644 --- a/README.md +++ b/README.md @@ -125,6 +125,7 @@ pre_build/latest/nodemcu_512k_latest.bin is removed. use pre_build/latest/nodemc #define LUA_USE_MODULES_UART #define LUA_USE_MODULES_OW #define LUA_USE_MODULES_BIT +#define LUA_USE_MODULES_WS2812 #endif /* LUA_USE_MODULES */ ... // LUA_NUMBER_INTEGRAL @@ -329,3 +330,13 @@ cu:send("hello") ds18b20 = nil package.loaded["ds18b20"]=nil ``` + +####Control a WS2812 based light strip +```lua + -- set the color of one LED on GPIO 2 to red + ws2812.write(4, string.char(0, 255, 0)) + -- set the color of 10 LEDs on GPIO 0 to blue + ws2812.write(3, string.char(0, 0, 255):rep(10)) + -- first LED green, second LED white + ws2812.write(4, string.char(255, 0, 0, 255, 255, 255)) +``` From 0bbaedac898157df23e5a9d98195fc11aac201de Mon Sep 17 00:00:00 2001 From: Till Klocke Date: Sat, 7 Feb 2015 07:05:41 +0100 Subject: [PATCH 08/14] Renamed lgpio_ws2812 to match lua method name and fixed formatting --- app/modules/ws2812.c | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/app/modules/ws2812.c b/app/modules/ws2812.c index 4a91b3f2..aab28e92 100644 --- a/app/modules/ws2812.c +++ b/app/modules/ws2812.c @@ -14,20 +14,25 @@ // ---------------------------------------------------------------------------- // -- This WS2812 code must be compiled with -O2 to get the timing right. // -- http://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/ - // The ICACHE_FLASH_ATTR is there to trick the compiler and get the very first pulse width correct. -static void ICACHE_FLASH_ATTR send_ws_0(uint8_t gpio) -{ +static void ICACHE_FLASH_ATTR send_ws_0(uint8_t gpio) { uint8_t i; - i = 4; while (i--) GPIO_REG_WRITE(GPIO_OUT_W1TS_ADDRESS, 1 << gpio); - i = 9; while (i--) GPIO_REG_WRITE(GPIO_OUT_W1TC_ADDRESS, 1 << gpio); + i = 4; + while (i--) + GPIO_REG_WRITE(GPIO_OUT_W1TS_ADDRESS, 1 << gpio); + i = 9; + while (i--) + GPIO_REG_WRITE(GPIO_OUT_W1TC_ADDRESS, 1 << gpio); } -static void ICACHE_FLASH_ATTR send_ws_1(uint8_t gpio) -{ +static void ICACHE_FLASH_ATTR send_ws_1(uint8_t gpio) { uint8_t i; - i = 8; while (i--) GPIO_REG_WRITE(GPIO_OUT_W1TS_ADDRESS, 1 << gpio); - i = 6; while (i--) GPIO_REG_WRITE(GPIO_OUT_W1TC_ADDRESS, 1 << gpio); + i = 8; + while (i--) + GPIO_REG_WRITE(GPIO_OUT_W1TS_ADDRESS, 1 << gpio); + i = 6; + while (i--) + GPIO_REG_WRITE(GPIO_OUT_W1TC_ADDRESS, 1 << gpio); } // Lua: ws2812.write(pin, "string") @@ -35,8 +40,7 @@ static void ICACHE_FLASH_ATTR send_ws_1(uint8_t gpio) // ws2812.write(4, string.char(0, 255, 0)) uses GPIO2 and sets the first LED red. // ws2812.write(3, string.char(0, 0, 255):rep(10)) uses GPIO0 and sets ten LEDs blue. // ws2812.write(4, string.char(255, 0, 0, 255, 255, 255)) first LED green, second LED white. -static int ICACHE_FLASH_ATTR lgpio_ws2812(lua_State* L) -{ +static int ICACHE_FLASH_ATTR ws2812_write(lua_State* L) { const uint8_t pin = luaL_checkinteger(L, 1); size_t length; const char *buffer = luaL_checklstring(L, 2, &length); @@ -64,18 +68,15 @@ static int ICACHE_FLASH_ATTR lgpio_ws2812(lua_State* L) #include "lrodefs.h" const LUA_REG_TYPE ws2812_map[] = { - { LSTRKEY( "write" ), LFUNCVAL( lgpio_ws2812 ) }, - { LNILKEY, LNILVAL} + { LSTRKEY( "write" ), LFUNCVAL( ws2812_write )}, + { LNILKEY, LNILVAL} }; -LUALIB_API int luaopen_ws2812( lua_State *L ) -{ - // TODO: Make sure that the GPIO system is initialized - LREGISTER( L, "ws2812", ws2812_map ); - return 1; +LUALIB_API int luaopen_ws2812(lua_State *L) { + // TODO: Make sure that the GPIO system is initialized + LREGISTER(L, "ws2812", ws2812_map); + return 1; } // ---------------------------------------------------------------------------- - - From dec47d5372551a8b271f840f4f20ada60703f913 Mon Sep 17 00:00:00 2001 From: funshine Date: Sat, 7 Feb 2015 23:45:01 +0800 Subject: [PATCH 09/14] fix #185 --- app/modules/mqtt.c | 11 +++++++++-- app/modules/net.c | 8 ++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/modules/mqtt.c b/app/modules/mqtt.c index a37974ec..13b182bc 100644 --- a/app/modules/mqtt.c +++ b/app/modules/mqtt.c @@ -725,8 +725,15 @@ static int mqtt_socket_connect( lua_State* L ) if(mud == NULL) return 0; - if(mud->pesp_conn) - c_free(mud->pesp_conn); + if(mud->pesp_conn){ //TODO: should I free tcp struct directly or ask user to call close()??? + mud->pesp_conn->reverse = NULL; + if(mud->pesp_conn->proto.tcp) + c_free(mud->pesp_conn->proto.tcp); + mud->pesp_conn->proto.tcp = NULL; + c_free(mud->pesp_conn); + mud->pesp_conn = NULL; + } + struct espconn *pesp_conn = NULL; pesp_conn = mud->pesp_conn = (struct espconn *)c_zalloc(sizeof(struct espconn)); if(!pesp_conn) diff --git a/app/modules/net.c b/app/modules/net.c index 92514c9b..817ad670 100644 --- a/app/modules/net.c +++ b/app/modules/net.c @@ -665,6 +665,10 @@ static int net_start( lua_State* L, const char* mt ) return 0; } + if(nud->pesp_conn == NULL){ + NODE_DBG("nud->pesp_conn is NULL.\n"); + return 0; + } pesp_conn = nud->pesp_conn; port = luaL_checkinteger( L, stack ); stack++; @@ -1074,6 +1078,10 @@ static int net_dns( lua_State* L, const char* mt ) return 0; } + if(nud->pesp_conn == NULL){ + NODE_DBG("nud->pesp_conn is NULL.\n"); + return 0; + } pesp_conn = nud->pesp_conn; if(!isserver || pesp_conn->type == ESPCONN_UDP){ // self_ref is only needed by socket userdata, or udp server From 929d4aed5cdd60bbacf355eccb19458e636f9273 Mon Sep 17 00:00:00 2001 From: Santiago Date: Mon, 9 Feb 2015 03:00:18 -0300 Subject: [PATCH 10/14] Added the hold and unhold methods to tcp socket --- app/include/lwip/app/espconn.h | 16 +++++++++++ app/include/lwip/tcp.h | 2 ++ app/lwip/app/espconn.c | 29 ++++++++++++++++++++ app/lwip/app/espconn_tcp.c | 16 +++++++++++ app/lwip/core/tcp.c | 1 + app/lwip/core/tcp_in.c | 2 +- app/modules/net.c | 50 ++++++++++++++++++++++++++++++++++ 7 files changed, 115 insertions(+), 1 deletion(-) diff --git a/app/include/lwip/app/espconn.h b/app/include/lwip/app/espconn.h index e6e60fd1..6eda9e3a 100644 --- a/app/include/lwip/app/espconn.h +++ b/app/include/lwip/app/espconn.h @@ -394,5 +394,21 @@ extern sint8 espconn_igmp_join(ip_addr_t *host_ip, ip_addr_t *multicast_ip); *******************************************************************************/ extern sint8 espconn_igmp_leave(ip_addr_t *host_ip, ip_addr_t *multicast_ip); +/****************************************************************************** + * FunctionName : espconn_recv_hold + * Description : hold tcp receive + * Parameters : espconn -- espconn to hold + * Returns : none +*******************************************************************************/ +extern sint8 espconn_recv_hold(struct espconn *pespconn); + +/****************************************************************************** + * FunctionName : espconn_recv_unhold + * Description : unhold tcp receive + * Parameters : espconn -- espconn to unhold + * Returns : none +*******************************************************************************/ +extern sint8 espconn_recv_unhold(struct espconn *pespconn); + #endif diff --git a/app/include/lwip/tcp.h b/app/include/lwip/tcp.h index 909ff9b7..7856a92d 100644 --- a/app/include/lwip/tcp.h +++ b/app/include/lwip/tcp.h @@ -277,6 +277,8 @@ struct tcp_pcb { /* KEEPALIVE counter */ u8_t keep_cnt_sent; + + u8_t hold; }; struct tcp_pcb_listen { diff --git a/app/lwip/app/espconn.c b/app/lwip/app/espconn.c index bd81e4d6..114f1b59 100644 --- a/app/lwip/app/espconn.c +++ b/app/lwip/app/espconn.c @@ -718,3 +718,32 @@ espconn_gethostbyname(struct espconn *pespconn, const char *hostname, ip_addr_t return dns_gethostbyname(hostname, addr, found, pespconn); } +sint8 espconn_recv_hold(struct espconn *pespconn) { + espconn_msg *pnode = NULL; + + if (pespconn == NULL) { + return ESPCONN_ARG; + } + pespconn->state = ESPCONN_WRITE; + if (!espconn_find_connection(pespconn, &pnode)) { + return ESPCONN_ARG; + } + + espconn_tcp_hold(pnode); + return ESPCONN_OK; +} + +sint8 espconn_recv_unhold(struct espconn *pespconn) { + espconn_msg *pnode = NULL; + + if (pespconn == NULL) { + return ESPCONN_ARG; + } + pespconn->state = ESPCONN_WRITE; + if (!espconn_find_connection(pespconn, &pnode)) { + return ESPCONN_ARG; + } + + espconn_tcp_unhold(pnode); + return ESPCONN_OK; +} diff --git a/app/lwip/app/espconn_tcp.c b/app/lwip/app/espconn_tcp.c index 91843887..da5c441a 100644 --- a/app/lwip/app/espconn_tcp.c +++ b/app/lwip/app/espconn_tcp.c @@ -948,3 +948,19 @@ sint8 ICACHE_FLASH_ATTR espconn_tcp_delete(struct espconn *pdeletecon) return ESPCONN_ARG; } } + +void espconn_tcp_hold(void *arg) { + espconn_msg *ptcp_sent = arg; + struct tcp_pcb *pcb = NULL; + pcb = ptcp_sent->pcommon.pcb; + + pcb->hold = 1; +} + +void espconn_tcp_unhold(void *arg) { + espconn_msg *ptcp_sent = arg; + struct tcp_pcb *pcb = NULL; + pcb = ptcp_sent->pcommon.pcb; + + pcb->hold = 0; +} diff --git a/app/lwip/core/tcp.c b/app/lwip/core/tcp.c index e3193cc7..fe0bb913 100644 --- a/app/lwip/core/tcp.c +++ b/app/lwip/core/tcp.c @@ -1259,6 +1259,7 @@ tcp_alloc(u8_t prio) #endif /* LWIP_TCP_KEEPALIVE */ pcb->keep_cnt_sent = 0; //���ķ��ʹ��� + pcb->hold = 0; } return pcb; } diff --git a/app/lwip/core/tcp_in.c b/app/lwip/core/tcp_in.c index 2f4a1c42..2aca07d4 100644 --- a/app/lwip/core/tcp_in.c +++ b/app/lwip/core/tcp_in.c @@ -1137,7 +1137,7 @@ tcp_receive(struct tcp_pcb *pcb) /* If the incoming segment contains data, we must process it further. */ - if (tcplen > 0) { + if ((tcplen > 0) && (!pcb->hold)) { /* This code basically does three things: +) If the incoming segment contains data that is the next diff --git a/app/modules/net.c b/app/modules/net.c index 817ad670..51639b54 100644 --- a/app/modules/net.c +++ b/app/modules/net.c @@ -1193,6 +1193,54 @@ static int net_socket_send( lua_State* L ) return net_send(L, mt); } +static int net_socket_hold( lua_State* L ) +{ + const char *mt = "net.socket"; + struct espconn *pesp_conn = NULL; + lnet_userdata *nud; + size_t l; + + nud = (lnet_userdata *)luaL_checkudata(L, 1, mt); + luaL_argcheck(L, nud, 1, "Server/Socket expected"); + if(nud==NULL){ + NODE_DBG("userdata is nil.\n"); + return 0; + } + + if(nud->pesp_conn == NULL){ + NODE_DBG("nud->pesp_conn is NULL.\n"); + return 0; + } + pesp_conn = nud->pesp_conn; + espconn_recv_hold(pesp_conn); + + return 0; +} + +static int net_socket_unhold( lua_State* L ) +{ + const char *mt = "net.socket"; + struct espconn *pesp_conn = NULL; + lnet_userdata *nud; + size_t l; + + nud = (lnet_userdata *)luaL_checkudata(L, 1, mt); + luaL_argcheck(L, nud, 1, "Server/Socket expected"); + if(nud==NULL){ + NODE_DBG("userdata is nil.\n"); + return 0; + } + + if(nud->pesp_conn == NULL){ + NODE_DBG("nud->pesp_conn is NULL.\n"); + return 0; + } + pesp_conn = nud->pesp_conn; + espconn_recv_unhold(pesp_conn); + + return 0; +} + // Lua: socket:dns( string, function(ip) ) static int net_socket_dns( lua_State* L ) { @@ -1251,6 +1299,8 @@ static const LUA_REG_TYPE net_socket_map[] = { LSTRKEY( "close" ), LFUNCVAL ( net_socket_close ) }, { LSTRKEY( "on" ), LFUNCVAL ( net_socket_on ) }, { LSTRKEY( "send" ), LFUNCVAL ( net_socket_send ) }, + { LSTRKEY( "hold" ), LFUNCVAL ( net_socket_hold ) }, + { LSTRKEY( "unhold" ), LFUNCVAL ( net_socket_unhold ) }, { LSTRKEY( "dns" ), LFUNCVAL ( net_socket_dns ) }, // { LSTRKEY( "delete" ), LFUNCVAL ( net_socket_delete ) }, { LSTRKEY( "__gc" ), LFUNCVAL ( net_socket_delete ) }, From 7f633b9168ce895db8a03ceb090a42a3d1269ac3 Mon Sep 17 00:00:00 2001 From: zeroday Date: Mon, 9 Feb 2015 23:51:53 +0800 Subject: [PATCH 11/14] Revert "Use python2 instead of python(2/3)" --- tools/esptool.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/esptool.py b/tools/esptool.py index c6027eb7..130e80f0 100755 --- a/tools/esptool.py +++ b/tools/esptool.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python # # ESP8266 ROM Bootloader Utility # https://github.com/themadinventor/esptool From b33e44c3deb7bcb96724ef3c7826e3d645deee15 Mon Sep 17 00:00:00 2001 From: Ivoah Date: Tue, 10 Feb 2015 08:25:41 -0500 Subject: [PATCH 12/14] Update telnet.lua --- examples/telnet.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/telnet.lua b/examples/telnet.lua index 482fcb41..f8ed7340 100644 --- a/examples/telnet.lua +++ b/examples/telnet.lua @@ -31,7 +31,7 @@ function startServer() print("===Now,Using xcon_tcp logon and input LUA.====") end -tmr.alarm(1000, 1, function() +tmr.alarm(0, 1000, 1, function() if wifi.sta.getip()=="0.0.0.0" then print("Connect AP, Waiting...") else From 7fda5bdf76ad2c5f41fe1bfdcee3e0b9d649efb1 Mon Sep 17 00:00:00 2001 From: HuangRui Date: Tue, 10 Feb 2015 22:39:50 +0800 Subject: [PATCH 13/14] Use more powerful UART baudrate list from RTOS driver. --- app/include/driver/uart.h | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/app/include/driver/uart.h b/app/include/driver/uart.h index bc175ee8..b4f4acfb 100644 --- a/app/include/driver/uart.h +++ b/app/include/driver/uart.h @@ -33,18 +33,23 @@ typedef enum { } UartExistParity; typedef enum { - BIT_RATE_1200 = 1200, - BIT_RATE_2400 = 2400, - BIT_RATE_4800 = 4800, - BIT_RATE_9600 = 9600, + BIT_RATE_300 = 300, + BIT_RATE_600 = 600, + BIT_RATE_1200 = 1200, + BIT_RATE_2400 = 2400, + BIT_RATE_4800 = 4800, + BIT_RATE_9600 = 9600, BIT_RATE_19200 = 19200, BIT_RATE_38400 = 38400, BIT_RATE_57600 = 57600, BIT_RATE_74880 = 74880, - BIT_RATE_115200 = 115200, - BIT_RATE_230400 = 230400, - BIT_RATE_460800 = 460800, - BIT_RATE_921600 = 921600 + BIT_RATE_115200 = 115200, + BIT_RATE_230400 = 230400, + BIT_RATE_256000 = 256000, + BIT_RATE_460800 = 460800, + BIT_RATE_921600 = 921600, + BIT_RATE_1843200 = 1843200, + BIT_RATE_3686400 = 3686400, } UartBautRate; typedef enum { From f1f508ca98a3df7ca88ebdac6bce9184c9ce0f03 Mon Sep 17 00:00:00 2001 From: HuangRui Date: Wed, 11 Feb 2015 00:39:03 +0800 Subject: [PATCH 14/14] Optimization of floating point Memory usage again. --- app/libc/c_math.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/libc/c_math.c b/app/libc/c_math.c index 622a942d..1433b1b2 100644 --- a/app/libc/c_math.c +++ b/app/libc/c_math.c @@ -42,18 +42,18 @@ double a2[] ICACHE_STORE_ATTR ICACHE_RODATA_ATTR = 0.29306999570789681E-17, 0.11260851040933474E-17 }; -double p1 = 0.833333333333332114e-1; -double p2 = 0.125000000005037992e-1; -double p3 = 0.223214212859242590e-2; -double p4 = 0.434457756721631196e-3; -double q1 = 0.693147180559945296e0; -double q2 = 0.240226506959095371e0; -double q3 = 0.555041086640855953e-1; -double q4 = 0.961812905951724170e-2; -double q5 = 0.133335413135857847e-2; -double q6 = 0.154002904409897646e-3; -double q7 = 0.149288526805956082e-4; -double k = 0.442695040888963407; +double p1 ICACHE_STORE_ATTR ICACHE_RODATA_ATTR = 0.833333333333332114e-1; +double p2 ICACHE_STORE_ATTR ICACHE_RODATA_ATTR = 0.125000000005037992e-1; +double p3 ICACHE_STORE_ATTR ICACHE_RODATA_ATTR = 0.223214212859242590e-2; +double p4 ICACHE_STORE_ATTR ICACHE_RODATA_ATTR = 0.434457756721631196e-3; +double q1 ICACHE_STORE_ATTR ICACHE_RODATA_ATTR = 0.693147180559945296e0; +double q2 ICACHE_STORE_ATTR ICACHE_RODATA_ATTR = 0.240226506959095371e0; +double q3 ICACHE_STORE_ATTR ICACHE_RODATA_ATTR = 0.555041086640855953e-1; +double q4 ICACHE_STORE_ATTR ICACHE_RODATA_ATTR = 0.961812905951724170e-2; +double q5 ICACHE_STORE_ATTR ICACHE_RODATA_ATTR = 0.133335413135857847e-2; +double q6 ICACHE_STORE_ATTR ICACHE_RODATA_ATTR = 0.154002904409897646e-3; +double q7 ICACHE_STORE_ATTR ICACHE_RODATA_ATTR = 0.149288526805956082e-4; +double k ICACHE_STORE_ATTR ICACHE_RODATA_ATTR = 0.442695040888963407; double pow(double x, double y) {