#ifndef _SANA2METER_H
#define _SANA2METER_H
/*
** $VER: sana2meter.h 1.1 (4 May 1996)
**
** (C) Copyright 1996 Marius Gröger
**     All Rights Reserved
**
** $HISTORY:
**
** 04 May 1996 : 001.001 :  created
** 25 Apr 1996 : 001.000 :  created
*/

/*F*/ /* includes */
#include <exec/libraries.h>
#include <exec/devices.h>
#include <exec/memory.h>
#include <exec/io.h>
#include <libraries/gadtools.h>
#include <workbench/startup.h>
#include <utility/tagitem.h>
#include <netinclude:devices/sana2.h>
#include "compiler.h"
#include "SANA2Meter_rev.h"
/*E*/

typedef enum DoWindowCtrl
{
   DOWCTRL_NOP       = 0,
   DOWCTRL_UPDATE    = (1<<0),
   DOWCTRL_REOPEN    = (1<<2),
   DOWCTRL_SHOWWINDOW= (1<<3)
} DoWindowCtrl;

/*F*/ /* struct TrackType */
struct TrackType
{
   ULONG                         tt_Type;
   UBYTE                         tt_Label[30];
   UBYTE                         tt_Key[12];
   ULONG                         tt_Flags;
   ULONG                         tt_ICPS;
   ULONG                         tt_OCPS;
   struct Sana2PacketTypeStats   tt_Stats;
};

#define TTF_ACTIVE            (1<<0)
#define TTF_TRACKED           (1<<1)
#define TTF_INITIAL_OPACKETS  (1<<2)
#define TTF_INITIAL_IPACKETS  (1<<3)
#define TTF_INITIAL_OBYTES    (1<<4)
#define TTF_INITIAL_IBYTES    (1<<5)
#define TTF_INITIAL_DPACKETS  (1<<6)
#define TTF_INITIAL_ICPS      (1<<7)
#define TTF_INITIAL_OCPS      (1<<8)
#define TTF_INITIAL_SETUP     (1<<9)
#define TTF_DROPFIRSTCPS      (1<<10)
/*E*/
/*F*/ /* enum Member, struct NewWatch, struct Watch */

enum Member
{
   MEMBER_NONE,
   MEMBER_DEVICEQUERY,
   MEMBER_GLOBALSTATS,
   MEMBER_SPECIALSTATS,
   MEMBER_TRACKTYPE
};

struct NewWatch
{
   enum Member    nw_Member;        /* classification */
   STRPTR         nw_ShortKey;      /* abbreviated option keyword */
   STRPTR         nw_Key;           /* option keyword */
   LONG           nw_LabelID;       /* locale ID */
   ULONG          nw_StructOffset;
   ULONG          nw_Flags;         /* see WF_#? below */
};

struct Watch
{
   struct MinNode          w_Link;
   enum Member             w_Member;      /* copy of NewWatch */
   STRPTR                  w_ShortKey;    /* abbreviated option keyword */
   STRPTR                  w_Key;         /* copy of NewWatch */
   struct TrackType     *  w_TrackType;   /* only if (w_Member == MEMBER_TRACKTYPE) */
   STRPTR                  w_Label;       /* translated localeid */
   ULONG                   w_Flags;       /* copy of NewWatch */
   ULONG                   w_ID;          /* for GUI */
   ULONG                *  w_Value;       /* pointer to monitored value */
};
#define WF_ACTIVE   (1<<0)
#define WF_STATIC   (1<<1)
#define WF_FIRSTTT  (1<<2)
#define WF_NOLABEL  (1<<3)
#define WF_OFF      (1<<4)

#define SCANWATCHES(w, list) for(w = (struct Watch*)((list)->mlh_Head); w->w_Link.mln_Succ; w=(struct Watch*)w->w_Link.mln_Succ)

/*E*/
/*F*/ /* device management data structures */

   /* Global data structures that will be passed to other system components */
struct PublicDevData
{
   struct IOSana2Req                pd_S2Req;
   struct Sana2DeviceQuery          pd_S2DeviceQuery;
   struct Sana2DeviceStats          pd_S2DeviceStats;
   struct TrackType              *  pd_TrackedTypes;
   struct Sana2SpecialStatHeader    pd_S2SpecialStats;
   struct Sana2SpecialStatRecord    pd_S2SpecialStatRecs[1];
};
   /* Global data structures that will be used locally only */
struct GlobalDevData
{
   struct MinNode                   gd_Link;
   int                              gd_GetGlobalStats    : 1;
   int                              gd_GetSpecialStats   : 1;
   int                              gd_GetTrackType      : 1;
   int                              gd_ShowDevQuery      : 1;
   int                              gd_Force             : 1;
   int                              gd_Active            : 1;
   int                              gd_FromConfig        : 1;
   LONG                             gd_Unit;
   LONG                             gd_ValidSpecialStats;
   struct MinList                   gd_Watches;
   struct Watch                  *  gd_StdWatches;
   ULONG                            gd_NumTT;
   struct Watch                  *  gd_TrackWatches;
   struct PublicDevData          *  gd_Public;
   UBYTE                            gd_Title[36];
   UBYTE                            gd_Device[1];  /* MUST be last member! */
};
#define SCANDEVS(d, list) for(d = (struct GlobalDevData*)((list)->mlh_Head); d->gd_Link.mln_Succ; d=(struct GlobalDevData*)d->gd_Link.mln_Succ)

/*E*/
/*F*/ /* global storage anchor */

typedef struct PublicData
{
   struct timerequest               pd_TReq;
   struct TTextAttr                 pd_Font;
   UBYTE                            pd_Fontname[32];
   UBYTE                            pd_Pubscreen[MAXPUBSCREENNAME+1];
   UBYTE                            pd_Console[100];
} *PD;

   /* Global data structures that will be used locally only */
typedef struct GlobalData
{
   /* System related stuff */
   struct Library                *  gd_SysBase,
                                 *  gd_UtilityBase,
                                 *  gd_GadToolsBase,
                                 *  gd_GTLayoutBase,
                                 *  gd_IntuitionBase,
                                 *  gd_IconBase,
                                 *  gd_DOSBase;
   struct Task                   *  gd_We;
   struct MsgPort                *  gd_S2Port;
   struct MsgPort                *  gd_TPort;
   void                          *  gd_AnyPool;
   void                          *  gd_PubPool;
   /* Timing related stuff */
   struct timeval                   gd_time;
   /* DOS/Arguments related stuff */
   UBYTE                            gd_ProgramName[80];
   ULONG                            gd_argc;
   UBYTE                         ** gd_argv;
   BPTR                             gd_Input;
   BPTR                             gd_Output;
   struct MsgPort                *  gd_OldConsoleTask;
   BPTR                             gd_OldInput;
   BPTR                             gd_OldOutput;
   /* Locale related stuff */
   struct LocaleInfo                gd_LocaleInfo;
   /* Flags related to anything */
   int                              gd_CustomFont      : 1;
   int                              gd_List            : 1;
   int                              gd_CLI             : 1;
   int                              gd_InputSelected   : 1;
   int                              gd_OutputSelected  : 1;
   int                              gd_CTSelected      : 1;
   int                              gd_Inactive        : 1;
   int                              gd_ToBack          : 1;
   int                              gd_NeedTimer       : 1;
   int                              gd_TimerOff        : 1;
   int                              gd_StayFront       : 1;
   /* Config related stuff */
   int                              gd_HadRefresh      : 1;
   int                              gd_HadCPSAging     : 1;
   int                              gd_HadLeft         : 1;
   int                              gd_HadTop          : 1;
   int                              gd_HadWindowToBack : 1;
   int                              gd_HadFont         : 1;
   int                              gd_HadInactive     : 1;
   int                              gd_HadPubscreen    : 1;
   int                              gd_HadStayFront    : 1;
   STRPTR                           gd_ConfigName;
   ULONG                            gd_Refresh;
   ULONG                            gd_CPSAging;
   ULONG                            gd_CPSAgingComp;
   /* GUI related stuff */
   struct LayoutHandle           *  gd_Handle;
   struct NewMenu                *  gd_NewMenu;
   struct NewMenu                *  gd_WatchStart;
   struct NewMenu                *  gd_DevSelStart;
   struct Menu                   *  gd_Menu;
   WORD                             gd_Left;
   WORD                             gd_Top;
   /* structure extensions */
   struct MinList                   gd_Devices;  /* List of GlobalDevData */
   ULONG                            gd_NumDevices;
   ULONG                            gd_NumActives;
   PD                               gd_Public;
} *GD;

#ifdef __SASC
     /*
     ** redirect all shared library bases to our device base.
     */
#  define SysBase       gd->gd_SysBase
#  define GadToolsBase  gd->gd_GadToolsBase
#  define GTLayoutBase  gd->gd_GTLayoutBase
#  define DOSBase       gd->gd_DOSBase
#  define UtilityBase   gd->gd_UtilityBase
#  define LocaleBase    gd->gd_LocaleInfo.li_LocaleBase
#  define IconBase      gd->gd_IconBase
#  define IntuitionBase gd->gd_IntuitionBase
     /*
     ** This macro declares a local variable which temporary gets
     ** SysBase directly from AbsExecBase.
     */
#  define LOCALSYSBASE struct { void *gd_SysBase; } *gd = (void*)0x4
#else
#  error Please define library bases for your compiler
#endif

/*
** Pool settings
*/
#define PUBPOOLKIND     (MEMF_PUBLIC|MEMF_CLEAR)
#define PUBPOOLPUDDLE   (4*1024)
#define PUBPOOLTHRESH   (3*1024)
#define ANYPOOLKIND     (MEMF_ANY|MEMF_CLEAR)
#define ANYPOOLPUDDLE   (4*1024)
#define ANYPOOLTHRESH   (3*1024)

/*E*/

#endif

