MyMotorDrive用の使うプログラム

Dependencies:   IAP MotorClass mbed

main.cpp

Committer:
kikoaac
Date:
2015-08-18
Revision:
1:540605f9477b
Parent:
0:2226b743b219

File content as of revision 1:540605f9477b:

#include "mbed.h"
#include "QEI.h"
#include "MotorClass.h"

#include "IAP.h"
#define addr 0xa0
I2C i2c(p28,p27);//(p9,p10);
Ticker tic;
Serial pc(USBTX,USBRX);
QEI wheel(p18,p17,NC,100,1,QEI::X4_ENCODING);
MotorClass mot(i2c,wheel);
IAP iap;
char *modename[7] = {"","NomalMode","ServoMode","ServoMode(PID)","SpeedHoldMode","SpeedHoldMode(PID)","Stop"};
char Mode;
void InputData(char *data)
{
    char i=0;
    do {
        *(data+i)=pc.getc();
        if(*(data+i)==127) {
            i=0;
            printf("\r");
        } else {
            printf("%c",*(data+i));
            i++;
        }
    } while(*(data+i-1)!=13);
    printf("\r\n");
}
void motor_select_mode_menu()
{
    printf("\r\nPlease Select Mode.\r\n");
    printf("\"1\" NomalMode\r\n\"2\" ServoMode\r\n\"3\" ServoMode(PID)\r\n\"4\" SpeedHoldMode\r\n\"5\" SpeedHoldMode(PID)\r\n\"6~\" Stop\r\n");
    printf("Back to press Q key.\r\n\n");
    while(1) {
        char get=pc.getc()-'0';
        if('Q'==(get+'0')) {
            printf("preesed Q \r\n");
            break;
        } else if((get>-1)&&(get<10)) {
            if(get>6)get=6;
            Mode = get;
            printf("%s \r\n",modename[get]);
            mot.Setup(get);
            break;
        }
    }
}
void motor_setting_menu()
{
    char data[10];
    printf("%s setting menu\r\n",modename[Mode]);

    float a;
    switch(Mode) {
        case 1:
            printf("Input Duty -1~1\r\n");
            do {
                InputData(data);
                a=atof(data);
            } while(a<-1||a>1);
            mot=a;
            break;
        case 2:
            printf("Input Target -65535~65535\r\n");
            do {
                InputData(data);
                a=atoi(data);
            } while(a<-65535/2||a>65535/2);
            mot = a;
            break;
        case 3:
            printf("Input P 0~25.5\r\n");
            do {
                InputData(data);
                a=atof(data);
            } while(a<0||a>25.5);
            mot.SetP(a);
            printf("Input I 0~25.5\r\n");
            do {
                InputData(data);
                a=atof(data);
            } while(a<0||a>25.5);
            mot.SetI(a);
            printf("Input D 0~25.5\r\n");
            do {
                InputData(data);
                a=atof(data);
            } while(a<0||a>25.5);
            mot.SetD(atof(data));

            printf("Input Target -65535~65535\r\n");
            do {
                InputData(data);
                a=atoi(data);
            } while(a<=-65535/2||a>=65535/2);
            mot=a;
            break;
        case 4:
            printf("Input Target -65535~65535\r\n");
            do {
                InputData(data);
                a=atoi(data);
            } while(a<=-65535/2||a>=65535/2);
            mot = a;
            break;
        case 5:
            printf("Input P 0~25.5\r\n");
            do {
                InputData(data);
                a=atof(data);
            } while(a<0||a>25.5);
            mot.SetP(a);
            printf("Input I 0~25.5\r\n");
            do {
                InputData(data);
                a=atof(data);
            } while(a<0||a>25.5);
            mot.SetI(a);
            printf("Input D 0~25.5\r\n");
            do {
                InputData(data);
                a=atof(data);
            } while(a<0||a>25.5);
            mot.SetD(a);
            printf("Input Target -65535~65535\r\n");
            do {
                InputData(data);
                a=atoi(data);
            } while(a<-65535/2||a>65535/2);
            mot = a;
            break;
        case 6:
            printf("Nothing setting\r\n");
    }
}
#define Lengh 4
char *menu[Lengh]= {"I2c slave address set","Motor setting","Debug mode","Set Use Address"};
int main_menu(bool add_f)
{
    int data;
    char *X;
    int i=add_f;
    while(1) {

        printf("\r%s\r",menu[i]);
        wait(0.2);
        data=pc.getc();
        if(data == 13)return i;
        X=menu[i];
        while(*X++)pc.putc(' ');
        do {
            if(279165==data || i<Lengh) {
                //up
                i++;
                if(i==Lengh)i=0;
            }
            if(279166==data || i<0) {
                //down
                i--;
                if(i<0)i=Lengh;
            }
        } while(add_f==1&&i==0);
    }
}
void set_address()
{
    char data[10];
    char a=2;
    printf("Let set address.\r\n");
    printf("2~254 *add%%2==0\r\n");
    do {
        InputData(data);
        a=atoi(data);
    } while(a<2||a>254 || a%2==1);
    mot.UseAddress(mot.SetAddress(a));
    
}
void use_address()
{
    char a=2;
    char data[10];
    printf("What number set address.\r\n");
    do {
        InputData(data);
        a=atoi(data);
    } while(a<2||a>254 || a%2==1);
    mot.UseAddress(a);
}
bool flagdata=0;
bool ff=0;

char *debugRe[7][3]= {{},{"state","duty","No debug data"},{"point","mypoint","Difference"},{"point","mypoint","Amount of work"},{"point","mypoint","Difference"},{"point","mypoint","Amount of work"}};
void debug_menu_mode()
{
    int i=0,count;
    if(Mode==0) {
        printf("\nNot need Debug.\r\n");
        return;
    }
    i=Mode;
    ff=1;
    printf("\n");
    float debug[3];
    while(!flagdata) {
        if(pc.readable ()) {
            float a=0;
            char data[10];
            int ind=pc.getc();
            if(ind==13)break;
            if(ind=='p') {
                printf("P:");
                do {
                    InputData(data);
                    a=atof(data);
                } while(a<0||a>25.5);
                mot.SetP(a);
            }
            if(ind=='i') {
                printf("I:");
                do {
                    InputData(data);
                    a=atof(data);
                } while(a<0||a>25.5);
                mot.SetI(a);
            }
            if(ind=='d') {
                printf("D:");
                do {
                    InputData(data);
                    a=atof(data);
                } while(a<0||a>25.5);
                mot.SetD(a);
            }
        }
        if(count==20) {
            printf("%10s  %10s  %10s\r\n",debugRe[i][0],debugRe[i][1],debugRe[i][2]);
            count=0;
        }
        mot.GetDebugData(debug,i);
        printf("%10f  %10f  %10f\r\n",debug[0],debug[1],debug[2]);
        wait(0.2);
        count++;
    }
    ff=0;

}
int main()
{
    /*
    int  r;
    r   = iap.blank_check( TARGET_SECTOR, TARGET_SECTOR );
    if ( r == SECTOR_NOT_BLANK ) {
        iap.prepare( TARGET_SECTOR, TARGET_SECTOR );
        r   = iap.erase( TARGET_SECTOR, TARGET_SECTOR );
    }
    iap.prepare( TARGET_SECTOR, TARGET_SECTOR );
    r   = iap.write( mem, sector_start_adress[ TARGET_SECTOR ], MEM_SIZE );
    r   = iap.compare( mem, sector_start_adress[ TARGET_SECTOR ], MEM_SIZE );

    iap.prepare( TARGET_SECTOR, TARGET_SECTOR );
    */
    bool addr_f=0;
    mot.StartQEIPut();
main_menu_select:
    switch(main_menu(addr_f)) {
        case 0:
            set_address();
            addr_f=1;
            mot.SetRate(1);
            goto main_menu_select;
        case 1:
            goto motor_mode_select;
        case 2:
            goto debug_menu;
        case 3:
            use_address();    
            goto main_menu_select;
    }
debug_menu:
    debug_menu_mode();
    goto main_menu_select;
motor_mode_select:
    motor_select_mode_menu();
    goto motor_setting;
motor_setting:
    motor_setting_menu();
    goto main_menu_select;
}