]> gerrit.simantics Code Review - simantics/fmil.git/blob - org.simantics.fmil/native/FMUSimulator/include/FMIL/Util/FMI2/fmi2_functions.h
Mavenized FMIL projects.
[simantics/fmil.git] / org.simantics.fmil / native / FMUSimulator / include / FMIL / Util / FMI2 / fmi2_functions.h
1 /*
2     Copyright (C) 2012 Modelon AB
3
4     This program is free software: you can redistribute it and/or modify
5     it under the terms of the BSD style license.
6
7      This program is distributed in the hope that it will be useful,
8     but WITHOUT ANY WARRANTY; without even the implied warranty of
9     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10     FMILIB_License.txt file for more details.
11
12     You should have received a copy of the FMILIB_License.txt file
13     along with this program. If not, contact Modelon AB <http://www.modelon.com>.
14 */\r
15 \r
16 #ifndef _FMI2_FUNCTION_TYPES_H_\r
17 #define _FMI2_FUNCTION_TYPES_H_\r
18 \r
19 #include <string.h>\r
20 #include <fmilib_config.h>\r
21 \r
22 #include "fmi2_types.h"\r
23 /**     \file fmi2_functions.h\r
24         Mapping for the standard FMI 2.0 functions into fmi2_ namespace.\r
25 \r
26         \addtogroup fmi2_utils\r
27         @{\r
28 */
29 \r
30 #ifdef __cplusplus\r
31 extern "C" {\r
32 #endif\r
33 /* make sure all compiler use the same alignment policies for structures */\r
34 #if defined _MSC_VER || defined __GNUC__\r
35 #pragma pack(push,8)\r
36 #endif\r
37 \r
38 \r
39 /** FMI 2.0 status codes */\r
40 typedef enum {\r
41         fmi2_status_ok,\r
42         fmi2_status_warning,\r
43         fmi2_status_discard,\r
44         fmi2_status_error,\r
45         fmi2_status_fatal,\r
46         fmi2_status_pending\r
47 } fmi2_status_t;\r
48
49 typedef enum {
50     fmi2_model_exchange,
51     fmi2_cosimulation
52 } fmi2_type_t;
53
54
55 /* Type definitions */\r
56 \r
57 /** Convert #fmi2_status_t variable to string  */\r
58 FMILIB_EXPORT const char* fmi2_status_to_string(fmi2_status_t status);\r
59 \r
60 /** FMI 2.0 logger function type */\r
61 typedef void  (*fmi2_callback_logger_ft)        (fmi2_component_environment_t env, fmi2_string_t instanceName, fmi2_status_t status, fmi2_string_t category, fmi2_string_t message, ...);\r
62 /** FMI 2.0 allocate memory function type */\r
63 typedef void* (*fmi2_callback_allocate_memory_ft)(size_t nobj, size_t size);\r
64 /** FMI 2.0 free memory  function type */\r
65 typedef void  (*fmi2_callback_free_memory_ft)    (void* obj);\r
66 /** FMI 2.0 step finished callback function type */\r
67 typedef void  (*fmi2_step_finished_ft)          (fmi2_component_environment_t env, fmi2_status_t status);\r
68 \r
69 /** The FMI 2.0 callbacks */\r
70 typedef struct {\r
71         fmi2_callback_logger_ft         logger;\r
72         fmi2_callback_allocate_memory_ft allocateMemory;\r
73         fmi2_callback_free_memory_ft     freeMemory;\r
74         fmi2_step_finished_ft           stepFinished;\r
75         fmi2_component_environment_t    componentEnvironment;\r
76 } fmi2_callback_functions_t;\r
77 \r
78 /** Event info structure as used in FMI 2.0 ME */\r
79 /* TODO: reuse from fmiFunctions.h */
80 typedef struct {
81     fmi2_boolean_t newDiscreteStatesNeeded;
82     fmi2_boolean_t terminateSimulation;
83     fmi2_boolean_t nominalsOfContinuousStatesChanged;
84     fmi2_boolean_t valuesOfContinuousStatesChanged;
85     fmi2_boolean_t nextEventTimeDefined;
86     fmi2_real_t    nextEventTime;
87 } fmi2_event_info_t;
88
89 /** Co-simulation status for FMI 2.0 CS */\r
90 /* TODO: reuse from fmiFunctions.h */
91 typedef enum {\r
92     fmi2_do_step_status,\r
93     fmi2_pending_status,\r
94     fmi2_last_successful_time,\r
95     fmi2_terminated\r
96 } fmi2_status_kind_t;\r
97 \r
98 \r
99 \r
100 /* reset alignment policy to the one set before reading this file */\r
101 #if defined _MSC_VER || defined __GNUC__\r
102 #pragma pack(pop)\r
103 #endif\r
104 \r
105 /* Define fmi function pointer types to simplify dynamic loading */\r
106 \r
107 /***************************************************\r
108 Types for Common Functions\r
109 ****************************************************/\r
110 \r
111 /* Inquire version numbers of header files and setting logging status */\r
112    typedef const char* (*fmi2_get_types_platform_ft)();\r
113    typedef const char* (*fmi2_get_version_ft)();\r
114    typedef fmi2_status_t   (*fmi2_set_debug_logging_ft)(fmi2_component_t, fmi2_boolean_t,size_t nCategories, const fmi2_string_t categories[]);\r
115 \r
116 /* Creation and destruction of fmu instances and setting debug status */
117    typedef fmi2_component_t (*fmi2_instantiate_ft) (fmi2_string_t, fmi2_type_t, fmi2_string_t, fmi2_string_t, const fmi2_callback_functions_t*, fmi2_boolean_t, fmi2_boolean_t);
118    typedef void         (*fmi2_free_instance_ft)(fmi2_component_t);
119
120 /* Enter and exit initialization mode, terminate and reset */
121    typedef fmi2_status_t (*fmi2_setup_experiment_ft)          (fmi2_component_t, fmi2_boolean_t, fmi2_real_t, fmi2_real_t, fmi2_boolean_t, fmi2_real_t);
122    typedef fmi2_status_t (*fmi2_enter_initialization_mode_ft) (fmi2_component_t);
123    typedef fmi2_status_t (*fmi2_exit_initialization_mode_ft)  (fmi2_component_t);
124    typedef fmi2_status_t (*fmi2_terminate_ft)              (fmi2_component_t);
125    typedef fmi2_status_t (*fmi2_reset_ft)     (fmi2_component_t);
126
127 /* Getting and setting variable values */\r
128    typedef fmi2_status_t (*fmi2_get_real_ft)   (fmi2_component_t, const fmi2_value_reference_t[], size_t, fmi2_real_t   []);\r
129    typedef fmi2_status_t (*fmi2_get_integer_ft)(fmi2_component_t, const fmi2_value_reference_t[], size_t, fmi2_integer_t[]);\r
130    typedef fmi2_status_t (*fmi2_get_boolean_ft)(fmi2_component_t, const fmi2_value_reference_t[], size_t, fmi2_boolean_t[]);\r
131    typedef fmi2_status_t (*fmi2_get_string_ft) (fmi2_component_t, const fmi2_value_reference_t[], size_t, fmi2_string_t []);\r
132 \r
133    typedef fmi2_status_t (*fmi2_set_real_ft)   (fmi2_component_t, const fmi2_value_reference_t[], size_t, const fmi2_real_t   []);\r
134    typedef fmi2_status_t (*fmi2_set_integer_ft)(fmi2_component_t, const fmi2_value_reference_t[], size_t, const fmi2_integer_t[]);\r
135    typedef fmi2_status_t (*fmi2_set_boolean_ft)(fmi2_component_t, const fmi2_value_reference_t[], size_t, const fmi2_boolean_t[]);\r
136    typedef fmi2_status_t (*fmi2_set_string_ft) (fmi2_component_t, const fmi2_value_reference_t[], size_t, const fmi2_string_t []);\r
137 \r
138 /* Getting and setting the internal _fmu_ state */\r
139    typedef fmi2_status_t (*fmi2_get_fmu_state_ft)           (fmi2_component_t, fmi2_FMU_state_t*);\r
140    typedef fmi2_status_t (*fmi2_set_fmu_state_ft)           (fmi2_component_t, fmi2_FMU_state_t);\r
141    typedef fmi2_status_t (*fmi2_free_fmu_state_ft)          (fmi2_component_t, fmi2_FMU_state_t*);\r
142    typedef fmi2_status_t (*fmi2_serialized_fmu_state_size_ft)(fmi2_component_t, fmi2_FMU_state_t, size_t*);\r
143    typedef fmi2_status_t (*fmi2_serialize_fmu_state_ft)     (fmi2_component_t, fmi2_FMU_state_t, fmi2_byte_t[], size_t);\r
144    typedef fmi2_status_t (*fmi2_de_serialize_fmu_state_ft)   (fmi2_component_t, const fmi2_byte_t[], size_t, fmi2_FMU_state_t*);\r
145 \r
146 /* Getting directional derivatives */
147    typedef fmi2_status_t (*fmi2_get_directional_derivative_ft)(fmi2_component_t, const fmi2_value_reference_t[], size_t,\r
148                                                                    const fmi2_value_reference_t[], size_t,\r
149                                                                    const fmi2_real_t[], fmi2_real_t[]);\r
150 \r
151 /***************************************************\r
152 Types for Functions for FMI for Model Exchange\r
153 ****************************************************/\r
154 \r
155 /* Enter and exit the different modes */
156    typedef fmi2_status_t (*fmi2_enter_event_mode_ft)          (fmi2_component_t);
157    typedef fmi2_status_t (*fmi2_new_discrete_states_ft)       (fmi2_component_t, fmi2_event_info_t*);
158    typedef fmi2_status_t (*fmi2_enter_continuous_time_mode_ft)(fmi2_component_t);
159    typedef fmi2_status_t (*fmi2_completed_integrator_step_ft) (fmi2_component_t, fmi2_boolean_t, fmi2_boolean_t*, fmi2_boolean_t*);
160
161 /* Providing independent variables and re-initialization of caching */\r
162    typedef fmi2_status_t (*fmi2_set_time_ft)                (fmi2_component_t, fmi2_real_t);\r
163    typedef fmi2_status_t (*fmi2_set_continuous_states_ft)    (fmi2_component_t, const fmi2_real_t[], size_t);\r
164 \r
165 /* Evaluation of the model equations */\r
166    typedef fmi2_status_t (*fmi2_get_derivatives_ft)            (fmi2_component_t, fmi2_real_t[], size_t);\r
167    typedef fmi2_status_t (*fmi2_get_event_indicators_ft)        (fmi2_component_t, fmi2_real_t[], size_t);\r
168    typedef fmi2_status_t (*fmi2_get_continuous_states_ft)       (fmi2_component_t, fmi2_real_t[], size_t);\r
169    typedef fmi2_status_t (*fmi2_get_nominals_of_continuous_states_ft)(fmi2_component_t, fmi2_real_t[], size_t);\r
170 \r
171 \r
172 /***************************************************\r
173 Types for_functions for FMI for Co-_simulation\r
174 ****************************************************/\r
175 \r
176 /* Simulating the slave */\r
177    typedef fmi2_status_t (*fmi2_set_real_input_derivatives_ft) (fmi2_component_t, const fmi2_value_reference_t [], size_t, const fmi2_integer_t [], const fmi2_real_t []);\r
178    typedef fmi2_status_t (*fmi2_get_real_output_derivatives_ft)(fmi2_component_t, const fmi2_value_reference_t [], size_t, const fmi2_integer_t [], fmi2_real_t []);\r
179 \r
180    typedef fmi2_status_t (*fmi2_do_step_ft)     (fmi2_component_t, fmi2_real_t, fmi2_real_t, fmi2_boolean_t);\r
181    typedef fmi2_status_t (*fmi2_cancel_step_ft) (fmi2_component_t);\r
182 \r
183 /* Inquire slave status */\r
184    typedef fmi2_status_t (*fmi2_get_status_ft)       (fmi2_component_t, const fmi2_status_kind_t, fmi2_status_t* );\r
185    typedef fmi2_status_t (*fmi2_get_real_status_ft)   (fmi2_component_t, const fmi2_status_kind_t, fmi2_real_t*   );\r
186    typedef fmi2_status_t (*fmi2_get_integer_status_ft)(fmi2_component_t, const fmi2_status_kind_t, fmi2_integer_t*);\r
187    typedef fmi2_status_t (*fmi2_get_boolean_status_ft)(fmi2_component_t, const fmi2_status_kind_t, fmi2_boolean_t*);\r
188    typedef fmi2_status_t (*fmi2_get_string_status_ft) (fmi2_component_t, const fmi2_status_kind_t, fmi2_string_t* );\r
189 \r
190 /**     @}\r
191 */
192 \r
193 #ifdef __cplusplus\r
194 }  /* end of extern "C" { */\r
195 #endif\r
196 \r
197 #endif /* fmi2_function_types_h */\r