DERPS

Dependencies:   BMP280 BNO055_fusion PowerControl mbed

Fork of STRAIGHT_DRIVE_NO_SEP by Antoine Laurens

main.cpp

Committer:
12104404
Date:
2016-04-27
Revision:
39:ecc9defe3dc0
Parent:
38:16208e003dc9

File content as of revision 39:ecc9defe3dc0:

#include "LOCALIZE.h"
#include "LOCOMOTION.h"
#include "SAFETY.h"
#include "BMP280.h"

#define WATCHDOG_TIME   10
//#define PC_MODE         1
#define IMPELLER_OFF    1000
#define IMPELLER_SPEED  1285
#define IMPELLER_STEPS  5
#define IMPELLER_STEP   ((IMPELLER_SPEED-IMPELLER_OFF)/IMPELLER_STEPS)

#if defined (PC_MODE)
Serial pc(USBTX, USBRX);
#else
Serial pc(p13, p14);
Ticker t;
void send();
#endif

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);

SAFETY safe;
PwmOut suction(p26);
I2C i2c2(p28, p27);
I2C i2c1(p9, p10);
BMP280 pres(i2c2);
LOCALIZE loc(i2c1, i2c2, p29, p5, p6, p7, p8, led1, led2, led3, led4);
LOCALIZE_xya xya;
LOCOMOTION motion(p11, p23, p24, p21, p22, p16, p15, led1, led2, led3, led4);

void BrownOut();

int xTarget=FRAME_W;
int angle_error=1;
bool xGood=false;
bool yGood=false;
bool angleGood=false;
int angleTarget=355;
int pressure;
int cmd=-1;

int main()
{
    //Set ESC Period
    suction.period_ms(2);
    //Initialize to 0
    suction.pulsewidth_us(1000);
    wait(2);
    //Watchdog Reset Indicator
    if ((LPC_WDT->WDMOD>>2)&1)
        led4=1;
    else
        led3=1;
    //Start Watchdog
    safe.kick(WATCHDOG_TIME);
    //Power Down Ethernet and USB and Enable Brown Out Interrupt
    safe.init((unsigned)BrownOut);
    //Serial Baudrate
    pc.baud(9600);
    //Initialize Locomotion
    loc.init();
    //pres.initialize();
    //Attach Periodic Wireless Printing
#if not defined(PC_MODE)
    pc.attach(&callback);
    t.attach(&send,1);
#endif
    led1=0;
    led2=0;
    led3=0;
    led4=0;
    for(int i=0; i<IMPELLER_STEPS; i++) {
        suction.pulsewidth_us((i*IMPELLER_STEP)+IMPELLER_OFF);
        wait(0.5);
    }
    while(1) {
        suction.pulsewidth_us(1285);
        //Finish
        if (xya.y>FRAME_H*0.75) {
            while(1) {
                uint8_t i=0;
                suction.pulsewidth_us(1285);
                motion.mStop();
                led1= (i & (1<<0))>>0;
                led2= (i & (1<<1))>>1;
                led3= (i & (1<<2))>>2;
                led4= (i & (1<<3))>>3;
                i++;
                safe.kick();
            }
        }
        loc.get_xy(&xya);
        xGood=motion.setXPos(xTarget,xya.x,2,0);
        if(!xGood)
            motion.setAngle(angleTarget,xya.a,angle_error,ANGLE_BIAS);
        else {
            xTarget=(xTarget==FRAME_W)?0:FRAME_W;
            angleTarget=(angleTarget==5)?-5:5;
        }
#if defined(PC_MODE)
        pc.printf("X: %3d\tY: %3d\tP: %3d\txGood: %d\tAngleGood: %d\tState: %d \n",xya.y,yTarget,xya.a,xGood,angleGood,xState);
#endif
        //Feed the dog
        safe.kick();
    }
}

void callback()
{
    __disable_irq();
    while(pc.readable()==1)
        cmd=pc.getc();
    switch(cmd) {
        case 2:
            
        break;
        default:
        break;        
    }
    __enable_irq();
}

void send()
{
    if(pc.readable()==0) {
        //Print over serial port to WiFi MCU
        pc.printf("%c%c%c%c\n",(char)xya.x,(char)xya.y,xya.a/10,xya.a%10);
    }
}

void BrownOut()
{
    //Stop Motors and Driver
    motion.eStop();
    //Ensure suction on
    suction.pulsewidth_us(1250);
    //Light Up Error Light Pattern
    led1=1;
    led2=0;
    led3=1;
    led4=0;
    //Power Down Non Essential
    Peripheral_PowerDown(~(LPC1768_PCONP_PCPWM1 | LPC1768_PCONP_PCGPIO));
    //Sleep wake by interrupt
    //Sleep();
}