#include "FireControlDm.h"
#include "fireControlNames.h"

#define FireControlName "FIRE_CONTROL"

FireControlDm::FireControlDm(const char *platformName, const char *appName)
{
  char itemName[MaxDmNameLen];

  DmObject::buildPrefix(itemName, platformName, appName, FireControlName, 0);

  char *namePtr = itemName + strlen(itemName);

  strcpy(namePtr, FireControlArmName);
  arm = new DmEmptyObject(itemName);

  strcpy(namePtr, FireControlDisarmName);
  disarm = new DmEmptyObject(itemName);

  strcpy(namePtr, FireControlFireName);
  fastFire = new DmEmptyObject(itemName);

  strcpy(namePtr, FireControlStatusName);
  state = new DmEnumObject(itemName);

  strcpy(namePtr, FireControlArmPasswordName);
  armPassword = new DmStringObject(itemName, FireControlPasswordLen);

  strcpy(namePtr, FireControlFirePasswordName);
  firePassword = new DmStringObject(itemName, FireControlPasswordLen);

  strcpy(namePtr, FireControlArmAlarmName);
  armedAlarm = new DmBooleanObject(itemName);

  strcpy(namePtr, FireControlFireAlarmName);
  firingAlarm = new DmBooleanObject(itemName);

  strcpy(namePtr, FireControlPressureSwitchStatusName);
  pressureSwitchStatus = new DmBooleanObject(itemName);
}


FireControlDm::~FireControlDm()
{
}


FireControlDm::State FireControlDm::computeState(unsigned char stateBits)
{
  // Define valid masks
  const unsigned char disarmed1Mask = 0;
  const unsigned char disarmed2Mask = PressureSwitchBit;

  const unsigned char armed1Mask = PressureSwitchBit | ArmedBit;

  const unsigned char slowFiring1Mask = 
    PressureSwitchBit | ArmedBit | SlowFiringBit;

  const unsigned char fastFiring1Mask = 
    PressureSwitchBit | ArmedBit | FastFiringBit;    

  const unsigned char fastFiring2Mask = 
    PressureSwitchBit | ArmedBit | SlowFiringBit | FastFiringBit;    

  const unsigned char fired1Mask = PressureSwitchBit | ArmedBit | FiredBit;

  const unsigned char fired2Mask = PressureSwitchBit | ArmedBit | 
    SlowFiringBit | FiredBit;

  const unsigned char fired3Mask = PressureSwitchBit | ArmedBit | 
    FastFiringBit | FiredBit;

  const unsigned char fired4Mask = PressureSwitchBit | ArmedBit | 
    SlowFiringBit | FastFiringBit | FiredBit;


  switch (stateBits) {
  case disarmed1Mask:
  case disarmed2Mask:
    return Disarmed;
    break;

  case armed1Mask:
    return Armed;
    break;

  case slowFiring1Mask:
    return SlowFiring;
    break;

  case fastFiring1Mask:
  case fastFiring2Mask:
    return FastFiring;
    break;

  case fired1Mask:
  case fired2Mask:
  case fired3Mask:
  case fired4Mask:
    return Fired;
    break;

  default:
    // Invalid state mask - circuit failure?
    return Unknown;
  }
}

