2 proportional integral derivative controller
10 constructor for PID controller
11 @treturn a.pid PID controller userdata
14 int liba_pid_new(lua_State
*L
)
16 a_pid
*const ctx
= lua_newclass(L
, a_pid
);
17 lua_registry_get(L
, liba_pid_new
);
18 lua_setmetatable(L
, -2);
22 ctx
->summax
= +A_FLOAT_INF
;
23 ctx
->summin
= -A_FLOAT_INF
;
24 ctx
->outmax
= +A_FLOAT_INF
;
25 ctx
->outmin
= -A_FLOAT_INF
;
31 calculate for PID controller
32 @tparam a.pid ctx PID controller userdata
33 @treturn a.pid PID controller userdata
36 int liba_pid_init(lua_State
*L
)
38 luaL_checktype(L
, 1, LUA_TUSERDATA
);
39 a_pid
*const ctx
= (a_pid
*)lua_touserdata(L
, 1);
43 ctx
->summax
= +A_FLOAT_INF
;
44 ctx
->summin
= -A_FLOAT_INF
;
45 ctx
->outmax
= +A_FLOAT_INF
;
46 ctx
->outmin
= -A_FLOAT_INF
;
52 set proportional integral derivative constant for PID controller
53 @tparam a.pid ctx PID controller userdata
54 @tparam number kp proportional constant
55 @tparam number ki integral constant
56 @tparam number kd derivative constant
57 @treturn a.pid PID controller userdata
60 int liba_pid_kpid(lua_State
*L
)
62 a_pid
*const ctx
= (a_pid
*)lua_touserdata(L
, 1);
65 a_float
const kp
= (a_float
)luaL_checknumber(L
, 2);
66 a_float
const ki
= (a_float
)luaL_checknumber(L
, 3);
67 a_float
const kd
= (a_float
)luaL_checknumber(L
, 4);
68 a_pid_kpid(ctx
, kp
, ki
, kd
);
76 calculate for PID controller
77 @tparam a.pid ctx PID controller userdata
78 @tparam number set setpoint value
79 @tparam number fdb feedback value
80 @treturn number setpoint value
83 int liba_pid_run(lua_State
*L
)
85 a_pid
*const ctx
= (a_pid
*)lua_touserdata(L
, 1);
88 a_float
const set
= (a_float
)luaL_checknumber(L
, 2);
89 a_float
const fdb
= (a_float
)luaL_checknumber(L
, 3);
90 lua_pushnumber(L
, (lua_Number
)a_pid_run(ctx
, set
, fdb
));
97 calculate for positional PID controller
98 @tparam a.pid ctx PID controller userdata
99 @tparam number set setpoint value
100 @tparam number fdb feedback value
101 @treturn number output value
104 int liba_pid_pos(lua_State
*L
)
106 a_pid
*const ctx
= (a_pid
*)lua_touserdata(L
, 1);
109 a_float
const set
= (a_float
)luaL_checknumber(L
, 2);
110 a_float
const fdb
= (a_float
)luaL_checknumber(L
, 3);
111 lua_pushnumber(L
, (lua_Number
)a_pid_pos(ctx
, set
, fdb
));
118 calculate for incremental PID controller
119 @tparam a.pid ctx PID controller userdata
120 @tparam number set setpoint value
121 @tparam number fdb feedback value
122 @treturn number output value
125 int liba_pid_inc(lua_State
*L
)
127 a_pid
*const ctx
= (a_pid
*)lua_touserdata(L
, 1);
130 a_float
const set
= (a_float
)luaL_checknumber(L
, 2);
131 a_float
const fdb
= (a_float
)luaL_checknumber(L
, 3);
132 lua_pushnumber(L
, (lua_Number
)a_pid_inc(ctx
, set
, fdb
));
139 zeroing for PID controller
140 @tparam a.pid ctx PID controller userdata
141 @treturn a.pid PID controller userdata
144 int liba_pid_zero(lua_State
*L
)
146 a_pid
*const ctx
= (a_pid
*)lua_touserdata(L
, 1);
155 static int liba_pid_set(lua_State
*L
)
157 a_pid
*const ctx
= (a_pid
*)lua_touserdata(L
, 1);
158 switch (a_hash_bkdr(lua_tostring(L
, 2), 0))
160 case 0x00003731: // kp
161 ctx
->kp
= (a_float
)luaL_checknumber(L
, 3);
163 case 0x0000372A: // ki
164 ctx
->ki
= (a_float
)luaL_checknumber(L
, 3);
166 case 0x00003725: // kd
167 ctx
->kd
= (a_float
)luaL_checknumber(L
, 3);
169 case 0x10E9FF9D: // summax
170 ctx
->summax
= (a_float
)luaL_checknumber(L
, 3);
172 case 0x10EA03AB: // summin
173 ctx
->summin
= (a_float
)luaL_checknumber(L
, 3);
175 case 0x23C8F10E: // outmax
176 ctx
->outmax
= (a_float
)luaL_checknumber(L
, 3);
178 case 0x23C8F51C: // outmin
179 ctx
->outmin
= (a_float
)luaL_checknumber(L
, 3);
181 case 0xE8859EEB: // __name
182 case 0xE70C48C6: // __call
183 case 0xA65758B2: // __index
184 case 0xAEB551C6: // __newindex
187 lua_getmetatable(L
, 1);
194 static int liba_pid_get(lua_State
*L
)
196 a_pid
const *const ctx
= (a_pid
const *)lua_touserdata(L
, 1);
197 switch (a_hash_bkdr(lua_tostring(L
, 2), 0))
199 case 0x00003731: // kp
200 lua_pushnumber(L
, (lua_Number
)ctx
->kp
);
202 case 0x0000372A: // ki
203 lua_pushnumber(L
, (lua_Number
)ctx
->ki
);
205 case 0x00003725: // kd
206 lua_pushnumber(L
, (lua_Number
)ctx
->kd
);
208 case 0x10E9FF9D: // summax
209 lua_pushnumber(L
, (lua_Number
)ctx
->summax
);
211 case 0x10EA03AB: // summin
212 lua_pushnumber(L
, (lua_Number
)ctx
->summin
);
214 case 0x23C8F10E: // outmax
215 lua_pushnumber(L
, (lua_Number
)ctx
->outmax
);
217 case 0x23C8F51C: // outmin
218 lua_pushnumber(L
, (lua_Number
)ctx
->outmin
);
220 case 0x001D4D3A: // out
221 lua_pushnumber(L
, (lua_Number
)ctx
->out
);
223 case 0x001AE924: // fdb
224 lua_pushnumber(L
, (lua_Number
)ctx
->fdb
);
226 case 0x001AAD55: // err
227 lua_pushnumber(L
, (lua_Number
)ctx
->err
);
229 case 0xA65758B2: // __index
230 lua_registry_get(L
, liba_pid_new
);
231 lua_num_set(L
, -1, "kp", ctx
->kp
);
232 lua_num_set(L
, -1, "ki", ctx
->ki
);
233 lua_num_set(L
, -1, "kd", ctx
->kd
);
234 lua_num_set(L
, -1, "summax", ctx
->summax
);
235 lua_num_set(L
, -1, "summin", ctx
->summin
);
236 lua_num_set(L
, -1, "outmax", ctx
->outmax
);
237 lua_num_set(L
, -1, "outmin", ctx
->outmin
);
238 lua_num_set(L
, -1, "out", ctx
->out
);
239 lua_num_set(L
, -1, "fdb", ctx
->fdb
);
240 lua_num_set(L
, -1, "err", ctx
->err
);
243 lua_getmetatable(L
, 1);
250 static int liba_pid_(lua_State
*L
)
252 lua_pushcfunction(L
, liba_pid_new
);
254 lua_call(L
, lua_gettop(L
) - 1, 1);
258 int luaopen_liba_pid(lua_State
*L
)
260 static lua_fun
const funcs
[] = {
261 {"new", liba_pid_new
},
262 {"init", liba_pid_init
},
263 {"kpid", liba_pid_kpid
},
264 {"run", liba_pid_run
},
265 {"pos", liba_pid_pos
},
266 {"inc", liba_pid_inc
},
267 {"zero", liba_pid_zero
},
269 lua_createtable(L
, 0, A_LEN(funcs
));
270 lua_fun_reg(L
, -1, funcs
, A_LEN(funcs
));
271 lua_createtable(L
, 0, 1);
272 lua_fun_set(L
, -1, "__call", liba_pid_
);
273 lua_setmetatable(L
, -2);
275 static lua_fun
const metas
[] = {
276 {"__newindex", liba_pid_set
},
277 {"__index", liba_pid_get
},
279 lua_createtable(L
, 0, A_LEN(metas
) + A_LEN(funcs
) + 1);
280 lua_fun_reg(L
, -1, metas
, A_LEN(metas
));
281 lua_fun_reg(L
, -1, funcs
, A_LEN(funcs
));
282 lua_str_set(L
, -1, "__name", "a.pid");
283 lua_registry_set(L
, liba_pid_new
);