Skip to content

Commit

Permalink
Suffix the nif functions to allow an extra layer of guards and erlang…
Browse files Browse the repository at this point in the history
… code

This makes it possible to for example accept atoms for input/output
further on instead of solely relying on macros which makes interactive
use a bit easier.
  • Loading branch information
klajo committed Jul 27, 2012
1 parent 627fe97 commit f516058
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 22 deletions.
20 changes: 10 additions & 10 deletions c_src/wpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
}

static ERL_NIF_TERM
pin_mode(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
pin_mode_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
int pin, mode;
if (!enif_get_int(env, argv[0], &pin))
Expand All @@ -40,7 +40,7 @@ pin_mode(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
}

static ERL_NIF_TERM
digital_write(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
digital_write_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
int pin, value;
if (!enif_get_int(env, argv[0], &pin))
Expand All @@ -56,7 +56,7 @@ digital_write(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
}

static ERL_NIF_TERM
pwm_write(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
pwm_write_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
int pin, value;
if (!enif_get_int(env, argv[0], &pin))
Expand All @@ -72,7 +72,7 @@ pwm_write(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
}

static ERL_NIF_TERM
digital_read(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
digital_read_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
int pin, value;
if (!enif_get_int(env, argv[0], &pin))
Expand All @@ -84,7 +84,7 @@ digital_read(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
}

static ERL_NIF_TERM
pull_up_dn_control(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
pull_up_dn_control_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
int pin, mode;
if (!enif_get_int(env, argv[0], &pin))
Expand All @@ -101,11 +101,11 @@ pull_up_dn_control(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])

static ErlNifFunc nif_funcs[] =
{
{"pin_mode", 2, pin_mode},
{"digital_write", 2, digital_write},
{"pwm_write", 2, pwm_write},
{"digital_read", 1, digital_read},
{"pull_up_dn_control", 2, pull_up_dn_control}
{"pin_mode_nif", 2, pin_mode_nif},
{"digital_write_nif", 2, digital_write_nif},
{"pwm_write_nif", 2, pwm_write_nif},
{"digital_read_nif", 1, digital_read_nif},
{"pull_up_dn_control_nif", 2, pull_up_dn_control_nif}
};

ERL_NIF_INIT(wpi, nif_funcs, load, NULL, NULL, NULL)
41 changes: 29 additions & 12 deletions src/wpi.erl
Original file line number Diff line number Diff line change
Expand Up @@ -32,28 +32,45 @@
-type wpi_pin_mode() :: 0..2. % WPI_INPUT|WPI_OUTPUT|WPI_PWM_OUTPUT
-type wpi_pin_number() :: integer().
-type wpi_digital_value() :: 0..1. % WPI_LOW|WPI_HIGH
-type wpi_pwm_value() :: 0..1024.
-type wpi_pud_mode() :: 0..2. % WPI_PUD_OFF|WPI_PUD_DOWN|WPI_PUD_DOWN
-type wpi_pwm_value() :: 0..1023.
-type wpi_pud_mode() :: 0..2. % WPI_PUD_OFF|WPI_PUD_DOWN|WPI_PUD_UP

on_load() ->
ok = erlang:load_nif(filename:join(code:priv_dir(wpi), "./wpi_drv"), 0).

-spec pin_mode(wpi_pin_number(), wpi_pin_mode()) -> ok.
pin_mode(_Pin, _Mode) ->
?nif_stub.
pin_mode(Pin, Mode) when is_integer(Pin),
(Mode == ?WPI_INPUT orelse
Mode == ?WPI_OUTPUT orelse
Mode == ?WPI_PWM_OUTPUT) ->
pin_mode_nif(Pin, Mode).

-spec digital_write(wpi_pin_number(), wpi_digital_value()) -> ok.
digital_write(_Pin, _Value) ->
?nif_stub.
digital_write(Pin, Value) when is_integer(Pin),
(Value == ?WPI_LOW orelse
Value == ?WPI_HIGH) ->
digital_write_nif(Pin, Value).

-spec pwm_write(wpi_pin_number(), wpi_pwm_value()) -> ok.
pwm_write(_Pin, _Value) ->
?nif_stub.
pwm_write(Pin, Value) when is_integer(Pin),
is_integer(Value),
Value >= 0,
Value < 1024 ->
pwm_write_nif(Pin, Value).

-spec digital_read(wpi_pin_number()) -> wpi_digital_value().
digital_read(_Pin) ->
?nif_stub.
digital_read(Pin) when is_integer(Pin) ->
digital_read_nif(Pin).

-spec pull_up_dn_control(wpi_pin_number(), wpi_pud_mode()) -> ok.
pull_up_dn_control(_Pin, _Mode) ->
?nif_stub.
pull_up_dn_control(Pin, Mode) when is_integer(Pin),
(Mode == ?WPI_PUD_OFF orelse
Mode == ?WPI_PUD_DOWN orelse
Mode == ?WPI_PUD_UP) ->
pull_up_dn_control_nif(Pin, Mode).

pin_mode_nif(_Pin, _Mode) -> ?nif_stub.
digital_write_nif(_Pin, _Value) -> ?nif_stub.
pwm_write_nif(_Pin, _Value) -> ?nif_stub.
digital_read_nif(_Pin) -> ?nif_stub.
pull_up_dn_control_nif(_Pin, _Mode) -> ?nif_stub.

0 comments on commit f516058

Please sign in to comment.