PiSlingers library for AHRC competitions

Beacon.cpp

Committer:
mpanetta
Date:
2012-11-03
Revision:
2:a9351d7f92b4
Parent:
0:d4427d048a98

File content as of revision 2:a9351d7f92b4:

#include "Beacon.h"
#include "MODSERIAL.h"

uint16_t
Beacon::readAndAverageR(int times)
{
    int32_t avg = 0;
    int i;
    
    for (i = 0; i < times; i++)
    {
        avg += ainR.read_u16();
    }
    
    return (avg / times);
}

uint16_t
Beacon::readAndAverageL(int times)
{
    int32_t avg = 0;
    int i;
    
    for (i = 0; i < times; i++)
    {
        avg += ainL.read_u16();
    }
    
    return (avg / times);
}

#define SAMPLES_TO_AVERAGE 8

void
Beacon::calibrate(MODSERIAL * debug)
{
    int32_t absMinL = 65536;
    int32_t absMaxL = 0;
    int32_t absMinR = 65536;
    int32_t absMaxR = 0;
    
    uint16_t readingL;
    uint16_t readingR;
    
    debug->printf("Calibrating offset and gain for beacon.  Turn off all beacons. Press any key when complete.\r\n");
    while ( !debug->readable() )
    {
        wait(0.1);
    }
    debug->rxBufferFlush();
    
    debug->printf("Starting calibration.\r\n");
    debug->printf("Absolute max and min starting values:\r\n");
    debug->printf("\tminL = %d\r\n", absMinL);
    debug->printf("\tmaxL = %d\r\n", absMaxL);
    debug->printf("\tminR = %d\r\n", absMinR);
    debug->printf("\tmaxR = %d\r\n", absMaxR);
    
    debug->printf("\r\nReading and averaging %d readings for left channel no beacon:\r\n", SAMPLES_TO_AVERAGE);
    readingL = readAndAverageL(SAMPLES_TO_AVERAGE);
    debug->printf("\tLeft channel average (beacon off): %5.5d\r\n", readingL);
    
    debug->printf("\r\nReading and averaging %d readings for right channel no beacon:\r\n", SAMPLES_TO_AVERAGE);
    readingR = readAndAverageR(SAMPLES_TO_AVERAGE);
    debug->printf("\tRight channel average (beacon off): %5.5d\r\n", readingR);
    
    absMinL = readingL;
    absMinR = readingR;
    
    debug->printf("Minimums gathered:\r\n");
    debug->printf("\tminL = %d\r\n", absMinL);
    debug->printf("\tminR = %d\r\n", absMinR);
    
    debug->printf("Power on beacon and place directly in front and center of robot. Press any key to continue.\r\n");
    while ( !debug->readable() )
    {
        debug->printf("rssiL = %d\r\n", readAndAverageL(SAMPLES_TO_AVERAGE));
        debug->printf("rssiR = %d\r\n", readAndAverageR(SAMPLES_TO_AVERAGE));
        wait(1);
    }
    debug->rxBufferFlush();
    
    
    debug->printf("\r\nReading and averaging %d readings for left channel with beacon:\r\n", SAMPLES_TO_AVERAGE);
    readingL = readAndAverageL(SAMPLES_TO_AVERAGE);
    debug->printf("\tLeft channel average (beacon on): %5.5d\r\n", readingL);
    
    debug->printf("\r\nReading and averaging %d readings for right channel with beacon:\r\n", SAMPLES_TO_AVERAGE);
    readingR = readAndAverageR(SAMPLES_TO_AVERAGE);
    debug->printf("\tRight channel average (beacon on): %5.5d\r\n", readingR);
    
    absMaxL = readingL;
    absMaxR = readingR;
    
    debug->printf("Maximums gathered:\r\n");
    debug->printf("\tmaxL = %d\r\n", absMaxL);
    debug->printf("\tmaxR = %d\r\n", absMaxR);
    
    debug->printf("Calculating gains:\r\n");
    gainL = 65535 / (absMaxL - absMinL);
    gainR = 65535 / (absMaxR - absMinR);
    debug->printf("\tLeft  gain = %d\r\n", gainL);
    debug->printf("\tRight gain = %d\r\n", gainR);
    
    debug->printf("Calculating offsets:\r\n");
    offsL = absMinL;
    offsR = absMinR;
    debug->printf("\tLeft  offset = %d\r\n", offsL);
    debug->printf("\tRight offset = %d\r\n", offsR);
    
    debug->printf("Calibration complete! Press any key to continue.\r\n");
    while ( !debug->readable() );
    debug->rxBufferFlush();
}

void
Beacon::scan(void)
{
    int32_t tmpL = readAndAverageL(4) - offsL;
    int32_t tmpR = readAndAverageR(4) - offsR;
    
    if (tmpL < 0) tmpL = 0;
    if (tmpR < 0) tmpR = 0;
    
    valL = (tmpL * gainL) >> 8;
    valR = (tmpR * gainR) >> 8;

//    valL = ainL.read_u16() >> 8;
//    valR = ainR.read_u16() >> 8;

//    valR = ainL.read_u16() >> 8;
//    valL = ainR.read_u16() >> 8;
    
    (valL > valR) ?  max = valL : max = valR;
    
    calc_centeroid();
}

void
Beacon::calc_centeroid(void)
{
    float sumA, sumB;
    
    sumB = (valL * 1) + (valR * 2);
    sumA = valL + valR;
    
    centeroid = sumB / sumA - 1.5f;
}

float
Beacon::get_centeroid(void)
{
    return centeroid;
}

uint16_t
Beacon::get_max_rssi(void)
{
    return max;
}

uint16_t
Beacon::getL(void)
{
    return valL;
}

uint16_t
Beacon::getR(void)
{
    return valR;
}