#include "LapBoxUiDm.h"

LapBoxUiData::LapBoxUiData(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, LAPBOX_ZOOM_DATA_DM);
  zoom = new DmInt16Object(itemName);
  strcpy(namePtr, LAPBOX_FOCUS_DATA_DM);
  focus = new DmInt16Object(itemName);
  strcpy(namePtr, LAPBOX_IRIS_DATA_DM);
  iris = new DmInt16Object(itemName);
  strcpy(namePtr, LAPBOX_JOYSTICK_X_DATA_DM);
  pan = new DmInt16Object(itemName);
  strcpy(namePtr, LAPBOX_JOYSTICK_Y_DATA_DM);
  tilt = new DmInt16Object(itemName);

  if (role & DmProvideFlag)
  {
    zoom->startProvide(DM_ASYNC);
    focus->startProvide(DM_ASYNC);
    iris->startProvide(DM_ASYNC);
    pan->startProvide(DM_ASYNC);
    tilt->startProvide(DM_ASYNC);
  }

  if (role & DmConsumeFlag)
  {    
    zoom->startConsume(DM_ASYNC, wakeupSem);
    focus->startConsume(DM_ASYNC, wakeupSem);
    iris->startConsume(DM_ASYNC, wakeupSem);
    pan->startConsume(DM_ASYNC, wakeupSem);
    tilt->startConsume(DM_ASYNC, wakeupSem);
  }
}


LapBoxUiEvents::LapBoxUiEvents(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, LAPBOX_IRIS_MODE_EVENT_DM);
  autoIris = new DmEmptyObject(itemName);
  strcpy(namePtr, LAPBOX_PANORAMIC_EVENT_DM);
  panoramic = new DmEmptyObject(itemName);
  strcpy(namePtr, LAPBOX_ENABLE_EVENT_DM);
  enable = new DmEmptyObject(itemName);
  strcpy(namePtr, LAPBOX_PORT_CAMERA_SELECT_EVENT_DM);
  portCameraSelect = new DmEmptyObject(itemName);
  strcpy(namePtr, LAPBOX_STBD_CAMERA_SELECT_EVENT_DM);
  stbdCameraSelect = new DmEmptyObject(itemName);
  strcpy(namePtr, LAPBOX_PORT_LIGHT_EVENT_DM);
  portLight = new DmEmptyObject(itemName);
  strcpy(namePtr, LAPBOX_PORT_CAMERA_EVENT_DM);
  portCamera = new DmEmptyObject(itemName);
  strcpy(namePtr, LAPBOX_STBD_LIGHT_EVENT_DM);  
  stbdLight = new DmEmptyObject(itemName);
  strcpy(namePtr, LAPBOX_STBD_CAMERA_EVENT_DM);  
  stbdCamera = new DmEmptyObject(itemName);

  if (role & DmProvideFlag)
  {
    autoIris->startProvide(DM_ASYNC);
    panoramic->startProvide(DM_ASYNC);
    enable->startProvide(DM_ASYNC);
    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)
  {
    autoIris->startConsume(DM_ASYNC, wakeupSem);
    panoramic->startConsume(DM_ASYNC, wakeupSem);
    enable->startConsume(DM_ASYNC, wakeupSem);
    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);
  }    
}


LapBoxUiSettings::LapBoxUiSettings(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, LAPBOX_IRIS_MODE_SETTING_DM);
  autoIris = new DmNat16Object(itemName);
  strcpy(namePtr, LAPBOX_PANORAMIC_SETTING_DM);
  panoramic = new DmNat16Object(itemName);
  strcpy(namePtr, LAPBOX_ENABLE_SETTING_DM);
  enable = new DmNat16Object(itemName);
  strcpy(namePtr, LAPBOX_PORT_CAMERA_SELECT_SETTING_DM);
  portCameraSelect = new DmNat16Object(itemName);
  strcpy(namePtr, LAPBOX_STBD_CAMERA_SELECT_SETTING_DM);
  stbdCameraSelect = new DmNat16Object(itemName);
  strcpy(namePtr, LAPBOX_PORT_LIGHT_SETTING_DM);
  portLight = new DmNat16Object(itemName);
  strcpy(namePtr, LAPBOX_PORT_CAMERA_SETTING_DM);
  portCamera = new DmNat16Object(itemName);
  strcpy(namePtr, LAPBOX_STBD_LIGHT_SETTING_DM);  
  stbdLight = new DmNat16Object(itemName);
  strcpy(namePtr, LAPBOX_STBD_CAMERA_SETTING_DM);  
  stbdCamera = new DmNat16Object(itemName);
  
  if (role & DmProvideFlag)
  {
    autoIris->startProvide(DM_ASYNC);
    panoramic->startProvide(DM_ASYNC);
    enable->startProvide(DM_ASYNC);
    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)
  {
    autoIris->startConsume(DM_ASYNC, wakeupSem);
    panoramic->startConsume(DM_ASYNC, wakeupSem);
    enable->startConsume(DM_ASYNC, wakeupSem);
    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 LapBoxUiSettings::encode(LapBoxButtonState state, MBool flash)
{
  return (flash << 8) | (0xFF & state);
}


void LapBoxUiSettings::decode(Nat16 value, 
			      LapBoxButtonState *state, MBool *flash)
{
  *state = (LapBoxButtonState )(0xFF & value);
  *flash = value >> 8;
}

