#include "psi_comp.h" #include "hal.h" #include "math.h" #include "defines.h" #include "angle.h" HAL_COMP(psi); HAL_PIN(vel); HAL_PIN(dc_volt); HAL_PIN(u); HAL_PIN(v); HAL_PIN(w); HAL_PIN(polecount); HAL_PIN(psi); HAL_PIN(max_psi); struct psi_ctx_t { float max_f; }; static void rt_func(float period, void *ctx_ptr, hal_pin_inst_t *pin_ptr) { struct psi_ctx_t *ctx = (struct psi_ctx_t *)ctx_ptr; struct psi_pin_ctx_t *pins = (struct psi_pin_ctx_t *)pin_ptr; float f = ABS(PIN(vel)) / 2.0 / M_PI * PIN(polecount); float u = PIN(dc_volt); float u2 = MAX3(PIN(u), PIN(v), PIN(w)) - MIN3(PIN(u), PIN(v), PIN(w)); u = MIN(u, u2) / M_SQRT3; // TODO: fix if(f > 1.0) { PIN(psi) = u / f / 2.0 / M_PI; if(ctx->max_f < f) { ctx->max_f = f; PIN(max_psi) = PIN(psi); } } ctx->max_f *= 0.999999; } const hal_comp_t psi_comp_struct = { .name = "psi", .nrt = 0, .rt = rt_func, .frt = 0, .nrt_init = 0, .hw_init = 0, .rt_start = 0, .frt_start = 0, .rt_stop = 0, .frt_stop = 0, .ctx_size = sizeof(struct psi_ctx_t), .pin_count = sizeof(struct psi_pin_ctx_t) / sizeof(struct hal_pin_inst_t), };