premiere ebauche

Dependencies:   mbed PinDetect

speedlimiter.hpp

Committer:
shovelcat
Date:
2018-11-18
Revision:
12:cf97590d9df2
Parent:
10:f0b382368614
Child:
13:47806f4dbfcd

File content as of revision 12:cf97590d9df2:

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

#include "mbed.h"
#include "recommendedspeed.hpp"

class SpeedLimiter
{
public:

    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;

    SpeedLimiter(const PinName& pedalInHi, const PinName& pedalInLo, const PinName& pedalOutHi, const PinName& pedalOutLo);
    ~SpeedLimiter();

    void ipControllerTransferFunction();

    inline float getReferenceSpeed(bool increment = false) {
        //float retval = _referenceSpeed;
        Segment& segment = _parcours->getSegment();
        float retval = segment.getSpeed();
        if (increment)
        {
            segment.incrementIndex();
        }
        return retval;
    }
    inline float getMeasuredSpeed() {
        float retval = _measuredSpeed;
        return retval;
    }
    inline void setReferenceSpeed(const float speed) {
        _referenceSpeed = speed;
    }
    inline void setMeasuredSpeed(const float speed) {
        _measuredSpeed = speed;
    }
    
    inline void setParcours(Parcours* parcours) {
        _parcours = parcours;
    }

    float ecoEnabledAlgorithm();
    
    inline float readAdcTest() {
        AnalogIn adc(PF_3);
        return adc.read();
    }
    
private:
    float readAdcPedalHi();
    float readAdcPedalLo();
    void writeAdcPedalHi(const float voltage);
    void writeAdcPedalLo(const float voltage);
    float ecoDisabledAlgorithm();

    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;
    
    Parcours *_parcours;

    static Serial* pc; // for communication / debugging
};

#endif