
/*
$Log: CameraMicro.cc,v $
Revision 1.4  1997/10/03 09:27:31  oreilly
*** empty log message ***

Revision 1.3  97/08/12  14:35:44  14:35:44  oreilly (Thomas C. O'Reilly)
*** empty log message ***

Revision 1.2  97/05/30  15:48:35  15:48:35  oreilly (Thomas C. O'Reilly)
*** empty log message ***

Revision 1.1  97/05/06  16:24:52  16:24:52  oreilly (Thomas C. O'Reilly)
Initial revision

*/
#include <stdlib.h>
#include <Xm/Form.h>
#include <Xm/RowColumn.h>
#include <Xm/Label.h>
#include <Xm/PushB.h>
#include <Xm/Separator.h>
#include <Xm/Frame.h>
#include <Vk/VkQuestionDialog.h>
#include <Vk/VkErrorDialog.h>
#include "TiburonApp.h"
#include "CameraMicro.h"
#include "Micro.h"
#include "DmErrno.h"
#include "parseUtils.h"
#include "DataRates.h"
#include "camera.h"


CameraMicro::CameraMicro(const char *name, const char *dmPrefix)
  : Micro(name, dmPrefix)
{
  cameraDm = new CameraDm(name, dmPrefix);
  if (cameraDm->error())
  {
    char errorBuf[errorMsgSize];
    cameraDm->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
}


CameraMicro::~CameraMicro()
{
}


MicroGui *CameraMicro::gui(Widget parent, int period)
{
  CameraMicroGui *gui = new CameraMicroGui(_name, parent, this, period);
  gui->show();
  return gui;
}


MicroH2OTemp *CameraMicro::h2OTemp(Widget parent, int period)
{
  CameraH2OTemp *gui = new CameraH2OTemp(_name, parent, this, period);
  gui->show();
  return gui;
}


CameraH2OTemp::CameraH2OTemp(const char *name, Widget parent, 
			   CameraMicro *CameraMicro, 
			   int period)
  : MicroH2OTemp(name, parent)
{
  CameraDm *cameraDm = CameraMicro->cameraDm;
  
  /* Find alarm items */
  SystemAlarms *alarms = ((TiburonApp *)theApplication)->systemAlarms;
  
  char alarmName[MaxDmNameLen];
  char errorBuf[errorMsgSize];
  
  strcpy(alarmName, (const char *)cameraDm->dmPrefix());
  
  char *alarmNamePtr = alarmName + strlen(alarmName);

  strcpy(alarmNamePtr, TEMPERATURE_ALARM_DM);  
  Alarm *tempAlarm;
  if ((tempAlarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf,
	    "CameraH2OTemp::CameraH2OTemp() - couldn't find alarm \"%s\"",
	    alarmName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(alarmNamePtr, HUMIDITY_ALARM_DM);  
  Alarm *humidityAlarm;
  if ((humidityAlarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf,
	    "CameraH2OTemp::CameraH2OTemp() - couldn't find alarm \"%s\"",
	    alarmName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(alarmNamePtr, HOUSING_WATER_ALARM_DM);  
  Alarm *waterAlarm;
  if ((waterAlarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf,
	    "CameraH2OTemp::CameraH2OTemp() - couldn't find alarm \"%s\"",
	    alarmName);

    theErrorDialog->postAndWait(errorBuf);
  }

  Widget nameWidget =
    XtVaCreateManagedWidget(name, xmLabelWidgetClass, _row->baseWidget(),
			    NULL);			    

  _row->append(nameWidget);
  
  _temp = 
    new AlarmedInt16Text("temperature", _row->baseWidget(), "%-3.0f C", 
			 cameraDm->microTemp, period, tempAlarm, Dynamic); 

  _row->append(_temp);

  _humidity = 
    new AlarmedNat16Text("humidity", _row->baseWidget(), "%-3.0f %%", 
			 cameraDm->humidity, period, humidityAlarm, Dynamic); 

  _row->append(_humidity);

  _housingWater = 
    new AlarmText("housingWater", _row->baseWidget(), waterAlarm, "%s");

  _row->append(_housingWater);
  
  Widget nA = 
    XtVaCreateManagedWidget("notApplicable", xmLabelWidgetClass, 
			    _row->baseWidget(), 
			    NULL);

  _row->append(nA);
  
  _row->show();
}


CameraH2OTemp::~CameraH2OTemp()
{
}


CameraMicroGui::CameraMicroGui(const char *name, Widget parent, 
			       CameraMicro *micro, int period)
  : MicroGui(name, parent, micro)
{
  _temp = 0;
  _humidity = 0;
  _housingWater = 0;
  
  CameraDm *cameraDm = micro->cameraDm;
  
  /* Find alarm items */
  SystemAlarms *alarms = ((TiburonApp *)theApplication)->systemAlarms;
  
  char alarmName[MaxDmNameLen];
  char errorBuf[errorMsgSize];
  
  strcpy(alarmName, (const char *)cameraDm->dmPrefix());
  
  char *alarmNamePtr = alarmName + strlen(alarmName);

  strcpy(alarmNamePtr, TEMPERATURE_ALARM_DM);  
  Alarm *tempAlarm;
  if ((tempAlarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf,
	    "CameraH2OTemp::CameraH2OTemp() - couldn't find alarm \"%s\"",
	    alarmName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(alarmNamePtr, HUMIDITY_ALARM_DM);  
  Alarm *humidityAlarm;
  if ((humidityAlarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf,
	    "CameraMicroGui::CameraMicroGui() - couldn't find alarm \"%s\"",
	    alarmName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(alarmNamePtr, HOUSING_WATER_ALARM_DM);  
  Alarm *waterAlarm;
  if ((waterAlarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf,
	    "CameraMicroGui::CameraMicroGui() - couldn't find alarm \"%s\"",
	    alarmName);

    theErrorDialog->postAndWait(errorBuf);
  }


  Widget label;
  TableRowForm *mgr;
  
  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("tempLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);
  
  mgr->append(label);
  
  _temp = 
    new AlarmedInt16Text("temperature", mgr->baseWidget(), "%-3.0f C",
			 cameraDm->microTemp, period, tempAlarm, Dynamic);
  
  mgr->append(_temp);
  
  mgr->show();

  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("humidityLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);
  mgr->append(label);

  _humidity = 
    new AlarmedNat16Text("humidity", mgr->baseWidget(), "%-3.0f %%", 
			 cameraDm->humidity, period, humidityAlarm, Dynamic); 

  mgr->append(_humidity);
  
  mgr->show();
  
  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("housingWaterLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);
  mgr->append(label);

  _housingWater = 
    new AlarmText("housingWater", mgr->baseWidget(), waterAlarm, "%s");

  mgr->append(_housingWater);

  mgr->show();
}


CameraMicroGui::~CameraMicroGui()
{
  delete _temp;
  delete _humidity;
  delete _housingWater;
}


void CameraMicroGui::updateGui(DM_Item handle)
{
  MicroGui::updateGui();
}

