Packages
circuits_gpio
2.1.1
2.3.0
2.2.0
2.1.3
2.1.2
retired
2.1.1
retired
2.1.0
retired
2.0.2
retired
2.0.1
retired
2.0.0
retired
2.0.0-pre.6
retired
2.0.0-pre.5
retired
2.0.0-pre.4
retired
2.0.0-pre.3
retired
2.0.0-pre.2
retired
2.0.0-pre.1
retired
2.0.0-pre.0
retired
1.2.2
1.2.1
1.2.0
1.1.0
1.0.1
1.0.0
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.1
0.3.0
0.2.0
0.1.0
Use GPIOs in Elixir
Retired package: Release invalid - Contains severe bug affecting interrupts. Upgrade to >=2.1.3
Current section
Files
Jump to
Current section
Files
c_src/nif_utils.c
// SPDX-FileCopyrightText: 2018 Frank Hunleth, Mark Sebald, Matt Ludwigs
//
// SPDX-License-Identifier: Apache-2.0
#include "gpio_nif.h"
#include <errno.h>
#include <string.h>
ERL_NIF_TERM make_ok_tuple(ErlNifEnv *env, ERL_NIF_TERM value)
{
return enif_make_tuple2(env, atom_ok, value);
}
ERL_NIF_TERM make_errno_error(ErlNifEnv *env, int errno_value)
{
// Handle return codes from functions that return -errno
if (errno_value < 0)
errno_value = -errno_value;
ERL_NIF_TERM reason;
switch (errno_value) {
case ENOENT:
reason = enif_make_atom(env, "not_found");
break;
case EBUSY:
reason = enif_make_atom(env, "already_open");
break;
case EOPNOTSUPP:
reason = enif_make_atom(env, "not_supported");
break;
default:
// These errors aren't that helpful, so if they happen, please report
// or update this code to provide a better reason.
reason = enif_make_tuple2(env, enif_make_atom(env, "errno"), enif_make_int(env, errno_value));
break;
}
return enif_make_tuple2(env, atom_error, reason);
}
ERL_NIF_TERM make_string_binary(ErlNifEnv *env, const char *str)
{
ERL_NIF_TERM term;
size_t len = strlen(str);
unsigned char *data = enif_make_new_binary(env, len, &term);
memcpy(data, str, len);
return term;
}
int enif_get_boolean(ErlNifEnv *env, ERL_NIF_TERM term, bool *v)
{
char buffer[16];
if (enif_get_atom(env, term, buffer, sizeof(buffer), ERL_NIF_LATIN1) <= 0)
return false;
if (strcmp("false", buffer) == 0)
*v = false;
else
*v = true;
return true;
}