//=========================================================================
// Summary  :
// Filename : SupervisorOutput.cc
// Author   : marsh
// Project  :
// Revision : 1
// Created  : 2000/08/19
// Modified : 2000/08/19
//=========================================================================
// Description :
//=========================================================================
#include "Syslog.h"
#include "SupervisorOutput.h"

SupervisorOutput::SupervisorOutput( Access access, Boolean init )
     : SharedData( SupervisorOutputName,
		   sizeof( SupervisorOutput::Data ),
		   access, init )
{
     data.numProcs = 0;
     data.maxProcs = PROC_TABLE_MAX;
     data.systemStatus = Sysinfo::Unknown;

     //clear the table
     for( int i = 0; i < PROC_TABLE_MAX; i++ ) {
	  data.procs[i].pid = 0;
	  data.procs[i].procName[0] = '\0';
	  data.procs[i].interfaceName[0] = '\0';
	  data.procs[i].status = Sysinfo::Unknown;
     }

     data.isMissionRunning = False;
     strcpy(data.directoryName, "");

     if( init )
	  write();
}

SupervisorOutput::~SupervisorOutput()
{
}

//====================================================================

void SupervisorOutput::addEntry( const VehicleConfigurationIF::Name procName,
				 const VehicleConfigurationIF::Name interfaceName,
				 pid_t pid )
{
     // Also add the task to the shared memory interface
     if( ( data.numProcs+1 ) < PROC_TABLE_MAX ) {
	  strcpy( data.procs[data.numProcs].procName, procName );
	  strcpy( data.procs[data.numProcs].interfaceName, interfaceName );
	  data.procs[data.numProcs].pid = pid;
	  data.numProcs++;
     } else {
	  Syslog::write("SupervisorOutput::addEntry -- Process table is full.  Won't be able to keep track of process %s", procName );

     }
}

//====================================================================

void SupervisorOutput::setStatus( pid_t pid, Sysinfo::ProcStatus status )
{
     for( int i = 0; i < data.numProcs ; i++ ) {
	  if( data.procs[i].pid == pid ) {
	       data.procs[i].status = status;
	  }
     }
}

//====================================================================

void SupervisorOutput::read(  )
{
     SharedData::read( (void *)&data );
}

void SupervisorOutput::write(  )
{
     SharedData::write( (void *)&data );
}
