use for experiment before the demonstration at open-campus

Dependencies:   FEP ikarashiMDC omni PID R1370

Fork of omni_sample by NagaokaRoboticsClub_mbedTeam

main.cpp

Committer:
tknara
Date:
2017-08-31
Revision:
7:ef72ec7390c2
Parent:
6:259deb365510
Child:
8:244c057d195c

File content as of revision 7:ef72ec7390c2:

#include "mbed.h"
#include "omni.h"
#include "ikarashiMDC.h"
#include "pin_config.h"
#include "FEP.h"

#define DEBUG 
Omni omni(4);
Serial serial(PC_12,PD_2);
DigitalOut serialcontrol(D2);
FEP fep(PC_10,PC_11,200);
DigitalOut leds[4] = {PC_13,PC_14,PC_15,PA_0};
DigitalOut attack[2] = {PA_10,PC_4};
DigitalOut angle[2] = {PB_3,PB_5};
#ifdef DEBUG
    Serial pc(USBTX,USBRX,115200);
#endif 
ikarashiMDC wheels[] {
    ikarashiMDC(&serialcontrol,0,0,SM,&serial),
    ikarashiMDC(&serialcontrol,1,0,SM,&serial),
    ikarashiMDC(&serialcontrol,1,4,SM,&serial),
    ikarashiMDC(&serialcontrol,0,4,SM,&serial)
};
ikarashiMDC lift[] {
    ikarashiMDC(&serialcontrol,1,2,SM,&serial)
};
void init()
{
    omni.setWheelRadian(PI/4,3*PI/4,5*PI/4,7*PI/4);
    for(int i = 0;i<4;i++) {
        leds[i] = 0;
    }
}
void AllActuatorStop()
{
#ifdef DEBUG
    pc.printf("All actuators stop\n");
#endif
    for(int i=0;i<1;i++)
    {
        attack[i]=0;
        angle[i]=0;
    }
}
int main()
{   
    bool airFlag1=0,airFlag2=0,airStatus1=0,airStatus2=0;
    char data[10] = { 0 };
    int  i, error_val = 0, tem[2] = {0}, Button1[7] = { 0 }, Button2[6] = { 0 };
    uint8_t fep_temp;
    double stick[4] = { 0 };
    double pwm = 0.0;
    
    while(1) {
        fep_temp=fep.read(data,6);
        if(fep_temp==0) {

#ifdef DEBUG
            pc.printf("Recieve succeeded,%s\r\n",data);
#endif

            error_val = 0;
            leds[0] = 0;
            tem[0] = data[4];
            tem[1] = data[5];
            for(i = 0; i < 4; i++) stick[i] = -1*(data[i]-128)/128.0;
            for(i = 0; i < 7; i++) {
                Button1[i] = tem[0] % 2;
                tem[0] /= 2;

#ifdef DEBUG
                pc.printf("%d,",Button1[i]);
#endif

            }
            pc.printf("\n");
            for(i = 0; i < 6; i++) {
                Button2[i] = tem[1] % 2;
                tem[1] /= 2;

#ifdef DEBUG
                pc.printf("%d,",Button2[i]);
#endif
            }

#ifdef DEBUG
            for(i=0;i < 4; i++) {
                pc.printf("%d,",data[i]);
            }
            pc.printf("\r\n");
#endif 
        } else if(fep_temp==FEP_NO_RESPONSE) {

#ifdef DEBUG
            pc.printf("No response\r\n");
#endif
            leds[0] = 1;
            continue;
        } else {

#ifdef DEBUG
            pc.printf("Recieve failed\r\n");
#endif
            leds[0] = 1;
            error_val++;
        }
        if(error_val < 4) {
            omni.computeXY(data[3],data[2],data[0]);           
            for(int i = 0; i < 4; i++) {
                wheels[i].setSpeed(omni.getOutput(i));
            }
            //昇降
            if(Button1[0] == 1 && Button1[1] == 0) {
                pwm = 0.9;
            } else if(Button1[0] == 0 && Button1[1] == 1) {
                pwm = -0.9;
            } else {
                pwm = -0.0;
            }
            lift[0].setSpeed(pwm);
            //アーム攻撃(toggle)
            if((Button2[1]==0)&&(airFlag1 == 0))
            {
                if(airStatus1==1) {
                    attack[0]=0;
                    attack[1]=1;
                    airFlag1=1;
                    airStatus1=0;
                }else if(airStatus1==0) {
                    attack[0]=1;
                    attack[1]=0;
                    airFlag1=1;
                    airStatus1=1;
                }                   
            }else if(Button2[1]==1){
                airFlag1=0;
                attack[0]=0;
                attack[1]=0;    
            }
            //アーム角度(toggle)
            if((Button2[3]==0)&&(airFlag2 == 0))
            {
                if(airStatus2==1) {
                    angle[0]=0;
                    angle[1]=1;
                    airFlag2=1;
                    airStatus2=0;
                }else if(airStatus2==0) {
                    angle[0]=1;
                    angle[1]=0;
                    airFlag2=1;
                    airStatus2=1;
                }                   
            }else if(Button2[3]==1){
                airFlag2=0;
                angle[0]=0;
                angle[1]=0;    
            }
#ifdef DEBUG
            printf("Status of airFlags %d,%d\r\n",airStatus1,airStatus2);
#endif
        } else if((fep_temp==FEP_NO_RESPONSE)&&(error_val > 4)){
            AllActuatorStop();
        } else {
            AllActuatorStop();
        }
    }
}