vielen Dank, dass ich mehere Einzelfunktionen einsparen will ist kar, das war ja meine Absicht, dennoch sehe ich jetzt schon ein wenig klarer.
Dennoch ist das mit den doppelten Pointern un dem "casting" schon seeehr kompliziert...
Außerdem ist mir nicht klar, wie jetzt genau die Verknüpfung erfolgen muss von der aufrufenden simplen API Funktion bis hin zum Task:
der vereinfachende Wrapper
ruft auf die ein wenig komplexere Interface-Funktion inkl. dem Target-Haltemodus:Code:inline void RotatePIDtoTarget(char port, long Target, float RotatSpeed) { RotatePID(port, Target, RotatSpeed, false); Wait(1); }
Code:RotatePID(port, Target, RotatSpeed, false);
und hier wird nach Setzen der PID Laufzeit-Variablen der PID Task gestartet:
statt der if-Schleifen für jeden Motor käme jetzt dein expliziter PID-Aufruf mit Motornummer als Parameter -Code:safecall void RotatePID(char port, long Target, float RotatSpeed, char cont) { if (port==OUT_A) { //... //... PID_A.runstate=1; // set runstate: PID active // custom init PID_A PID_A.target =Target; // assign target PID_A.tarpwm =RotatSpeed; // assign rotation speed PID_A.cont=cont; // cont vs. hit once // Reset PID control defaults PID_A.outp =0; // PID control output value PID_A.maxout =100; // absolute max possible output (max pwr) PID_A.read =0; // current reading PID_A.err =0; // current error PID_A.integr =0; // integral of errors PID_A.speed =0; // current speed start task_PID_A; } else if (port==OUT_B) { //...
wie würde es aber denn heißen müssen, wenn ich den PID pthread task innerhalb deiner neuen Struktur starten will?







Zitieren
Lesezeichen