Program Listing for File fusion.h

Return to documentation for file (api/include/pntos/plugins/fusion.h)

#pragma once

#include <pntos/plugins/common.h>
#include <pntos/plugins/fusion_strategy.h>

#ifdef __cplusplus
extern "C" {
#endif

PNTOS_ASSUME_NONNULL_BEGIN

typedef struct PntosCommonFusionEngine {
    PntosManagedMemory* memory;

    PntosFusionType engine_type;

} PntosCommonFusionEngine;

typedef struct PntosCrossCovariances {
    PntosManagedMemory* memory;

    size_t num_covariances;

    char** block_labels;

    PntosMatrix** cross_covariances;
} PntosCrossCovariances;

typedef struct PntosStandardFusionEngine {
    PntosCommonFusionEngine common;

    void (*set_time)(struct PntosStandardFusionEngine* self, AspnTypeTimestamp time);

    AspnTypeTimestamp (*get_time)(struct PntosStandardFusionEngine* self);

    void (*set_strategy)(struct PntosStandardFusionEngine* self,
                         PntosStandardFusionStrategy* strategy);

    PntosStandardFusionStrategy* PNTOS_NULLABLE (*get_strategy)(
        struct PntosStandardFusionEngine* self);

    size_t (*get_num_states)(struct PntosStandardFusionEngine* self);

    PntosStringArray* PNTOS_NULLABLE (*get_state_block_labels)(
        struct PntosStandardFusionEngine* self);

    bool (*has_block)(struct PntosStandardFusionEngine* self, char* block_label);

    void (*add_state_block)(struct PntosStandardFusionEngine* self,
                            PntosStandardStateBlock* block,
                            PntosEstimateWithCovariance* initial_estimate_covariance,
                            PntosCrossCovariances* PNTOS_NULLABLE cross_covariances);

    PntosMatrix* PNTOS_NULLABLE (*get_state_block_estimate)(struct PntosStandardFusionEngine* self,
                                                            char* block_label);

    PntosMatrix* PNTOS_NULLABLE (*get_state_block_covariance)(
        struct PntosStandardFusionEngine* self, char* block_label);

    PntosMatrix* PNTOS_NULLABLE (*get_state_block_cross_covariance)(
        struct PntosStandardFusionEngine* self, char* block_label1, char* block_label2);

    void (*set_state_block_estimate)(struct PntosStandardFusionEngine* self,
                                     char* block_label,
                                     PntosMatrix* estimate);

    void (*set_state_block_covariance)(struct PntosStandardFusionEngine* self,
                                       char* block_label,
                                       PntosMatrix* covariance);

    void (*set_state_block_cross_covariance)(struct PntosStandardFusionEngine* self,
                                             char* block_label1,
                                             char* block_label2,
                                             PntosMatrix* covariance);

    void (*remove_state_block)(struct PntosStandardFusionEngine* self, char* block_label);

    PntosStringArray* PNTOS_NULLABLE (*get_virtual_state_block_target_labels)(
        struct PntosStandardFusionEngine* self);

    bool (*has_virtual_state_block)(struct PntosStandardFusionEngine* self, char* vsb_target_label);

    void (*add_virtual_state_block)(struct PntosStandardFusionEngine* self,
                                    PntosVirtualStateBlock* virtual_state_block);

    void (*remove_virtual_state_block)(struct PntosStandardFusionEngine* self,
                                       char* vsb_target_label);

    PntosStringArray* PNTOS_NULLABLE (*get_measurement_processor_labels)(
        struct PntosStandardFusionEngine* self);

    bool (*has_processor)(struct PntosStandardFusionEngine* self, char* processor_label);

    void (*add_measurement_processor)(struct PntosStandardFusionEngine* self,
                                      PntosStandardMeasurementProcessor* processor);

    void (*remove_measurement_processor)(struct PntosStandardFusionEngine* self,
                                         char* processor_label);

    void (*propagate)(struct PntosStandardFusionEngine* self, AspnTypeTimestamp time);

    void (*update)(struct PntosStandardFusionEngine* self,
                   char* processor_label,
                   PntosMessage* message);

    PntosEstimateWithCovariance* PNTOS_NULLABLE (*peek_ahead)(
        struct PntosStandardFusionEngine* self,
        AspnTypeTimestamp time,
        char** block_labels,
        size_t num_block_labels);

    PntosEstimateWithCovariance* PNTOS_NULLABLE (*generate_x_and_p)(
        struct PntosStandardFusionEngine* self, char** block_labels, size_t num_block_labels);

    void (*give_state_block_aux_data)(struct PntosStandardFusionEngine* self,
                                      char* block_label,
                                      PntosMessageArray* aux);

    void (*give_measurement_processor_aux_data)(struct PntosStandardFusionEngine* self,
                                                char* processor_label,
                                                PntosMessageArray* aux);

    void (*give_virtual_state_block_aux_data)(struct PntosStandardFusionEngine* self,
                                              char* target_label,
                                              PntosMessageArray* aux);

    struct PntosStandardFusionEngine* (*clone)(struct PntosStandardFusionEngine* self);
} PntosStandardFusionEngine;

typedef struct PntosFusionPlugin {
    PntosCommonPlugin common;

    bool (*is_fusion_type_supported)(struct PntosFusionPlugin* self, PntosFusionType type);

    PntosCommonFusionEngine* PNTOS_NULLABLE (*new_fusion_engine)(struct PntosFusionPlugin* self,
                                                                 PntosFusionType type);
} PntosFusionPlugin;

PNTOS_ASSUME_NONNULL_END

#ifdef __cplusplus
}
#endif