#ifndef LEARN_AT____LEARN____THROTTLE_HPP_
#define LEARN_AT____LEARN____THROTTLE_HPP_

// /home/siemens/bip/examples/sync_lec/learn.bip:108:1
// include package "master" header
#include <learn.hpp>

#include <Atom.hpp>

// User include given in @cpp annotation
#include <utilities.hpp>

#include <learn/AtomIPort__learn__intPort.hpp>


#include <learn/AtomEPort__learn__intPort.hpp>

#include <learn/PV__learn__intPort.hpp>



class AT__learn__Throttle : public Atom {
private:
   // internal ports & associated port values
    AtomIPort__learn__intPort &_iport_decl__throttle;
    PV__learn__intPort _iport_decl_pv__throttle;
    AtomIPort__learn__intPort &_iport_decl__changeSpeed;
    PV__learn__intPort _iport_decl_pv__changeSpeed;

    // exported ports
    AtomEPort__learn__intPort &_eport_decl__throttle;
    AtomEPort__learn__intPort &_eport_decl__changeSpeed;
public:
    AT__learn__Throttle(const string &name , AtomIPort__learn__intPort &_iport_decl__throttle, AtomIPort__learn__intPort &_iport_decl__changeSpeed
                             
                             , AtomEPort__learn__intPort &_eport_decl__throttle, AtomEPort__learn__intPort &_eport_decl__changeSpeed
                             
                             );
    virtual ~AT__learn__Throttle();

    virtual BipError& execute(PortValue &portValue);
    virtual BipError& execute(AtomExternalPort &portValue);
    virtual BipError& initialize();
    virtual string toString() const;

protected:
    BipError& update();

    BipError& executeInternalTransitions();
    BipError& checkInvariants();

    const static size_t bvector_size = 2/(8*sizeof(int))+((2%(8*sizeof(int))) > 0 ? 1 : 0);
    int __statesbv[ bvector_size ];

    // component data declarations
    int _id__deltaSpeed;

    // enabledness of transitions
    bool _transguard__1;
    bool _transguard__2;

    // index of the latest executed transition
    int __previous;

    bool atIdle() const;
    bool toIdle();
    bool fromIdle();
    bool atAction() const;
    bool toAction();
    bool fromAction();
};

#endif // LEARN_AT____LEARN____THROTTLE_HPP_
