re:pub

Dependents:   200_yotsuba_21 200_yotuba_21_uiChange

sensorGen.cpp

Committer:
piroro4560
Date:
2020-02-01
Revision:
2:10fa708a59e1
Parent:
1:c65c5282c05b
Child:
3:91064a3feb31

File content as of revision 2:10fa708a59e1:

#include "sensorGen.h"

sensor::sensor() 
:   camera(pixymosi, pixymiso, pixysclk),
    jy(jysda, jyscl),
    limit(limitPin)
{
    _line[0] = new Line(line1,1500);
    _line[1] = new Line(line2,1500);
    _line[2] = new Line(line3,1500);
    _line[3] = new Line(line4,1500);
    _line[4] = new Line(line5,1500);
    _line[5] = new Line(line6,1500);
    angleCount = 0;
    ballcount = 0;
    bluecount = 0;
    yellowcount = 0;
    jy.calibrateAll(50);
    limit.mode(PullUp);
    thread.start(callback(this,&sensor::sensorloop));
}

void sensor::sensorloop()
{
    while(1)
    {
        rawAngle = jy.getZaxisAngle();
        if(rawAngle > 180.0) rawAngle -= 360;

        angleLimit = rawAngle;
        if((angleLimit - tempAngle) > 300) angleCount -= 1;
        if((tempAngle - angleLimit) > 300) angleCount += 1;
        angle = angleLimit + angleCount * 360.0;         
        tempAngle = angleLimit;
        
        if(camera.ballSignal()) ballcount+=2;
        else ballcount--;
        if(camera.blueSignal()) bluecount+=2;
        else bluecount--;
        if(camera.yellowSignal()) yellowcount+=2;
        else yellowcount--;
        if(ballcount >= 200) ballcount = 200;
        else if(ballcount <= 0) ballcount = 0;
        if(yellowcount >= 200) yellowcount = 200;
        else if(yellowcount <= 0) yellowcount = 0;
        if(bluecount >= 200) bluecount = 200;
        else if(bluecount <= 0) bluecount = 0;
        if((ballcount > 20 )&& ballTimeoutState==0)
        {
            ballTimeout.stop();
            ballTimeout.reset();
            ballx = 168 - camera.ballX();
            bally = 128 - camera.ballY();
        }
        else if(ballTimeoutState == 0)
        {
            ballTimeoutState = 1;
            ballTimeout.start();
        }
        else if(ballTimeout > 0.5)
        {
            ballx = 0;
            bally = 0;
        }
        if(bluecount > 20 && blueTimeoutState==0)
        {
            blueTimeout.stop();
            blueTimeout.reset();
            blueTimeoutState = 0;
            bluex = 168 - camera.blueX();
            bluey = 128 - camera.blueY();
        }
        else if(blueTimeoutState == 0)
        {
            blueTimeoutState = 1;
            blueTimeout.start();
        }
        else if(blueTimeout > 0.5)
        {
            bluex = 0;
            bluey = 0;
        }
        if(yellowcount > 20 && yellowTimeoutState == 0)
        {
            yellowTimeout.stop();
            yellowTimeout.reset();
            yellowTimeoutState = 0;
            yellowx = 168 - camera.yellowX();
            yellowy = 128 - camera.yellowY();
        }
        else if(yellowTimeoutState == 0)
        {
            yellowTimeoutState = 1;
            yellowTimeout.start();
        }
        else if(yellowTimeout > 0.5)
        {
            yellowx = 0;
            yellowy = 0;
        }
        
        ballAngle = atan2(ballx,bally) * -180/PI;
        ballRange = hypot(ballx,bally);
        blueAngle = atan2(bluex,bluey) * -180/PI;
        blueRange = hypot(bluex,bluey);
        yellowAngle = atan2(yellowx,yellowy) * -180/PI;
        yellowRange = hypot(yellowx,yellowy);
        
        for(int i=0; i < 6; i++) line[i] = _line[i]->judg();
        ballKeep = !limit;
        if (ballKeep && (ballkeepcount < 200)) {
            ballkeepcount++;
        } else if(ballkeepcount > 0) {
            ballkeepcount--;
        }
        ThisThread::sleep_for(1000.0/300.0);
    }

}