Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
Nodemcu Firmware
Commits
84e39e01
Commit
84e39e01
authored
Feb 10, 2015
by
HuangRui
Browse files
Merge branch 'dev' of
https://github.com/nodemcu/nodemcu-firmware
parents
370bc88b
7fda5bdf
Changes
18
Hide whitespace changes
Inline
Side-by-side
README.md
View file @
84e39e01
...
...
@@ -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 @
84e39e01
...
...
@@ -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 @
84e39e01
...
...
@@ -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 @
84e39e01
...
...
@@ -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 @
84e39e01
...
...
@@ -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
...
...
@@ -64,6 +63,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
...
...
app/libc/c_math.c
View file @
84e39e01
#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
=
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
;
int
iw1
,
m
,
p
;
...
...
app/lwip/app/espconn.c
View file @
84e39e01
...
...
@@ -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 @
84e39e01
...
...
@@ -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 @
84e39e01
...
...
@@ -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 @
84e39e01
...
...
@@ -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/modules.h
View file @
84e39e01
...
...
@@ -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 @
84e39e01
...
...
@@ -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 @
84e39e01
#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
;
}
// ----------------------------------------------------------------------------
lua_examples/irsend.lua
View file @
84e39e01
...
...
@@ -5,7 +5,7 @@
-- Vladimir Dronnikov <dronnikov@gmail.com>
--
-- Example:
--
requir
e("irsend").nec(4, 0x00ff00ff)
--
dofil
e("irsend
.lua
").nec(4, 0x00ff00ff)
------------------------------------------------------------------------------
local
M
do
...
...
lua_examples/yet-another-bmp085.lua
View file @
84e39e01
...
...
@@ -6,7 +6,7 @@
-- Heavily based on work of Christee <Christee@nodemcu.com>
--
-- Example:
--
requir
e("bmp085").read(sda, scl)
--
dofil
e("bmp085
.lua
").read(sda, scl)
------------------------------------------------------------------------------
local
M
do
...
...
@@ -59,20 +59,13 @@ do
MD
=
r16
(
0xBE
)
end
-- get raw P
local
p
-- NB: optimize for oss = 0
if
not
oss
then
oss
=
0
end
if
oss
==
0
then
oss
=
0
w8
(
0xF4
,
0x34
)
tmr
.
delay
(
5000
)
p
=
r8
(
0xF6
)
*
256
+
r8
(
0xF7
)
else
w8
(
0xF4
,
0x34
+
64
*
oss
)
tmr
.
delay
(
30000
)
p
=
r8
(
0xF6
)
*
65536
+
r8
(
0xF7
)
*
256
+
r8
(
0xF8
)
p
=
p
/
2
^
(
8
-
oss
)
end
if
oss
<=
0
then
oss
=
0
end
if
oss
>
3
then
oss
=
3
end
w8
(
0xF4
,
0x34
+
64
*
oss
)
tmr
.
delay
((
4
+
3
^
oss
)
*
1000
)
local
p
=
r8
(
0xF6
)
*
65536
+
r8
(
0xF7
)
*
256
+
r8
(
0xF8
)
p
=
p
/
2
^
(
8
-
oss
)
-- get T
w8
(
0xF4
,
0x2E
)
tmr
.
delay
(
5000
)
...
...
@@ -86,14 +79,14 @@ do
local
X1
=
B2
*
(
B6
*
B6
/
4096
)
/
2048
local
X2
=
AC2
*
B6
/
2048
local
X3
=
X1
+
X2
local
B3
=
((
AC1
*
4
+
X3
)
*
2
^
oss
+
2
)
/
4
local
B3
=
((
AC1
*
4
+
X3
)
*
2
^
oss
+
2
)
/
4
X1
=
AC3
*
B6
/
8192
X2
=
(
B1
*
(
B6
*
B6
/
4096
))
/
65536
X3
=
(
X1
+
X2
+
2
)
/
4
local
B4
=
AC4
*
(
X3
+
32768
)
/
32768
local
B7
=
(
p
-
B3
)
*
(
50000
/
2
^
oss
)
local
B7
=
(
p
-
B3
)
*
(
50000
/
2
^
oss
)
p
=
B7
/
B4
*
2
X1
=
(
p
/
256
)
^
2
X1
=
(
p
/
256
)
^
2
X1
=
(
X1
*
3038
)
/
65536
X2
=
(
-
7357
*
p
)
/
65536
p
=
p
+
(
X1
+
X2
+
3791
)
/
16
...
...
lua_examples/yet-another-dht22.lua
View file @
84e39e01
...
...
@@ -5,8 +5,8 @@
-- Vladimir Dronnikov <dronnikov@gmail.com>
--
-- Example:
-- print("DHT11",
requir
e("dht22").read(4))
-- print("DHT22",
requir
e("dht22").read(4, true))
-- print("DHT11",
dofil
e("dht22
.lua
").read(4))
-- print("DHT22",
dofil
e("dht22
.lua
").read(4, true))
-- NB: the very first read sometimes fails
------------------------------------------------------------------------------
local
M
...
...
lua_examples/yet-another-ds18b20.lua
View file @
84e39e01
...
...
@@ -5,7 +5,7 @@
-- Vladimir Dronnikov <dronnikov@gmail.com>
--
-- Example:
--
requir
e("ds18b20").read(4, function(r) for k, v in pairs(r) do print(k, v) end end)
--
dofil
e("ds18b20
.lua
").read(4, function(r) for k, v in pairs(r) do print(k, v) end end)
------------------------------------------------------------------------------
local
M
do
...
...
lua_modules/redis/redis.lua
0 → 100644
View file @
84e39e01
------------------------------------------------------------------------------
-- Redis client module
--
-- LICENCE: http://opensource.org/licenses/MIT
-- Vladimir Dronnikov <dronnikov@gmail.com>
--
-- Example:
-- local redis = dofile("redis.lua").connect(host, port)
-- redis:publish("chan1", foo")
-- redis:subscribe("chan1", function(channel, msg) print(channel, msg) end)
------------------------------------------------------------------------------
local
M
do
-- const
local
REDIS_PORT
=
6379
-- cache
local
pairs
,
tonumber
=
pairs
,
tonumber
--
local
publish
=
function
(
self
,
chn
,
s
)
self
.
_fd
:
send
((
"*3\r\n$7\r\npublish\r\n$%d\r\n%s\r\n$%d\r\n%s\r\n"
):
format
(
#
chn
,
chn
,
#
s
,
s
))
-- TODO: confirmation? then queue of answers needed
end
local
subscribe
=
function
(
self
,
chn
,
handler
)
-- TODO: subscription to all channels, with single handler
self
.
_fd
:
send
((
"*2\r\n$9\r\nsubscribe\r\n$%d\r\n%s\r\n"
):
format
(
#
chn
,
chn
))
self
.
_handlers
[
chn
]
=
handler
-- TODO: confirmation? then queue of answers needed
end
local
unsubscribe
=
function
(
self
,
chn
)
self
.
_handlers
[
chn
]
=
false
end
-- NB: pity we can not just augment what net.createConnection returns
local
close
=
function
(
self
)
self
.
_fd
:
close
()
end
local
connect
=
function
(
host
,
port
)
local
_fd
=
net
.
createConnection
(
net
.
TCP
,
0
)
local
self
=
{
_fd
=
_fd
,
_handlers
=
{
},
-- TODO: consider metatables?
close
=
close
,
publish
=
publish
,
subscribe
=
subscribe
,
unsubscribe
=
unsubscribe
,
}
_fd
:
on
(
"connection"
,
function
()
--print("+FD")
end
)
_fd
:
on
(
"disconnection"
,
function
()
-- FIXME: this suddenly occurs. timeout?
--print("-FD")
end
)
_fd
:
on
(
"receive"
,
function
(
fd
,
s
)
--print("IN", s)
-- TODO: subscription to all channels
-- lookup message pattern to determine channel and payload
-- NB: pairs() iteration gives no fixed order!
for
chn
,
handler
in
pairs
(
self
.
_handlers
)
do
local
p
=
(
"*3\r\n$7\r\nmessage\r\n$%d\r\n%s\r\n$"
):
format
(
#
chn
,
chn
)
if
s
:
find
(
p
,
1
,
true
)
then
-- extract and check message length
-- NB: only the first TCP packet considered!
local
_
,
start
,
len
=
s
:
find
(
"(%d-)\r\n"
,
#
p
)
if
start
and
tonumber
(
len
)
==
#
s
-
start
-
2
and
handler
then
handler
(
chn
,
s
:
sub
(
start
+
1
,
-
2
))
-- ends with \r\n
end
end
end
end
)
_fd
:
connect
(
port
or
REDIS_PORT
,
host
)
return
self
end
-- expose
M
=
{
connect
=
connect
,
}
end
return
M
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