#ifndef _ECUBOARD_H
#define _ECUBOARD_H
#include "IbcApp.h"
#include "SerialDevice.h"
#include "MicroApp.h"
#include "ecu.h"

extern "C" 
{
#include "quadSerCmd.h"
};

/*
CLASS 
ECU Board

DESCRIPTION
Sub Class of the Abstract class for serial device. SerialDevice can be added to 
certain IbcCard types, e.g. QuadSerialCard.

AUTHOR
Douglas Au
*/
class ECUBoard : public SerialDevice {
  public:

  ///////////////////////////////////////////////////////////////////
  // Constructor
  // [input] name: Name of device
  ECUBoard(const char *systemName,
	       const char *appName,
	       const char *deviceName,
	       Word channelNo,
               IbcApp *app);

  ~ECUBoard();

  ///////////////////////////////////////////////////////////////////
  // Initialize DM items and micro
  virtual STATUS handleResetEvent();
  
  ///////////////////////////////////////////////////////////////////
  // Add DM items to monitored group
  // [input] dmMonitor: DmMonitor which monitors component
  virtual STATUS startMonitoring(DmMonitor *dmMonitor);

  ///////////////////////////////////////////////////////////////////
  // Process changes to DM items
  virtual STATUS processDmChanges(DmGroup *dmGroup);

  ///////////////////////////////////////////////////////////////////
  // Start providers for sampling
  virtual STATUS startSampling();

  ///////////////////////////////////////////////////////////////////
  // Read micro and update DM items
  virtual STATUS sampleMicro();

  ///////////////////////////////////////////////////////////////////
  // Call after receiving SRQ
  virtual MBool handleSrq(Word requestCode, Byte *packet);

  ///////////////////////////////////////////////////////////////////
  // Call after receiving reset SRQ
  virtual STATUS handleResetSrq();
  

  ///////////////////////////////////////////////////////////////////
  // Add Output Channels to ECU board
  DigitalOutput *addOutput(const char *name, SwitchMethod switchMethod);


  ///////////////////////////////////////////////////////////////////
  // Return channel number
  Word channelNo();
  
  //////////////////////////////////////////////////////////////////
  // Initialize Digital Outputs of the ECU Board
  STATUS initECUDigitalOutputs();

  //////////////////////////////////////////////////////////////////
  // Sets Digital Outputs of the ECU Board
  STATUS setECUDigitalOutputs(int chan, MBool outputValue);

  SwitchStatus ECUswitchStatus;
  
  switchEntry* ECUSwitchEntry;

 protected:

  Int16 _boardNum;
  Int16 _ModuleNum;
  Word  _ecuSerialChan;
  MBool _initialized;

  //////////////////////////////////////////////////////////////////
  // Array of Digital Output Objects
  DynamicArray _outputs;

  int _maxChannels;
  

  //////////////////////////////////////////////////////////////////
  // Pointer to the main app
  IbcApp *_mainApp;
  
  //////////////////////////////////////////////////////////////////
  // Pointers to Digital output objects for valve pack
  Byte _output[nOutputs];
  
  Byte ECU_OutputState[nModules];

};


#endif



