42#ifndef _ACFUTILS_DR_H_
43#define _ACFUTILS_DR_H_
49#include <XPLMDataAccess.h>
59#define DR_MAX_NAME_LEN 128
61typedef struct dr_s dr_t;
63#ifdef __INCLUDED_FROM_DR_C__
64#define DR_EXT_DEPRECATED
66#define DR_EXT_DEPRECATED DEPRECATED_ATTR
76 char name[DR_MAX_NAME_LEN];
103 DR_EXT_DEPRECATED void (*
read_cb)(dr_t *
dr,
void *value_out);
109 DR_EXT_DEPRECATED void (*
write_cb)(dr_t *
dr,
void *value_in);
128 int offset,
int count);
135 int offset,
int count);
238 void (*read_cb)(dr_t *dr,
void *value_out);
244 void (*write_cb)(dr_t *dr,
void *value_in);
261 bool_t (*read_scalar_cb)(dr_t *dr,
void *value_out);
272 bool_t (*write_scalar_cb)(dr_t *dr,
void *value_in);
278 int (*read_array_cb)(dr_t *dr,
void *values_out,
int off,
int cnt);
285 void (*write_array_cb)(dr_t *dr,
void *values_in,
int off,
int cnt);
309API_EXPORT bool_t
dr_find(dr_t *dr, PRINTF_FORMAT(
const char *fmt), ...)
318#define fdr_find(dr, ...) \
320 if (!dr_find(dr, __VA_ARGS__)) { \
321 char drname[DR_MAX_NAME_LEN]; \
322 snprintf(drname, sizeof (drname), __VA_ARGS__); \
323 VERIFY_MSG(0, "dataref \"%s\" not found", drname); \
332#define DR_DEBUG(__varstr) log_basename(__FILE__), __LINE__, __varstr
333#define DR_DEBUG_VARS \
334 const char *filename, int line, const char *varname
348#define dr_geti(__dr) dr_geti_impl((__dr), DR_DEBUG(#__dr))
350API_EXPORT
int dr_geti_impl(
const dr_t *dr, DR_DEBUG_VARS) HOT_ATTR;
369#define dr_seti(__dr, __i) dr_seti_impl((__dr), DR_DEBUG(#__dr), (__i))
371API_EXPORT
void dr_seti_impl(
const dr_t *dr, DR_DEBUG_VARS,
int i) HOT_ATTR;
378#define dr_getf(__dr) dr_getf_impl((__dr), DR_DEBUG(#__dr))
380API_EXPORT
double dr_getf_impl(
const dr_t *dr, DR_DEBUG_VARS) HOT_ATTR;
388#define dr_setf(__dr, __f) dr_setf_impl((__dr), DR_DEBUG(#__dr), (__f))
390API_EXPORT
void dr_setf_impl(
const dr_t *dr, DR_DEBUG_VARS,
double f) HOT_ATTR;
396#define dr_getf_prot(__dr) dr_getf_prot_impl((__dr), DR_DEBUG(#__dr))
398HOT_ATTR
static inline double
402 ASSERT_MSG(!isnan(x) && isfinite(x),
"%s:%d: Dataref %s (varname %s) "
403 "contains a garbage value (%f). We didn't write that, somebody "
404 "else did! Remove extraneous plugins and try to isolate the cause.",
405 filename, line, dr->name, varname, x);
426#define dr_getvi(__dr, __i, __off, __num) \
427 dr_getvi_impl((__dr), DR_DEBUG(#__dr), (__i), (__off), (__num))
430 int *i,
unsigned off,
unsigned num) HOT_ATTR;
446#define dr_setvi(__dr, __i, __off, __num) \
447 dr_setvi_impl((__dr), DR_DEBUG(#__dr), (__i), (__off), (__num))
449API_EXPORT
void dr_setvi_impl(
const dr_t *dr, DR_DEBUG_VARS,
int *i,
450 unsigned off,
unsigned num) HOT_ATTR;
455#define dr_getvf(__dr, __df, __off, __num) \
456 dr_getvf_impl((__dr), DR_DEBUG(#__dr), (__df), (__off), (__num))
458API_EXPORT
int dr_getvf_impl(
const dr_t *dr, DR_DEBUG_VARS,
double *df,
459 unsigned off,
unsigned num) HOT_ATTR;
464#define dr_setvf(__dr, __df, __off, __num) \
465 dr_setvf_impl((__dr), DR_DEBUG(#__dr), (__df), (__off), (__num))
467API_EXPORT
void dr_setvf_impl(
const dr_t *dr, DR_DEBUG_VARS,
double *df,
468 unsigned off,
unsigned num) HOT_ATTR;
473#define dr_getvf32(__dr, __ff, __off, __num) \
474 dr_getvf32_impl((__dr), DR_DEBUG(#__dr), (__ff), (__off), (__num))
476API_EXPORT
int dr_getvf32_impl(
const dr_t *dr, DR_DEBUG_VARS,
float *ff,
477 unsigned off,
unsigned num) HOT_ATTR;
482#define dr_setvf32(__dr, __ff, __off, __num) \
483 dr_setvf32_impl((__dr), DR_DEBUG(#__dr), (__ff), (__off), (__num))
485API_EXPORT
void dr_setvf32_impl(
const dr_t *dr, DR_DEBUG_VARS,
float *ff,
486 unsigned off,
unsigned num) HOT_ATTR;
511#define dr_gets(__dr, __str, __cap) \
512 dr_gets_impl((__dr), DR_DEBUG(#__dr), (__str), (__cap))
514API_EXPORT
int dr_gets_impl(
const dr_t *dr, DR_DEBUG_VARS,
char *str,
515 size_t cap) HOT_ATTR;
527#define dr_sets(__dr, __str) \
528 dr_sets_impl((__dr), DR_DEBUG(#__dr), (__str))
530API_EXPORT
void dr_sets_impl(
const dr_t *dr, DR_DEBUG_VARS,
char *str) HOT_ATTR;
562#define dr_getbytes(__dr, __data, __off, __num) \
563 dr_getbytes_impl((__dr), DR_DEBUG(#__dr), (__data), (__off), (__num))
566 unsigned off,
unsigned num) HOT_ATTR;
580#define dr_setbytes(__dr, __data, __off, __num) \
581 dr_setbytes_impl((__dr), DR_DEBUG(#__dr), (__data), (__off), (__num))
584 unsigned off,
unsigned num) HOT_ATTR;
614API_EXPORT
void dr_create_i(dr_t *dr,
int *value, bool_t writable,
615 PRINTF_FORMAT(
const char *fmt), ...) PRINTF_ATTR(4);
622 PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(4);
627API_EXPORT
void dr_create_f(dr_t *dr,
float *value, bool_t writable,
628 PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(4);
635 PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(4);
640API_EXPORT
void dr_create_f64(dr_t *dr,
double *value, bool_t writable,
641 PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(4);
648 PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(4);
671API_EXPORT
void dr_create_vi(dr_t *dr,
int *value,
size_t n, bool_t writable,
672 PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(5);
679 PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(4);
684API_EXPORT
void dr_create_vf(dr_t *dr,
float *value,
size_t n, bool_t writable,
685 PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(5);
692 PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(4);
706 bool_t writable, PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(5);
713 PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(4);
730 bool_t writable, PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(5);
737 dr_cfg_t cfg, PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(4);
744 bool_t writable, PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(5);
751 dr_cfg_t cfg, PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(4);
759 bool_t writable, PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(5);
766 dr_cfg_t cfg, PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(4);
771API_EXPORT
void dr_create_b(dr_t *dr,
void *value,
size_t n, bool_t writable,
772 PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(5);
779 PRINTF_FORMAT(const
char *fmt), ...) PRINTF_ATTR(4);
#define ASSERT_MSG(x, fmt,...)
double dr_getf_impl(const dr_t *dr, const char *filename, int line, const char *varname)
void dr_setf_impl(const dr_t *dr, const char *filename, int line, const char *varname, double f)
void dr_array_set_stride(dr_t *dr, size_t stride)
void dr_create_vf_autoscalar_cfg(dr_t *dr, float *value, dr_cfg_t cfg, const char *fmt,...)
void dr_create_f_cfg(dr_t *dr, float *value, dr_cfg_t cfg, const char *fmt,...)
int dr_getvi_impl(const dr_t *dr, const char *filename, int line, const char *varname, int *i, unsigned off, unsigned num)
void dr_setvi_impl(const dr_t *dr, const char *filename, int line, const char *varname, int *i, unsigned off, unsigned num)
void dr_setvf_impl(const dr_t *dr, const char *filename, int line, const char *varname, double *df, unsigned off, unsigned num)
void dr_create_i_cfg(dr_t *dr, int *value, dr_cfg_t cfg, const char *fmt,...)
void dr_setvf32_impl(const dr_t *dr, const char *filename, int line, const char *varname, float *ff, unsigned off, unsigned num)
void dr_create_i(dr_t *dr, int *value, bool_t writable, const char *fmt,...)
void dr_seti_impl(const dr_t *dr, const char *filename, int line, const char *varname, int i)
void dr_create_vf(dr_t *dr, float *value, size_t n, bool_t writable, const char *fmt,...)
void dr_create_f64_cfg(dr_t *dr, double *value, dr_cfg_t cfg, const char *fmt,...)
void dr_create_f(dr_t *dr, float *value, bool_t writable, const char *fmt,...)
void dr_create_vf64_autoscalar(dr_t *dr, double *value, size_t n, bool_t writable, const char *fmt,...)
void dr_create_vf64_cfg(dr_t *dr, double *value, dr_cfg_t cfg, const char *fmt,...)
void dr_create_b_cfg(dr_t *dr, void *value, dr_cfg_t cfg, const char *fmt,...)
bool_t dr_find(dr_t *dr, const char *fmt,...)
void dr_create_vf_autoscalar(dr_t *dr, float *value, size_t n, bool_t writable, const char *fmt,...)
void dr_create_f64(dr_t *dr, double *value, bool_t writable, const char *fmt,...)
int dr_geti_impl(const dr_t *dr, const char *filename, int line, const char *varname)
void dr_create_b(dr_t *dr, void *value, size_t n, bool_t writable, const char *fmt,...)
void dr_create_vf64_autoscalar_cfg(dr_t *dr, double *value, dr_cfg_t cfg, const char *fmt,...)
void dr_create_vi_cfg(dr_t *dr, int *value, dr_cfg_t cfg, const char *fmt,...)
void dr_create_vi_autoscalar(dr_t *dr, int *value, size_t n, bool_t writable, const char *fmt,...)
void dr_create_vi(dr_t *dr, int *value, size_t n, bool_t writable, const char *fmt,...)
void dr_sets_impl(const dr_t *dr, const char *filename, int line, const char *varname, char *str)
void dr_setbytes_impl(const dr_t *dr, const char *filename, int line, const char *varname, void *data, unsigned off, unsigned num)
void dr_create_vi_autoscalar_cfg(dr_t *dr, int *value, dr_cfg_t cfg, const char *fmt,...)
int dr_getbytes_impl(const dr_t *dr, const char *filename, int line, const char *varname, void *data, unsigned off, unsigned num)
void dr_create_vf64(dr_t *dr, double *value, size_t n, bool_t writable, const char *fmt,...)
void dr_create_vf_cfg(dr_t *dr, float *value, dr_cfg_t cfg, const char *fmt,...)
int dr_getvf_impl(const dr_t *dr, const char *filename, int line, const char *varname, double *df, unsigned off, unsigned num)
void * dr_get_cb_userinfo(const dr_t *dr)
static double dr_getf_prot_impl(const dr_t *dr, const char *filename, int line, const char *varname)
int dr_gets_impl(const dr_t *dr, const char *filename, int line, const char *varname, char *str, size_t cap)
int dr_getvf32_impl(const dr_t *dr, const char *filename, int line, const char *varname, float *ff, unsigned off, unsigned num)
bool_t dr_writable(dr_t *dr)
bool writable
Defines whether this dataref will be writable or read-only.
int(* read_array_cb)(dr_t *dr, void *values_out, int offset, int count)
void(* write_array_cb)(dr_t *dr, void *values_in, int offset, int count)
void(* write_cb)(dr_t *dr, void *value_in)
bool_t(* write_scalar_cb)(dr_t *dr, void *value_in)
bool_t(* read_scalar_cb)(dr_t *dr, void *value_out)
void(* read_cb)(dr_t *dr, void *value_out)