component lin2rev "Calculate motor angle from position in machine units";
pin in float scale;

pin in float cmd_in;
pin out float cmd_out;

pin in float fb_in;
pin out float fb_out;

variable double pi = 3.141592654;
variable double s;
variable int lastq = 0;
variable int q = 0;
variable int rev = 0;

function _;
license "GPL";
;;

s = scale;
if(s == 0){
   s = 1;
}

cmd_out = (cmd_in/s)*2.0*pi;

while(cmd_out < -pi){
   cmd_out += 2.0 * pi;
}

while(cmd_out > pi){
   cmd_out -= 2.0 * pi;
}

q = 0;
if(fb_in > pi/2.0){
   q = 2;
}
if(fb_in < -pi/2.0){
   q = 3;
}

if(q != 0 && q == 3 && lastq == 2){
   rev++;
}

if(q != 0 && q == 2 && lastq == 3){
   rev--;
}

lastq = q;

fb_out = ((fb_in+rev*pi*2.0)*s)/(2.0*pi);
