/* * This file is part of the moving_model project. * Copyright 2025 Edward V. Emelianov . * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include "main.h" #include "movingmodel.h" #include "ramp.h" extern movemodel_t trapez; static void chkminmax(double *min, double *max){ if(*min <= *max) return; double t = *min; *min = *max; *max = t; } movemodel_t *model_init(limits_t *l){ if(!l) return FALSE; movemodel_t *model = calloc(1, sizeof(movemodel_t)); memcpy(model, &trapez, sizeof(movemodel_t)); if(!model->init_limits) goto fail; moveparam_t *max = &l->max, *min = &l->min; if(min->speed < 0.) min->speed = -min->speed; if(max->speed < 0.) max->speed = -max->speed; if(min->accel < 0.) min->accel = -min->accel; if(max->accel < 0.) max->accel = -max->accel; chkminmax(&min->coord, &max->coord); chkminmax(&min->speed, &max->speed); chkminmax(&min->accel, &max->accel); if(!model->init_limits(l)) return NULL; return model; fail: free(model); return NULL; } int model_move2(movemodel_t *model, moveparam_t *target, double t){ if(!target || !model) return FALSE; DBG("MOVE to %g at speed %g", target->coord, target->speed); // only positive velocity if(target->speed < 0.) target->speed = -target->speed; // don't mind about acceleration - user cannot set it now return model->calculate(target, t); }