#include "FakeMicro.h"
#include "DmErrno.h"

FakeMicro::FakeMicro(const char *name, Nat16 channelNo, 
		     const char *dmPowerStatusName)
  : DeviceInterface(name, channelNo, dmPowerStatusName)
{
  char itemName[MaxDmNameLen];
  strcpy(itemName, name);
  strcat(itemName, ".SRQ");
  
  _dmSrqCode = new DmInt16Object(itemName);

  char errorBuf[100];
  Errno err;
  
  if ((_srqSem = semBCreate(SEM_Q_FIFO, SEM_EMPTY)) == 0)
  { 
    sprintf(errorBuf, "FakeMicro::FakeMicro() - semBCreate() failed\n");
    setError(errorBuf);
    return;
  }
  
  if ((err = _dmSrqCode->startConsume(DM_STATIC, _srqSem)) != SUCCESS)
  {
    sprintDmError(err, "FakeMicro::FakeMicro() - _dmSRQCode->startConsume()",
		  errorBuf);
    
    setError(errorBuf);
    return;
  }
  
}


FakeMicro::~FakeMicro()
{
}


int FakeMicro::readSRQ(Byte *packet, Int16 maxBytes, Int32 timeout)
{
  semTake(_srqSem, WAIT_FOREVER);

  DM_Time t;
  Int16 code;
  
  _dmSrqCode->read(&code, &t);
  packet[0] = code >> 8;
  packet[1] = (0x00FF & code);
  return 0;
}


Word FakeMicro::getWord(Void *packet, Int32 index)
{
  return *((Word *)packet + index);
}


STATUS FakeMicro::enable()
{
}


STATUS FakeMicro::reset()
{
}


STATUS FakeMicro::id(Char *str)
{
  strcpy(str, "FakeMicro id");
  return OK;
}



STATUS FakeMicro::serialNo(Char *str)
{
  strcpy(str, "FakeMicro serialNo");
  return OK;
}


STATUS FakeMicro::softwareRev(Char *str)
{
  strcpy(str, "FakeMicro softwareRev");
  return OK;
}


STATUS FakeMicro::ramTest(MBool *passed)
{
  *passed = TRUE;
  return OK;
}


