#ifndef _ALARMLOGGER_H
#define _ALARMLOGGER_H
static char AlarmLogger_h_id[] = "$Header: /usr/tiburon/unix/gui/tmacs/RCS/AlarmLogger.h,v 1.7 1997/09/10 08:45:17 oreilly Exp $";

/*
$Log: AlarmLogger.h,v $
Revision 1.7  1997/09/10 08:45:17  oreilly
*** empty log message ***

 * Revision 1.6  97/08/12  14:15:36  14:15:36  oreilly (Thomas C. O'Reilly)
 * Method to return setup window
 * 
 * Revision 1.5  97/05/30  15:44:12  15:44:12  oreilly (Thomas C. O'Reilly)
 * *** empty log message ***
 * 
 * Revision 1.4  97/04/30  19:23:48  19:23:48  oreilly (Thomas C. O'Reilly)
 * Added method to clear all AlarmLists
 * 
 * Revision 1.3  97/03/20  12:32:41  12:32:41  oreilly (Thomas C. O'Reilly)
 * *** empty log message ***
 * 
 * Revision 1.2  96/10/28  09:13:14  09:13:14  oreilly (Thomas C. O'Reilly)
 * *** empty log message ***
 * 
*/

#include "DmGuiObject.h"
#include "Alarm.h"
#include "SystemAlarms.h"
#include "AlarmPanel.h"
#include "AlarmPage.h"
#include "AlarmSetup.h"
#include "AlarmActionSetup.h"
// #include "TestWindow.h"
#include "AlarmPopup.h"
#include "View.h"

#define XBellLevel 50

/*
FlashList cycles through unacknowledged alarms
*/
class FlashList
{
  public:
  FlashList(AlarmList **alarmLists);
  
  int total();
  int total(Priority priority);
  Alarm *next(Priority *priority, int *index);
  void reset();
  
  protected:
  Boolean flashIt(Alarm *alarm);
  AlarmList *_list[NPriorityLevels];
  int _listIndex;
  int _entryIndex;
  int _flashListIndex;
};


/*
AlarmLogger has several functions, including:

  Display AlarmLight to indicate current alarm state and priority
  Provide detailed alarm info on separate panel
  Execute user-specified actions when new alarm conditions occur
  Provide GUI for user control of alarm actions and alarm attributes
  Log alarm events to file
*/

class AlarmLogger : public DmGuiObject
{
  public:
  AlarmLogger(const char *name, Widget parent, SystemAlarms *alarms); 
  ~AlarmLogger();

  virtual const char *className() 
  {
    return "AlarmLogger";
  }
  
  virtual void updateGui(DM_Item handle = 0);

  // Check state of all alarms; optionally read each alarm DM item before 
  // checking

  void processAlarm(Alarm *alarm);
  int checkAllAlarms(MBool init = FALSE);
  
  // Return view of alarm panel gui
  View *alarmPageView() 
  {
    return _alarmPageView;
  }

  AlarmSetupWindow *setupWindow();
  
  void setActionBits(Priority priority, int actionBits);
  int getActionBits(Priority priority);

  static void showActionSetupCallback(Widget w,
				      XtPointer clientData,
				      XtPointer callData);
  
  static void showAlarmSetupCallback(Widget w, XtPointer clientData,
				     XtPointer callData);

  static const char *const priority1FlagsMnem;
  static const char *const priority2FlagsMnem;
  static const char *const priority3FlagsMnem;

  int loadPreferences(DynArray<Preference *> *preferences, char *errorBuf);
  int savePreferences(DynArray<Preference *> *preferences, char *errorBuf);

  protected:
  SystemAlarms *_alarms;
  AlarmPanel *_alarmPanel;
  AlarmPage *_alarmPage;
  View *_alarmPageView;
  AlarmSetupWindow *_alarmSetupWindow;
  ActionSetupWindow *_actionSetupWindow;
  AlarmPopup *_alarmPopup[NAlarmLists];
  
  Widget _showAlarmPageButton;

  int _bellPeriod;
  int _labelPeriod;
  XtIntervalId _bellTimer;
  XtIntervalId _labelTimer;

  MBool bellRinging()
  {
    if (_bellTimer)
      return TRUE;
    else
      return FALSE;
  }

  void startRinging();
  void stopRinging();
  
  int _alarmActionBits[NAlarmLists];  

  // Execute appropriate alarm action 
  void execAlarmAction(Alarm *alarm);

  // Update contents of all AlarmLists
  void assignToList(Alarm *alarm);

  void updateAlarmPanel();
  
  // Update message on flashing AlarmPanel
  void updateFlashLabel();

  // Update display of active alarm counts
  void updateActiveCounts();

  // Clear all AlarmLists
  void clearLists();

  void flash();
  void shine();

  Boolean stickyAlarms(Priority priority)
  {
    return (_alarmActionBits[(int )(priority - 1)] & StickyAlarms);
  }
  
  // Acknowledge all alarms of specified priority
  void acknowledge(Priority p);

  // Handle destruction of setup windows
  static void windowDeleteHandler(Widget mainWindowWidget, 
				  XtPointer clientData);
  
  typedef enum
  {
    InitState, Flashing, Shining, Dark

  } AlarmLightState;
  
  AlarmLightState _alarmLightState;
  
  MBool _stickyAlarms[NAlarmLists];
  FlashList *_flashList;
  
  private:
  
  static void alarmSetupCallback(Widget w, XtPointer clientData,
				 XtPointer callData);

  static void timerCallback(XtPointer clientData, XtIntervalId *id);
  static void ackButtonCallback(Widget w, XtPointer clientData, 
				XtPointer callData);

  static void actionSetupCallback(Widget w, XtPointer clientData,
				  XtPointer callData);

  static void cancelAlarmSetupCallback(Widget w, XtPointer clientData,
				       XtPointer callData);

  static void cancelActionSetupCallback(Widget w, XtPointer clientData,
				       XtPointer callData);

  static void alarmPopupCallback(Widget w, XtPointer clientData, 
				 XtPointer callData);
  
  static void bellTimerCallback(XtPointer clientData, XtIntervalId *id);
  static void labelTimerCallback(XtPointer clientData, XtIntervalId *id);
  
};



#endif
