// $Source: /usr/local/SimSoft/Sfx3D/src/gsl/programm.h,v $
// $Revision: 1.2 $
// $Author: baum $
// $Date: 2001/11/29 15:18:09 $
//
// Login name of the user who locked the revision
// $Locker:  $
// Tag name used to checkout the file
// $Name:  $
// State assigned to revision
// $State: Exp $
//
//
// $Log: programm.h,v $
// Revision 1.2  2001/11/29 15:18:09  baum
// -Realzeitsteuerung eingebaut
// -Handsteuerung eingebaut
//

#ifndef _PROGRAMM_H
#define _PROGRAMM_H  1

#include "DynArray.h"

#include "Kalender.h"
#include "execontx.h"

#include "baustein.h"
#include "maschine.h"

#ifdef _PROGRAMM_CPP
#  undef _impexp
#  define _impexp __declspec(dllexport)
#elif defined BUILD_MAIN_DLL
#  undef _impexp
#  define _impexp 
#else
#  undef _impexp
#  define _impexp __declspec(dllimport)
#endif

#if defined __GNUC__ || defined __hpux
#  undef _impexp
#  define _impexp
#endif

//---------------------------------------------------------
// some general stuff
//---------------------------------------------------------

typedef void PrgFunc ();
/*< Rudi: 24-09-03: Deklaration zum Aufruf einer Funktion in der C-Schnittstelle. KWF-Projekt.*/
typedef typBaustein* ( * PrgFunc_typBaustein ) (typTransportEinheit*);
typedef int ( * PrgFunc_void ) (int);//miro 09.10.2003 13:40


class  typDLhandler;
struct ProgInfo;
struct EventInfo;
class  UserProg;

//---------------------------------------------------------
// Klasse typPrgModul
//---------------------------------------------------------

class _impexp typPrgModul {
  public:
    typPrgModul  (char* dllname, char* stackaddr);
    ~typPrgModul ();

    typBaustein* getProgBst () const;

    int callPrgFunc (char *name);
    /*< Rudi: 24-09-03: Deklaration zum Aufruf einer Funktion in der C-Schnittstelle. KWF-Projekt.
        Rueckgabe ist _TYP-Angabe. */
    typBaustein* callPrgFunc_typBaustein (char *name, typTransportEinheit *zTE);
    int callPrgFunc_void (char *name, int BstNr);//miro 09.10.2003 13:40

    void installProg (int nr);
    int removeProg   (int nr);
    PrgFunc *getProg (int nr);
    void startProg   (int bstnr, int nr, char* stackaddr);

    void installEvent (int etyp, int bstnr, char* name);
    int removeEvent   (int etyp, int bstnr);
    PrgFunc* getEvent (int etyp, int bstnr);
    int checkEvent    (int etyp, int bstnr, char* stackaddr);

    void interruptUserProg ();
    int  continueUserProg  (UserProg*);

  private:
    typDLhandler* ObjDLhandler;

    // globaler Context fuer Stack von ::main()
    ExeContxt ObjGlobalContxt;

    UserProg* ObjAktuell;
    DynArray<ProgInfo>  ObjProgArray;
    DynArray<EventInfo> ObjEventArray;

    static int ClassCreated;

    // deklariert aber nicht implementiert
    typPrgModul ();
    typPrgModul (const typPrgModul&);
    typPrgModul& operator = (const typPrgModul&);

  friend class UserProg;
}; // typPrgModul


_impexp extern typPrgModul* PrgModul;

#endif /* ENDE programm.h */
