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
20465dd3
Commit
20465dd3
authored
Mar 14, 2016
by
TerryE
Browse files
Updates to gpio.c and documentation to reflect review comments
parent
5595ca35
Changes
2
Hide whitespace changes
Inline
Side-by-side
app/modules/gpio.c
View file @
20465dd3
...
@@ -62,25 +62,36 @@ static void gpio_intr_callback_task (task_param_t param, uint8 priority)
...
@@ -62,25 +62,36 @@ static void gpio_intr_callback_task (task_param_t param, uint8 priority)
static
int
lgpio_trig
(
lua_State
*
L
)
static
int
lgpio_trig
(
lua_State
*
L
)
{
{
unsigned
pin
=
luaL_checkinteger
(
L
,
1
);
unsigned
pin
=
luaL_checkinteger
(
L
,
1
);
int
old_pin_ref
=
gpio_cb_ref
[
pin
];
static
const
char
*
const
opts
[]
=
{
"none"
,
"up"
,
"down"
,
"both"
,
"low"
,
"high"
,
NULL
};
static
const
char
*
const
opts
[]
=
{
"none"
,
"up"
,
"down"
,
"both"
,
"low"
,
"high"
,
NULL
};
static
const
int
opts_type
[]
=
{
static
const
int
opts_type
[]
=
{
GPIO_PIN_INTR_DISABLE
,
GPIO_PIN_INTR_POSEDGE
,
GPIO_PIN_INTR_NEGEDGE
,
GPIO_PIN_INTR_DISABLE
,
GPIO_PIN_INTR_POSEDGE
,
GPIO_PIN_INTR_NEGEDGE
,
GPIO_PIN_INTR_ANYEDGE
,
GPIO_PIN_INTR_LOLEVEL
,
GPIO_PIN_INTR_HILEVEL
GPIO_PIN_INTR_ANYEDGE
,
GPIO_PIN_INTR_LOLEVEL
,
GPIO_PIN_INTR_HILEVEL
};
};
luaL_argcheck
(
L
,
platform_gpio_exists
(
pin
)
&&
pin
>
0
,
1
,
"Invalid interrupt pin"
);
luaL_argcheck
(
L
,
platform_gpio_exists
(
pin
)
&&
pin
>
0
,
1
,
"Invalid interrupt pin"
);
int
old_pin_ref
=
gpio_cb_ref
[
pin
];
int
type
=
opts_type
[
luaL_checkoption
(
L
,
2
,
"none"
,
opts
)];
int
type
=
opts_type
[
luaL_checkoption
(
L
,
2
,
"none"
,
opts
)];
if
(
type
!=
GPIO_PIN_INTR_DISABLE
)
{
if
(
type
==
GPIO_PIN_INTR_DISABLE
)
{
int
cbtype
=
lua_type
(
L
,
3
);
// "none" clears the callback
luaL_argcheck
(
L
,
cbtype
==
LUA_TFUNCTION
||
cbtype
==
LUA_TLIGHTFUNCTION
,
3
,
gpio_cb_ref
[
pin
]
=
LUA_NOREF
;
"invalid callback type"
);
lua_pushvalue
(
L
,
3
);
// copy argument (func) to the top of stack
}
else
if
(
lua_gettop
(
L
)
==
2
&&
old_pin_ref
!=
LUA_NOREF
)
{
// keep the old one if no callback
old_pin_ref
=
LUA_NOREF
;
}
else
if
(
lua_type
(
L
,
3
)
==
LUA_TFUNCTION
||
lua_type
(
L
,
3
)
==
LUA_TLIGHTFUNCTION
)
{
// set up the new callback if present
lua_pushvalue
(
L
,
3
);
gpio_cb_ref
[
pin
]
=
luaL_ref
(
L
,
LUA_REGISTRYINDEX
);
gpio_cb_ref
[
pin
]
=
luaL_ref
(
L
,
LUA_REGISTRYINDEX
);
}
else
{
}
else
{
gpio_cb_ref
[
pin
]
=
LUA_NOREF
;
// invalid combination, so clear down any old callback and throw an error
if
(
old_pin_ref
!=
LUA_NOREF
)
luaL_unref
(
L
,
LUA_REGISTRYINDEX
,
old_pin_ref
);
luaL_argcheck
(
L
,
0
,
3
,
"invalid callback type"
);
}
}
// unreference any overwritten callback
if
(
old_pin_ref
!=
LUA_NOREF
)
luaL_unref
(
L
,
LUA_REGISTRYINDEX
,
old_pin_ref
);
if
(
old_pin_ref
!=
LUA_NOREF
)
luaL_unref
(
L
,
LUA_REGISTRYINDEX
,
old_pin_ref
);
NODE_DBG
(
"Pin data: %d %d %08x, %d %d %d, %08x
\n
"
,
NODE_DBG
(
"Pin data: %d %d %08x, %d %d %d, %08x
\n
"
,
...
...
docs/en/modules/gpio.md
View file @
20465dd3
...
@@ -103,14 +103,16 @@ Establish or clear a callback function to run on interrupt for a pin.
...
@@ -103,14 +103,16 @@ Establish or clear a callback function to run on interrupt for a pin.
This function is not available if GPIO_INTERRUPT_ENABLE was undefined at compile time.
This function is not available if GPIO_INTERRUPT_ENABLE was undefined at compile time.
#### Syntax
#### Syntax
`gpio.trig(pin, [type [,
function(level)]}
)`
`gpio.trig(pin, [type [,
callback_function]]
)`
#### Parameters
#### Parameters
-
`pin`
**1~12**
, IO index, pin D0 does not support interrupt.
-
`pin`
**1-12**
, pin to trigger on, IO index. Note that pin 0 does not support interrupts.
-
`type`
"up", "down", "both", "low", "high", which represent rising edge, falling edge, both edge,
-
`type`
"up", "down", "both", "low", "high", which represent
*rising edge*
,
*falling edge*
,
*
both
low level, high level trig mode correspondingly. If the type is "none" or omitted then the
edges
*, *
low level
*, and *
high level
*
trigger modes respectivey. If the type is "none" or omitted
callback function is removed and the interrupt disabled.
then the callback function is removed and the interrupt is disabled.
-
`function(level)`
callback function when triggered. The gpio level is the param. Use previous callback function if undefined here.
-
`callback_function(level)`
callback function when trigger occurs. The level of the specified pin
at the interrupt passed as the parameter to the callback. The previous callback function will be
used if the function is omitted.
#### Returns
#### Returns
`nil`
`nil`
...
@@ -118,23 +120,20 @@ callback function is removed and the interrupt disabled.
...
@@ -118,23 +120,20 @@ callback function is removed and the interrupt disabled.
#### Example
#### Example
```
lua
```
lua
-- use pin 1 as the input pulse width counter
do
pin
=
1
-- use pin 1 as the input pulse width counter
pulse1
=
0
local
pin
,
pulse1
,
du
,
now
,
trig
=
1
,
0
,
0
,
tmr
.
now
,
gpio
.
trig
du
=
0
gpio
.
mode
(
pin
,
gpio
.
INT
)
gpio
.
mode
(
pin
,
gpio
.
INT
)
local
function
pin1cb
(
level
)
function
pin1cb
(
level
)
local
pulse2
=
now
()
du
=
tmr
.
now
()
-
pulse1
print
(
level
,
pulse2
-
pulse1
)
print
(
du
)
pulse1
=
pulse2
pulse1
=
tmr
.
now
()
trig
(
pin
,
level
==
gpio
.
HIGH
and
"down"
or
"up"
)
if
level
==
gpio
.
HIGH
then
gpio
.
trig
(
pin
,
"down"
)
else
gpio
.
trig
(
pin
,
"up"
)
end
end
trig
(
pin
,
"down"
,
pin1cb
)
end
end
gpio
.
trig
(
pin
,
"down"
,
pin1cb
)
```
```
Lua
gpio.trig(4, 'none') -- remove any existing trigger
```
```
#### See also
#### See also
[
`gpio.mode()`
](
#gpiomode
)
[
`gpio.mode()`
](
#gpiomode
)
...
...
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