Code for autonomous rover for Sparkfun AVC. DataBus won 3rd in 2012 and the same code was used on Troubled Child, a 1986 Jeep Grand Wagoneer to win 1st in 2014.

Dependencies:   mbed Watchdog SDFileSystem DigoleSerialDisp

Config/Config.cpp

Committer:
shimniok
Date:
2018-11-29
Revision:
9:39c0ff43332b
Parent:
3:42f3821c4e54
Child:
22:dc54ca6e6eec

File content as of revision 9:39c0ff43332b:

#define MAXBUF 64

#include "Config.h"
#include "SDFileSystem.h"
#include "GeoPosition.h"
#include "globals.h"
#include "util.h"

// Identifiers for each of the parameters
#define CURB            "curb"
#define WAYPOINT        "wpt"
#define GPS             "gps"
#define GYRO            "gyro"
#define MAGNETOMETER    "mag"
#define ACCELEROMETER   "accel"
#define DECLINATION     "decl"
#define NAVIGATION      "nav"
#define STEER           "steer"
#define SPEED           "speed"
#define VEHICLE         "veh"
#define ENCODER         "enc"


Config::Config():
    loaded(false),
    intercept(0),
    waypointDist(0),
    brakeDist(0),
    wptCount(0),
    escMin(1300),
    escZero(1300),
    escMax(1300),
    topSpeed(0),
    turnSpeed(0),
    startSpeed(0),
    minRadius(0),
    speedKp(0),
    speedKi(0),
    speedKd(0),
    steerZero(0),
    steerScale(0),
    curbThreshold(0),
    curbGain(0),
    gyroScale(0),
    // Data Bus Original Settings
    wheelbase(0.280),
    track(0.290),
    tireCirc(0.321537),
    encStripes(32)
{
    for (int i=0; i < MAX_WPT; i++) {
        wptTopSpeedAdj[i] = 0;
        wptTurnSpeedAdj[i] = 0;
    }
    for (int i=0; i < 3; i++) {
        magOffset[i] = 0;
        magScale[i] = 0;
    }
}

// load configuration from filesystem
bool Config::load(const char *filename)
{
    FILE *fp;
    char buf[MAXBUF];   // buffer to read in data
    char tmp[MAXBUF];   // temp buffer
    char *p;
    double lat, lon;
    float wTopSpeed, wTurnSpeed;
    bool declFound = false;
    bool confStatus = false;

    pc.printf("opening config file...\n");
    
    fp = fopen(filename, "r");
    if (fp == 0) {
        pc.puts("Could not open ");
        pc.puts(filename);
        pc.puts(" \n");
    } else {
        wptCount = 0;
        while (!feof(fp)) {
            fgets(buf, MAXBUF-1, fp);
            p = split(tmp, buf, MAXBUF, ',');               // split off the first field

            if (!strcmp(tmp, CURB)) {

                p = split(tmp, p, MAXBUF, ',');             // threshold distance for curb avoid
                curbThreshold = cvstof(tmp);
                p = split(tmp, p, MAXBUF, ',');             // steering gain for curb avoid
                curbGain = cvstof(tmp);

            } else if (!strcmp(tmp, WAYPOINT)) {

                p = split(tmp, p, MAXBUF, ',');             // split off the latitude to tmp
                lat = cvstof(tmp);
                p = split(tmp, p, MAXBUF, ',');             // split off the longitude to tmp
                lon = cvstof(tmp);
                p = split(tmp, p, MAXBUF, ',');             // split off the waypoint top speed
                wTopSpeed = cvstof(tmp);
                p = split(tmp, p, MAXBUF, ',');             // split off the waypoint turn speed
                wTurnSpeed = cvstof(tmp);
                if (wptCount < MAXWPT) {
                    wpt[wptCount].set(lat, lon);            // set position
                    wptTopSpeedAdj[wptCount] = wTopSpeed;   // set top speed adjust
                    wptTurnSpeedAdj[wptCount] = wTurnSpeed; // set turn speed adjust
                    wptCount++;
                }

            } else if (!strcmp(tmp, NAVIGATION)) {

                p = split(tmp, p, MAXBUF, ',');
                intercept = (float) cvstof(tmp);        // intercept distance for steering algorithm
                p = split(tmp, p, MAXBUF, ',');
                waypointDist = (float) cvstof(tmp);         // distance before waypoint switch
                p = split(tmp, p, MAXBUF, ',');
                brakeDist = (float) cvstof(tmp);            // distance at which braking starts
                p = split(tmp, p, MAXBUF, ',');
                minRadius = (float) cvstof(tmp);            // minimum turning radius

            } else if (!strcmp(tmp, STEER)) {

                p = split(tmp, p, MAXBUF, ',');
                steerZero = cvstof(tmp);                    // servo center setting
                p = split(tmp, p, MAXBUF, ',');
                steerScale = cvstof(tmp);                   // steering angle conversion factor

            } else if (!strcmp(tmp, SPEED)) {

                p = split(tmp, p, MAXBUF, ',');
                escMin = cvstof(tmp);                       // minimum esc (brake) setting
                p = split(tmp, p, MAXBUF, ',');
                escZero = cvstof(tmp);                      // esc center/zero setting
                p = split(tmp, p, MAXBUF, ',');
                escMax = cvstof(tmp);                       // maximum esc setting
                p = split(tmp, p, MAXBUF, ',');
                topSpeed = cvstof(tmp);                     // desired top speed
                p = split(tmp, p, MAXBUF, ',');
                turnSpeed = cvstof(tmp);                    // speed to use when turning
                p = split(tmp, p, MAXBUF, ',');
                startSpeed = cvstof(tmp);                   // speed to use at start
                p = split(tmp, p, MAXBUF, ',');
                speedKp = cvstof(tmp);                      // speed PID: proportional gain
                p = split(tmp, p, MAXBUF, ',');
                speedKi = cvstof(tmp);                      // speed PID: integral gain
                p = split(tmp, p, MAXBUF, ',');
                speedKd = cvstof(tmp);                      // speed PID: derivative gain

            } else if (!strcmp(tmp, VEHICLE)) {
                p = split(tmp, p, MAXBUF, ',');
                wheelbase = cvstof(tmp);                    // vehicle wheelbase (front to rear axle)
                p = split(tmp, p, MAXBUF, ',');
                track = cvstof(tmp);                        // vehicle track width (left to right)
            } else if (!strcmp(tmp, ENCODER)) {
                p = split(tmp, p, MAXBUF, ',');
                tireCirc = cvstof(tmp);                     // tire circumference
                p = split(tmp, p, MAXBUF, ',');
                encStripes = atoi(tmp);                     // ticks per revolution
            } else if (!strcmp(tmp, GYRO)) {
                p = split(tmp, p, MAXBUF, ',');             // split off the declination to tmp
                gyroScale = cvstof(tmp);            // gyro scaling factor to deg/sec
            } else if (!strcmp(tmp, GPS)) {
                p = split(tmp, p, MAXBUF, ',');
                gpsValidSpeed = cvstof(tmp);
            } //if-else
            /* else if (!strcmp(tmp, DECLINATION)) {
                p = split(tmp, p, MAXBUF, ',');     // split off the declination to tmp
                declination = (float) cvstof(tmp);
                declFound = true;
            } else if (!strcmp(tmp, MAGNETOMETER)) {
                for (int i=0; i < 3; i++) {
                    p = split(tmp, p, MAXBUF, ',');
                    magOffset[i] = (float) cvstof(tmp);
                    pc.printf("magOffset[%d]: %.2f\n", i, magOffset[i]);
                }
                for (int i=0; i < 3; i++) {
                    p = split(tmp, p, MAXBUF, ',');
                    magScale[i] = (float) cvstof(tmp);
                    pc.printf("magScale[%d]: %.2f\n", i, magScale[i]);
                }
            }
            */
        } // while

        // Did we get the values we were looking for?
        if (wptCount > 0 && declFound) {
            confStatus = true;
        }
        
    } // if fp
    
    if (fp != 0)
        fclose(fp);

    loaded = confStatus;

    return confStatus;
}