libacfutils
A general purpose library of utility functions designed to make it easier to develop addons for the X-Plane flight simulator.
Loading...
Searching...
No Matches
dr.h
Go to the documentation of this file.
1/*
2 * CDDL HEADER START
3 *
4 * This file and its contents are supplied under the terms of the
5 * Common Development and Distribution License ("CDDL"), version 1.0.
6 * You may only use this file in accordance with the terms of version
7 * 1.0 of the CDDL.
8 *
9 * A full copy of the text of the CDDL should have accompanied this
10 * source. A copy of the CDDL is also available via the Internet at
11 * http://www.illumos.org/license/CDDL.
12 *
13 * CDDL HEADER END
14*/
15/*
16 * Copyright 2025 Saso Kiselkov. All rights reserved.
17 */
42#ifndef _ACFUTILS_DR_H_
43#define _ACFUTILS_DR_H_
44
45#include <stdbool.h>
46#include <stdlib.h>
47#include <string.h>
48
49#include <XPLMDataAccess.h>
50
51#include "helpers.h"
52#include "log.h"
53#include "types.h"
54
55#ifdef __cplusplus
56extern "C" {
57#endif
58
59#define DR_MAX_NAME_LEN 128
60
61typedef struct dr_s dr_t;
62
63#ifdef __INCLUDED_FROM_DR_C__
64#define DR_EXT_DEPRECATED
65#else
66#define DR_EXT_DEPRECATED DEPRECATED_ATTR
67#endif
68
74struct dr_s {
76 char name[DR_MAX_NAME_LEN];
78 XPLMDataRef dr;
80 XPLMDataTypeID type;
82 bool_t writable;
84 bool_t wide_type;
90 void *value;
96 ssize_t count;
97 size_t stride;
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);
115 DR_EXT_DEPRECATED bool_t (*read_scalar_cb)(dr_t *dr, void *value_out);
121 DR_EXT_DEPRECATED bool_t (*write_scalar_cb)(dr_t *dr, void *value_in);
127 DR_EXT_DEPRECATED int (*read_array_cb)(dr_t *dr, void *values_out,
128 int offset, int count);
134 DR_EXT_DEPRECATED void (*write_array_cb)(dr_t *dr, void *values_in,
135 int offset, int count);
141 DR_EXT_DEPRECATED void *cb_userinfo;
142};
143
177typedef struct {
182 size_t count;
215 size_t stride;
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);
292} dr_cfg_t;
293
309API_EXPORT bool_t dr_find(dr_t *dr, PRINTF_FORMAT(const char *fmt), ...)
310 PRINTF_ATTR(2);
318#define fdr_find(dr, ...) \
319 do { \
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); \
324 } \
325 } while (0)
326
330API_EXPORT bool_t dr_writable(dr_t *dr);
331
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;
351
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
399dr_getf_prot_impl(const dr_t *dr, DR_DEBUG_VARS)
400{
401 double x = dr_getf_impl(dr, filename, line, varname);
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);
406 return (x);
407}
426#define dr_getvi(__dr, __i, __off, __num) \
427 dr_getvi_impl((__dr), DR_DEBUG(#__dr), (__i), (__off), (__num))
429API_EXPORT int dr_getvi_impl(const dr_t *dr, DR_DEBUG_VARS,
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;
531/*
532 * To read/write raw byte array datarefs, use dr_getbytes/dr_setbytes.
533 * The arguments, return values and behavior are identical to XPLMGetDatab
534 * and XPLMSetDatab.
535 */
536
562#define dr_getbytes(__dr, __data, __off, __num) \
563 dr_getbytes_impl((__dr), DR_DEBUG(#__dr), (__data), (__off), (__num))
565API_EXPORT int dr_getbytes_impl(const dr_t *dr, DR_DEBUG_VARS, void *data,
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))
583API_EXPORT void dr_setbytes_impl(const dr_t *dr, DR_DEBUG_VARS, void *data,
584 unsigned off, unsigned num) HOT_ATTR;
585
614API_EXPORT void dr_create_i(dr_t *dr, int *value, bool_t writable,
615 PRINTF_FORMAT(const char *fmt), ...) PRINTF_ATTR(4);
621API_EXPORT void dr_create_i_cfg(dr_t *dr, int *value, dr_cfg_t cfg,
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);
634API_EXPORT void dr_create_f_cfg(dr_t *dr, float *value, dr_cfg_t cfg,
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);
647API_EXPORT void dr_create_f64_cfg(dr_t *dr, double *value, dr_cfg_t cfg,
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);
678API_EXPORT void dr_create_vi_cfg(dr_t *dr, int *value, dr_cfg_t cfg,
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);
691API_EXPORT void dr_create_vf_cfg(dr_t *dr, float *value, dr_cfg_t cfg,
692 PRINTF_FORMAT(const char *fmt), ...) PRINTF_ATTR(4);
705API_EXPORT void dr_create_vf64(dr_t *dr, double *value, size_t n,
706 bool_t writable, PRINTF_FORMAT(const char *fmt), ...) PRINTF_ATTR(5);
712API_EXPORT void dr_create_vf64_cfg(dr_t *dr, double *value, dr_cfg_t cfg,
713 PRINTF_FORMAT(const char *fmt), ...) PRINTF_ATTR(4);
729API_EXPORT void dr_create_vi_autoscalar(dr_t *dr, int *value, size_t n,
730 bool_t writable, PRINTF_FORMAT(const char *fmt), ...) PRINTF_ATTR(5);
736API_EXPORT void dr_create_vi_autoscalar_cfg(dr_t *dr, int *value,
737 dr_cfg_t cfg, PRINTF_FORMAT(const char *fmt), ...) PRINTF_ATTR(4);
743API_EXPORT void dr_create_vf_autoscalar(dr_t *dr, float *value, size_t n,
744 bool_t writable, PRINTF_FORMAT(const char *fmt), ...) PRINTF_ATTR(5);
750API_EXPORT void dr_create_vf_autoscalar_cfg(dr_t *dr, float *value,
751 dr_cfg_t cfg, PRINTF_FORMAT(const char *fmt), ...) PRINTF_ATTR(4);
758API_EXPORT void dr_create_vf64_autoscalar(dr_t *dr, double *value, size_t n,
759 bool_t writable, PRINTF_FORMAT(const char *fmt), ...) PRINTF_ATTR(5);
765API_EXPORT void dr_create_vf64_autoscalar_cfg(dr_t *dr, double *value,
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);
778API_EXPORT void dr_create_b_cfg(dr_t *dr, void *value, dr_cfg_t cfg,
779 PRINTF_FORMAT(const char *fmt), ...) PRINTF_ATTR(4);
808DEPRECATED_ATTR API_EXPORT void dr_array_set_stride(dr_t *dr, size_t stride);
818API_EXPORT void dr_delete(dr_t *dr);
825API_EXPORT void *dr_get_cb_userinfo(const dr_t REQ_PTR(dr));
826
827#ifdef __cplusplus
828}
829#endif
830
831#endif /* _ACFUTILS_DR_H_ */
#define ASSERT_MSG(x, fmt,...)
Definition assert.h:214
double dr_getf_impl(const dr_t *dr, const char *filename, int line, const char *varname)
Definition dr.c:113
void dr_setf_impl(const dr_t *dr, const char *filename, int line, const char *varname, double f)
Definition dr.c:133
void dr_array_set_stride(dr_t *dr, size_t stride)
Definition dr.c:626
void dr_create_vf_autoscalar_cfg(dr_t *dr, float *value, dr_cfg_t cfg, const char *fmt,...)
Definition dr.c:880
void dr_create_f_cfg(dr_t *dr, float *value, dr_cfg_t cfg, const char *fmt,...)
Definition dr.c:730
int dr_getvi_impl(const dr_t *dr, const char *filename, int line, const char *varname, int *i, unsigned off, unsigned num)
Definition dr.c:155
void dr_setvi_impl(const dr_t *dr, const char *filename, int line, const char *varname, int *i, unsigned off, unsigned num)
Definition dr.c:190
void dr_setvf_impl(const dr_t *dr, const char *filename, int line, const char *varname, double *df, unsigned off, unsigned num)
Definition dr.c:299
void dr_create_i_cfg(dr_t *dr, int *value, dr_cfg_t cfg, const char *fmt,...)
Definition dr.c:703
void dr_setvf32_impl(const dr_t *dr, const char *filename, int line, const char *varname, float *ff, unsigned off, unsigned num)
Definition dr.c:335
void dr_create_i(dr_t *dr, int *value, bool_t writable, const char *fmt,...)
Definition dr.c:691
void dr_seti_impl(const dr_t *dr, const char *filename, int line, const char *varname, int i)
Definition dr.c:94
void dr_create_vf(dr_t *dr, float *value, size_t n, bool_t writable, const char *fmt,...)
Definition dr.c:793
void dr_create_f64_cfg(dr_t *dr, double *value, dr_cfg_t cfg, const char *fmt,...)
Definition dr.c:757
void dr_create_f(dr_t *dr, float *value, bool_t writable, const char *fmt,...)
Definition dr.c:718
void dr_create_vf64_autoscalar(dr_t *dr, double *value, size_t n, bool_t writable, const char *fmt,...)
Definition dr.c:893
void dr_create_vf64_cfg(dr_t *dr, double *value, dr_cfg_t cfg, const char *fmt,...)
Definition dr.c:830
void dr_create_b_cfg(dr_t *dr, void *value, dr_cfg_t cfg, const char *fmt,...)
Definition dr.c:932
bool_t dr_find(dr_t *dr, const char *fmt,...)
Definition dr.c:44
void dr_create_vf_autoscalar(dr_t *dr, float *value, size_t n, bool_t writable, const char *fmt,...)
Definition dr.c:867
void dr_create_f64(dr_t *dr, double *value, bool_t writable, const char *fmt,...)
Definition dr.c:745
int dr_geti_impl(const dr_t *dr, const char *filename, int line, const char *varname)
Definition dr.c:74
void dr_create_b(dr_t *dr, void *value, size_t n, bool_t writable, const char *fmt,...)
Definition dr.c:919
void dr_create_vf64_autoscalar_cfg(dr_t *dr, double *value, dr_cfg_t cfg, const char *fmt,...)
Definition dr.c:906
void dr_create_vi_cfg(dr_t *dr, int *value, dr_cfg_t cfg, const char *fmt,...)
Definition dr.c:781
void dr_create_vi_autoscalar(dr_t *dr, int *value, size_t n, bool_t writable, const char *fmt,...)
Definition dr.c:841
void dr_delete(dr_t *dr)
Definition dr.c:946
void dr_create_vi(dr_t *dr, int *value, size_t n, bool_t writable, const char *fmt,...)
Definition dr.c:768
void dr_sets_impl(const dr_t *dr, const char *filename, int line, const char *varname, char *str)
Definition dr.c:380
void dr_setbytes_impl(const dr_t *dr, const char *filename, int line, const char *varname, void *data, unsigned off, unsigned num)
Definition dr.c:396
void dr_create_vi_autoscalar_cfg(dr_t *dr, int *value, dr_cfg_t cfg, const char *fmt,...)
Definition dr.c:854
int dr_getbytes_impl(const dr_t *dr, const char *filename, int line, const char *varname, void *data, unsigned off, unsigned num)
Definition dr.c:388
void dr_create_vf64(dr_t *dr, double *value, size_t n, bool_t writable, const char *fmt,...)
Definition dr.c:817
void dr_create_vf_cfg(dr_t *dr, float *value, dr_cfg_t cfg, const char *fmt,...)
Definition dr.c:806
int dr_getvf_impl(const dr_t *dr, const char *filename, int line, const char *varname, double *df, unsigned off, unsigned num)
Definition dr.c:217
void * dr_get_cb_userinfo(const dr_t *dr)
Definition dr.c:955
static double dr_getf_prot_impl(const dr_t *dr, const char *filename, int line, const char *varname)
Definition dr.h:399
int dr_gets_impl(const dr_t *dr, const char *filename, int line, const char *varname, char *str, size_t cap)
Definition dr.c:367
int dr_getvf32_impl(const dr_t *dr, const char *filename, int line, const char *varname, float *ff, unsigned off, unsigned num)
Definition dr.c:261
bool_t dr_writable(dr_t *dr)
Definition dr.c:68
Definition dr.h:177
bool writable
Defines whether this dataref will be writable or read-only.
Definition dr.h:179
void * cb_userinfo
Definition dr.h:291
size_t stride
Definition dr.h:215
size_t count
Definition dr.h:182
Definition dr.h:74
bool_t wide_type
Definition dr.h:84
void * value
Definition dr.h:90
bool_t writable
Definition dr.h:82
void * cb_userinfo
Definition dr.h:141
int(* read_array_cb)(dr_t *dr, void *values_out, int offset, int count)
Definition dr.h:127
void(* write_array_cb)(dr_t *dr, void *values_in, int offset, int count)
Definition dr.h:134
char name[128]
Definition dr.h:76
void(* write_cb)(dr_t *dr, void *value_in)
Definition dr.h:109
ssize_t count
Definition dr.h:96
XPLMDataTypeID type
Definition dr.h:80
XPLMDataRef dr
Definition dr.h:78
bool_t(* write_scalar_cb)(dr_t *dr, void *value_in)
Definition dr.h:121
bool_t(* read_scalar_cb)(dr_t *dr, void *value_out)
Definition dr.h:115
void(* read_cb)(dr_t *dr, void *value_out)
Definition dr.h:103
#define REQ_PTR(x)
Definition sysmacros.h:334