satdump/src-core/libs/supernovas/plugin.c
2025-09-23 19:58:18 +02:00

191 lines
5.7 KiB
C

/**
* @file
*
* @date Created on Mar 6, 2025
* @author Attila Kovacs
*
* Functions that allow to define or access user-defined plugin routines.
*/
#include <errno.h>
/// \cond PRIVATE
#define __NOVAS_INTERNAL_API__ ///< Use definitions meant for internal use by SuperNOVAS only
#include "novas.h"
/// \endcond
/// \cond PRIVATE
#ifndef DEFAULT_SOLSYS
/// Will use solarsystem() and solarsystem_hp() that is linked with application
# define DEFAULT_SOLSYS 0
#endif
// <---------- GLOBAL VARIABLES -------------->
#if DEFAULT_SOLSYS <= 0
static short solarsystem_adapter(double jd_tdb, enum novas_planet body, enum novas_origin origin,
double *restrict position, double *restrict velocity) {
solarsystem(jd_tdb, (short) body, (short) origin, position, velocity);
}
static short solarsystem_hp_adapter(const double jd_tdb[2], enum novas_planet body, enum novas_origin origin,
double *restrict position, double *restrict velocity) {
solarsystem_hp(jd_tdb, (short) body, (short) origin, position, velocity);
}
novas_planet_provider planet_call = solarsystem_adapter;
novas_planet_provider_hp planet_call_hp = solarsystem_hp_adapter;
#endif
/// \endcond
/// function to use for reading ephemeris data for all types of solar system sources
static novas_ephem_provider readeph2_call = NULL;
/// Function to use for reduced-precision calculations. (The full IAU 2000A model is used
/// always for high-precision calculations)
static novas_nutation_provider nutate_lp = iau2000b;
/**
* Sets the function to use for obtaining position / velocity information for minor planets,
* or sattelites.
*
* @param func new function to use for accessing ephemeris data for minor planets or satellites.
* @return 0 if successful, or else -1 if the function argument is NULL.
*
* @since 1.0
* @author Attila Kovacs
*
* @sa get_ephem_provider(), set_planet_provider(), set_planet_provider_hp()
* @sa novas_use_calceph(), novas_use_cspice()
*/
int set_ephem_provider(novas_ephem_provider func) {
readeph2_call = func;
return 0;
}
/**
* Returns the user-defined ephemeris accessor function.
*
* @return the currently defined function for accessing ephemeris data for minor planets
* or satellites, ot NULL if no function was set via set_ephem_provider() previously.
*
* @since 1.0
* @author Attila Kovacs
*
* @sa set_ephem_provider(), get_planet_provider(), get_planet_provider_hp(), ephemeris()
*/
novas_ephem_provider get_ephem_provider() {
return readeph2_call;
}
/**
* Set the function to use for low-precision IAU 2000 nutation calculations instead of the
* default nu2000k().
*
* @param func the new function to use for low-precision IAU 2000 nutation calculations
* @return 0 if successful, or -1 if the input argument is NULL
*
* @since 1.0
* @author Attila Kovacs
*
* @sa get_nutation_lp_provider(), nutation_angles(), nutation()
*/
int set_nutation_lp_provider(novas_nutation_provider func) {
if(!func)
return novas_error(-1, EINVAL, "set_nutation_lp_provider", "NULL 'func' parameter");
nutate_lp = func;
return 0;
}
/**
* Returns the function configured for low-precision IAU 2000 nutation calculations instead
* of the default nu2000k().
*
* @return the function to use for low-precision IAU 2000 nutation calculations
*
* @since 1.3
* @author Attila Kovacs
*
* @sa set_nutation_lp_provider(), nutation_angles(), nutation()
*/
novas_nutation_provider get_nutation_lp_provider() {
return nutate_lp;
}
/**
* Set a custom function to use for regular precision (see NOVAS_REDUCED_ACCURACY)
* ephemeris calculations instead of the default solarsystem() routine.
*
* @param func The function to use for solar system position/velocity calculations.
* See solarsystem() for further details on what is required of this
* function.
*
* @author Attila Kovacs
* @since 1.0
*
* @sa get_planet_provider(), set_planet_provider_hp(), solarsystem(), NOVAS_REDUCED_ACCURACY
* @sa novas_use_calceph(), novas_use_cspice()
*/
int set_planet_provider(novas_planet_provider func) {
if(!func)
return novas_error(-1, EINVAL, "set_planet_provider", "NULL 'func' parameter");
planet_call = func;
return 0;
}
/**
* Returns the custom (low-precision) ephemeris provider function for major planets
* (and Sun, Moon, SSB...), if any.
*
* @return the custom (low-precision) planet ephemeris provider function.
*
* @author Attila Kovacs
* @since 1.2
*
* @sa set_planet_provider(), get_planet_provider_hp(), get_ephem_provider()
*/
novas_planet_provider get_planet_provider() {
return planet_call;
}
/**
* Set a custom function to use for high precision (see NOVAS_FULL_ACCURACY) ephemeris
* calculations instead of the default solarsystem_hp() routine.
*
* @param func The function to use for solar system position/velocity calculations.
* See solarsystem_hp() for further details on what is required of this
* function.
*
* @author Attila Kovacs
* @since 1.0
*
* @sa get_planet_provider_hp(), set_planet_provider(), solarsystem_hp(), NOVAS_FULL_ACCURACY
* @sa novas_use_calceph(), novas_use_cspice()
*/
int set_planet_provider_hp(novas_planet_provider_hp func) {
if(!func)
return novas_error(-1, EINVAL, "set_planet_provider_hp", "NULL 'func' parameter");
planet_call_hp = func;
return 0;
}
/**
* Returns the custom high-precision ephemeris provider function for major planets
* (and Sun, Moon, SSB...), if any.
*
* @return the custom high-precision planet ephemeris provider function.
*
* @author Attila Kovacs
* @since 1.2
*
* @sa set_planet_provider_hp(), get_planet_provider(), get_ephem_provider()
*/
novas_planet_provider_hp get_planet_provider_hp() {
return planet_call_hp;
}