libelec
A general purpose library of utility functions designed to make it easier to develop addons for the X-Plane flight simulator.
libelec.h
Go to the documentation of this file.
1 /*
2  * This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
5  */
6 /*
7  * Copyright 2023 Saso Kiselkov. All rights reserved.
8  */
15 #ifndef _LIBELEC_H_
16 #define _LIBELEC_H_
17 
18 #include <stdarg.h>
19 #include <stdbool.h>
20 
21 #include <acfutils/conf.h>
22 #include <acfutils/geom.h>
23 #include <acfutils/sysmacros.h>
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 #if !defined(STATIC_ARRAY_LEN_ARG) && !defined(CONST_ARRAY_LEN_ARG)
30 #if __STDC_VERSION__ >= 199901L && !defined(_MSC_VER)
31 #define STATIC_ARRAY_LEN_ARG(len) static len
32 #define CONST_ARRAY_LEN_ARG(len) static len
33 #else /* __STDC_VERSION__ < 199901L || defined(_MSC_VER) */
34 #define STATIC_ARRAY_LEN_ARG(len)
35 #define CONST_ARRAY_LEN_ARG(len) len
36 #endif /* __STDC_VERSION__ < 199901L || defined(_MSC_VER) */
37 #endif /* !defined(STATIC_ARRAY_LEN_ARG) && !defined(CONST_ARRAY_LEN_ARG) */
38 
39 enum {
40  ELEC_MAX_SRCS = 64
41 };
42 
43 typedef struct elec_sys_s elec_sys_t;
44 typedef struct elec_comp_s elec_comp_t;
45 typedef struct elec_comp_info_s elec_comp_info_t;
46 
51 typedef enum {
209 
216 typedef double (*elec_get_temp_cb_t)(elec_comp_t *comp, void *userinfo);
220 typedef struct {
221  double volts;
222  double capacity;
223  double max_pwr;
224  double chg_R;
231 
249 typedef double (*elec_get_rpm_cb_t)(elec_comp_t *comp, void *userinfo);
253 typedef struct elec_gen_info_s {
254  double volts;
255  double freq;
256  double stab_rate_U;
257  double stab_rate_f;
258  double exc_rpm;
259  double min_rpm;
260  double max_rpm;
261  vect2_t *eff_curve;
268 
272 typedef struct {
273  double in_volts;
274  double min_volts;
275  double out_volts;
276  double out_freq;
277  vect2_t *eff_curve;
284  bool charger;
285  const elec_comp_info_t *batt;
286  const elec_comp_info_t *batt_conn;
287  double curr_lim;
289 
293 typedef struct {
294  double in_volts;
295  double out_volts;
296  vect2_t *eff_curve;
300 
316 typedef double (*elec_get_load_cb_t)(elec_comp_t *comp, void *userinfo);
320 typedef struct {
322  bool ac;
324  bool stab;
326  double incap_C;
328  double incap_R;
332  double min_volts;
339  double std_load;
341 
345 typedef struct {
346  bool ac;
348  size_t n_comps;
350 
354 typedef struct {
355  double max_amps;
356  double rate;
357  bool fuse;
358  bool triphase;
360 
364 typedef struct {
369  const elec_comp_info_t *sides[2];
371 
372 typedef enum {
373  GUI_LOAD_GENERIC,
374  GUI_LOAD_MOTOR
375 } gui_load_type_t;
376 
377 typedef struct {
378  vect2_t pos;
379  vect2_t sz;
380  double font_scale;
382 
398  char *name;
400  void *userinfo;
405  bool autogen;
407  char location[32];
409  double int_R;
411  unsigned parse_linenum;
412  union {
417  elec_xfrmr_info_t xfrmr;
424  };
426  struct {
427  vect2_t pos;
428  double sz;
429  int rot;
430  gui_load_type_t load_type;
431  bool virt;
432  bool invis;
433  vect3_t color;
434  } gui;
435 };
436 
445 typedef void (*elec_user_cb_t)(elec_sys_t *sys, bool pre, void *userinfo);
446 
447 elec_sys_t *libelec_new(const char *filename);
448 void libelec_destroy(elec_sys_t *sys);
449 
450 const elec_comp_info_t *libelec_get_comp_infos(const elec_sys_t *sys,
451  size_t *num_infos);
452 
453 bool libelec_sys_start(elec_sys_t *sys);
454 void libelec_sys_stop(elec_sys_t *sys);
455 bool libelec_sys_is_started(const elec_sys_t *sys);
456 bool libelec_sys_can_start(const elec_sys_t *sys);
457 
458 void libelec_sys_set_time_factor(elec_sys_t *sys, double time_factor);
459 double libelec_sys_get_time_factor(const elec_sys_t *sys);
460 
461 void libelec_serialize(elec_sys_t *sys, conf_t *ser, const char *prefix);
462 bool libelec_deserialize(elec_sys_t *sys, const conf_t *ser,
463  const char *prefix);
464 
465 #ifdef LIBELEC_WITH_NETLINK
466 void libelec_enable_net_send(elec_sys_t *sys);
467 void libelec_disable_net_send(elec_sys_t *sys);
468 void libelec_enable_net_recv(elec_sys_t *sys);
469 void libelec_disable_net_recv(elec_sys_t *sys);
470 #endif /* defined(LIBELEC_WITH_NETLINK) */
471 
472 #ifdef LIBELEC_WITH_LIBSWITCH
473 void libelec_create_cb_switches(const elec_sys_t *sys, const char *prefix,
474  float anim_rate);
475 #endif /* defined(LIBELEC_WITH_LIBSWITCH) */
476 
477 #ifdef LIBELEC_SLOW_DEBUG
478 void libelec_step(elec_sys_t *sys);
479 #endif
480 
481 /* User callbacks */
482 void libelec_add_user_cb(elec_sys_t *sys, bool pre, elec_user_cb_t cb,
483  void *userinfo);
484 void libelec_remove_user_cb(elec_sys_t *sys, bool pre, elec_user_cb_t cb,
485  void *userinfo);
486 
487 /* Finding devices and interrogating their configuration */
488 elec_comp_t *libelec_comp_find(elec_sys_t *sys, const char *name);
489 void libelec_walk_comps(const elec_sys_t *sys,
490  void (*cb)(elec_comp_t *, void *), void *userinfo);
491 const elec_comp_info_t *libelec_comp2info(const elec_comp_t *comp);
492 
493 bool libelec_comp_is_AC(const elec_comp_t *comp);
494 elec_comp_type_t libelec_comp_get_type(const elec_comp_t *comp);
495 const char *libelec_comp_get_name(const elec_comp_t *comp);
496 const char *libelec_comp_get_location(const elec_comp_t *comp);
497 bool libelec_comp_get_autogen(const elec_comp_t *comp);
498 
499 size_t libelec_comp_get_num_conns(const elec_comp_t *comp);
500 elec_comp_t *libelec_comp_get_conn(const elec_comp_t *comp, size_t i);
501 
502 /* Electrical state querying */
503 double libelec_comp_get_in_volts(const elec_comp_t *comp);
504 double libelec_comp_get_out_volts(const elec_comp_t *comp);
505 double libelec_comp_get_in_amps(const elec_comp_t *comp);
506 double libelec_comp_get_out_amps(const elec_comp_t *comp);
507 double libelec_comp_get_in_pwr(const elec_comp_t *comp);
508 double libelec_comp_get_out_pwr(const elec_comp_t *comp);
509 double libelec_comp_get_in_freq(const elec_comp_t *comp);
510 double libelec_comp_get_out_freq(const elec_comp_t *comp);
511 double libelec_comp_get_incap_volts(const elec_comp_t *comp);
512 bool libelec_comp_is_powered(const elec_comp_t *comp);
513 double libelec_comp_get_eff(const elec_comp_t *gen);
514 unsigned libelec_comp_get_srcs(const elec_comp_t *comp,
515  elec_comp_t *srcs[CONST_ARRAY_LEN_ARG(ELEC_MAX_SRCS)]);
516 
517 /* Failures */
518 void libelec_comp_set_failed(elec_comp_t *comp, bool failed);
519 bool libelec_comp_get_failed(const elec_comp_t *comp);
520 void libelec_comp_set_shorted(elec_comp_t *comp, bool shorted);
521 bool libelec_comp_get_shorted(const elec_comp_t *comp);
522 double libelec_gen_set_random_volts(elec_comp_t *comp, double stddev);
523 double libelec_gen_set_random_freq(elec_comp_t *comp, double stddev);
524 
525 /* Callback setup */
526 void libelec_comp_set_userinfo(elec_comp_t *comp, void *userinfo);
527 void *libelec_comp_get_userinfo(const elec_comp_t *comp);
528 
529 void libelec_batt_set_temp_cb(elec_comp_t *batt, elec_get_temp_cb_t cb);
530 elec_get_temp_cb_t libelec_batt_get_temp_cb(const elec_comp_t *batt);
531 
532 void libelec_gen_set_rpm_cb(elec_comp_t *gen, elec_get_rpm_cb_t cb);
533 elec_get_rpm_cb_t libelec_gen_get_rpm_cb(const elec_comp_t *gen);
534 
535 void libelec_load_set_load_cb(elec_comp_t *load, elec_get_load_cb_t cb);
537 
538 /* Circuit breakers */
539 void libelec_cb_set(elec_comp_t *comp, bool set);
540 bool libelec_cb_get(const elec_comp_t *comp);
541 double libelec_cb_get_temp(const elec_comp_t *comp);
542 
543 /* Ties */
544 void libelec_tie_set_list(elec_comp_t *comp, size_t list_len,
545  elec_comp_t *const bus_list[STATIC_ARRAY_LEN_ARG(list_len)]);
546 void libelec_tie_set(elec_comp_t *comp, ...) SENTINEL_ATTR;
547 void libelec_tie_set_v(elec_comp_t *comp, va_list ap);
548 void libelec_tie_set_all(elec_comp_t *comp, bool tied);
549 bool libelec_tie_get_all(elec_comp_t *comp);
550 size_t libelec_tie_get_list(elec_comp_t *comp, size_t cap,
551  elec_comp_t *bus_list[STATIC_ARRAY_LEN_ARG(cap)]);
552 size_t libelec_tie_get_num_buses(const elec_comp_t *comp);
553 /*
554  * Due to default argument promotion and va_start underneath,
555  * we cannot use the native bool type here.
556  */
557 bool libelec_tie_get(elec_comp_t *tie, bool_t exhaustive, ...)
558  SENTINEL_ATTR;
559 bool libelec_tie_get_v(elec_comp_t *tie, bool exhaustive, va_list ap);
560 
561 /*
562  * Generators
563  */
564 void libelec_gen_set_rpm(elec_comp_t *gen, double rpm);
565 double libelec_gen_get_rpm(const elec_comp_t *gen);
566 
567 /* Batteries */
568 double libelec_batt_get_chg_rel(const elec_comp_t *batt);
569 void libelec_batt_set_chg_rel(elec_comp_t *batt, double chg_rel);
570 double libelec_batt_get_temp(const elec_comp_t *batt);
571 void libelec_batt_set_temp(elec_comp_t *batt, double T);
572 
573 /* Miscellaneous */
574 bool libelec_chgr_get_working(const elec_comp_t *chgr);
575 
576 double libelec_phys_get_batt_voltage(double U_nominal, double chg_rel,
577  double I_rel);
578 
579 #ifdef __cplusplus
580 }
581 #endif
582 
583 #endif /* _LIBELEC_H_ */
double libelec_batt_get_chg_rel(const elec_comp_t *batt)
Definition: libelec.c:4938
bool libelec_comp_is_AC(const elec_comp_t *comp)
Definition: libelec.c:2590
double libelec_gen_set_random_freq(elec_comp_t *comp, double stddev)
Definition: libelec.c:2864
void libelec_comp_set_userinfo(elec_comp_t *comp, void *userinfo)
Definition: libelec.c:2882
double libelec_comp_get_out_amps(const elec_comp_t *comp)
Definition: libelec.c:2360
void libelec_gen_set_rpm_cb(elec_comp_t *gen, elec_get_rpm_cb_t cb)
Definition: libelec.c:2956
void libelec_sys_set_time_factor(elec_sys_t *sys, double time_factor)
Definition: libelec.c:1044
elec_get_rpm_cb_t libelec_gen_get_rpm_cb(const elec_comp_t *gen)
Definition: libelec.c:2970
double(* elec_get_load_cb_t)(elec_comp_t *comp, void *userinfo)
Definition: libelec.h:316
elec_comp_t * libelec_comp_find(elec_sys_t *sys, const char *name)
Definition: libelec.c:2147
elec_get_load_cb_t libelec_load_get_load_cb(elec_comp_t *load)
Definition: libelec.c:3007
double libelec_comp_get_out_freq(const elec_comp_t *comp)
Definition: libelec.c:2546
void libelec_tie_set(elec_comp_t *comp,...) SENTINEL_ATTR
Definition: libelec.c:4659
double libelec_phys_get_batt_voltage(double U_nominal, double chg_rel, double I_rel)
Definition: libelec.c:5033
double(* elec_get_temp_cb_t)(elec_comp_t *comp, void *userinfo)
Definition: libelec.h:216
double libelec_comp_get_eff(const elec_comp_t *gen)
Definition: libelec.c:2682
void libelec_walk_comps(const elec_sys_t *sys, void(*cb)(elec_comp_t *, void *), void *userinfo)
Definition: libelec.c:2108
const elec_comp_info_t * libelec_get_comp_infos(const elec_sys_t *sys, size_t *num_infos)
Definition: libelec.c:539
bool libelec_cb_get(const elec_comp_t *comp)
Definition: libelec.c:4569
void libelec_sys_stop(elec_sys_t *sys)
Definition: libelec.c:1003
bool libelec_comp_get_failed(const elec_comp_t *comp)
Definition: libelec.c:2755
double libelec_comp_get_out_pwr(const elec_comp_t *comp)
Definition: libelec.c:2469
const elec_comp_info_t * libelec_comp2info(const elec_comp_t *comp)
Definition: libelec.c:2131
bool libelec_comp_get_shorted(const elec_comp_t *comp)
Definition: libelec.c:2789
double libelec_batt_get_temp(const elec_comp_t *batt)
Definition: libelec.c:4974
void libelec_batt_set_temp_cb(elec_comp_t *batt, elec_get_temp_cb_t cb)
Definition: libelec.c:2918
double libelec_comp_get_in_freq(const elec_comp_t *comp)
Definition: libelec.c:2504
bool libelec_deserialize(elec_sys_t *sys, const conf_t *ser, const char *prefix)
Definition: libelec.c:1245
void libelec_load_set_load_cb(elec_comp_t *load, elec_get_load_cb_t cb)
Definition: libelec.c:2993
bool libelec_comp_is_powered(const elec_comp_t *comp)
Definition: libelec.c:2670
elec_sys_t * libelec_new(const char *filename)
Definition: libelec.c:737
double libelec_comp_get_in_volts(const elec_comp_t *comp)
Definition: libelec.c:2232
bool libelec_tie_get(elec_comp_t *tie, bool_t exhaustive,...) SENTINEL_ATTR
Definition: libelec.c:4825
double libelec_comp_get_in_pwr(const elec_comp_t *comp)
Definition: libelec.c:2410
void libelec_batt_set_temp(elec_comp_t *batt, double T)
Definition: libelec.c:4994
size_t libelec_tie_get_num_buses(const elec_comp_t *comp)
Definition: libelec.c:4799
void libelec_comp_set_shorted(elec_comp_t *comp, bool shorted)
Definition: libelec.c:2775
void libelec_add_user_cb(elec_sys_t *sys, bool pre, elec_user_cb_t cb, void *userinfo)
Definition: libelec.c:2048
void * libelec_comp_get_userinfo(const elec_comp_t *comp)
Definition: libelec.c:2895
elec_comp_type_t
Definition: libelec.h:51
@ ELEC_SHUNT
Definition: libelec.h:163
@ ELEC_TIE
Definition: libelec.h:194
@ ELEC_LABEL_BOX
Definition: libelec.h:207
@ ELEC_DIODE
Definition: libelec.h:201
@ ELEC_LOAD
Definition: libelec.h:113
@ ELEC_BUS
Definition: libelec.h:121
@ ELEC_GEN
Definition: libelec.h:73
@ ELEC_TRU
Definition: libelec.h:89
@ ELEC_INV
Definition: libelec.h:96
@ ELEC_CB
Definition: libelec.h:147
@ ELEC_BATT
Definition: libelec.h:64
@ ELEC_XFRMR
Definition: libelec.h:103
double libelec_gen_get_rpm(const elec_comp_t *gen)
Definition: libelec.c:4920
void libelec_tie_set_list(elec_comp_t *comp, size_t list_len, elec_comp_t *const bus_list[])
Definition: libelec.c:4605
double libelec_comp_get_in_amps(const elec_comp_t *comp)
Definition: libelec.c:2323
bool libelec_sys_is_started(const elec_sys_t *sys)
Definition: libelec.c:936
void libelec_tie_set_all(elec_comp_t *comp, bool tied)
Definition: libelec.c:4713
double libelec_cb_get_temp(const elec_comp_t *comp)
Definition: libelec.c:4584
void libelec_batt_set_chg_rel(elec_comp_t *batt, double chg_rel)
Definition: libelec.c:4953
double libelec_gen_set_random_volts(elec_comp_t *comp, double stddev)
Definition: libelec.c:2849
bool libelec_chgr_get_working(const elec_comp_t *chgr)
Definition: libelec.c:5009
size_t libelec_tie_get_list(elec_comp_t *comp, size_t cap, elec_comp_t *bus_list[])
Definition: libelec.c:4768
elec_comp_t * libelec_comp_get_conn(const elec_comp_t *comp, size_t i)
Definition: libelec.c:2194
void(* elec_user_cb_t)(elec_sys_t *sys, bool pre, void *userinfo)
Definition: libelec.h:445
double libelec_comp_get_out_volts(const elec_comp_t *comp)
Definition: libelec.c:2276
double(* elec_get_rpm_cb_t)(elec_comp_t *comp, void *userinfo)
Definition: libelec.h:249
double libelec_comp_get_incap_volts(const elec_comp_t *comp)
Definition: libelec.c:2574
void libelec_serialize(elec_sys_t *sys, conf_t *ser, const char *prefix)
Definition: libelec.c:1205
size_t libelec_comp_get_num_conns(const elec_comp_t *comp)
Definition: libelec.c:2164
void libelec_tie_set_v(elec_comp_t *comp, va_list ap)
Definition: libelec.c:4676
elec_get_temp_cb_t libelec_batt_get_temp_cb(const elec_comp_t *batt)
Definition: libelec.c:2933
void libelec_comp_set_failed(elec_comp_t *comp, bool failed)
Definition: libelec.c:2742
void libelec_destroy(elec_sys_t *sys)
Definition: libelec.c:1287
void libelec_gen_set_rpm(elec_comp_t *gen, double rpm)
Definition: libelec.c:4893
bool libelec_sys_start(elec_sys_t *sys)
Definition: libelec.c:977
bool libelec_sys_can_start(const elec_sys_t *sys)
Definition: libelec.c:951
double libelec_sys_get_time_factor(const elec_sys_t *sys)
Definition: libelec.c:1081
bool libelec_tie_get_all(elec_comp_t *comp)
Definition: libelec.c:4738
void libelec_cb_set(elec_comp_t *comp, bool set)
Definition: libelec.c:4551
void libelec_remove_user_cb(elec_sys_t *sys, bool pre, elec_user_cb_t cb, void *userinfo)
Definition: libelec.c:2076
bool libelec_tie_get_v(elec_comp_t *tie, bool exhaustive, va_list ap)
Definition: libelec.c:4844
double capacity
Definition: libelec.h:222
double volts
Definition: libelec.h:221
double max_pwr
Definition: libelec.h:223
double chg_R
Definition: libelec.h:224
elec_get_temp_cb_t get_temp
Definition: libelec.h:229
const elec_comp_info_t ** comps
Definition: libelec.h:347
size_t n_comps
Definition: libelec.h:348
double rate
Definition: libelec.h:356
bool triphase
Definition: libelec.h:358
double max_amps
Definition: libelec.h:355
elec_cb_info_t cb
Definition: libelec.h:420
char location[32]
Definition: libelec.h:407
elec_label_box_info_t label_box
Definition: libelec.h:423
elec_comp_type_t type
Definition: libelec.h:397
void * userinfo
Definition: libelec.h:400
double int_R
Definition: libelec.h:409
struct elec_comp_info_s::@3 gui
unsigned parse_linenum
Definition: libelec.h:411
elec_load_info_t load
Definition: libelec.h:418
elec_diode_info_t diode
Definition: libelec.h:421
elec_gen_info_t gen
Definition: libelec.h:414
elec_tru_info_t tru
Definition: libelec.h:416
elec_bus_info_t bus
Definition: libelec.h:419
elec_batt_info_t batt
Definition: libelec.h:413
double freq
Definition: libelec.h:255
double min_rpm
Definition: libelec.h:259
double exc_rpm
Definition: libelec.h:258
double stab_rate_U
Definition: libelec.h:256
double volts
Definition: libelec.h:254
double max_rpm
Definition: libelec.h:260
elec_get_rpm_cb_t get_rpm
Definition: libelec.h:266
double stab_rate_f
Definition: libelec.h:257
vect2_t * eff_curve
Definition: libelec.h:261
double incap_leak_Qps
Definition: libelec.h:330
elec_get_load_cb_t get_load
Definition: libelec.h:334
double incap_C
Definition: libelec.h:326
double std_load
Definition: libelec.h:339
double min_volts
Definition: libelec.h:332
double incap_R
Definition: libelec.h:328
double in_volts
Definition: libelec.h:273
const elec_comp_info_t * dc
Definition: libelec.h:279
double curr_lim
Definition: libelec.h:287
const elec_comp_info_t * ac
Definition: libelec.h:278
double out_freq
Definition: libelec.h:276
double min_volts
Definition: libelec.h:274
double out_volts
Definition: libelec.h:275
vect2_t * eff_curve
Definition: libelec.h:277
const elec_comp_info_t * output
Definition: libelec.h:298
double in_volts
Definition: libelec.h:294
const elec_comp_info_t * input
Definition: libelec.h:297
double out_volts
Definition: libelec.h:295
vect2_t * eff_curve
Definition: libelec.h:296