Current section
Files
Jump to
Current section
Files
src/wait_nif.c
#ifdef __cplusplus
extern "C"
{
#endif
#include <erl_nif.h>
#include <stdio.h>
#include <stdlib.h>
#include "total_nif.h"
#include "wait_nif.h"
#include "rcl/wait.h"
#include "rcl/allocator.h"
//空のrcl_allocator_tを作成
ERL_NIF_TERM nif_rcl_get_default_allocator(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]){
if(argc!=0){
return enif_make_badarg(env);
}
rcl_allocator_t *res;
ERL_NIF_TERM ret;
res = enif_alloc_resource(rt_default_alloc,sizeof(rcl_allocator_t));
if(res == NULL) return enif_make_badarg(env);
ret = enif_make_resource(env,res);
//enif_release_resource(res);
*res = rcl_get_default_allocator();
return ret;
}
//waitsetを作って初期化
ERL_NIF_TERM nif_rcl_get_zero_initialized_wait_set(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]){
if(argc != 0){
return enif_make_badarg(env);
}
rcl_wait_set_t* res;
ERL_NIF_TERM ret;
res = enif_alloc_resource(rt_waitset,sizeof(rcl_wait_set_t));
if(res == NULL) return enif_make_badarg(env);
*res = rcl_get_zero_initialized_wait_set();
ret = enif_make_resource(env,res);
return ret;
}
/*
rcl_ret_t
rcl_wait_set_init(
rcl_wait_set_t * wait_set,
size_t number_of_subscriptions,
size_t number_of_guard_conditions,
size_t number_of_timers,
size_t number_of_clients,
size_t number_of_services,
size_t number_of_events,
rcl_context_t * context,
rcl_allocator_t allocator);
*/
ERL_NIF_TERM nif_rcl_wait_set_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]){
if(argc != 9){
return enif_make_badarg(env);
}
ERL_NIF_TERM ret;
rcl_wait_set_t* res_waitset;
rcl_context_t* res_context;
rcl_allocator_t* res_alloc;
if(!enif_get_resource(env, argv[0], rt_waitset, (void**) &res_waitset)){
return enif_make_badarg(env);
}
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
int f = 0;
if(!enif_get_int(env,argv[1],&a)){
return enif_make_badarg(env);
}
if(!enif_get_int(env,argv[2],&b)){
return enif_make_badarg(env);
}
if(!enif_get_int(env,argv[3],&c)){
return enif_make_badarg(env);
}
if(!enif_get_int(env,argv[4],&d)){
return enif_make_badarg(env);
}
if(!enif_get_int(env,argv[5],&e)){
return enif_make_badarg(env);
}
if(!enif_get_int(env,argv[6],&f)){
return enif_make_badarg(env);
}
if(!enif_get_resource(env, argv[7], rt_context, (void**) &res_context)){
return enif_make_badarg(env);
}
if(!enif_get_resource(env, argv[8], rt_default_alloc, (void**) &res_alloc)){
return enif_make_badarg(env);
}
ret = enif_make_resource(env,res_waitset);
size_t number_of_subscriptions = (size_t)a;
size_t number_of_guard_conditions = (size_t)b;
size_t number_of_timers = (size_t)c;
size_t number_of_clients = (size_t)d;
size_t number_of_services = (size_t)e;
size_t number_of_events = (size_t)f;
rcl_wait_set_init(res_waitset,number_of_subscriptions,number_of_guard_conditions,number_of_timers,number_of_clients,
number_of_services,number_of_events,res_context,*res_alloc);
return ret;
}
//rcl_ret_t rcl_wait_set_fini(rcl_wait_set_t* wait_set)
ERL_NIF_TERM nif_rcl_wait_set_fini(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]){
if(argc != 1){
return enif_make_badarg(env);
}
rcl_ret_t* res;
ERL_NIF_TERM ret;
rcl_wait_set_t* res_waitset;
if(!enif_get_resource(env,argv[0],rt_waitset,(void**) &res_waitset)){
return enif_make_badarg(env);
}
res = enif_alloc_resource(rt_ret,sizeof(rcl_ret_t));
if(res == NULL) return enif_make_badarg(env);
ret = enif_make_resource(env,res);
enif_release_resource(res);
*res = rcl_wait_set_fini(res_waitset);
return ret;
}
/*
rcl_ret_t
rcl_wait_set_add_subscription(
rcl_wait_set_t * wait_set,
const rcl_subscription_t * subscription,
size_t * index);
*/
ERL_NIF_TERM nif_rcl_wait_set_clear(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]){
if(argc != 1){
return enif_make_badarg(env);
}
rcl_ret_t* res;
ERL_NIF_TERM ret;
rcl_wait_set_t* res_waitset;
if(!enif_get_resource(env,argv[0],rt_waitset,(void**) &res_waitset)){
return enif_make_badarg(env);
}
res = enif_alloc_resource(rt_ret,sizeof(rcl_ret_t));
if(res == NULL) return enif_make_badarg(env);
ret = enif_make_resource(env,res);
enif_release_resource(res);
*res = rcl_wait_set_clear(res_waitset);
return ret;
}
ERL_NIF_TERM nif_rcl_wait_set_add_subscription(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]){
if(argc != 2){
return enif_make_badarg(env);
}
rcl_ret_t* res;
ERL_NIF_TERM ret;
rcl_wait_set_t* res_waitset;
rcl_subscription_t* res_sub;
if(!enif_get_resource(env,argv[0],rt_waitset,(void**) &res_waitset)){
return enif_make_badarg(env);
}
if(!enif_get_resource(env,argv[1],rt_sub,(void**) &res_sub)){
return enif_make_badarg(env);
}
res = enif_alloc_resource(rt_ret,sizeof(rcl_ret_t));
if(res == NULL) return enif_make_badarg(env);
ret = enif_make_resource(env,res);
enif_release_resource(res);
*res = rcl_wait_set_add_subscription(res_waitset,res_sub,NULL);
return ret;
}
/*
rcl_ret_t
rcl_wait(rcl_wait_set_t * wait_set, int64_t timeout);
*/
ERL_NIF_TERM nif_rcl_wait(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]){
if(argc != 2){
return enif_make_badarg(env);
}
rcl_ret_t* res;
ERL_NIF_TERM ret;
rcl_wait_set_t* res_waitset;
int64_t timeout;
if(!enif_get_resource(env,argv[0],rt_waitset,(void**) &res_waitset)){
return enif_make_badarg(env);
}
if(!enif_get_int64(env,argv[1],&timeout)){
return enif_make_badarg(env);
}
res = enif_alloc_resource(rt_ret,sizeof(rcl_ret_t));
if(res == NULL) return enif_make_badarg(env);
ret = enif_make_resource(env,res);
enif_release_resource(res);
*res = rcl_wait(res_waitset,RCL_MS_TO_NS(timeout));
return ret;
}
ERL_NIF_TERM nif_check_subscription(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]){
if(argc != 1){
return enif_make_badarg(env);
}
rcl_subscription_t* res_sub;
if(!enif_get_resource(env,argv[0],rt_sub,(void**) &res_sub)){
return enif_make_badarg(env);
}
if(res_sub){
return enif_make_atom(env,"true");
}else{
return enif_make_atom(env,"false");
}
}
ERL_NIF_TERM nif_check_waitset(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]){
if(argc != 2){
return enif_make_badarg(env);
}
rcl_wait_set_t* res_waitset;
int index = 0;
if(!enif_get_resource(env,argv[0],rt_waitset,(void**) &res_waitset)){
return enif_make_badarg(env);
}
if(!enif_get_int(env,argv[1],&index)){
return enif_make_badarg(env);
}
if(res_waitset->subscriptions[index]){
return enif_make_atom(env,"true");
}else{
return enif_make_atom(env,"false");
}
}
ERL_NIF_TERM nif_get_sublist_from_waitset(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]){
if(argc != 1){
return enif_make_badarg(env);
}
rcl_wait_set_t* res_waitset;
rcl_subscription_t* res_sub;
ERL_NIF_TERM* ret;
if(!enif_get_resource(env,argv[0],rt_waitset,(void**) &res_waitset)){
return enif_make_badarg(env);
}
int num_of_sub = 0;
num_of_sub = res_waitset->size_of_subscriptions;
ret = (ERL_NIF_TERM *)malloc(num_of_sub*sizeof(ERL_NIF_TERM));
for(int i=0;i<num_of_sub;i++){
ret[i] = enif_make_resource(env,(res_waitset->subscriptions[i]));
}
return enif_make_list_from_array(env,ret,num_of_sub);
free(ret);
}
#ifdef __cplusplus
}
#endif