#ifndef _TASKCONTROL_H
#define _TASKCONTROL_H

#define __STDC__
//#define INCLUDE_PROTOTYPES


#ifndef UNIX
# include <sys/times.h>
#endif

#include <stdio.h>

#ifdef UNIX
# include "VxStubs.h"
#else
# include <mbari/types.h>
#endif

extern "C" 
{
#ifdef UNIX
#  include "dmUnix.h"
#  include "semLib.h"
#else
# include "vxWorks.h"
# include "msgQLib.h"
# include "sysLib.h"
# include "semLib.h"
# include "taskLib.h"
# include "lstLib.h"
# include "datamgr.h"
# include "sio32.h"
# include "sio32Server.h"
# include "sio32Client.h"
# include "powerTypes.h"
# include "microTask.h"
# include "microCmd.h"
# include "microDm.h"
#endif
};



#include "ErrorHandler.h"
#include "MicroDm.h"
#include "MicroInterface.h"


/*
   TaskControl provides inter-task coordination methods
*/
class TaskControl : public ErrorHandler
{
  public:
  TaskControl(const char *name, 
	      Nat16 nTasks,
	      MicroInterface *microInterface,
	      const char *microDmPrefix,
	      const char *powerDmItemName
	      );

  ~TaskControl();

  // Wakeup the specified task
  int wakeupTask(microTaskId task);

  // Wait for wakeup call from another task
  int wait(microTaskId thisTask, int timeout = WAIT_FOREVER);
  
  // Return number of micro resets that have occurred
  int microResetCount();
  
  // Increment reset count
  void countReset()
  {
     _microIoControl.resetEventCount++;    
  }
  // Call when a micro reset occurs 
  int microResetOccurred();

  // Indicate if micro link is up
  MBool microLinkUp();
  
  // Indicate if micro is "online"
  MBool microOnline();
  
  // Return state of micro link
  serialComState microLinkState();

  // Set state of micro link
  void setMicroLinkState(serialComState state);
  
  // Return state of micro device power switch
  switchStatus powerSwitchState();
  
  void announceResets(MBool announce)
  {
    _microIoControl.announceResets = announce;
  }
  
  void setTaskId(microTaskId task, Nat32 taskNo)
  {
   _microIoControl.childTasks[task].taskId = taskNo;
  }  

  Nat32 getTaskId(microTaskId task)
  {
   return(_microIoControl.childTasks[task].taskId);
  }  
  
  Void setMicroConfigured(MBool state)
  {
    _microIoControl.microConfigured = state;
  }
  
  DmEmptyObject *dmResetEvent()
  {
    return _microDm->resetEvent;
  }
  
  DmEmptyObject *dmResetCmd()
  {
    return _microDm->resetCmd;
  }
  
  protected:
  microIOControl _microIoControl;
  MicroDm *_microDm;
  MicroInterface *_microIF;

  int initIOControl(Nat16 nTasks, 
		    const char *prefix,
		    const char *powerDmItemName);
  
};

#endif













