-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodel.c
145 lines (116 loc) · 3.82 KB
/
model.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
* Auto-generated VeriStand model interface code for my_new_model.
*
* Generated Mon Aug 05 13:01:48 2024
*
* You almost certainly do NOT want to edit this file, as it may be overwritten
* at any time!
*/
#include "ni_modelframework.h"
#include "model.h"
#include <stddef.h> /* offsetof() */
#include <string.h> /* memcpy() */
/* User-defined data types for parameters and signals */
#define rtDBL 0
#define rtINT 1
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* Model info */
const char* USER_ModelName DataSection(".NIVS.compiledmodelname") =
"my_new_model";
const char* USER_Builder DataSection(".NIVS.builder") =
"a newly-generated model";
/* Model baserate */
double USER_BaseRate = 0.0025;
/* Model task configuration */
NI_Task rtTaskAttribs DataSection(".NIVS.tasklist") = {0, 0.0025, 0, 0};
/* Parameters */
int32_t ParameterSize DataSection(".NIVS.paramlistsize") = 2;
NI_Parameter rtParamAttribs[] DataSection(".NIVS.paramlist") = {
{0, "my_new_model/i32_param", offsetof(Parameters, i32_param), rtINT, 1, 2, 0, 0},
{0, "my_new_model/double_vec_param", offsetof(Parameters, double_vec_param), rtDBL, 16, 2, 2, 0},
};
int32_t ParamDimList[] DataSection(".NIVS.paramdimlist") = {
1, 1, /* i32_param */
4, 4, /* double_vec_param */
};
/* Set default parameter values here */
Parameters initParams DataSection(".NIVS.defaultparams");
ParamSizeWidth Parameters_sizes[] DataSection(".NIVS.defaultparamsizes") = {
{sizeof(Parameters), 0, 0},
{sizeof(int32_t), 1, rtINT}, /* i32_param */
{sizeof(double), 16, rtDBL}, /* double_vec_param */
};
/* Signals */
Signals rtSignal;
int32_t SignalSize DataSection(".NIVS.siglistsize") = 2;
NI_Signal rtSignalAttribs[] DataSection(".NIVS.siglist") = {
{0, "my_new_model/i32_vec_sig", 0, "an array of integers", 0, 0, rtINT, 24, 2, 0, 0},
{0, "my_new_model/double_sig", 0, "a double value", 0, 0, rtDBL, 1, 2, 2, 0},
};
int32_t SigDimList[] DataSection(".NIVS.sigdimlist") = {
24, 1, /* i32_vec_sig */
1, 1, /* double_sig */
};
/* Inports and outports */
int32_t InportSize = 3;
int32_t OutportSize = 3;
int32_t ExtIOSize DataSection(".NIVS.extlistsize") = 6;
NI_ExternalIO rtIOAttribs[] DataSection(".NIVS.extlist") = {
/* Inports */
{0, "scalar_in", 0, 0, 1, 1, 1},
{0, "vectors/vector1d_in", 0, 0, 1, 8, 1},
{0, "vectors/vector2d_in", 0, 0, 1, 2, 12},
/* Outports */
{0, "scalar_out", 0, 1, 1, 1, 1},
{0, "vectors/vector1d_out", 0, 1, 1, 6, 1},
{0, "vectors/vector2d_out", 0, 1, 1, 3, 5},
/* Terminate list */
{-1, NULL, 0, 0, 0, 0, 0},
};
int32_t USER_SetValueByDataType(void* ptr, int32_t idx, double value,
int32_t type) {
switch (type) {
case rtDBL:
((double*)ptr)[idx] = (double)value;
return NI_OK;
case rtINT:
((int32_t*)ptr)[idx] = (int32_t)value;
return NI_OK;
}
return NI_ERROR;
}
double USER_GetValueByDataType(void* ptr, int32_t idx, int32_t type) {
switch (type) {
case rtDBL:
return ((double*)ptr)[idx];
case rtINT:
return (double)(((int32_t*)ptr)[idx]);
}
/* Return NaN on error */
static const uint64_t nan = ~(uint64_t)0;
double v;
memcpy(&v, &nan, sizeof(v));
return v;
}
int32_t USER_Initialize(void) {
/* Populate pointers to signal values */
rtSignalAttribs[0].addr = (uintptr_t)&*rtSignal.i32_vec_sig;
rtSignalAttribs[1].addr = (uintptr_t)&rtSignal.double_sig;
return my_new_model_Initialize();
}
int32_t USER_ModelStart(void) {
return my_new_model_Start();
}
int32_t USER_TakeOneStep(double* inData, double* outData, double timestamp) {
const struct Inports* inports = (const struct Inports*)inData;
struct Outports* outports = (struct Outports*)outData;
return my_new_model_Step(inports, outports, timestamp);
}
int32_t USER_Finalize(void) {
return my_new_model_Finalize();
}
#ifdef __cplusplus
} /* extern "C" */
#endif /* __cplusplus */