slave_dt8.cpp 5.02 KB
/*
 * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
 *
 * Licensed under GNU General Public License 3.0 or later.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 */

#include "slave_dt8.hpp"

#ifdef DALI_DT8

namespace dali {

// static
Slave* SlaveDT8::create(IMemory* memoryDriver, ILamp* lampDriver, IBus* busDriver, ITimer* timer) {
  controller::MemoryDT8* memory = new controller::MemoryDT8(memoryDriver, &kDefaultsDT8);
  controller::LampDT8* lamp = new controller::LampDT8(lampDriver, memory);
  controller::QueryStoreDT8* queryStore = new controller::QueryStoreDT8(memory, lamp);
  controller::Bus* bus = new controller::Bus(busDriver);
  controller::Initialization* initialization = new controller::Initialization(timer, memory);

  return new SlaveDT8(memory, lamp, queryStore, bus, initialization);
}

SlaveDT8::SlaveDT8(controller::Memory* memory, controller::Lamp* lamp, controller::QueryStore* queryStore,
    controller::Bus* bus, controller::Initialization* initialization) :
    Slave(memory, lamp, queryStore, bus, initialization) {
}

Status SlaveDT8::handleHandleDaliDeviceTypeCommand(uint16_t repeatCount, Command cmd, uint8_t param,
    uint8_t device_type) {
  if (device_type != 8) {
    return Status::INVALID;
  }

  CommandDT8 cmdDT8 = (CommandDT8)cmd;

  switch (cmdDT8) {
  case CommandDT8::SET_TEMPORARY_X_COORDINATE_WORD:
    return getQueryStoreControllerDT8()->setTemporaryCoordinateX();

  case CommandDT8::SET_TEMPORARY_Y_COORDINATE_WORD:
    return getQueryStoreControllerDT8()->setTemporaryCoordinateY();

  case CommandDT8::ACTIVATE:
    return getLampControllerDT8()->activate();

#ifdef DALI_DT8_SUPPORT_XY
  case CommandDT8::X_COORDINATE_STEP_UP:
    return getLampControllerDT8()->coordinateStepUpX();

  case CommandDT8::X_COORDINATE_STEP_DOWN:
    return getLampControllerDT8()->coordinateStepDownX();

  case CommandDT8::Y_COORDINATE_STEP_UP:
    return getLampControllerDT8()->coordinateStepUpY();

  case CommandDT8::Y_COORDINATE_STEP_DOWN:
    return getLampControllerDT8()->coordinateStepDownY();
#endif // DALI_DT8_SUPPORT_XY

  case CommandDT8::SET_TEMPORARY_COLOUR_TEMPERATURE:
    return getQueryStoreControllerDT8()->setTemporaryColorTemperature();

#ifdef DALI_DT8_SUPPORT_TC
  case CommandDT8::COLOUR_TEMPERATURE_STEP_COOLER:
    return getLampControllerDT8()->colorTemperatureStepCooler();

  case CommandDT8::COLOUR_TEMPERATURE_STEP_WARMER:
    return getLampControllerDT8()->colorTemperatureStepWarmer();
#endif // DALI_DT8_SUPPORT_TC

  case CommandDT8::SET_TEMPORARY_PRIMARY_N_DIMLEVEL:
    return getQueryStoreControllerDT8()->setTemporaryPrimaryLevel();

  case CommandDT8::SET_TEMPORARY_RGB_DIMLEVEL:
    return getQueryStoreControllerDT8()->setTemporaryRGB();

  case CommandDT8::SET_TEMPORARY_WAF_DIMLEVEL:
    return getQueryStoreControllerDT8()->setTemporaryWAF();

  case CommandDT8::SET_TEMPORARY_RGBWAF_CONTROL:
    return getQueryStoreControllerDT8()->setTemporaryRGBWAFControl();

  case CommandDT8::COPY_REPORT_TO_TEMPORARY:
    return getMemoryControllerDT8()->copyReportToTemporary();

#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  case CommandDT8::STORE_TY_PRIMARY_N:
    if (repeatCount == 0) {
      return Status::REPEAT_REQUIRED;
    }
    return getQueryStoreControllerDT8()->storePrimaryTY();

  case CommandDT8::STORE_XY_COORDINATE_PRIMARY_N:
    if (repeatCount == 0) {
      return Status::REPEAT_REQUIRED;
    }
    return getQueryStoreControllerDT8()->storePrimaryCoordinate();
#endif // DALI_DT8_SUPPORT_PRIMARY_N

#ifdef DALI_DT8_SUPPORT_TC
  case CommandDT8::STORE_COLOUR_TEMPERATURE_LIMIT:
    if (repeatCount == 0) {
      return Status::REPEAT_REQUIRED;
    }
    return getQueryStoreControllerDT8()->storeColourTemperatureLimit();
#endif // DALI_DT8_SUPPORT_TC

  case CommandDT8::STORE_GEAR_FEATURES_STATUS:
    if (repeatCount == 0) {
      return Status::REPEAT_REQUIRED;
    }
    return getQueryStoreControllerDT8()->storeGearFeatures();

  case CommandDT8::START_AUTO_CALIBRATION:
    if (repeatCount == 0) {
      return Status::REPEAT_REQUIRED;
    }
    // TODO Implement in the future
    return Status::INVALID;

  case CommandDT8::QUERY_GEAR_FEATURES_STATUS:
    return sendAck(getQueryStoreControllerDT8()->queryGearFeatures());

  case CommandDT8::QUERY_COLOUR_STATUS:
    return sendAck(getQueryStoreControllerDT8()->queryColorStatus());

  case CommandDT8::QUERY_COLOUR_TYPE_FEATURES:
    return sendAck(getQueryStoreControllerDT8()->queryColorTypes());

  case CommandDT8::QUERY_COLOUR_VALUE: {
    if (getQueryStoreControllerDT8()->queryColorValue() == Status::OK) {
      return sendAck(getMemoryController()->getDTR1());
    }
    return Status::INVALID;
  }

  case CommandDT8::QUERY_EXTENDED_VERSION_NUMBER:
    return sendAck(2);

  default:
    return Status::INVALID;
  }
}

} // namespace dali

#endif // DALI_DT8