Subject: kommentiertes m_layer.h
Date: Mon, 15 Mar 1999 23:09:06 +0100 (MET)
From: Jens-Uwe Rumstich 
To: freund@informatik.hu-berlin.de (Sebastian Freund)
CC: hepp@informatik.hu-berlin.de (Derrick Hepp)

#ifndef __M_LAYER_H
#define __M_LAYER_H

#ifdef __cplusplus
extern "C" {
#endif

;  /* delete me, semi colon only here for editor indent ;) */

/*
 * High Level Layer der Motoransteuerung.
 * Funktionen von ausserhalb sollten diese benutzen und nicht die
 * aus m_motcom.h bzw. m_mothw.h
 *
 * mFunctionName  = funktion benutzt den aktivierten Motor
 * mlFunctionName = funktion benutzt den Motor mit der uebergebenen
 *                  MotorID (mid)
 * Achse = ein Motor, der eine bestimmte Achse bewegt
 *
 * Viele hier benutzte Typen werden in comhead.h definiert, auf
 * jeden Fall einmal anschauen.
 * In m_motcom.h stehen einige kurzroutinen!!
 *
 * Kommentare: Jens-Uwe Rumstich, 18. Februar 1999.
 */

/* prototypes for export functions */

/* initialisiere  DLL.
 * TRUE  = initialisierung erfolgreich
 * FALSE = sonst  */
BOOL      WINAPI     mlInitializeMotorsDLL (void);

/* Auswahl der aktiven Axis (Motor).
 * Auswahl des Motors, der danach direkt ueber die mFuntionsname
 * Fumktionen angesprochen wird.
 * Moegliche Eingaben sind die in der enumneration TAxisType (comhead.h)
 * angegebenen werte (??)
 * TRUE  = Auswahl erfolgreich
 * FALSE = Auswahl schlug fehl (z.B. Motor/Axis existiert nicht) */
BOOL       WINAPI    mlSetAxis (int);

/* Ermittle derzeit aktivierte Axe
 * Siehe mlSetAxis fuer mehr */
int        WINAPI    mlGetAxis (void);

/* Returns ID-Number of AxisType.
 * -1 = Fehler, diese Axe wurde noch nicht initialisiert!
 * AxisType might be one of X, Y, Z, Omega, Theta, Phi, Spi, Encoder,
 * Monochromator, Absorber, Collimator, DF, DC, Tilt, Rotation
 * siehe auch comhead.h*/
int        WINAPI    mlGetIdByName (TAxisType);

/* Ermittle Distance des Motors mit der gegebenen Motor ID.
 * TRUE  = Ok, Distanz konnte ermittelt werden
         -> Distanz steht im Double-Parameter!!
 * FALSE = sorry, funktion ging schief */
BOOL       WINAPI    mlGetDistance (int,double&);

/* returns the value of TValueType of the motor.
 * TValueType might be one of : Distance, MinDistance, MaxDistance,
 * Speed, Width. Diese Funktion ermittelt also verschiedene Werte,
 * abhaengig vom Inhalt von TValueType!
 * fuer TValueType siehe auch comhead.h */
double     WINAPI    mlGetValue (int,TValueType);

/* move given motor (mid) to distance (double) */
BOOL       WINAPI    mlMoveToDistance (int,double);

/* Feststellen, ob sich der Motor noch bewegt.
 * TRUE  : motor finished to move (stands still)
           oder befindet sich in einem toten Bereich */
BOOL       WINAPI    mlIsMoveFinish (int);

/* returns Offset (dAngleBias)
 * dAngleBias, Winkel. Bias = Keil, Ueberhang, Neigung
 *Vielleicht Winkel des Motors in Grundstellung??
 * Wenn Offset != 0, dann bezieht sich alles auf relative Null.*/
double     WINAPI    mlGetOffset (int);

/* Umwandeln eines Strings in einen AxisType.
 * Allows more than one name for the same axis type. for example will
 * all of AzimutalRotation, AZ, Rotation and Azimute get to axis type
 * Rotation.
 * wird zum Beispiel ueber mehrere Ecken von ParsingCmd in m_steering.cpp
 * benutzt. useless ?? */
TAxisType   WINAPI   mlParsingAxis (LPSTR);

/* herausfinden, ob eine bestimmte Achse initialisiert wurde
 * TRUE  = Achse wurde bereits initialisiert
 * FALSE = sonst */
BOOL       WINAPI    mlIsAxisValid (TAxisType);

/* wurde Motors.DLL geladen und initialisiert?
 * TRUE  = ja,
 * FALSE = noe */
BOOL       WINAPI    mlIsServerOK (void);

/* Ermitteln der Anzahl der Achsen. (nLastdrive+1)
 * Siehe Definition von GetAxisNumber in m_motcom.h */
int        WINAPI    mlGetAxisNumber (void);

/* Abspeichern der Settings der Motoren in ein File (motors.cpp) */
void       WINAPI    mlSaveModuleSettings (void);

/* Setzen der Defaults fuer Winkel (dAngleBias auf 0 ) und der
 * (erlaubten ?)Winkelbereiche (SetAngleRange). Die Werte brauchen nicht
 * uebergeben zu werden. */
void       WINAPI    mlSetAngleDefault (void);

/* Rueckgabe der Versionsnummer von der m_layer-Schicht */
LPCSTR     WINAPI    mlGetVersion (void);

/* returns instance of module */
HINSTANCE  WINAPI    mlGetInstance (void);

/* move given motor (mid) to distance (double).
 * Die Distanz wird im Bogenmass uebergeben */
BOOL       WINAPI    mMoveToDistance (double);

/* Bewege Motor relative zur aktuellen Position um eine bestimmte Distanz.
 * Distanz wird im Winkelmass uebergeben */
BOOL       WINAPI    mMoveByDistance (double);

BOOL       WINAPI    mSetLine (int,BOOL);

/* Feststellen, ob sich der Motor noch bewegt.
 * TRUE  : motor finished to move (stands still)
           oder befindet sich in einem toten Bereich */
BOOL       WINAPI    mIsMoveFinish (void);

/* Feststellen, ob ein Motor (vielleicht auch nur frueher berechneter
 * Winkel, wird in Translate gesetzt) ausserhalb des erlaubten Bereich
 * ist.
 * TRUE  = Ausserhalb des erlaubten Bereichs, Fehler!
 * FALSE = Innerhalb des erlaubten Bereichs, kein Problem :-) */
BOOL       WINAPI    mIsRangeHit (void);

BOOL       WINAPI    mIsCalibrated (void);

/* TRUE  = WinkelOffset != 0, sprich der Winkel bezieht sich auf
 *         relative Null
 * FALSE = WinkelOffset = 0.*/
BOOL       WINAPI    mIsDistanceRelative (void);

/* Wenn FALSE, dann wird Befehl auf der 812 ignoriert !!!  BUG ??
 * Stoppen des Motors.
 * Der Bool-Wert gibt eventuell an, ob der Motor wieder neu gestartet
 * werden soll. Leider Source ohne Doc nicht lesbar :-(  */
void       WINAPI    mStopDrive (BOOL);

/* Ermittle Distance des Motors mit der gegebenen Motor ID.
 * TRUE  = Ok, Distanz konnte ermittelt werden
         -> Distanz steht im Double-Parameter!!
 * FALSE = sorry, funktion ging schief */
BOOL       WINAPI    mGetDistance (double&);
double     WINAPI    mGetDistanceProcess (void);

/* return the value of TValueType of the motor.
 * TValueType might be one of : Distance, MinDistance, MaxDistance, Speed,
Width  */
double     WINAPI    mGetValue (TValueType);

/* returns Unittype.
 * this might be one of Grad,Minuten,Sekunden,Millimeter,Mikrometer
 * Channel. See comhead.h for deklaration of TUniType */
TUnitType  WINAPI    mGetUnitType (void);

/* set value of a special ValueType. TValueType might be Speed or Width.
 * Distance, MaxDistance, MinDistance allways return false an can not be set!
 * TRUE : Function successfull
 * FALSE: Fuction failed
 * This fuction depends on a LowLevel-Driver to return false/true correctly */
BOOL       WINAPI    mSetValue (TValueType,double);

/* Aktiviere einen Motor (Ansteuerungskarte?)
 * Dieses geschieht direkt auf der Hardware Ebene*/
void       WINAPI    mActivateDrive (void);

/* der Correctionstate wird entweder ON oder OFF (oder 0) geschaltet */
void       WINAPI    mSetCorrectionState (BOOL);

/* was ergibt pCharacteristic ?? */
LPCSTR     WINAPI    mGetAxisName (void);

/* ausgabe von szUnit. Wird aus ini-file ausgelesen */
LPCSTR     WINAPI    mGetAxisUnit (void);

/* rueckgabe eines String. Siehe DFmt in motors.cpp.*/
LPCSTR     WINAPI    mGetDF (void);

/* rueckgabe eines String. Siehe SFmt in motors.cpp */
LPCSTR     WINAPI    mGetSF (void);

/* Setzen der Defaults fuer Winkel (dAngleBias auf 0 ) und der
 * (erlaubten ?)Winkelbereiche (SetAngleRange). Die Werte brauchen nicht
 * uebergeben zu werden. */
vvoid      WINAPI    mSetAngleDefault (void);

/* setzen der relativen Null.
 * Wenn Bool = yes -> der Wert in double wird von Winkel Offset abgezogen.
 *           = no  -> Der Winkel Offset wird auf 0 gesetzt. */
void       WINAPI    mSetRelativeZero (BOOL,double);

/* Ausfuehren des Kommandos in LPSTR direkt auf der Karte/dem Motor.
 *
 * sollte solcherlei direktes Ansprechen der Hardware in diesem
 * High-Level-Layer nicht unmoeglich sein? */
int        WINAPI    mExecuteCmd (LPSTR);

/* Zwischenspeichern von dAngle, dAngleMin, dAngleMax, dAngleWidth und
 * dSpeed. Achtung, es werden eventuell frueher gespeicherte Werte
 * ueberschrieben. Zwischen 2 PushSettings muss also ein PopSettings
 * erfolgen, sonst gehen diese Werte verloren!
 * Frage: ist es wirklich sinnvoll, eine solche Routine nach aussen
 * anzubieten? Sollte so etwas nicht irgendwie abgeschirmt werden?*/
void       WINAPI    mPushSettings (void);

/* Zurueckschreiben der (letzten) mit PushSettings gespeicherten
 * Werte in die entsprechenden Variablen! */
void       WINAPI    mPopSettings (TMParameter);

/* keine ahnung, wird in mSavePosition in m_layer.cpp gesetzt*/
int        WINAPI    mGetMoveFinishIdx (void);

/* Sorry, keine Ahnung. Was ist ein CallBack ?? */
void       CALLBACK  mSavePosition (UINT,UINT,DWORD,DWORD,DWORD);

/* returns the ScanSize.
 * nScanSize is a constant defined in m_layer.h (150 at the moment) */
int        WINAPI    mGetScanSize (void);

/* siehe  m_layer.cpp, Routines for optimizing the motors */
LPLONG     WINAPI    mGetMoveScan (void);
void       WINAPI    mStartMoveScan (int,int);
#ifdef __cplusplus
        }
#endif

/* verschiedene Type-Definitionen */
#ifdef __WIN32__
typedef BOOL       WINAPI    (*TInitializeMotorsDLL) (void);
typedef BOOL       WINAPI    (*TSetAxis) (int);
typedef int        WINAPI    (*TGetAxis) (void);
typedef BOOL       WINAPI    (*TSetLine) (int,BOOL);
typedef BOOL       WINAPI    (*TIsMoveFinish) (void);
typedef BOOL       WINAPI    (*TGetDistance) (double&);
typedef BOOL       WINAPI    (*TIsServerOK) (void);
typedef BOOL       WINAPI    (*TMoveToDistance) (double);
typedef BOOL       WINAPI    (*TMoveByDistance) (double);
typedef BOOL       WINAPI    (*TSetAxisWithName) (TAxisType);
typedef int        WINAPI    (*TGetScanSize) (void);
typedef LPLONG     WINAPI    (*TGetMoveScan) (void);
typedef void       WINAPI    (*TStartMoveScan) (int,int);
typedef int        WINAPI    (*TGetMoveFinishIdx) (void);
typedef void       CALLBACK  (*TSavePosition) (UINT,UINT,DWORD,DWORD,DWORD);

/* table with several functions */
typedef struct
        {
        public:
        TInitializeMotorsDLL  InitializeMotorsDLL;
        TSetAxis                    SetAxis;
        TSetAxisWithName      SetAxisWithName;
        TGetAxis                    GetAxis;
        TGetScanSize            GetScanSize;
        TGetMoveScan          GetMoveScan;
        TStartMoveScan        StartMoveScan;
        TMoveToDistance       MoveToDistance;
        TMoveByDistance       MoveByDistance;
        TSetLine              SetLine;
        TIsMoveFinish         IsMoveFinish;
        TGetDistance          GetDistance;
        TIsServerOK           IsServerOK;
        TGetMoveFinishIdx     GetMoveFinishIdx;
        TSavePosition         SavePosition;
        } TMFunctionTable;

/* ich habe alles mit DLG im Namen hierhin an das Ende verbannt. Alles mit
 * Dialogen  hat hier nichts zu suchen und sollte an eine entsprechende
 * Files bewegt werden!! */

/* start InquireReferencePoint-Dialog */
void       WINAPI    mlInquireReferencePointDlg (int);

/* start PositionControl-Dialog */
void       WINAPI    mlPositionControlDlg
(void);

/* start SetParameter-Dialog */
void       WINAPI    mlSetParametersDlg (void);

/* send cm_CallExecuteScan. and start OptimizingDialog.
 * should be moved out of m_layer !!!*/
void       WINAPI    mlOptimizingDlg(void);

#endif
                     /* ifdef __WIN32__ */
#endif
                     /* ifdef __M_LAYER_H */
// __LastLine__