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
85586411
Commit
85586411
authored
Apr 03, 2015
by
funshine
Browse files
add gpio.serout() api to help serialize bit out
parent
b49e4583
Changes
2
Hide whitespace changes
Inline
Side-by-side
app/modules/gpio.c
View file @
85586411
...
@@ -146,6 +146,82 @@ static int lgpio_write( lua_State* L )
...
@@ -146,6 +146,82 @@ static int lgpio_write( lua_State* L )
return
0
;
return
0
;
}
}
#define DELAY_TABLE_MAX_LEN 256
#define noInterrupts os_intr_lock
#define interrupts os_intr_unlock
#define delayMicroseconds os_delay_us
#define DIRECT_WRITE(pin, level) (GPIO_OUTPUT_SET(GPIO_ID_PIN(pin_num[pin]), level))
// Lua: serout( pin, firstLevel, delay_table, [repeatNum] )
// -- serout( pin, firstLevel, delay_table, [repeatNum] )
// gpio.mode(1,gpio.OUTPUT,gpio.PULLUP)
// gpio.serout(1,1,{30,30,60,60,30,30}) -- serial one byte, b10110010
// gpio.serout(1,1,{30,70},8) -- serial 30% pwm 10k, lasts 8 cycles
// gpio.serout(1,1,{3,7},8) -- serial 30% pwm 100k, lasts 8 cycles
// gpio.serout(1,1,{0,0},8) -- serial 50% pwm as fast as possible, lasts 8 cycles
// gpio.mode(1,gpio.OUTPUT,gpio.PULLUP)
// gpio.serout(1,0,{20,10,10,20,10,10,10,100}) -- sim uart one byte 0x5A at about 100kbps
// gpio.serout(1,1,{8,18},8) -- serial 30% pwm 38k, lasts 8 cycles
static
int
lgpio_serout
(
lua_State
*
L
)
{
unsigned
level
;
unsigned
pin
;
unsigned
table_len
=
0
;
unsigned
repeat
=
0
;
int
delay_table
[
DELAY_TABLE_MAX_LEN
];
pin
=
luaL_checkinteger
(
L
,
1
);
MOD_CHECK_ID
(
gpio
,
pin
);
level
=
luaL_checkinteger
(
L
,
2
);
if
(
level
!=
HIGH
&&
level
!=
LOW
)
return
luaL_error
(
L
,
"wrong arg type"
);
if
(
lua_istable
(
L
,
3
)
)
{
table_len
=
lua_objlen
(
L
,
3
);
if
(
table_len
<=
0
||
table_len
>
DELAY_TABLE_MAX_LEN
)
return
luaL_error
(
L
,
"wrong arg range"
);
int
i
;
for
(
i
=
0
;
i
<
table_len
;
i
++
)
{
lua_rawgeti
(
L
,
3
,
i
+
1
);
delay_table
[
i
]
=
(
int
)
luaL_checkinteger
(
L
,
-
1
);
lua_pop
(
L
,
1
);
if
(
delay_table
[
i
]
<
0
||
delay_table
[
i
]
>
1000000
)
// can not delay more than 1000000 us
return
luaL_error
(
L
,
"delay must < 1000000 us"
);
}
}
else
{
return
luaL_error
(
L
,
"wrong arg range"
);
}
if
(
lua_isnumber
(
L
,
4
))
repeat
=
lua_tointeger
(
L
,
4
);
if
(
repeat
<
0
||
repeat
>
DELAY_TABLE_MAX_LEN
)
return
luaL_error
(
L
,
"delay must < 256"
);
if
(
repeat
==
0
)
repeat
=
1
;
int
j
;
bool
skip_loop
=
true
;
do
{
if
(
skip_loop
){
// skip the first loop.
skip_loop
=
false
;
continue
;
}
for
(
j
=
0
;
j
<
table_len
;
j
++
){
noInterrupts
();
// platform_gpio_write(pin, level);
DIRECT_WRITE
(
pin
,
level
);
interrupts
();
delayMicroseconds
(
delay_table
[
j
]);
level
=!
level
;
}
repeat
--
;
}
while
(
repeat
>
0
);
return
0
;
}
#undef DELAY_TABLE_MAX_LEN
// Module function map
// Module function map
#define MIN_OPT_LEVEL 2
#define MIN_OPT_LEVEL 2
#include "lrodefs.h"
#include "lrodefs.h"
...
@@ -154,6 +230,7 @@ const LUA_REG_TYPE gpio_map[] =
...
@@ -154,6 +230,7 @@ const LUA_REG_TYPE gpio_map[] =
{
LSTRKEY
(
"mode"
),
LFUNCVAL
(
lgpio_mode
)
},
{
LSTRKEY
(
"mode"
),
LFUNCVAL
(
lgpio_mode
)
},
{
LSTRKEY
(
"read"
),
LFUNCVAL
(
lgpio_read
)
},
{
LSTRKEY
(
"read"
),
LFUNCVAL
(
lgpio_read
)
},
{
LSTRKEY
(
"write"
),
LFUNCVAL
(
lgpio_write
)
},
{
LSTRKEY
(
"write"
),
LFUNCVAL
(
lgpio_write
)
},
{
LSTRKEY
(
"serout"
),
LFUNCVAL
(
lgpio_serout
)
},
#ifdef GPIO_INTERRUPT_ENABLE
#ifdef GPIO_INTERRUPT_ENABLE
{
LSTRKEY
(
"trig"
),
LFUNCVAL
(
lgpio_trig
)
},
{
LSTRKEY
(
"trig"
),
LFUNCVAL
(
lgpio_trig
)
},
#endif
#endif
...
...
examples/fragment.lua
View file @
85586411
...
@@ -472,3 +472,15 @@ m:on("offline", function(conn)
...
@@ -472,3 +472,15 @@ m:on("offline", function(conn)
print
(
node
.
heap
())
print
(
node
.
heap
())
end
)
end
)
m
:
connect
(
"192.168.18.88"
,
1883
,
0
,
1
)
m
:
connect
(
"192.168.18.88"
,
1883
,
0
,
1
)
-- serout( pin, firstLevel, delay_table, [repeatNum] )
gpio
.
mode
(
1
,
gpio
.
OUTPUT
,
gpio
.
PULLUP
)
gpio
.
serout
(
1
,
1
,{
30
,
30
,
60
,
60
,
30
,
30
})
-- serial one byte, b10110010
gpio
.
serout
(
1
,
1
,{
30
,
70
},
8
)
-- serial 30% pwm 10k, lasts 8 cycles
gpio
.
serout
(
1
,
1
,{
3
,
7
},
8
)
-- serial 30% pwm 100k, lasts 8 cycles
gpio
.
serout
(
1
,
1
,{
0
,
0
},
8
)
-- serial 50% pwm as fast as possible, lasts 8 cycles
gpio
.
mode
(
1
,
gpio
.
OUTPUT
,
gpio
.
PULLUP
)
gpio
.
serout
(
1
,
0
,{
20
,
10
,
10
,
20
,
10
,
10
,
10
,
100
})
-- sim uart one byte 0x5A at about 100kbps
gpio
.
serout
(
1
,
1
,{
8
,
18
},
8
)
-- serial 30% pwm 38k, lasts 8 cycles
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