//////////////////////////////////////////////////////////////////////////////
//
//  c-movado-link: Movado interface in C (Linux/Mac/Windows)
//      version 1.2 (October 9, 2009)
//
//  (C) Hideki Kozima (xkozima@myu.ac.jp), subject to GPLv2
//

#include "c-movado.c"

//////////////////////////////////////////////////////////////////////////////
//
//  movado_move/movac/movel (trapezoid motion control)
//
//  movado_move:  move to pos [rad]
//  movado_movac: move to pos [rad] with (acc > 0.0) [rad/s/s]
//  movado_movel: move to pos [rad] with (vel > 0.0) [rad/s]

void  movado_move (int addr, int n, double pos)
{
    int  quad;

    quad = pos * 65536;
    pac_do(addr, n, 0, &quad);
}

void  movado_movac (int addr, int n, double pos, double acc)
{
    int  ipos, iacc;
    int  quad;

    ipos = pos * 65536;
    iacc = acc * 65536;
    if (iacc <= 0) return;
    quad = ((-iacc) & 0xffff0000) | (ipos >> 16);
    pac_do(addr, n, 1, &quad);
}

void  movado_movel (int addr, int n, double pos, double vel)
{
    int  ipos, ivel;
    int  quad;

    ipos = pos * 65536;
    ivel = vel * 65536;
    if (ivel <= 0) return;
    quad = ((-ivel) & 0xffff0000) | (ipos >> 16);
    pac_do(addr, n, 2, &quad);
}

//////////////////////////////////////////////////////////////////////////////
//
//  movado_setacc/setvel/setpos
//
//  movado_setacc: set acc (> 0.0) [rad/s/s]
//  movado_setvel: set vel (> 0.0) [rad/s]
//  movado_setpos: set pos [rad] (ballistic move)

void  movado_setacc (int addr, int n, double acc)
{
    int  quad;

    quad = acc * 65536;
    if (quad < 0) return;
    pac_do(addr, n, 1, &quad);
}

void  movado_setvel (int addr, int n, double vel)
{
    int  quad;

    quad = vel * 65536;
    if (quad < 0) return;
    pac_do(addr, n, 2, &quad);
}

void  movado_setpos (int addr, int n, double pos)
{
    int  quad;

    quad = pos * 65536;
    if (quad < 0) return;
    pac_do(addr, n, 3, &quad);
}

//////////////////////////////////////////////////////////////////////////////
//
//  movado_getacc/getvel/getpos
//
//  movado_getacc: get acc [rad/s/s] (preset acc)
//  movado_getvel: get vel [rad/s]   (current vel)
//  movado_getpos: get pos [rad]     (current pos)

double  movado_getacc (int addr, int n)
{
    int  quad;
    double  acc;

    pac_do(addr, n, 5, &quad);
    acc = quad / 65536.0;

    return acc;
}

double  movado_getvel (int addr, int n)
{
    int  quad;
    double  vel;

    pac_do(addr, n, 6, &quad);
    vel = quad / 65536.0;

    return vel;
}

double  movado_getpos (int addr, int n)
{
    int  quad;
    double  pos;

    pac_do(addr, n, 7, &quad);
    pos = quad / 65536.0;

    return pos;
}

//////////////////////////////////////////////////////////////////////////////
//
//  movado_sub

int  movado_sub (int addr, int n, int jnst, int index, int word)
{
    int  quad;

    quad = ((jnst&0xff) << 24) | ((index&0xff) << 16) | (word&0xffff); 
    pac_do(addr, n, 4, &quad);

    return  quad & 0xffff;
}

//////////////////////////////////////////////////////////////////////////////

