MDX-15,20の制御用library

MDX20.cpp

Committer:
suupen
Date:
2016-11-23
Revision:
4:b01a67ab40cf
Parent:
3:3bf2936b8d9b
Child:
5:bd414d8e483f

File content as of revision 4:b01a67ab40cf:

#include "MDX20.h"
#include "BufferedSerial.h"


MDX20::MDX20(PinName tx, PinName rx, PinName cts) : _serial(tx, rx), _cts(cts, PullUp)
{

    _serial.baud(9600);
    _serial.format(8,Serial::None,1);
}

MDX20::~MDX20()
{
}

void MDX20::clearPositon(void)
{
    D_position[Z_x] = 0;
    D_position[Z_y] = 0;
    D_position[Z_z] = 0;
}

void MDX20::answerPositon(int16_t *position)
{
    *(position + Z_x) = D_position[Z_x];
    *(position + Z_y) = D_position[Z_y];
    *(position + Z_z) = D_position[Z_z];

}

void MDX20::answerPositonMillimeter(float *position)
{
    *(position + Z_x) = (float)D_position[Z_x] * countToMillimeter;
    *(position + Z_y) = (float)D_position[Z_y] * countToMillimeter;
    *(position + Z_z) = (float)D_position[Z_z] * countToMillimeter;

}


void MDX20::integralPosition(char *str)
{
    char strData[100];
    char *p;
    static uint8_t AorR = 'A';  // 'A'=absolute 'R'=relative

    strcpy(strData, str);

    if( 0 == strncmp("^PA", strData, 3)) {
        AorR = 'A';
    } else if( 0 == strncmp("^PR", strData, 3)) {
        AorR = 'R';
    }


    while ((p = strchr(strData, ','))!=NULL) *p = ' ';

    double a[3] = {0,0,0};
    if(*str != 'Z') {
        return;
    }

    sscanf((strData + 1), "%lf %lf %lf", &a[0], &a[1], &a[2]);

    if(AorR == 'A') {
        D_position[Z_x] = a[0];
        D_position[Z_y] = a[1];
        D_position[Z_z] = a[2];
    } else {
        D_position[Z_x] += a[0];
        D_position[Z_y] += a[1];
        D_position[Z_z] += a[2];
    }

    printf("x=%f y=%f z=%f \n", D_position[Z_x], D_position[Z_y], D_position[Z_z]);
    wait(0.1);
}

uint8_t MDX20::xyOrigin(void)
{
    uint8_t ans;
    char buffer[100];
    D_userOriginPosition[Z_x] = D_position[Z_x];
    D_userOriginPosition[Z_y] = D_position[Z_y];
    D_userOriginPosition[Z_z] = 0;

    sprintf(buffer, "!XO%d;",(int16_t)D_userOriginPosition[Z_x]);
//    printf("%s\r\n",buffer);
    sprintf(buffer, "!YO%d;",(int16_t)D_userOriginPosition[Z_y]);
//    printf("%s\r\n",buffer);

    return ans;
}

uint8_t MDX20::zOrigin(void)
{
    uint8_t ans;
    char buffer[100];

    sprintf(buffer, "!ZO%d;",0);    // 今いる位置をZ原点にするので"0"を設定する
//    printf("%s\r\n",buffer);
    ans &= sendData(buffer);

    return ans;
}

/**
* MDX-15/20へのデータ送信
* @@para *data : データ一行の先頭アドレス
* @@para uint8_t : 0:送信キャンセル 1:送信完了
*/
uint8_t MDX20::sendData(char* data)
{
    uint8_t ans = 0;    // 0:送信キャンセル 1:送信完了

    while(_cts != 0) {}
    wait(0.1);  // このwait timeがないとMDX-20からのwait指示を読み飛ばす
//    printf("%s\r\n",data);
    _serial.printf("%s\r\n",data);

    integralPosition(data);
    ans = 1;

    return (ans);
}

uint8_t MDX20::reciveData(void)
{
    char ans = 0;
    while(_serial.readable()) {
        ans = _serial.getc();
    }
    return ans;
}

int MDX20::putc(int c)
{
    _serial.putc(c);
    return c;
}

uint8_t MDX20::initial(void)
{
    uint8_t ans;
    ans &= sendData("^IN");
    ans &= sendData("!MC0");
    ans &= sendData("^PA");
    ans &= sendData("Z0,0,0");
    clearPositon();
    return (ans);
}

uint8_t MDX20::motorOff(void)
{
    uint8_t ans;
    ans &= sendData("!MC0");
    return (ans);
}

uint8_t MDX20::userOriginInitial(void)
{
    char buffer[100];
    uint8_t ans;

    ans &= sendData("^PA");

    sprintf(buffer, "Z%d,%d,%d",(int16_t)D_userOriginPosition[Z_x], (int16_t)D_userOriginPosition[Z_y], (int16_t)D_userOriginPosition[Z_z]);
//    printf("%s\r\n",buffer);
    ans &= sendData(buffer);

    return ans;
}

uint8_t MDX20::final(void)
{
    uint8_t ans;
    ans &= sendData("!MC0");
    ans &= sendData("^PA");
    ans &= sendData("Z0,0,0");
    clearPositon();
    ans &= sendData("^IN");
    return (ans);
}

uint8_t MDX20::zeroSetting(void)
{
    uint8_t ans;

    ans &= sendData("!X00");
    ans &= sendData("!Y00");
    ans &= sendData("!Z00");
    clearPositon();
    return (ans);
}
uint8_t MDX20::XYZMove(int16_t x, int16_t y, int16_t z)
{
    uint8_t ans;
    char buffer[100];

    ans &= sendData("!MC0");
    ans &= sendData("^PR");
    sprintf(buffer, "Z%05d,%05d,%05d",x, y, z);
    ans &= sendData(buffer);

    return (ans);
}