Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
Nodemcu Firmware
Commits
18886ea6
Commit
18886ea6
authored
Feb 12, 2015
by
zeroday
Browse files
Merge pull request #203 from nodemcu/dev
Fixed floating point bug. add file.rename
parents
370bc88b
22d096ce
Changes
39
Expand all
Hide whitespace changes
Inline
Side-by-side
README.md
View file @
18886ea6
...
...
@@ -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
...
...
@@ -330,3 +331,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
))
```
app/include/driver/uart.h
View file @
18886ea6
...
...
@@ -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
{
...
...
app/include/lwip/app/espconn.h
View file @
18886ea6
...
...
@@ -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
app/include/lwip/tcp.h
View file @
18886ea6
...
...
@@ -277,6 +277,8 @@ struct tcp_pcb {
/* KEEPALIVE counter */
u8_t
keep_cnt_sent
;
u8_t
hold
;
};
struct
tcp_pcb_listen
{
...
...
app/include/user_config.h
View file @
18886ea6
...
...
@@ -13,6 +13,8 @@
// #define FLASH_1M
// #define FLASH_2M
// #define FLASH_4M
// #define FLASH_8M
// #define FLASH_16M
#define FLASH_AUTOSIZE
// #define DEVELOP_VERSION
#define FULL_VERSION_FOR_USER
...
...
@@ -40,7 +42,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
...
...
@@ -64,12 +65,10 @@
#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
#ifndef LUA_NUMBER_INTEGRAL
#define PRINTF_LONG_SUPPORT
#endif
#define LUA_OPTRAM
#ifdef LUA_OPTRAM
...
...
app/libc/c_math.c
View file @
18886ea6
#include "c_math.h"
#include "c_types.h"
#include "user_config.h"
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
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
[]
ICACHE_STORE_ATTR
ICACHE_RODATA_ATTR
=
{
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
[]
ICACHE_STORE_ATTR
ICACHE_RODATA_ATTR
=
{
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
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
)
{
double
frexp
(),
g
,
ldexp
(),
r
,
u1
,
u2
,
v
,
w
,
w1
,
w2
,
y1
,
y2
,
z
;
int
iw1
,
m
,
p
;
...
...
app/libc/c_stdio.c
View file @
18886ea6
This diff is collapsed.
Click to expand it.
app/libc/c_stdlib.c
View file @
18886ea6
...
...
@@ -3,68 +3,65 @@
#include "c_types.h"
#include "c_string.h"
#include "user_interface.h"
#include "user_config.h"
// const char *lua_init_value = "print(\"Hello world\")";
const
char
*
lua_init_value
=
"@init.lua"
;
// int c_abs(int x){
//
return x>0?x:0-x;
//
return x>0?x:0-x;
// }
// void c_exit(int e){
// }
const
char
*
c_getenv
(
const
char
*
__string
){
if
(
c_strcmp
(
__string
,
"LUA_INIT"
)
==
0
){
return
lua_init_value
;
}
return
NULL
;
const
char
*
c_getenv
(
const
char
*
__string
)
{
if
(
c_strcmp
(
__string
,
"LUA_INIT"
)
==
0
)
{
return
lua_init_value
;
}
return
NULL
;
}
// make sure there is enough memory before real malloc, otherwise malloc will panic and reset
// void *c_malloc(size_t __size){
//
if(__size>system_get_free_heap_size()){
//
NODE_ERR("malloc: not enough memory\n");
//
return NULL;
//
}
//
return (void *)os_malloc(__size);
//
if(__size>system_get_free_heap_size()){
//
NODE_ERR("malloc: not enough memory\n");
//
return NULL;
//
}
//
return (void *)os_malloc(__size);
// }
// void *c_zalloc(size_t __size){
//
if(__size>system_get_free_heap_size()){
//
NODE_ERR("zalloc: not enough memory\n");
//
return NULL;
//
}
//
return (void *)os_zalloc(__size);
//
if(__size>system_get_free_heap_size()){
//
NODE_ERR("zalloc: not enough memory\n");
//
return NULL;
//
}
//
return (void *)os_zalloc(__size);
// }
// void c_free(void *p){
//
// NODE_ERR("free1: %d\n", system_get_free_heap_size());
//
os_free(p);
//
// NODE_ERR("-free1: %d\n", system_get_free_heap_size());
//
// NODE_ERR("free1: %d\n", system_get_free_heap_size());
//
os_free(p);
//
// NODE_ERR("-free1: %d\n", system_get_free_heap_size());
// }
// int
c_rand(void){
// int
c_rand(void){
// }
// void c_srand(unsigned int __seed){
// }
// int
c_atoi(const char *__nptr){
// int
c_atoi(const char *__nptr){
// }
#include <_ansi.h>
//#include <reent.h>
#include <string.h>
//#include "mprec.h"
double
c_strtod
(
const
char
*
string
,
char
**
endPtr
)
double
powersOf10
[]
ICACHE_STORE_ATTR
ICACHE_RODATA_ATTR
=
/* Table giving binary powers of 10. Entry */
{
int
maxExponent
=
511
;
/* Largest possible base 10 exponent. Any
* exponent larger than this will already
* produce underflow or overflow, so there's
* no need to worry about additional digits.
*/
double
powersOf10
[]
=
{
/* Table giving binary powers of 10. Entry */
10
.,
/* is 10^2^i. Used to convert decimal */
100
.,
/* exponents into floating-point numbers. */
10
.,
/* is 10^2^i. Used to convert decimal */
100
.,
/* exponents into floating-point numbers. */
1.0e4
,
1.0e8
,
1.0e16
,
...
...
@@ -72,43 +69,57 @@ double c_strtod(const char *string, char **endPtr)
1.0e64
,
1.0e128
,
1.0e256
};
};
double
c_strtod
(
const
char
*
string
,
char
**
endPtr
)
{
int
maxExponent
=
511
;
/* Largest possible base 10 exponent. Any
* exponent larger than this will already
* produce underflow or overflow, so there's
* no need to worry about additional digits.
*/
int
sign
,
expSign
=
FALSE
;
double
fraction
,
dblExp
,
*
d
;
register
const
char
*
p
;
register
int
c
;
int
exp
=
0
;
/* Exponent read from "EX" field. */
int
fracExp
=
0
;
/* Exponent that derives from the fractional
* part. Under normal circumstatnces, it is
* the negative of the number of digits in F.
* However, if I is very long, the last digits
* of I get dropped (otherwise a long I with a
* large negative exponent could cause an
* unnecessary overflow on I alone). In this
* case, fracExp is incremented one for each
* dropped digit. */
int
mantSize
;
/* Number of digits in mantissa. */
int
decPt
;
/* Number of mantissa digits BEFORE decimal
* point. */
const
char
*
pExp
;
/* Temporarily holds location of exponent
* in string. */
int
exp
=
0
;
/* Exponent read from "EX" field. */
int
fracExp
=
0
;
/* Exponent that derives from the fractional
* part. Under normal circumstatnces, it is
* the negative of the number of digits in F.
* However, if I is very long, the last digits
* of I get dropped (otherwise a long I with a
* large negative exponent could cause an
* unnecessary overflow on I alone). In this
* case, fracExp is incremented one for each
* dropped digit. */
int
mantSize
;
/* Number of digits in mantissa. */
int
decPt
;
/* Number of mantissa digits BEFORE decimal
* point. */
const
char
*
pExp
;
/* Temporarily holds location of exponent
* in string. */
/*
* Strip off leading blanks and check for a sign.
*/
p
=
string
;
while
(
isspace
((
unsigned
char
)(
*
p
)))
{
p
+=
1
;
while
(
isspace
((
unsigned
char
)(
*
p
)))
{
p
+=
1
;
}
if
(
*
p
==
'-'
)
{
sign
=
TRUE
;
p
+=
1
;
}
if
(
*
p
==
'-'
)
{
sign
=
TRUE
;
p
+=
1
;
}
else
{
if
(
*
p
==
'+'
)
{
p
+=
1
;
}
sign
=
FALSE
;
else
{
if
(
*
p
==
'+'
)
{
p
+=
1
;
}
sign
=
FALSE
;
}
/*
...
...
@@ -119,14 +130,16 @@ double c_strtod(const char *string, char **endPtr)
decPt
=
-
1
;
for
(
mantSize
=
0
;
;
mantSize
+=
1
)
{
c
=
*
p
;
if
(
!
isdigit
(
c
))
{
if
((
c
!=
'.'
)
||
(
decPt
>=
0
))
{
break
;
}
decPt
=
mantSize
;
}
p
+=
1
;
c
=
*
p
;
if
(
!
isdigit
(
c
))
{
if
((
c
!=
'.'
)
||
(
decPt
>=
0
))
{
break
;
}
decPt
=
mantSize
;
}
p
+=
1
;
}
/*
...
...
@@ -135,49 +148,60 @@ double c_strtod(const char *string, char **endPtr)
* If the mantissa has more than 18 digits, ignore the extras, since
* they can't affect the value anyway.
*/
pExp
=
p
;
p
-=
mantSize
;
if
(
decPt
<
0
)
{
decPt
=
mantSize
;
}
else
{
mantSize
-=
1
;
/* One of the digits was the point. */
if
(
decPt
<
0
)
{
decPt
=
mantSize
;
}
if
(
mantSize
>
18
)
{
fracExp
=
decPt
-
18
;
mantSize
=
18
;
}
else
{
fracExp
=
decPt
-
mantSize
;
else
{
mantSize
-=
1
;
/* One of the digits was the point. */
}
if
(
mantSize
==
0
)
{
fraction
=
0
.
0
;
p
=
string
;
goto
done
;
}
else
{
int
frac1
,
frac2
;
frac1
=
0
;
for
(
;
mantSize
>
9
;
mantSize
-=
1
)
{
c
=
*
p
;
p
+=
1
;
if
(
c
==
'.'
)
{
c
=
*
p
;
p
+=
1
;
}
frac1
=
10
*
frac1
+
(
c
-
'0'
);
}
frac2
=
0
;
for
(;
mantSize
>
0
;
mantSize
-=
1
)
{
c
=
*
p
;
p
+=
1
;
if
(
c
==
'.'
)
{
c
=
*
p
;
p
+=
1
;
}
frac2
=
10
*
frac2
+
(
c
-
'0'
);
}
fraction
=
(
1.0e9
*
frac1
)
+
frac2
;
if
(
mantSize
>
18
)
{
fracExp
=
decPt
-
18
;
mantSize
=
18
;
}
else
{
fracExp
=
decPt
-
mantSize
;
}
if
(
mantSize
==
0
)
{
fraction
=
0
.
0
;
p
=
string
;
goto
done
;
}
else
{
int
frac1
,
frac2
;
frac1
=
0
;
for
(
;
mantSize
>
9
;
mantSize
-=
1
)
{
c
=
*
p
;
p
+=
1
;
if
(
c
==
'.'
)
{
c
=
*
p
;
p
+=
1
;
}
frac1
=
10
*
frac1
+
(
c
-
'0'
);
}
frac2
=
0
;
for
(;
mantSize
>
0
;
mantSize
-=
1
)
{
c
=
*
p
;
p
+=
1
;
if
(
c
==
'.'
)
{
c
=
*
p
;
p
+=
1
;
}
frac2
=
10
*
frac2
+
(
c
-
'0'
);
}
fraction
=
(
1.0e9
*
frac1
)
+
frac2
;
}
/*
...
...
@@ -185,30 +209,40 @@ double c_strtod(const char *string, char **endPtr)
*/
p
=
pExp
;
if
((
*
p
==
'E'
)
||
(
*
p
==
'e'
))
{
p
+=
1
;
if
(
*
p
==
'-'
)
{
expSign
=
TRUE
;
p
+=
1
;
}
else
{
if
(
*
p
==
'+'
)
{
p
+=
1
;
}
expSign
=
FALSE
;
}
if
(
!
isdigit
((
unsigned
char
)(
*
p
)))
{
p
=
pExp
;
goto
done
;
}
while
(
isdigit
((
unsigned
char
)(
*
p
)))
{
exp
=
exp
*
10
+
(
*
p
-
'0'
);
p
+=
1
;
}
if
((
*
p
==
'E'
)
||
(
*
p
==
'e'
))
{
p
+=
1
;
if
(
*
p
==
'-'
)
{
expSign
=
TRUE
;
p
+=
1
;
}
else
{
if
(
*
p
==
'+'
)
{
p
+=
1
;
}
expSign
=
FALSE
;
}
if
(
!
isdigit
((
unsigned
char
)(
*
p
)))
{
p
=
pExp
;
goto
done
;
}
while
(
isdigit
((
unsigned
char
)(
*
p
)))
{
exp
=
exp
*
10
+
(
*
p
-
'0'
);
p
+=
1
;
}
}
if
(
expSign
)
{
exp
=
fracExp
-
exp
;
}
else
{
exp
=
fracExp
+
exp
;
if
(
expSign
)
{
exp
=
fracExp
-
exp
;
}
else
{
exp
=
fracExp
+
exp
;
}
/*
...
...
@@ -217,41 +251,52 @@ double c_strtod(const char *string, char **endPtr)
* many powers of 2 of 10. Then combine the exponent with the
* fraction.
*/
if
(
exp
<
0
)
{
expSign
=
TRUE
;
exp
=
-
exp
;
}
else
{
expSign
=
FALSE
;
if
(
exp
<
0
)
{
expSign
=
TRUE
;
exp
=
-
exp
;
}
if
(
exp
>
maxExponent
)
{
exp
=
maxExponent
;
// errno = ERANGE;
else
{
expSign
=
FALSE
;
}
if
(
exp
>
maxExponent
)
{
exp
=
maxExponent
;
// errno = ERANGE;
}
dblExp
=
1
.
0
;
for
(
d
=
powersOf10
;
exp
!=
0
;
exp
>>=
1
,
d
+=
1
)
{
if
(
exp
&
01
)
{
dblExp
*=
*
d
;
}
for
(
d
=
powersOf10
;
exp
!=
0
;
exp
>>=
1
,
d
+=
1
)
{
if
(
exp
&
01
)
{
dblExp
*=
*
d
;
}
}
if
(
expSign
)
{
fraction
/=
dblExp
;
}
if
(
expSign
)
{
fraction
/=
dblExp
;
}
else
{
fraction
*=
dblExp
;
else
{
fraction
*=
dblExp
;
}
done:
if
(
endPtr
!=
NULL
)
{
*
endPtr
=
(
char
*
)
p
;
if
(
endPtr
!=
NULL
)
{
*
endPtr
=
(
char
*
)
p
;
}
if
(
sign
)
{
return
-
fraction
;
if
(
sign
)
{
return
-
fraction
;
}
return
fraction
;
}
// long
c_strtol(const char *__n, char **__end_PTR, int __base){
// long
c_strtol(const char *__n, char **__end_PTR, int __base){
// }
// unsigned long c_strtoul(const char *__n, char **__end_PTR, int __base){
// }
...
...
app/lua/luaconf.h
View file @
18886ea6
...
...
@@ -601,8 +601,7 @@ extern int readline4lua(const char *prompt, char *buffer, int length);
#endif // #if !defined LUA_INTEGRAL_LONGLONG
#else
#define LUA_NUMBER_SCAN "%lf"
//#define LUA_NUMBER_FMT "%.14g"
#define LUA_NUMBER_FMT "%g"
#define LUA_NUMBER_FMT "%.14g"
#endif // #if defined LUA_NUMBER_INTEGRAL
#define lua_number2str(s,n) c_sprintf((s), LUA_NUMBER_FMT, (n))
#define LUAI_MAXNUMBER2STR 32
/* 16 digits, sign, point, and \0 */
...
...
app/lwip/app/espconn.c
View file @
18886ea6
...
...
@@ -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
;
}
app/lwip/app/espconn_tcp.c
View file @
18886ea6
...
...
@@ -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
;
}
app/lwip/core/tcp.c
View file @
18886ea6
...
...
@@ -1259,6 +1259,7 @@ tcp_alloc(u8_t prio)
#endif
/* LWIP_TCP_KEEPALIVE */
pcb
->
keep_cnt_sent
=
0
;
//���ķ��ʹ���
pcb
->
hold
=
0
;
}
return
pcb
;
}
...
...
app/lwip/core/tcp_in.c
View file @
18886ea6
...
...
@@ -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
...
...
app/modules/file.c
View file @
18886ea6
...
...
@@ -125,7 +125,7 @@ static int file_remove( lua_State* L )
if
(
len
>
FS_NAME_MAX_LENGTH
)
return
luaL_error
(
L
,
"filename too long"
);
file_close
(
L
);
SPIFFS_remove
(
&
fs
,
fname
);
SPIFFS_remove
(
&
fs
,
(
char
*
)
fname
);
return
0
;
}
...
...
@@ -150,6 +150,31 @@ static int file_check( lua_State* L )
}
#endif
// Lua: rename("oldname", "newname")
static
int
file_rename
(
lua_State
*
L
)
{
size_t
len
;
if
((
FS_OPEN_OK
-
1
)
!=
file_fd
){
fs_close
(
file_fd
);
file_fd
=
FS_OPEN_OK
-
1
;
}
const
char
*
oldname
=
luaL_checklstring
(
L
,
1
,
&
len
);
if
(
len
>
FS_NAME_MAX_LENGTH
)
return
luaL_error
(
L
,
"filename too long"
);
const
char
*
newname
=
luaL_checklstring
(
L
,
2
,
&
len
);
if
(
len
>
FS_NAME_MAX_LENGTH
)
return
luaL_error
(
L
,
"filename too long"
);
if
(
SPIFFS_OK
==
myspiffs_rename
(
oldname
,
newname
)){
lua_pushboolean
(
L
,
1
);
}
else
{
lua_pushboolean
(
L
,
0
);
}
return
1
;
}
#endif
// g_read()
...
...
@@ -282,6 +307,7 @@ const LUA_REG_TYPE file_map[] =
{
LSTRKEY
(
"seek"
),
LFUNCVAL
(
file_seek
)
},
{
LSTRKEY
(
"flush"
),
LFUNCVAL
(
file_flush
)
},
// { LSTRKEY( "check" ), LFUNCVAL( file_check ) },
{
LSTRKEY
(
"rename"
),
LFUNCVAL
(
file_rename
)
},
#endif
#if LUA_OPTIMIZE_MEMORY > 0
...
...
app/modules/modules.h
View file @
18886ea6
...
...
@@ -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
app/modules/net.c
View file @
18886ea6
...
...
@@ -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
)
},
...
...
app/modules/ws2812.c
0 → 100644
View file @
18886ea6
#include "lualib.h"
#include "lauxlib.h"
#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.
// -- 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.write(pin, "string")
// Byte triples in the string are interpreted as G R B values.
// 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
ws2812_write
(
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
(
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
;
}
// ----------------------------------------------------------------------------
app/platform/cpu_esp8266.h
View file @
18886ea6
...
...
@@ -25,6 +25,10 @@
#define FLASH_SEC_NUM 0x200
#elif defined(FLASH_4M)
#define FLASH_SEC_NUM 0x400
#elif defined(FLASH_8M)
#define FLASH_SEC_NUM 0x800
#elif defined(FLASH_16M)
#define FLASH_SEC_NUM 0x1000
#elif defined(FLASH_AUTOSIZE)
#define FLASH_SEC_NUM (flash_get_sec_num())
#else
...
...
app/platform/flash_api.c
View file @
18886ea6
...
...
@@ -56,6 +56,12 @@ uint32_t flash_get_size_byte(void)
case
SIZE_32MBIT
:
// 32Mbit, 4MByte
flash_size
=
4
*
1024
*
1024
;
case
SIZE_64MBIT
:
// 64Mbit, 8MByte
flash_size
=
8
*
1024
*
1024
;
case
SIZE_128MBIT
:
// 128Mbit, 16MByte
flash_size
=
16
*
1024
*
1024
;
break
;
default:
// Unknown flash size, fall back mode.
...
...
app/platform/flash_api.h
View file @
18886ea6
...
...
@@ -52,6 +52,8 @@ typedef struct
SIZE_8MBIT
=
2
,
SIZE_16MBIT
=
3
,
SIZE_32MBIT
=
4
,
SIZE_64MBIT
=
5
,
SIZE_128MBIT
=
6
,
}
size
:
4
;
}
ICACHE_STORE_TYPEDEF_ATTR
SPIFlashInfo
;
...
...
Prev
1
2
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment