#include "PilotTrayUiDm.h"

PilotTrayUiData::PilotTrayUiData(const char *dmPrefix, DmRoleFlags role,
                           SEM_ID wakeupSem)
{

  char itemName[MaxDmNameLen];
  strcpy(itemName, dmPrefix);
  if (itemName[strlen(itemName)-1] != '.')
    strcat(itemName, ".");

  char *namePtr = itemName + strlen(itemName);

  strcpy(namePtr, PILOTTRAY_ZOOM_DATA_DM);
  zoom = new DmInt16Object(itemName);
  strcpy(namePtr, PILOTTRAY_FOCUS_DATA_DM);
  focus = new DmInt16Object(itemName);
  strcpy(namePtr, PILOTTRAY_JOYSTICK_X_DATA_DM);
  pan = new DmInt16Object(itemName);
  strcpy(namePtr, PILOTTRAY_JOYSTICK_Y_DATA_DM);
  tilt = new DmInt16Object(itemName);

  if (role & DmProvideFlag)
  {
    zoom->startProvide(DM_ASYNC);
    focus->startProvide(DM_ASYNC);
    pan->startProvide(DM_ASYNC);
    tilt->startProvide(DM_ASYNC);
  }

  if (role & DmConsumeFlag)
  {
    zoom->startConsume(DM_ASYNC, wakeupSem);
    focus->startConsume(DM_ASYNC, wakeupSem);
    pan->startConsume(DM_ASYNC, wakeupSem);
    tilt->startConsume(DM_ASYNC, wakeupSem);
  }
}


PilotTrayUiEvents::PilotTrayUiEvents(const char *dmPrefix, DmRoleFlags role,
                               SEM_ID wakeupSem)
{
  char itemName[MaxDmNameLen];
  strcpy(itemName, dmPrefix);
  if (itemName[strlen(itemName)-1] != '.')
    strcat(itemName, ".");

  char *namePtr = itemName + strlen(itemName);
  strcpy(namePtr, PILOTTRAY_PORT_CAMERA_SELECT_EVENT_DM);
  portCameraSelect = new DmBooleanObject(itemName);
  strcpy(namePtr, PILOTTRAY_STBD_CAMERA_SELECT_EVENT_DM);
  stbdCameraSelect = new DmBooleanObject(itemName);
  strcpy(namePtr, PILOTTRAY_PORT_LIGHT_EVENT_DM);
  portLight = new DmBooleanObject(itemName);
  strcpy(namePtr, PILOTTRAY_PORT_CAMERA_EVENT_DM);
  portCamera = new DmBooleanObject(itemName);
  strcpy(namePtr, PILOTTRAY_STBD_LIGHT_EVENT_DM);
  stbdLight = new DmBooleanObject(itemName);
  strcpy(namePtr, PILOTTRAY_STBD_CAMERA_EVENT_DM);
  stbdCamera = new DmBooleanObject(itemName);

  if (role & DmProvideFlag)
  {
    portCameraSelect->startProvide(DM_ASYNC);
    stbdCameraSelect->startProvide(DM_ASYNC);
    portLight->startProvide(DM_ASYNC);
    portCamera->startProvide(DM_ASYNC);
    stbdLight->startProvide(DM_ASYNC);
    stbdCamera->startProvide(DM_ASYNC);
  }

  if (role & DmConsumeFlag)
  {
    portCameraSelect->startConsume(DM_ASYNC, wakeupSem);
    stbdCameraSelect->startConsume(DM_ASYNC, wakeupSem);
    portLight->startConsume(DM_ASYNC, wakeupSem);
    portCamera->startConsume(DM_ASYNC, wakeupSem);
    stbdLight->startConsume(DM_ASYNC, wakeupSem);
    stbdCamera->startConsume(DM_ASYNC, wakeupSem);
  }
}


PilotTrayUiSettings::PilotTrayUiSettings(const char *dmPrefix, DmRoleFlags role,
                                   SEM_ID wakeupSem)
{
  char itemName[MaxDmNameLen];
  strcpy(itemName, dmPrefix);
  if (itemName[strlen(itemName)-1] != '.')
    strcat(itemName, ".");

  char *namePtr = itemName + strlen(itemName);
  strcpy(namePtr, PILOTTRAY_PORT_CAMERA_SELECT_SETTING_DM);
  portCameraSelect = new DmBooleanObject(itemName);
  strcpy(namePtr, PILOTTRAY_STBD_CAMERA_SELECT_SETTING_DM);
  stbdCameraSelect = new DmBooleanObject(itemName);
  strcpy(namePtr, PILOTTRAY_PORT_LIGHT_SETTING_DM);
  portLight = new DmBooleanObject(itemName);
  strcpy(namePtr, PILOTTRAY_PORT_CAMERA_SETTING_DM);
  portCamera = new DmBooleanObject(itemName);
  strcpy(namePtr, PILOTTRAY_STBD_LIGHT_SETTING_DM);
  stbdLight = new DmBooleanObject(itemName);
  strcpy(namePtr, PILOTTRAY_STBD_CAMERA_SETTING_DM);
  stbdCamera = new DmBooleanObject(itemName);

  if (role & DmProvideFlag)
  {
    portCameraSelect->startProvide(DM_ASYNC);
    stbdCameraSelect->startProvide(DM_ASYNC);
    portLight->startProvide(DM_ASYNC);
    portCamera->startProvide(DM_ASYNC);
    stbdLight->startProvide(DM_ASYNC);
    stbdCamera->startProvide(DM_ASYNC);
  }

  if (role & DmConsumeFlag)
  {
    portCameraSelect->startConsume(DM_ASYNC, wakeupSem);
    stbdCameraSelect->startConsume(DM_ASYNC, wakeupSem);
    portLight->startConsume(DM_ASYNC, wakeupSem);
    portCamera->startConsume(DM_ASYNC, wakeupSem);
    stbdLight->startConsume(DM_ASYNC, wakeupSem);
    stbdCamera->startConsume(DM_ASYNC, wakeupSem);
  }
}


Nat16 PilotTrayUiSettings::encode(MBool state, MBool flash)
{
  return (flash << 8) | (0xFF & state);
}


void PilotTrayUiSettings::decode(Nat16 value,
                              MBool *state, MBool *flash)
{
  *state = (MBool)(0xFF & value);
  *flash = value >> 8;
}

