Firmware for an Android accessory electric bicycle. See http://www.danielcasner.org/tag/ebike/ for some more information on my build.

Dependencies:   AndroidAccessory mbed

throttle.cpp

Committer:
DanielC
Date:
2012-08-25
Revision:
3:dc564aaf8a81
Parent:
2:e2c3c7340fb3

File content as of revision 3:dc564aaf8a81:

#include "throttle.h"

AnalogIn gripThrottle(p17);
AnalogOut throttleOut(p18); 
DigitalIn gripButton(p6);

Throttle* Throttle::instance = NULL;

Throttle *Throttle::getThrottle(float *I, float *v_f, float *v_r, float *cadence, AnalogIn* break_l, AnalogIn *break_r) {
    if (instance == NULL) {
        instance = new Throttle(I, v_f, v_r, cadence, break_l, break_r);
    }
    return instance;
}

Throttle::Throttle(float *I, float *v_f, float *v_r, float *cadence, AnalogIn* break_l, AnalogIn *break_r) :
                   mode(off), state(waiting),
                   I(I), v_f(v_f), v_r(v_r), cadence(cadence),
                   brkl(break_l), brkr(break_r),
                   target(0.0f), iLimit(0.0f), speedLimit(0.0f),
                   enforceSpeedLimit(false)
                   {
    throttleOut = 0.0f;
    gripButton.mode(PullUp);
    tick.attach(this, &Throttle::onTick, 0.001);
}

Throttle::~Throttle() {
    tick.detach();
    throttleOut = 0.0f;
}

void Throttle::onTick() {
    if (brkl->read() < break_inhibit_threshold && brkr->read() < break_inhibit_threshold) {
        switch(mode) {
        case off:
            throttleOut = 0.0f;
            break;
        case raw:
            throttleOut = gripThrottle;
            break;
        case cruise_raw:
            throttleOut = target;
            break;
        default:
            throttleOut = 0.0f;
        }
    }
    else {
        state = inhibited;
    }
}

void Throttle::setMode(ThrottleMode m) { mode = m; }

void Throttle::setILimit(float I) { iLimit = I; }

void Throttle::setSpeedLimit(float v, bool enforce) {
    speedLimit = v;
    enforceSpeedLimit = enforce;
}