#include <stdlib.h>
#include <unistd.h>

#include "mbariTypes.h"
#include "pilotTray.h"
#include "PilotTrayMicro.h"
#include "PilotTrayApp.h"
#include "PilotTrayOutTask.h"

PilotTrayOutTask::PilotTrayOutTask(PilotTrayTaskControl *taskParams,
                             PilotTrayMicro *uiObject,
                             IviewControl *iviewControlPT, 
                             IviewControl *iviewControlZFI)
{
  char name[256];
  
  strcpy(name, taskParams->name());

  DM_Item  msgItemPT, msgItemZFI;
 
  _uiObject = uiObject;
  _taskParams = taskParams;

  _iviewControlPT = iviewControlPT;
  // Don't need Camera ZFI Stuff Yet
  //_iviewControlZFI = iviewControlZFI;
 
  msgItemPT = _iviewControlPT->msgItem();
  // Don't need Camera ZFI Stuff Yet
  // msgItemZFI = _iviewControlZFI->msgItem(); 

  _msgObjPT = new DmObject(&msgItemPT);
  // Don't need Camera ZFI Stuff Yet
  //_msgObjZFI = new DmObject(&msgItemZFI);

  //Button Grabber Stuff
  _iviewMonitor = new IviewMonitor();

  _portLightPT = new PTDeviceLight(IviewPortLight , PORT_LIGHT_BUTTON,
				 _iviewControlPT, 
                                 _iviewMonitor, _uiObject, 
                                 _taskParams->SRQTaskPid);

  _stbdLightPT = new PTDeviceLight(IviewStbdLight , STBD_LIGHT_BUTTON,
				 _iviewControlPT, 
                                 _iviewMonitor, _uiObject, 
                                 _taskParams->SRQTaskPid);

  _portCameraPT = new PTDeviceLight(IviewPortCamera , PORT_CAMERA_BUTTON,
				  _iviewControlPT, 
                                  _iviewMonitor, _uiObject, 
                                  _taskParams->SRQTaskPid);

  _stbdCameraPT = new PTDeviceLight(IviewStbdCamera , STBD_CAMERA_BUTTON,
				  _iviewControlPT, 
                                  _iviewMonitor, _uiObject, 
                                  _taskParams->SRQTaskPid);

#if 0 // Don't need Camera ZFI Stuff Yet
  _portCameraZFI = new PTDeviceLight(IviewPortCamera , 
				   PORT_CAMERA_SELECT_BUTTON,
				   _iviewControlZFI, 
                                   _iviewMonitor, _uiObject, 
                                   _taskParams->SRQTaskPid);

  _stbdCameraZFI = new PTDeviceLight(IviewStbdCamera , 
				   STBD_CAMERA_SELECT_BUTTON,
				   _iviewControlZFI, 
                                   _iviewMonitor, _uiObject, 
                                   _taskParams->SRQTaskPid);
#endif

  if ((_dmUpdateSem = semBCreate(SEM_Q_FIFO, SEM_EMPTY)) == NULL)
  {
    fprintf(stderr, "PilotTrayOutTask::PilotTrayOutTask() - semBCreate() failed\n");
    exit(1);
  }
}

PilotTrayOutTask::~PilotTrayOutTask()
{
  semDelete(_dmUpdateSem);
  delete _uiObject;
  delete _msgObjPT;
  //delete _msgObjZFI;
}

int PilotTrayOutTask::run()
{
   DM_Group dmGroup;               /* Pilot Tray Data Manager Group         */
   DWord    changedBits;           /* Holds dm_group_changes bit vector     */

   DWord    msgObjPTBit;
   //DWord    msgObjZFIBit;

   IviewMessage msg;

   MBool    Flash = FALSE;
   MBool    state;

   PilotTrayButtonState buttonState;

   const int SetDeviceTimeout = 2;

   DM_Time  dmTime;                

   _uiObject->startProvideSettings();

   _msgObjPT->startConsume(DM_STATIC, _dmUpdateSem);
   //_msgObjZFI->startConsume(DM_STATIC, _dmUpdateSem);

   dmGroup = dm_create_group();    /* Create Data Manager Group for items   */

   dm_group_add_item(dmGroup, _msgObjPT->getHandle(), &msgObjPTBit);
   //dm_group_add_item(dmGroup, _msgObjZFI->getHandle(), &msgObjZFIBit);
   
   // Initialize device States
   _portLightPT->getIviewDeviceState();
   _stbdLightPT->getIviewDeviceState();
   _portCameraPT->getIviewDeviceState();
   _stbdCameraPT->getIviewDeviceState();

   //_portCameraZFI->getIviewDeviceState();
   //_stbdCameraZFI->getIviewDeviceState();


   FOREVER
   {       
        /* We need to initialize default state of Data manager Items here    */
                                    /* Clear item changed bits after reset   */
        changedBits = dm_get_group_changes(dmGroup);
   
        //Get Device light States Periodicaly
        _portLightPT->getIviewDeviceState();
        _stbdLightPT->getIviewDeviceState();
        _portCameraPT->getIviewDeviceState();
        _stbdCameraPT->getIviewDeviceState();

        //_portCameraZFI->getIviewDeviceState();

        semTake(_dmUpdateSem, SetDeviceTimeout);

                                    /* Ask Data Manager which items changed  */
        changedBits = dm_get_group_changes(dmGroup);

        // Mgs Changed Bit
        if (changedBits & msgObjPTBit)
        {
            _iviewControlPT->getMsg(&msg);

	    if (msg.serverStarting)
               _iviewControlPT->initialize();

            if(msg.deviceMask & IviewPortLight)
            {
               _portLightPT->getIviewDeviceState();
	    }
            if(msg.deviceMask & IviewStbdLight)
	    {
               _stbdLightPT->getIviewDeviceState();
            }
            if(msg.deviceMask & IviewPortCamera)             
            {
               _portCameraPT->getIviewDeviceState();
            }
            if(msg.deviceMask & IviewStbdCamera)
            {
               _stbdCameraPT->getIviewDeviceState();
	    }
        }

#if 0
        if (changedBits & msgObjZFIBit)
        {
            _iviewControlZFI->getMsg(&msg);
            if(msg.serverStarting)
               _iviewControlZFI->initialize();

            if(msg.deviceMask & IviewPortCamera)             
            {
               _portCameraZFI->getIviewDeviceState();
               _taskParams->setCamera(IviewPortCamera);
            }
            else if(msg.deviceMask & IviewStbdCamera)
            {               
               _stbdCameraZFI->getIviewDeviceState();
               _taskParams->setCamera(IviewStbdCamera);
            }    
        }
#endif

        taskSafe();                 /* Prevent task from being delete during */
                                    /* serial IO and Data Manager updates    */

        taskUnsafe();
   }//FOREVER
  return 0;
}//PilotTrayOutTask::run







