premiere ebauche

Dependencies:   mbed PinDetect

speedlimiter.hpp

Committer:
shovelcat
Date:
2018-10-18
Revision:
3:4da392d2bae8
Parent:
2:06f128641b62
Child:
4:a8c9f6a13633

File content as of revision 3:4da392d2bae8:

/*
author: Sebastian Pelchat
date: october 2018
*/
#ifndef SPEED_LIMITER_HPP
#define SPEED_LIMITER_HPP

#include "mbed.h"

class SpeedLimiter
{
    static const float TRANSFER_FUNCTION_PERIOD = 0.1; // seconds
    static const float DISABLE_ECO_ALGO_TRIGGER = 999; // TODO: probably defined somewhere else.

    static const float ADC_INPUT_MAX_VALUE = 3.3; // Volts
    static const float ADC_OUTPUT_MAX_VALUE = 3.3; // Volts

    static const float PEDAL_HI_MIN_VALUE = 0.48; // Volts
    static const float PEDAL_HI_MAX_VALUE = 2.96; // Volts
    static const float PEDAL_LO_MIN_VALUE = PEDAL_HI_MIN_VALUE / 2;
    static const float PEDAL_LO_MAX_VALUE = PEDAL_HI_MAX_VALUE / 2;
    
    static const float TORQUE_MAX = 20.0; // Newtons
    
    static const float SPEED_MAX = 40.0;

public:
    SpeedLimiter(const PinName& pedalInHi, const PinName& pedalInLo, const PinName& pedalOutHi, const PinName& pedalOutLo);
    ~SpeedLimiter();
    void start();

    inline float getReferenceSpeed() {
        _mutex->lock();
        float retval = _referenceSpeed;
        _mutex->unlock();
        return retval;
    }
    inline float getMeasuredSpeed() {
        _mutex->lock();
        float retval = _measuredSpeed;
        _mutex->unlock();
        return retval;
    }
    inline void setReferenceSpeed(const float speed) {
        _mutex->lock();
        _referenceSpeed = speed;
        _mutex->unlock();
    }
    inline void setMeasuredSpeed(const float speed) {
        _mutex->lock();
        _measuredSpeed = speed;
        _mutex->unlock();
    }
    
    
    
private:
    float readAdcPedalHi();
    float readAdcPedalLo();
    void writeAdcPedalHi(const float voltage);
    void writeAdcPedalLo(const float voltage);
    float ecoDisabledAlgorithm();
    float ecoEnabledAlgorithm();
    void tickerCallback();
    void ipControllerTransferFunction();
    
    float boundValue(float value, const float lowerBound, const float upperBound);
    float voltageToDecimal(const float decimal, const float reference);
    
    inline void setOutputPedalVoltageHi(const float voltage) {
        _outputPedalVoltageHi = voltage;
    }
    inline void setOutputPedalVoltageLo(const float voltage) {
        _outputPedalVoltageLo = voltage;
    }
    inline float getOutputPedalVoltageHi() {
        return _outputPedalVoltageHi;
    }
    inline float getOutputPedalVoltageLo() {
        return _outputPedalVoltageLo;
    }

protected:
    AnalogIn    _pedalInHi;
    AnalogIn    _pedalInLo;
    AnalogOut   _pedalOutHi;
    AnalogOut   _pedalOutLo;

    volatile float _referenceSpeed;
    volatile float _measuredSpeed;
    volatile float _outputPedalVoltageHi;
    volatile float _outputPedalVoltageLo;

    Ticker* _ticker;
    Mutex* _mutex;
    
    static Serial* pc; // for communication / debugging
};

#endif