Commit f2151106f93a5f394d369a592264c139907813c7

Authored by Arkadiusz Materek
1 parent 678db6cc

DALI device type 8 implementation.

src/dali/commands_dt8.hpp 0 → 100644
  1 +/*
  2 + * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
  3 + *
  4 + * Licensed under GNU General Public License 3.0 or later.
  5 + *
  6 + * This program is distributed in the hope that it will be useful,
  7 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  8 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9 + */
  10 +
  11 +#ifndef DALI_COMMANDS_DT8_HPP_
  12 +#define DALI_COMMANDS_DT8_HPP_
  13 +
  14 +#include <stdint.h>
  15 +
  16 +namespace dali {
  17 +
  18 +enum class CommandDT8 {
  19 + SET_TEMPORARY_X_COORDINATE_WORD = 224,
  20 + SET_TEMPORARY_Y_COORDINATE_WORD = 225,
  21 + ACTIVATE = 226,
  22 + X_COORDINATE_STEP_UP = 227,
  23 + X_COORDINATE_STEP_DOWN = 228,
  24 + Y_COORDINATE_STEP_UP = 229,
  25 + Y_COORDINATE_STEP_DOWN = 230,
  26 + SET_TEMPORARY_COLOUR_TEMPERATURE = 231,
  27 + COLOUR_TEMPERATURE_STEP_COOLER = 232,
  28 + COLOUR_TEMPERATURE_STEP_WARMER = 233,
  29 + SET_TEMPORARY_PRIMARY_N_DIMLEVEL = 234,
  30 + SET_TEMPORARY_RGB_DIMLEVEL = 235,
  31 + SET_TEMPORARY_WAF_DIMLEVEL = 236,
  32 + SET_TEMPORARY_RGBWAF_CONTROL = 237,
  33 + COPY_REPORT_TO_TEMPORARY = 238,
  34 +
  35 + STORE_TY_PRIMARY_N = 240,
  36 + STORE_XY_COORDINATE_PRIMARY_N = 241,
  37 + STORE_COLOUR_TEMPERATURE_LIMIT = 242,
  38 + STORE_GEAR_FEATURES_STATUS = 243,
  39 +
  40 + ASSIGN_COLOUR_TO_LINKED_CHANNEL = 245,
  41 + START_AUTO_CALIBRATION = 246,
  42 + QUERY_GEAR_FEATURES_STATUS = 247,
  43 + QUERY_COLOUR_STATUS = 248,
  44 + QUERY_COLOUR_TYPE_FEATURES = 249,
  45 + QUERY_COLOUR_VALUE = 250,
  46 + QUERY_RGBWAF_CONTROL = 251,
  47 + QUERY_ASSIGNED_COLOUR = 252,
  48 +
  49 + QUERY_EXTENDED_VERSION_NUMBER = 255,
  50 +};
  51 +
  52 +}
  53 +// namespace dali
  54 +
  55 +#endif // DALI_COMMANDS_DT8_HPP_
src/dali/config.hpp
@@ -14,11 +14,13 @@ @@ -14,11 +14,13 @@
14 #define DALI_VERSION 1 14 #define DALI_VERSION 1
15 #define DALI_DEVICE_TYPE 8 15 #define DALI_DEVICE_TYPE 8
16 16
17 -#define DALI_BANKS 3 17 +#define DALI_BANKS 5
18 #define DALI_BANK0_ADDR 0 // Bank 0 (16 bytes) according to 62386-102 18 #define DALI_BANK0_ADDR 0 // Bank 0 (16 bytes) according to 62386-102
19 #define DALI_BANK1_ADDR 16 // Bank 1 (16 bytes) according to 62386-102 19 #define DALI_BANK1_ADDR 16 // Bank 1 (16 bytes) according to 62386-102
20 #define DALI_BANK2_ADDR 32 // Bank 2 (28 bytes) data 62386-102 (26 bytes) 20 #define DALI_BANK2_ADDR 32 // Bank 2 (28 bytes) data 62386-102 (26 bytes)
21 -#define DALI_BANK3_ADDR 60 21 +#define DALI_BANK3_ADDR 60 // Bank 3 (44 bytes) configuration DT8 62386-209
  22 +#define DALI_BANK4_ADDR 104 // Bank 4 (148 bytes) data DT8 62386-209
  23 +#define DALI_BANK5_ADDR 252
22 24
23 #define DALI_PHISICAL_MIN_LEVEL 1 25 #define DALI_PHISICAL_MIN_LEVEL 1
24 26
src/dali/config_dt8.hpp 0 → 100644
  1 +/*
  2 + * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
  3 + *
  4 + * All right reversed. Usage for commercial on not commercial
  5 + * purpose without written permission is not allowed.
  6 + *
  7 + * This program is distributed in the hope that it will be useful,
  8 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10 + */
  11 +
  12 +#ifndef DALI_CONFIG_DT8_H_
  13 +#define DALI_CONFIG_DT8_H_
  14 +
  15 +#include "config.hpp"
  16 +
  17 +#if DALI_DEVICE_TYPE == 8
  18 +
  19 +# define DALI_DT8
  20 +
  21 +# define DALI_DT8_SUPPORT_XY
  22 +# define DALI_DT8_SUPPORT_TC
  23 +# define DALI_DT8_SUPPORT_PRIMARY_N
  24 +// # define DALI_DT8_SUPPORT_RGBWAF // TODO
  25 +
  26 +#define DALI_DT8_NUMBER_OF_PRIMARIES 3
  27 +
  28 +# define DEFAULT_RGBWAF_CONTROL (DALI_DT8_RGBWAF_CONTROL_CANNELS_MASK | (DALI_DT8_RGBWAF_CONTROL_COLOR << 6))
  29 +
  30 +
  31 +#endif // DALI_DEVICE_TYPE == 8
  32 +
  33 +#endif // DALI_CONFIG_DT8_H_
src/dali/controller/color_dt8.cpp 0 → 100644
  1 +/*
  2 + * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
  3 + *
  4 + * Licensed under GNU General Public License 3.0 or later.
  5 + *
  6 + * This program is distributed in the hope that it will be useful,
  7 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  8 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9 + */
  10 +
  11 +#include "color_dt8.hpp"
  12 +
  13 +#include <stdint.h>
  14 +#include <string.h>
  15 +
  16 +// TC values in mired
  17 +#define TC_MIN 50
  18 +#define TC_MAX 1000
  19 +#define TC_STEP 50
  20 +
  21 +namespace dali {
  22 +namespace controller {
  23 +namespace {
  24 +
  25 +const PointXY tc2xy[] = {
  26 + { 16807, 16884 }, // 0 - minimal possible TC
  27 + { 18392, 18893 }, // 1
  28 + { 20382, 21047 }, // 2
  29 + { 22617, 23043 }, // 3
  30 + { 24933, 24691 }, // 4
  31 + { 27200, 25910 }, // 5
  32 + { 29325, 26700 }, // 6
  33 + { 31261, 27111 }, // 7
  34 + { 32992, 27214 }, // 8
  35 + { 34517, 27086 }, // 9
  36 + { 35859, 26793 }, // 10
  37 + { 37031, 26394 }, // 11
  38 + { 38073, 25925 }, // 12
  39 + { 38980, 25430 }, // 13
  40 + { 39799, 24916 }, // 14
  41 + { 40521, 24411 }, // 15
  42 + { 41177, 23916 }, // 16
  43 + { 41762, 23446 }, // 17
  44 + { 42291, 23001 }, // 18
  45 + { 42779, 22574 }, // 19 - maximal possible TC
  46 +};
  47 +
  48 +const Float kZero(0);
  49 +const Float kOne(65536);
  50 +
  51 +bool isCalibrated(const Primary& p) {
  52 + return (p.ty <= DALI_DT8_PRIMARY_TY_MAX) && (p.xy.x != DALI_DT8_MASK16) && (p.xy.x != DALI_DT8_MASK16);
  53 +}
  54 +
  55 +bool xyToPrimary1(PointXY p, const PointXY prim_xy[], Float out[]) {
  56 + out[0] = kOne;
  57 + return (prim_xy[0].x != p.x) || (prim_xy[0].y != p.y);
  58 +}
  59 +
  60 +Float float_abs(Float x) {
  61 + if (x < kZero) {
  62 + return kZero - x;
  63 + }
  64 + return x;
  65 +}
  66 +
  67 +bool xyToPrimary2(PointXY p, const PointXY prim_xy[], Float out[]) {
  68 + bool limitError = false;
  69 + Float x1(prim_xy[0].x);
  70 + Float x2(prim_xy[1].x);
  71 + Float y1(prim_xy[0].y);
  72 + Float y2(prim_xy[1].y);
  73 + Float tmpx = x1 - x2;
  74 + Float tmpy = y1 - y2;
  75 +
  76 + Float l1, l2;
  77 + if (float_abs(tmpx) >= float_abs(tmpy)) {
  78 + Float x = Float(p.x);
  79 + l1 = (x - x2) / tmpx;
  80 + l2 = (x1 - x) / tmpx;
  81 + } else {
  82 + Float y = Float(p.y);
  83 + l1 = (y - y2) / tmpy;
  84 + l2 = (y1 - y) / tmpy;
  85 + }
  86 +
  87 + if (l1 < kZero) {
  88 + l1 = kZero;
  89 + limitError = true;
  90 + } else if (l1 > kOne) {
  91 + l1 = kOne;
  92 + limitError = true;
  93 + }
  94 +
  95 + if (l2 < kZero) {
  96 + l2 = kZero;
  97 + limitError = true;
  98 + } else if (l2 > kOne) {
  99 + l2 = kOne;
  100 + limitError = true;
  101 + }
  102 +
  103 + out[0] = l1;
  104 + out[1] = l2;
  105 +
  106 + return limitError;
  107 +}
  108 +
  109 +bool xyToPrimary3(PointXY p, const PointXY prim_xy[], Float out[]) {
  110 + bool limitError = false;
  111 + Float x(p.x);
  112 + Float y(p.y);
  113 + Float x1(prim_xy[0].x);
  114 + Float y1(prim_xy[0].y);
  115 + Float x2(prim_xy[1].x);
  116 + Float y2(prim_xy[1].y);
  117 + Float x3(prim_xy[2].x);
  118 + Float y3(prim_xy[2].y);
  119 + Float tmp = (x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2));
  120 +
  121 + if (tmp == Float(0)) {
  122 + return true;
  123 + }
  124 +
  125 + Float l1 = (x * (y2 - y3) + y * (x3 - x2) + x2 * y3 - x3 * y2) / tmp;
  126 + if (l1 < kZero) {
  127 + l1 = kZero;
  128 + limitError = true;
  129 + } else if (l1 > kOne) {
  130 + l1 = kOne;
  131 + limitError = true;
  132 + }
  133 +
  134 + Float l2 = kZero - (x * (y1 - y3) + y * (x3 - x1) + x1 * y3 - x3 * y1) / tmp;
  135 + if (l2 < kZero) {
  136 + l2 = kZero;
  137 + limitError = true;
  138 + } else if (l2 > kOne) {
  139 + l2 = kOne;
  140 + limitError = true;
  141 + }
  142 +
  143 + Float l3 = (x * (y1 - y2) + y * (x2 - x1) + x1 * y2 - x2 * y1) / tmp;
  144 + if (l3 < kZero) {
  145 + l3 = kZero;
  146 + limitError = true;
  147 + } else if (l3 > kOne) {
  148 + l3 = kOne;
  149 + limitError = true;
  150 + }
  151 + out[0] = l1;
  152 + out[1] = l2;
  153 + out[2] = l3;
  154 + return limitError;
  155 +}
  156 +
  157 +} // namespace
  158 +
  159 +// static
  160 +uint16_t ColorDT8::primaryToTc(const Float level[], const Primary primary[], uint16_t nrOfPrimaries) {
  161 + PointXY p = ColorDT8::primaryToXY(level, primary, nrOfPrimaries);
  162 +
  163 + uint16_t x = p.x;
  164 + if (x <= tc2xy[0].x) {
  165 + return TC_MIN;
  166 + }
  167 + if (x >= tc2xy[19].x) {
  168 + return TC_MAX;
  169 + }
  170 +
  171 + uint16_t a = 0;
  172 + uint16_t b = 19;
  173 + while (a + 1 < b) {
  174 + uint16_t m = (a + b) / 2;
  175 + uint16_t xx = tc2xy[m].x;
  176 + if (x == xx) {
  177 + a = b = m;
  178 + } else if (x < xx) {
  179 + b = m;
  180 + } else {
  181 + a = m;
  182 + }
  183 + }
  184 +
  185 + if (a == b) {
  186 + return (a + 1) * TC_STEP;
  187 + } else {
  188 + uint16_t xx = x - tc2xy[a].x;
  189 + uint16_t dx = tc2xy[b].x - tc2xy[a].x;
  190 + return (a + 1) * TC_STEP + (xx * TC_STEP + dx / 2) / dx;
  191 + }
  192 +}
  193 +
  194 +// static
  195 +PointXY ColorDT8::tcToXY(uint16_t tc) {
  196 + if (tc <= TC_MIN) {
  197 + return tc2xy[0];
  198 + }
  199 + if (tc >= TC_MAX) {
  200 + return tc2xy[19];
  201 + }
  202 + uint16_t i = tc / TC_STEP - 1;
  203 +
  204 + // linear approximation
  205 + PointXY a = tc2xy[i];
  206 + PointXY b = tc2xy[i + 1];
  207 + int32_t r = tc % TC_STEP;
  208 + PointXY result = a;
  209 + result.x += (((int32_t)b.x - a.x) * r + TC_STEP / 2) / TC_STEP;
  210 + result.y += (((int32_t)b.y - a.y) * r + TC_STEP / 2) / TC_STEP;
  211 + return result;
  212 +}
  213 +
  214 +// static
  215 +PointXY ColorDT8::primaryToXY(const Float level[], const Primary primary[], uint16_t nrOfPrimaries) {
  216 + Float x(0);
  217 + Float y(0);
  218 + Float l(0);
  219 + uint16_t min_ty = 65535;
  220 + for (uint16_t i = 0; i < nrOfPrimaries; ++ i) {
  221 + if (primary[i].ty < min_ty) {
  222 + min_ty = primary[i].ty;
  223 + }
  224 + }
  225 +
  226 + for (uint16_t i = 0; i < nrOfPrimaries; ++ i) {
  227 + const Primary& p = primary[i];
  228 + if (isCalibrated(p)) {
  229 + Float ty = level[i] * Float(primary[i].ty) / Float(min_ty);
  230 + l += ty;
  231 + x += Float(p.xy.x) * ty;
  232 + y += Float(p.xy.y) * ty;
  233 + }
  234 + }
  235 + PointXY result;
  236 + if (l != kZero) {
  237 + int32_t tx = x / l;
  238 + result.x = tx <= 65535 ? tx : 65535;
  239 + int32_t ty = y / l;
  240 + result.y = ty <= 65535 ? ty : 65535;
  241 + } else {
  242 + // TODO how to handle this case
  243 + result.x = 0;
  244 + result.y = 0;
  245 + }
  246 + return result;
  247 +}
  248 +
  249 +uint16_t findValidPrimaries(const Primary primary[], uint16_t nrOfPrimaries, PointXY primaryXY[], uint16_t primaryNr[]) {
  250 + uint16_t n = 0;
  251 + for (uint16_t i = 0; i < nrOfPrimaries; ++ i) {
  252 + const Primary& p = primary[i];
  253 + if (isCalibrated(p)) {
  254 + primaryXY[n].x = p.xy.x;
  255 + primaryXY[n].y = p.xy.y;
  256 + primaryNr[n] = i;
  257 + n++;
  258 + }
  259 + }
  260 + return n;
  261 +}
  262 +
  263 +// static
  264 +bool ColorDT8::xyToPrimary(PointXY xy, const Primary primary[], uint16_t nrOfPrimaries, Float level[]) {
  265 + PointXY primaryXY[nrOfPrimaries];
  266 + uint16_t primaryNr[nrOfPrimaries];
  267 + uint16_t n = findValidPrimaries(primary, nrOfPrimaries, primaryXY, primaryNr);
  268 +
  269 + memset(level, 0, sizeof(uint16_t) * nrOfPrimaries);
  270 +
  271 + bool limitError = false;
  272 + Float out[n];
  273 + switch (n) {
  274 + case 0:
  275 + // no calibrated primary found
  276 + break;
  277 +
  278 + case 1:
  279 + limitError = xyToPrimary1(xy, primaryXY, out);
  280 + break;
  281 +
  282 + case 2:
  283 + limitError = xyToPrimary2(xy, primaryXY, out);
  284 + break;
  285 +
  286 + case 3:
  287 + limitError = xyToPrimary3(xy, primaryXY, out);
  288 + break;
  289 +
  290 + default:
  291 + // TODO find better solution ex. find nearest points
  292 + n = 3;
  293 + limitError =xyToPrimary3(xy, primaryXY, out);
  294 + break;
  295 + }
  296 +
  297 + uint16_t min_ty = 65535;
  298 + for (uint16_t i = 0; i < nrOfPrimaries; ++ i) {
  299 + if (primary[i].ty < min_ty) {
  300 + min_ty = primary[i].ty;
  301 + }
  302 + }
  303 + for (uint16_t i = 0; i < n; ++i) {
  304 + uint16_t j = primaryNr[i];
  305 + level[j] = (out[i] * Float(min_ty)) / Float(primary[j].ty);
  306 + }
  307 + return limitError;
  308 +}
  309 +
  310 +} // controller
  311 +} // namespace dali
src/dali/controller/color_dt8.hpp 0 → 100644
  1 +/*
  2 + * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
  3 + *
  4 + * Licensed under GNU General Public License 3.0 or later.
  5 + *
  6 + * This program is distributed in the hope that it will be useful,
  7 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  8 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9 + */
  10 +
  11 +#ifndef DALI_CONTROLLER_COLOR_HPP_
  12 +#define DALI_CONTROLLER_COLOR_HPP_
  13 +
  14 +#include <dali/dali_dt8.hpp>
  15 +
  16 +#ifdef DALI_DT8
  17 +
  18 +#include <dali/float_dt8.hpp>
  19 +
  20 +namespace dali {
  21 +namespace controller {
  22 +
  23 +typedef struct __attribute__((__packed__)) ColorDT8 {
  24 +
  25 + ColorDT8() {
  26 + reset();
  27 + }
  28 +
  29 + void reset() {
  30 + type = DALI_MASK;
  31 + memset(&value, 0xff, sizeof(value));
  32 + }
  33 +
  34 + bool isReset() const {
  35 + if (type != DALI_MASK)
  36 + return false;
  37 + return true;
  38 + }
  39 +
  40 + void setType(uint8_t type) {
  41 + if (this->type != type) {
  42 + reset();
  43 + this->type = type;
  44 + }
  45 + }
  46 +
  47 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  48 + typedef uint16_t Primaries[DALI_DT8_NUMBER_OF_PRIMARIES];
  49 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  50 + union {
  51 +
  52 +#ifdef DALI_DT8_SUPPORT_XY
  53 + PointXY xy;
  54 +#endif // DALI_DT8_SUPPORT_XY
  55 +
  56 +#ifdef DALI_DT8_SUPPORT_TC
  57 + uint16_t tc;
  58 +#endif // DALI_DT8_SUPPORT_TC
  59 +
  60 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  61 + Primaries primary;
  62 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  63 + } value;
  64 +
  65 + uint8_t type;
  66 +
  67 + static uint16_t primaryToTc(const Float level[], const Primary primary[], uint16_t nrOfPrimaries);
  68 + static PointXY tcToXY(uint16_t tc);
  69 + static PointXY primaryToXY(const Float level[], const Primary primary[], uint16_t nrOfPrimaries);
  70 + static bool xyToPrimary(PointXY xy, const Primary primary[], uint16_t nrOfPrimaries, Float level[]);
  71 +} ColorDT8;
  72 +
  73 +} // controller
  74 +} // dali
  75 +
  76 +#endif // DALI_DT8
  77 +
  78 +#endif // DALI_CONTROLLER_COLOR_HPP_
src/dali/controller/lamp_dt8.cpp 0 → 100644
  1 +/*
  2 + * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
  3 + *
  4 + * Licensed under GNU General Public License 3.0 or later.
  5 + *
  6 + * This program is distributed in the hope that it will be useful,
  7 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  8 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9 + */
  10 +
  11 +#include "lamp_dt8.hpp"
  12 +
  13 +#ifdef DALI_DT8
  14 +
  15 +#include "color_dt8.hpp"
  16 +#include "lamp_helper.hpp"
  17 +
  18 +namespace dali {
  19 +namespace controller {
  20 +
  21 +LampDT8::LampDT8(ILamp* lamp, MemoryDT8* memoryController) :
  22 + Lamp(lamp, memoryController), mXYCoordinateLimitError(false), mTemeratureLimitError(false) {
  23 + for (uint16_t i = 0; i < DALI_DT8_NUMBER_OF_PRIMARIES; ++i) {
  24 + mActualPrimary[i] = 0;
  25 + }
  26 + calculatePowerOnColor(); // update mActualColor to initial value
  27 + setColor(mActualColor, 0);
  28 +}
  29 +
  30 +const ColorDT8& LampDT8::getActualColor() {
  31 + if (getLampDT8()->isColorChanging()) {
  32 + updateActualColor();
  33 + return mActualColor;
  34 + }
  35 + return mActualColor;
  36 +}
  37 +
  38 +bool LampDT8::isColorChanging() {
  39 + return getLampDT8()->isColorChanging();
  40 +}
  41 +
  42 +bool LampDT8::isAutomaticActivationEnabled() {
  43 + return (getMemoryDT8()->getFeaturesStatus() & 0x01) != 0;
  44 +}
  45 +
  46 +bool LampDT8::isXYCoordinateLimitError() {
  47 + return mXYCoordinateLimitError;
  48 +}
  49 +
  50 +bool LampDT8::isTemeratureLimitError() {
  51 + return mTemeratureLimitError;
  52 +}
  53 +
  54 +Status LampDT8::powerDirect(uint8_t level, uint64_t time) {
  55 + if (isAutomaticActivationEnabled()) {
  56 + activateColor(getFadeTime());
  57 + } else if (level == DALI_MASK) {
  58 + abortColorChanging();
  59 + }
  60 + return Lamp::powerDirect(level, time);
  61 +}
  62 +
  63 +Status LampDT8::powerOff() {
  64 + if (isAutomaticActivationEnabled()) {
  65 + activateColor(0);
  66 + }
  67 + return Lamp::powerOff();
  68 +}
  69 +
  70 +Status LampDT8::powerScene(uint8_t scene) {
  71 + const ColorDT8& color = getMemoryDT8()->getColorForScene(scene);
  72 + getMemoryDT8()->setTemporaryColor(color);
  73 + if (isAutomaticActivationEnabled()) {
  74 + activateColor(getFadeTime());
  75 + }
  76 + return Lamp::powerScene(scene);
  77 +}
  78 +
  79 +Status LampDT8::powerUp() {
  80 + if (isAutomaticActivationEnabled()) {
  81 + activateColor(getFadeRate());
  82 + }
  83 + return Lamp::powerUp();
  84 +}
  85 +
  86 +Status LampDT8::powerDown() {
  87 + if (isAutomaticActivationEnabled()) {
  88 + activateColor(getFadeRate());
  89 + }
  90 + return Lamp::powerDown();
  91 +}
  92 +
  93 +Status LampDT8::powerStepUp() {
  94 + if (isAutomaticActivationEnabled()) {
  95 + activateColor(0);
  96 + }
  97 + return Lamp::powerStepUp();
  98 +}
  99 +
  100 +Status LampDT8::powerStepDown() {
  101 + if (isAutomaticActivationEnabled()) {
  102 + activateColor(0);
  103 + }
  104 + return Lamp::powerStepDown();
  105 +}
  106 +
  107 +Status LampDT8::powerOnAndStepUp() {
  108 + if (isAutomaticActivationEnabled()) {
  109 + activateColor(0);
  110 + }
  111 + return Lamp::powerOnAndStepUp();
  112 +}
  113 +
  114 +Status LampDT8::powerStepDownAndOff() {
  115 + if (isAutomaticActivationEnabled()) {
  116 + activateColor(0);
  117 + }
  118 + return Lamp::powerStepDownAndOff();
  119 +}
  120 +
  121 +Status LampDT8::powerRecallMinLevel() {
  122 + if (isAutomaticActivationEnabled()) {
  123 + activateColor(0);
  124 + }
  125 + return Lamp::powerRecallMinLevel();
  126 +}
  127 +
  128 +Status LampDT8::powerRecallMaxLevel() {
  129 + if (isAutomaticActivationEnabled()) {
  130 + activateColor(0);
  131 + }
  132 + return Lamp::powerRecallMaxLevel();
  133 +}
  134 +
  135 +Status LampDT8::powerRecallOnLevel() {
  136 + setColor(getMemoryDT8()->getPowerOnColor(), 0);
  137 + return Lamp::powerRecallOnLevel();
  138 +}
  139 +
  140 +Status LampDT8::powerRecallFaliureLevel() {
  141 + setColor(getMemoryDT8()->getFaliureColor(), 0);
  142 + return Lamp::powerRecallFaliureLevel();
  143 +}
  144 +
  145 +Status LampDT8::activate() {
  146 + // shall stop a running fade if a fade is running,
  147 + // and start a new fade for color only.
  148 + // See 9.12.5 for details.
  149 + Lamp::abortFading();
  150 + return activateColor(getFadeTime());
  151 +}
  152 +
  153 +#ifdef DALI_DT8_SUPPORT_XY
  154 +Status LampDT8::coordinateStepUpX() {
  155 + ColorDT8 color = getActualColor();
  156 + if (color.type != DALI_DT8_COLOR_TYPE_XY) {
  157 + return Status::INVALID;
  158 + }
  159 + if (color.value.xy.x < 65535 - 256) {
  160 + color.value.xy.x += 256;
  161 + }
  162 + return setColor(color, 0);
  163 +}
  164 +
  165 +Status LampDT8::coordinateStepUpY() {
  166 + ColorDT8 color = getActualColor();
  167 + if (color.type != DALI_DT8_COLOR_TYPE_XY) {
  168 + return Status::INVALID;
  169 + }
  170 + if (color.value.xy.y < 65535 - 256) {
  171 + color.value.xy.y += 256;
  172 + }
  173 + return setColor(color, 0);
  174 +}
  175 +
  176 +Status LampDT8::coordinateStepDownX() {
  177 + ColorDT8 color = getActualColor();
  178 + if (color.type != DALI_DT8_COLOR_TYPE_XY) {
  179 + return Status::INVALID;
  180 + }
  181 + if (color.value.xy.x > 256) {
  182 + color.value.xy.x -= 256;
  183 + }
  184 + return setColor(color, 0);
  185 +}
  186 +
  187 +Status LampDT8::coordinateStepDownY() {
  188 + ColorDT8 color = getActualColor();
  189 + if (color.type != DALI_DT8_COLOR_TYPE_XY) {
  190 + return Status::INVALID;
  191 + }
  192 + if (color.value.xy.y > 256) {
  193 + color.value.xy.y -= 256;
  194 + }
  195 + return setColor(color, 0);
  196 +}
  197 +#endif // DALI_DT8_SUPPORT_XY
  198 +
  199 +#ifdef DALI_DT8_SUPPORT_TC
  200 +Status LampDT8::colorTemperatureStepCooler() {
  201 + ColorDT8 color = getActualColor();
  202 + if (color.type != DALI_DT8_COLOR_TYPE_TC) {
  203 + return Status::INVALID;
  204 + }
  205 + uint16_t colorTemperatureCoolest = getMemoryDT8()->getColorTemperatureCoolest();
  206 + if (color.value.tc <= colorTemperatureCoolest) {
  207 + mTemeratureLimitError = true;
  208 + return Status::OK;
  209 + } else {
  210 + color.value.tc--;
  211 + }
  212 + return setColor(color, 0);
  213 +}
  214 +
  215 +Status LampDT8::colorTemperatureStepWarmer() {
  216 + ColorDT8 color = getActualColor();
  217 + if (color.type != DALI_DT8_COLOR_TYPE_TC) {
  218 + return Status::INVALID;
  219 + }
  220 + uint16_t colorTemperatureWarmest = getMemoryDT8()->getColorTemperatureWarmest();
  221 + if (color.value.tc >= colorTemperatureWarmest) {
  222 + mTemeratureLimitError = true;
  223 + return Status::OK;
  224 + } else {
  225 + color.value.tc++;
  226 + }
  227 + return setColor(color, 0);
  228 +}
  229 +#endif // DALI_DT8_SUPPORT_TC
  230 +
  231 +Status LampDT8::activateColor(uint32_t changeTime) {
  232 + Status status = Status::INVALID;
  233 +
  234 + ColorDT8 color = getMemoryDT8()->getTemporaryColor();
  235 + switch (color.type) {
  236 +
  237 +#ifdef DALI_DT8_SUPPORT_XY
  238 + case DALI_DT8_COLOR_TYPE_XY:
  239 +#endif // DALI_DT8_SUPPORT_XY
  240 +
  241 +#ifdef DALI_DT8_SUPPORT_TC
  242 + case DALI_DT8_COLOR_TYPE_TC:
  243 +#endif // DALI_DT8_SUPPORT_TC
  244 +
  245 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  246 + case DALI_DT8_COLOR_TYPE_PRIMARY_N:
  247 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  248 +
  249 + getLampDT8()->abortColorChanging();
  250 + status = setColor(color, changeTime);
  251 + getMemoryDT8()->resetTemporaryColor();
  252 + break;
  253 +
  254 + case DALI_MASK:
  255 + abortColorChanging();
  256 + status = Status::OK;
  257 + break;
  258 +
  259 + default:
  260 + status = Status::ERROR;
  261 + break;
  262 + }
  263 + return status;
  264 +}
  265 +
  266 +Status LampDT8::setColor(const ColorDT8& color, uint32_t changeTime) {
  267 + mXYCoordinateLimitError = false;
  268 + mTemeratureLimitError = false;
  269 +
  270 + switch (color.type) {
  271 +#ifdef DALI_DT8_SUPPORT_XY
  272 + case DALI_DT8_COLOR_TYPE_XY:
  273 + Lamp::setMode(Mode::NORMAL, DALI_MASK, changeTime);
  274 + return setColorXY(color, changeTime);
  275 +#endif // DALI_DT8_SUPPORT_XY
  276 +
  277 +#ifdef DALI_DT8_SUPPORT_TC
  278 + case DALI_DT8_COLOR_TYPE_TC:
  279 + Lamp::setMode(Mode::NORMAL, DALI_MASK, changeTime);
  280 + return setColorTemperature(color, changeTime);
  281 +#endif // DALI_DT8_SUPPORT_TC
  282 +
  283 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  284 + case DALI_DT8_COLOR_TYPE_PRIMARY_N: {
  285 + Status status = setColorPrimary(color, changeTime);
  286 + Lamp::setMode(Mode::CONSTANT_POWER, DALI_LEVEL_MAX, changeTime);
  287 + return status;
  288 + }
  289 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  290 +
  291 + default:
  292 + return Status::INVALID;
  293 + }
  294 +}
  295 +
  296 +#ifdef DALI_DT8_SUPPORT_XY
  297 +Status LampDT8::setColorXY(const ColorDT8& color, uint32_t changeTime) {
  298 + const Primary* primaries = getMemoryDT8()->getPrimaries();
  299 + mActualColor = color;
  300 + if ((mActualColor.value.xy.x == DALI_DT8_MASK16) || (mActualColor.value.xy.y == DALI_DT8_MASK16)) {
  301 + PointXY xy = ColorDT8::primaryToXY(mActualPrimary, primaries, DALI_DT8_NUMBER_OF_PRIMARIES);
  302 + if (mActualColor.value.xy.x == DALI_DT8_MASK16) {
  303 + mActualColor.value.xy.x = xy.x;
  304 + }
  305 + if (mActualColor.value.xy.y == DALI_DT8_MASK16) {
  306 + mActualColor.value.xy.y = xy.y;
  307 + }
  308 + }
  309 + if (ColorDT8::xyToPrimary(mActualColor.value.xy, primaries, DALI_DT8_NUMBER_OF_PRIMARIES, mActualPrimary)) {
  310 + mXYCoordinateLimitError = true;
  311 + mActualColor.value.xy = ColorDT8::primaryToXY(mActualPrimary, primaries, DALI_DT8_NUMBER_OF_PRIMARIES);
  312 + }
  313 + updateLampDriver(changeTime);
  314 + return getMemoryDT8()->setActualColor(mActualColor);
  315 +}
  316 +#endif // DALI_DT8_SUPPORT_XY
  317 +
  318 +#ifdef DALI_DT8_SUPPORT_TC
  319 +Status LampDT8::setColorTemperature(const ColorDT8& color, uint32_t changeTime) {
  320 + const Primary* primaries = getMemoryDT8()->getPrimaries();
  321 + mActualColor = color;
  322 + if (mActualColor.value.tc != DALI_DT8_MASK16) {
  323 + uint16_t colorTemperaturePhisicalCoolest = getMemoryDT8()->getColorTemperaturePhisicalCoolest();
  324 + uint16_t colorTemperaturePhisicalWarmest = getMemoryDT8()->getColorTemperaturePhisicalWarmest();
  325 +
  326 + if (colorTemperaturePhisicalCoolest == DALI_DT8_MASK16) {
  327 + colorTemperaturePhisicalCoolest = DALI_DT8_TC_COOLEST;
  328 + }
  329 + if (colorTemperaturePhisicalWarmest == DALI_DT8_MASK16) {
  330 + colorTemperaturePhisicalWarmest = DALI_DT8_TC_WARMESR;
  331 + }
  332 +
  333 + uint16_t colorTemperatureCoolest = getMemoryDT8()->getColorTemperatureCoolest();
  334 + uint16_t colorTemperatureWarmest = getMemoryDT8()->getColorTemperatureWarmest();
  335 +
  336 + if (colorTemperatureCoolest == DALI_DT8_MASK16) {
  337 + colorTemperatureCoolest = colorTemperaturePhisicalCoolest;
  338 + }
  339 + if (colorTemperatureWarmest == DALI_DT8_MASK16) {
  340 + colorTemperatureWarmest = colorTemperaturePhisicalWarmest;
  341 + }
  342 +
  343 + if (mActualColor.value.tc < colorTemperatureCoolest) {
  344 + mTemeratureLimitError = true;
  345 + mActualColor.value.tc = colorTemperatureCoolest;
  346 + }
  347 + if (mActualColor.value.tc > colorTemperatureWarmest) {
  348 + mTemeratureLimitError = true;
  349 + mActualColor.value.tc = colorTemperatureWarmest;
  350 + }
  351 +
  352 + PointXY xy = ColorDT8::tcToXY(mActualColor.value.tc);
  353 + ColorDT8::xyToPrimary(xy, primaries, DALI_DT8_NUMBER_OF_PRIMARIES, mActualPrimary);
  354 +
  355 + updateLampDriver(changeTime);
  356 + } else {
  357 + mActualColor.value.tc = ColorDT8::primaryToTc(mActualPrimary, primaries, DALI_DT8_NUMBER_OF_PRIMARIES);
  358 + }
  359 + return getMemoryDT8()->setActualColor(mActualColor);
  360 +}
  361 +#endif // DALI_DT8_SUPPORT_TC
  362 +
  363 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  364 +
  365 +Status LampDT8::setColorPrimary(const ColorDT8& color, uint32_t changeTime) {
  366 + uint16_t primary[DALI_DT8_NUMBER_OF_PRIMARIES];
  367 + getLampDT8()->getPrimary(primary, DALI_DT8_NUMBER_OF_PRIMARIES);
  368 + mActualColor = color;
  369 + for (uint8_t i = 0; i < DALI_DT8_NUMBER_OF_PRIMARIES; ++i) {
  370 + if (mActualColor.value.primary[i] == DALI_DT8_MASK16) {
  371 + mActualColor.value.primary[i] = primary[i]; // no change
  372 + }
  373 + mActualPrimary[i] = mActualColor.value.primary[i];
  374 + }
  375 + updateLampDriver(changeTime);
  376 + return getMemoryDT8()->setActualColor(mActualColor);
  377 +}
  378 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  379 +
  380 +void LampDT8::abortColorChanging() {
  381 + if (getLampDT8()->isColorChanging()) {
  382 + getLampDT8()->abortColorChanging();
  383 + updateActualColor();
  384 + getMemoryDT8()->setActualColor(mActualColor);
  385 + }
  386 +}
  387 +
  388 +void LampDT8::calculatePowerOnColor() {
  389 + mActualColor = getMemoryDT8()->getPowerOnColor();
  390 + const ColorDT8& actualColor = getMemoryDT8()->getActualColor();
  391 + switch (mActualColor.type) {
  392 +
  393 +#ifdef DALI_DT8_SUPPORT_XY
  394 + case DALI_DT8_COLOR_TYPE_XY:
  395 + if (mActualColor.value.xy.x == DALI_DT8_MASK16) {
  396 + mActualColor.value.xy.x = actualColor.value.xy.x == DALI_DT8_MASK16 ? getMemoryDT8()->getDefaults()->xCoordinate : actualColor.value.xy.x;
  397 + }
  398 + if (mActualColor.value.xy.y == DALI_DT8_MASK16) {
  399 + mActualColor.value.xy.y = actualColor.value.xy.y == DALI_DT8_MASK16 ? getMemoryDT8()->getDefaults()->yCoordinate : actualColor.value.xy.y;
  400 + }
  401 + break;
  402 +#endif // DALI_DT8_SUPPORT_XY
  403 +
  404 +#ifdef DALI_DT8_SUPPORT_TC
  405 + case DALI_DT8_COLOR_TYPE_TC:
  406 + if (mActualColor.value.tc == DALI_DT8_MASK16) {
  407 + mActualColor.value.tc = actualColor.value.tc == DALI_DT8_MASK16 ? getMemoryDT8()->getDefaults()->tc : actualColor.value.tc;
  408 + }
  409 + break;
  410 +#endif // DALI_DT8_SUPPORT_TC
  411 +
  412 + default:
  413 + break;
  414 + }
  415 +}
  416 +
  417 +void LampDT8::updateLampDriver(uint32_t changeTime) {
  418 + uint16_t primary[DALI_DT8_NUMBER_OF_PRIMARIES];
  419 + for (uint16_t i = 0; i < DALI_DT8_NUMBER_OF_PRIMARIES; ++i) {
  420 + int32_t level = mActualPrimary[i];
  421 + primary[i] = level < DALI_DT8_MASK16 ? level : DALI_DT8_MASK16;
  422 + }
  423 + getLampDT8()->setPrimary(primary, DALI_DT8_NUMBER_OF_PRIMARIES, changeTime);
  424 +}
  425 +
  426 +void LampDT8::updateActualColor() {
  427 + uint16_t primary[DALI_DT8_NUMBER_OF_PRIMARIES];
  428 + getLampDT8()->getPrimary(primary, DALI_DT8_NUMBER_OF_PRIMARIES);
  429 + for (uint8_t i = 0; i < DALI_DT8_NUMBER_OF_PRIMARIES; ++i) {
  430 + mActualPrimary[i] = primary[i];
  431 + }
  432 +
  433 + mActualColor = getMemoryDT8()->getActualColor();
  434 + switch (mActualColor.type) {
  435 +
  436 +#ifdef DALI_DT8_SUPPORT_XY
  437 + case DALI_DT8_COLOR_TYPE_XY:
  438 + mActualColor.value.xy = ColorDT8::primaryToXY(mActualPrimary, getMemoryDT8()->getPrimaries(), DALI_DT8_NUMBER_OF_PRIMARIES);
  439 + break;
  440 +#endif // DALI_DT8_SUPPORT_XY
  441 +
  442 +#ifdef DALI_DT8_SUPPORT_TC
  443 + case DALI_DT8_COLOR_TYPE_TC:
  444 + mActualColor.value.tc = ColorDT8::primaryToTc(mActualPrimary, getMemoryDT8()->getPrimaries(), DALI_DT8_NUMBER_OF_PRIMARIES);
  445 + break;
  446 +#endif // DALI_DT8_SUPPORT_TC
  447 + } // switch
  448 +}
  449 +
  450 +} // namespace controller
  451 +} // namespace dali
  452 +
  453 +#endif // DALI_DT8
src/dali/controller/lamp_dt8.hpp 0 → 100644
  1 +/*
  2 + * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
  3 + *
  4 + * Licensed under GNU General Public License 3.0 or later.
  5 + *
  6 + * This program is distributed in the hope that it will be useful,
  7 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  8 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9 + */
  10 +
  11 +#ifndef DALI_LAMP_DT8_CONTROLLER_HPP_
  12 +#define DALI_LAMP_DT8_CONTROLLER_HPP_
  13 +
  14 +#include <dali/config_dt8.hpp>
  15 +
  16 +#ifdef DALI_DT8
  17 +
  18 +#include "color_dt8.hpp"
  19 +#include "lamp.hpp"
  20 +#include "memory_dt8.hpp"
  21 +
  22 +#include <dali/float_dt8.hpp>
  23 +
  24 +namespace dali {
  25 +namespace controller {
  26 +
  27 +class LampDT8: public Lamp {
  28 +public:
  29 +
  30 + explicit LampDT8(ILamp* lamp, MemoryDT8* memoryController);
  31 +
  32 +// >>> used only in controller namespace
  33 +
  34 + const ColorDT8& getActualColor();
  35 +
  36 + bool isColorChanging();
  37 + bool isAutomaticActivationEnabled();
  38 + bool isXYCoordinateLimitError();
  39 + bool isTemeratureLimitError();
  40 +// <<< used only in controller namespace
  41 +
  42 + Status powerDirect(uint8_t level, uint64_t time) override;
  43 + Status powerOff() override;
  44 + Status powerScene(uint8_t scene) override;
  45 + Status powerUp() override;
  46 + Status powerDown() override;
  47 + Status powerStepUp() override;
  48 + Status powerStepDown() override;
  49 + Status powerOnAndStepUp() override;
  50 + Status powerStepDownAndOff() override;
  51 + Status powerRecallMinLevel() override;
  52 + Status powerRecallMaxLevel() override;
  53 + Status powerRecallOnLevel() override;
  54 + Status powerRecallFaliureLevel() override;
  55 +
  56 + Status activate();
  57 +
  58 +#ifdef DALI_DT8_SUPPORT_XY
  59 + Status coordinateStepUpX();
  60 + Status coordinateStepUpY();
  61 + Status coordinateStepDownX();
  62 + Status coordinateStepDownY();
  63 +#endif // DALI_DT8_SUPPORT_XY
  64 +
  65 +#ifdef DALI_DT8_SUPPORT_TC
  66 + Status colorTemperatureStepCooler();
  67 + Status colorTemperatureStepWarmer();
  68 +#endif // DALI_DT8_SUPPORT_TC
  69 +
  70 +private:
  71 + LampDT8(const LampDT8& other) = delete;
  72 + LampDT8& operator=(const LampDT8&) = delete;
  73 +
  74 + ILampDT8* getLampDT8() {
  75 + return (ILampDT8*) getLamp();
  76 + }
  77 +
  78 + MemoryDT8* getMemoryDT8() {
  79 + return (MemoryDT8*) getMemoryController();
  80 + }
  81 +
  82 + Status activateColor(uint32_t changeTime);
  83 + Status setColor(const ColorDT8& color, uint32_t changeTime);
  84 +
  85 +#ifdef DALI_DT8_SUPPORT_XY
  86 + Status setColorXY(const ColorDT8& color, uint32_t changeTime);
  87 +#endif // DALI_DT8_SUPPORT_XY
  88 +
  89 +#ifdef DALI_DT8_SUPPORT_TC
  90 + Status setColorTemperature(const ColorDT8& color, uint32_t changeTime);
  91 +#endif // DALI_DT8_SUPPORT_TC
  92 +
  93 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  94 + Status setColorPrimary(const ColorDT8& color, uint32_t changeTime);
  95 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  96 +
  97 + void abortColorChanging();
  98 + void calculatePowerOnColor();
  99 + void updateLampDriver(uint32_t changeTime);
  100 + void updateActualColor();
  101 +
  102 + bool mXYCoordinateLimitError;
  103 + bool mTemeratureLimitError;
  104 + ColorDT8 mActualColor;
  105 + Float mActualPrimary[DALI_DT8_NUMBER_OF_PRIMARIES];
  106 +};
  107 +
  108 +} // namespace controller
  109 +}// namespace dali
  110 +
  111 +#endif // DALI_DT8
  112 +
  113 +#endif // DALI_LAMP_DT8_CONTROLLER_HPP_
src/dali/controller/memory.cpp
@@ -317,6 +317,10 @@ size_t Memory::getBankSize(uint8_t bank) { @@ -317,6 +317,10 @@ size_t Memory::getBankSize(uint8_t bank) {
317 return DALI_BANK2_ADDR - DALI_BANK1_ADDR; 317 return DALI_BANK2_ADDR - DALI_BANK1_ADDR;
318 case 2: 318 case 2:
319 return DALI_BANK3_ADDR - DALI_BANK2_ADDR; 319 return DALI_BANK3_ADDR - DALI_BANK2_ADDR;
  320 + case 3:
  321 + return DALI_BANK4_ADDR - DALI_BANK3_ADDR;
  322 + case 4:
  323 + return DALI_BANK5_ADDR - DALI_BANK4_ADDR;
320 default: 324 default:
321 return 0; 325 return 0;
322 } 326 }
@@ -330,6 +334,10 @@ uintptr_t Memory::getBankAddr(uint8_t bank) { @@ -330,6 +334,10 @@ uintptr_t Memory::getBankAddr(uint8_t bank) {
330 return DALI_BANK1_ADDR; 334 return DALI_BANK1_ADDR;
331 case 2: 335 case 2:
332 return DALI_BANK2_ADDR; 336 return DALI_BANK2_ADDR;
  337 + case 3:
  338 + return DALI_BANK3_ADDR;
  339 + case 4:
  340 + return DALI_BANK4_ADDR;
333 default: 341 default:
334 return INVALID_BANK_ADDR; 342 return INVALID_BANK_ADDR;
335 } 343 }
src/dali/controller/memory_dt8.cpp 0 → 100644
  1 +/*
  2 + * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
  3 + *
  4 + * Licensed under GNU General Public License 3.0 or later.
  5 + *
  6 + * This program is distributed in the hope that it will be useful,
  7 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  8 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9 + */
  10 +
  11 +#include "memory_dt8.hpp"
  12 +
  13 +#ifdef DALI_DT8
  14 +
  15 +#define DATA_FIELD_OFFSET(type, field) ((uintptr_t) &(((type *) 0)->field))
  16 +#define TEMP_FIELD_OFFSET(type, field) (sizeof(Temp) + (uintptr_t) &(((type *) 0)->field))
  17 +
  18 +#define CONFIG_VERSION 1
  19 +
  20 +namespace dali {
  21 +namespace controller {
  22 +
  23 +MemoryDT8::MemoryDT8(IMemory* memory, const DefaultsDT8* defaults) :
  24 + Memory(memory),
  25 + mDefaults(defaults),
  26 + mConfigDT8((ConfigDT8*)memory->data(DALI_BANK3_ADDR, sizeof(ConfigDT8))),
  27 + mDataDT8((DataDT8*)memory->data(DALI_BANK4_ADDR, sizeof(DataDT8))),
  28 + mTempDT8((TempDT8*)memory->tempData(sizeof(Temp), sizeof(TempDT8))){
  29 +
  30 + resetRamDT8(true);
  31 +
  32 + if (mConfigDT8 != nullptr) {
  33 + if (!isValidConfigDT8()) {
  34 + resetConfigDT8();
  35 + }
  36 + }
  37 + if (mDataDT8 != nullptr) {
  38 + if (!isValidDataDT8()) {
  39 + resetDataDT8(true);
  40 + }
  41 + }
  42 + if (mTempDT8 != nullptr) {
  43 + if (!isValidTempDT8()) {
  44 + resetTempDT8(true);
  45 + }
  46 + }
  47 +}
  48 +
  49 +Status MemoryDT8::setPowerOnColor(const ColorDT8& color) {
  50 + return writeDataColor(DATA_FIELD_OFFSET(DataDT8, powerOnColor), &color);
  51 +}
  52 +
  53 +const ColorDT8& MemoryDT8::getPowerOnColor() {
  54 + return mDataDT8->powerOnColor;
  55 +}
  56 +
  57 +Status MemoryDT8::setFaliureColor(const ColorDT8& color) {
  58 + return writeDataColor(DATA_FIELD_OFFSET(DataDT8, failureColor), &color);
  59 +}
  60 +
  61 +const ColorDT8& MemoryDT8::getFaliureColor() {
  62 + return mDataDT8->failureColor;
  63 +}
  64 +
  65 +Status MemoryDT8::setColorForScene(uint8_t scene, const ColorDT8& color) {
  66 + if (scene > DALI_SCENE_MAX) {
  67 + return Status::ERROR;
  68 + }
  69 + return writeDataColor(DATA_FIELD_OFFSET(DataDT8, sceneColor[scene]), &color);
  70 +}
  71 +
  72 +const ColorDT8& MemoryDT8::getColorForScene(uint8_t scene) {
  73 + static const ColorDT8 kInvalidColor;
  74 + if (scene > DALI_SCENE_MAX) {
  75 + return kInvalidColor;
  76 + }
  77 + return mDataDT8->sceneColor[scene];
  78 +}
  79 +
  80 +Status MemoryDT8::setTemporaryColor(const ColorDT8& color) {
  81 + mRamDT8.temporaryColor = color;
  82 + return Status::OK;
  83 +}
  84 +
  85 +const ColorDT8& MemoryDT8::getTemporaryColor() {
  86 + return mRamDT8.temporaryColor;
  87 +}
  88 +
  89 +Status MemoryDT8::resetTemporaryColor() {
  90 + mRamDT8.temporaryColor.reset();
  91 + return Status::OK;
  92 +}
  93 +
  94 +Status MemoryDT8::setReportColor(const ColorDT8& color) {
  95 + mRamDT8.reportColor = color;
  96 + return Status::OK;
  97 +}
  98 +
  99 +const ColorDT8& MemoryDT8::getReportColor() {
  100 + return mRamDT8.reportColor;
  101 +}
  102 +
  103 +Status MemoryDT8::resetReportColor() {
  104 + mRamDT8.reportColor.reset();
  105 + return Status::OK;
  106 +}
  107 +
  108 +Status MemoryDT8::copyReportToTemporary() {
  109 + mRamDT8.temporaryColor = mRamDT8.reportColor;
  110 + return Status::OK;
  111 +}
  112 +
  113 +const ColorDT8& MemoryDT8::getActualColor() {
  114 + return mTempDT8->actualColor;
  115 +}
  116 +
  117 +Status MemoryDT8::setActualColor(const ColorDT8& color) {
  118 + return writeTempColor(TEMP_FIELD_OFFSET(TempDT8, actualColor), &color);
  119 +}
  120 +
  121 +uint8_t MemoryDT8::getFeaturesStatus() {
  122 + return mRamDT8.featuresStatus;
  123 +}
  124 +
  125 +Status MemoryDT8::setFeaturesStatus(uint8_t value) {
  126 + mRamDT8.featuresStatus = value;
  127 + return Status::OK;
  128 +}
  129 +
  130 +bool MemoryDT8::isReset() {
  131 + if (mRamDT8.featuresStatus != 0x01) {
  132 + return false;
  133 + }
  134 +#if !defined(DALI_DT8_SUPPORT_XY) && defined(DALI_DT8_SUPPORT_PRIMARY_N)
  135 + if (mRamDT8.temporaryX != DALI_DT8_MASK16)
  136 + return false;
  137 + if (mRamDT8.temporaryY != DALI_DT8_MASK16)
  138 + return false;
  139 +#endif
  140 +
  141 +
  142 + if (!mRamDT8.temporaryColor.isReset())
  143 + return false;
  144 +
  145 + if (mDataDT8->powerOnColor.type != mDefaults->colorType)
  146 + return false;
  147 +
  148 +#ifdef DALI_DT8_SUPPORT_XY
  149 + if (mDefaults->colorType == DALI_DT8_COLOR_TYPE_XY) {
  150 + if (mDataDT8->powerOnColor.value.xy.x != mDefaults->xCoordinate)
  151 + return false;
  152 + if (mDataDT8->powerOnColor.value.xy.y != mDefaults->yCoordinate)
  153 + return false;
  154 + }
  155 +#endif // DALI_DT8_SUPPORT_XY
  156 +
  157 +#ifdef DALI_DT8_SUPPORT_TC
  158 + if (mDefaults->colorType == DALI_DT8_COLOR_TYPE_TC) {
  159 + if (mDataDT8->powerOnColor.value.tc != mDefaults->tc)
  160 + return false;
  161 + }
  162 +#endif // DALI_DT8_SUPPORT_TC
  163 +
  164 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  165 + if (mDefaults->colorType == DALI_DT8_COLOR_TYPE_PRIMARY_N) {
  166 + for (uint8_t i = 0; i < DALI_DT8_NUMBER_OF_PRIMARIES; ++i) {
  167 + if (mDataDT8->powerOnColor.value.primary[i] != mDefaults->primary[i]) {
  168 + return false;
  169 + }
  170 + }
  171 + }
  172 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  173 +
  174 + if (mDataDT8->failureColor.type != mDefaults->colorType)
  175 + return false;
  176 +
  177 +#ifdef DALI_DT8_SUPPORT_XY
  178 + if (mDefaults->colorType == DALI_DT8_COLOR_TYPE_XY) {
  179 + if (mDataDT8->failureColor.value.xy.x != mDefaults->xCoordinate)
  180 + return false;
  181 + if (mDataDT8->failureColor.value.xy.y != mDefaults->yCoordinate)
  182 + return false;
  183 + }
  184 +#endif // DALI_DT8_SUPPORT_XY
  185 +
  186 +#ifdef DALI_DT8_SUPPORT_TC
  187 + if (mDefaults->colorType == DALI_DT8_COLOR_TYPE_TC) {
  188 + if (mDataDT8->failureColor.value.tc != mDefaults->tc)
  189 + return false;
  190 + }
  191 +#endif // DALI_DT8_SUPPORT_TC
  192 +
  193 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  194 + if (mDefaults->colorType == DALI_DT8_COLOR_TYPE_PRIMARY_N) {
  195 + for (uint8_t i = 0; i < DALI_DT8_NUMBER_OF_PRIMARIES; ++i) {
  196 + if (mDataDT8->failureColor.value.primary[i] != mDefaults->primary[i]) {
  197 + return false;
  198 + }
  199 + }
  200 + }
  201 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  202 +
  203 + for (size_t i = 0; i <= DALI_SCENE_MAX; i++) {
  204 + if (!mDataDT8->sceneColor[i].isReset())
  205 + return false;
  206 + }
  207 +
  208 +#ifdef DALI_DT8_SUPPORT_TC
  209 + if (mDataDT8->colorTemperatureCoolest != getColorTemperaturePhisicalCoolest())
  210 + return false;
  211 + if (mDataDT8->colorTemperatureWarmest != getColorTemperaturePhisicalWarmest())
  212 + return false;
  213 +#endif // DALI_DT8_SUPPORT_TC
  214 +
  215 + return Memory::isReset();
  216 +}
  217 +
  218 +Status MemoryDT8::reset() {
  219 + resetDataDT8(false);
  220 + resetTempDT8(false);
  221 + resetRamDT8(false);
  222 + return Memory::reset();
  223 +}
  224 +
  225 +#if defined(DALI_DT8_SUPPORT_XY) || defined(DALI_DT8_SUPPORT_PRIMARY_N)
  226 +Status MemoryDT8::setTemporaryCoordinateX(uint16_t value) {
  227 +#ifdef DALI_DT8_SUPPORT_XY
  228 + mRamDT8.temporaryColor.setType(DALI_DT8_COLOR_TYPE_XY);
  229 + mRamDT8.temporaryColor.value.xy.x = value;
  230 + return Status::OK;
  231 +#else
  232 + mRamDT8.temporaryColor.setType(DALI_DT8_COLOR_TYPE_XY);
  233 + mRamDT8.temporaryX = value;
  234 + return Status::OK;
  235 +#endif // DALI_DT8_SUPPORT_XY
  236 +}
  237 +
  238 +Status MemoryDT8::setTemporaryCoordinateY(uint16_t value) {
  239 +#ifdef DALI_DT8_SUPPORT_XY
  240 + mRamDT8.temporaryColor.setType(DALI_DT8_COLOR_TYPE_XY);
  241 + mRamDT8.temporaryColor.value.xy.y = value;
  242 + return Status::OK;
  243 +#else
  244 + mRamDT8.temporaryColor.setType(DALI_DT8_COLOR_TYPE_XY);
  245 + mRamDT8.temporaryY = value;
  246 + return Status::OK;
  247 +#endif // DALI_DT8_SUPPORT_XY
  248 +}
  249 +
  250 +# if !defined(DALI_DT8_SUPPORT_XY)
  251 +uint16_t MemoryDT8::getTemporaryCooridanateX() {
  252 + return mRamDT8.temporaryX;
  253 +}
  254 +
  255 +uint16_t MemoryDT8::getTemporaryCooridanateY() {
  256 + return mRamDT8.temporaryY;
  257 +}
  258 +# endif // !defined(DALI_DT8_SUPPORT_XY)
  259 +#endif // defined(DALI_DT8_SUPPORT_XY) || defined(DALI_DT8_SUPPORT_PRIMARY_N)
  260 +
  261 +#ifdef DALI_DT8_SUPPORT_TC
  262 +Status MemoryDT8::setTemporaryColorTemperature(uint16_t temperature) {
  263 + mRamDT8.temporaryColor.setType(DALI_DT8_COLOR_TYPE_TC);
  264 + mRamDT8.temporaryColor.value.tc = temperature;
  265 + return Status::OK;
  266 +}
  267 +
  268 +Status MemoryDT8::setColorTemperatureCoolest(uint16_t temperature) {
  269 + return writeData16(DATA_FIELD_OFFSET(DataDT8, colorTemperatureCoolest), temperature);
  270 +}
  271 +
  272 +uint16_t MemoryDT8::getColorTemperatureCoolest() {
  273 + return mDataDT8->colorTemperatureCoolest;
  274 +}
  275 +
  276 +Status MemoryDT8::setColorTemperatureWarmest(uint16_t temperature) {
  277 + return writeData16(DATA_FIELD_OFFSET(DataDT8, colorTemperatureWarmest), temperature);
  278 +}
  279 +
  280 +uint16_t MemoryDT8::getColorTemperatureWarmest() {
  281 + return mDataDT8->colorTemperatureWarmest;
  282 +}
  283 +
  284 +Status MemoryDT8::setColorTemperaturePhisicalCoolest(uint16_t temperature) {
  285 + return writeConfig16(DATA_FIELD_OFFSET(ConfigDT8, colorTemperaturePhisicalCoolest), temperature);
  286 +}
  287 +
  288 +uint16_t MemoryDT8::getColorTemperaturePhisicalCoolest() {
  289 + return mConfigDT8->colorTemperaturePhisicalCoolest;
  290 +}
  291 +
  292 +Status MemoryDT8::setColorTemperaturePhisicalWarmest(uint16_t temperature) {
  293 + return writeConfig16(DATA_FIELD_OFFSET(ConfigDT8, colorTemperaturePhisicalWarmest), temperature);
  294 +}
  295 +
  296 +uint16_t MemoryDT8::getColorTemperaturePhisicalWarmest() {
  297 + return mConfigDT8->colorTemperaturePhisicalWarmest;
  298 +}
  299 +#endif // DALI_DT8_SUPPORT_TC
  300 +
  301 +Status MemoryDT8::storePrimaryTy(uint8_t n, uint16_t ty) {
  302 + if (n < DALI_DT8_NUMBER_OF_PRIMARIES) {
  303 + return writeConfig16(DATA_FIELD_OFFSET(ConfigDT8, primary[n].ty), ty);
  304 + } else {
  305 + return Status::ERROR;
  306 + }
  307 + return Status::OK;
  308 +}
  309 +
  310 +Status MemoryDT8::storePrimaryCoordinate(uint8_t n, uint16_t x, uint16_t y) {
  311 + Status status = Status::OK;
  312 + if (n < DALI_DT8_NUMBER_OF_PRIMARIES) {
  313 + if (writeConfig16(DATA_FIELD_OFFSET(ConfigDT8, primary[n].xy.x), x) != Status::OK) {
  314 + status = Status::ERROR;
  315 + }
  316 + if (writeConfig16(DATA_FIELD_OFFSET(ConfigDT8, primary[n].xy.y), y) != Status::OK) {
  317 + status = Status::ERROR;
  318 + }
  319 + } else {
  320 + status = Status::ERROR;
  321 + }
  322 + return status;
  323 +}
  324 +
  325 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  326 +Status MemoryDT8::setTemporaryPrimaryLevel(uint8_t n, uint16_t level) {
  327 + if (n < DALI_DT8_NUMBER_OF_PRIMARIES) {
  328 + mRamDT8.temporaryColor.setType(DALI_DT8_COLOR_TYPE_PRIMARY_N);
  329 + mRamDT8.temporaryColor.value.primary[n] = level;
  330 + return Status::OK;
  331 + } else {
  332 + return Status::ERROR;
  333 + }
  334 +}
  335 +
  336 +uint16_t MemoryDT8::getPrimaryTy(uint8_t n) {
  337 + return mConfigDT8->primary[n].ty;
  338 +}
  339 +
  340 +uint16_t MemoryDT8::getPrimaryCoordinateX(uint8_t n) {
  341 + return mConfigDT8->primary[n].xy.x;
  342 +}
  343 +
  344 +uint16_t MemoryDT8::getPrimaryCoordinateY(uint8_t n) {
  345 + return mConfigDT8->primary[n].xy.y;
  346 +}
  347 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  348 +
  349 +bool MemoryDT8::isColorValid(const ColorDT8& color, bool canTypeBeMask) {
  350 + switch (color.type) {
  351 + case DALI_DT8_COLOR_TYPE_XY:
  352 +#ifdef DALI_DT8_SUPPORT_XY
  353 + if (color.value.xy.x == 0 || color.value.xy.y == 0) {
  354 + return false;
  355 + }
  356 + break;
  357 +#else
  358 + return false;
  359 +#endif // DALI_DT8_SUPPORT_XY
  360 + case DALI_DT8_COLOR_TYPE_TC:
  361 +#ifdef DALI_DT8_SUPPORT_TC
  362 + if ((color.value.tc != DALI_DT8_MASK16) && ((color.value.tc < DALI_DT8_TC_COOLEST) || (color.value.tc > DALI_DT8_TC_WARMESR))) {
  363 + return false;
  364 + }
  365 + break;
  366 +#else
  367 + return false;
  368 +#endif // DALI_DT8_SUPPORT_TC
  369 + case DALI_DT8_COLOR_TYPE_PRIMARY_N:
  370 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  371 + // Nothing to do
  372 + break;
  373 +#else
  374 + return false;
  375 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  376 +
  377 + case DALI_MASK:
  378 + return canTypeBeMask ? true : false;
  379 +
  380 + default:
  381 + return false;
  382 + }
  383 +
  384 + return true;
  385 +}
  386 +
  387 +bool MemoryDT8::isValidConfigDT8() {
  388 + if (mConfigDT8->version != CONFIG_VERSION) {
  389 + return false;
  390 + }
  391 +
  392 +#ifdef DALI_DT8_SUPPORT_TC
  393 + if (mConfigDT8->colorTemperaturePhisicalCoolest == 0) {
  394 + return false;
  395 + }
  396 + if (mConfigDT8->colorTemperaturePhisicalWarmest == 0) {
  397 + return false;
  398 + }
  399 + if (mConfigDT8->colorTemperaturePhisicalCoolest > mConfigDT8->colorTemperaturePhisicalWarmest) {
  400 + return false;
  401 + }
  402 +#endif // DALI_DT8_SUPPORT_TC
  403 +
  404 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  405 + for (uint8_t i = 0; i < DALI_DT8_NUMBER_OF_PRIMARIES; ++i) {
  406 + Primary prim = mConfigDT8->primary[i];
  407 + if (prim.xy.x == 0) {
  408 + return false;
  409 + }
  410 + if (prim.xy.y == 0) {
  411 + return false;
  412 + }
  413 + if ((prim.ty != DALI_DT8_MASK16) && (prim.ty > DALI_DT8_PRIMARY_TY_MAX)) {
  414 + return false;
  415 + }
  416 + }
  417 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  418 +
  419 + return true;
  420 +}
  421 +
  422 +bool MemoryDT8::isValidDataDT8() {
  423 + if (!isColorValid(mDataDT8->powerOnColor, false)) {
  424 + return false;
  425 + }
  426 + if (!isColorValid(mDataDT8->failureColor, false)) {
  427 + return false;
  428 + }
  429 +#ifdef DALI_DT8_SUPPORT_TC
  430 + uint16_t colorTemperaturePhisicalCoolest = getColorTemperaturePhisicalCoolest();
  431 + uint16_t colorTemperaturePhisicalWarmest = getColorTemperaturePhisicalWarmest();
  432 +
  433 + uint16_t colorTemperatureCoolest = mDataDT8->colorTemperatureCoolest;
  434 + uint16_t colorTemperatureWarmest = mDataDT8->colorTemperatureWarmest;
  435 + if (colorTemperaturePhisicalCoolest != DALI_DT8_MASK16) {
  436 + if (colorTemperaturePhisicalCoolest > colorTemperaturePhisicalWarmest)
  437 + return false;
  438 + if (colorTemperaturePhisicalCoolest < DALI_DT8_TC_COOLEST)
  439 + return false;
  440 +
  441 + if (colorTemperatureCoolest != DALI_DT8_MASK16 && colorTemperatureCoolest < colorTemperaturePhisicalCoolest)
  442 + return false;
  443 + }
  444 + if (colorTemperaturePhisicalWarmest != DALI_DT8_MASK16) {
  445 + if (colorTemperaturePhisicalWarmest > DALI_DT8_TC_WARMESR)
  446 + return false;
  447 +
  448 + if (colorTemperatureWarmest != DALI_DT8_MASK16 && colorTemperatureWarmest > colorTemperaturePhisicalWarmest)
  449 + return false;
  450 + }
  451 + if (colorTemperatureCoolest != DALI_DT8_MASK16 && colorTemperatureWarmest != DALI_DT8_MASK16
  452 + && colorTemperatureCoolest > colorTemperatureWarmest)
  453 + return false;
  454 +#endif // DALI_DT8_SUPPORT_TC
  455 +
  456 + for (uint16_t i = 0; i <= DALI_SCENE_MAX; i++) {
  457 + const ColorDT8& color = mDataDT8->sceneColor[i];
  458 + if (color.type != DALI_MASK) {
  459 + if (!isColorValid(color, true)) {
  460 + return false;
  461 + }
  462 + }
  463 + }
  464 + return true;
  465 +}
  466 +
  467 +bool MemoryDT8::isValidTempDT8() {
  468 + switch (mTempDT8->actualColor.type) {
  469 + case DALI_DT8_COLOR_TYPE_XY:
  470 +#ifdef DALI_DT8_SUPPORT_XY
  471 + if (mTempDT8->actualColor.value.xy.x == 0 || mTempDT8->actualColor.value.xy.y == 0) {
  472 + return false;
  473 + }
  474 + break;
  475 +#else
  476 + return false;
  477 +#endif // DALI_DT8_SUPPORT_XY
  478 + case DALI_DT8_COLOR_TYPE_TC:
  479 +#ifdef DALI_DT8_SUPPORT_TC
  480 + if (mTempDT8->actualColor.value.tc == 0) {
  481 + return false;
  482 + }
  483 + break;
  484 +#else
  485 + return false;
  486 +#endif // DALI_DT8_SUPPORT_TC
  487 + case DALI_DT8_COLOR_TYPE_PRIMARY_N:
  488 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  489 + for (uint8_t i = 0; i < DALI_DT8_NUMBER_OF_PRIMARIES; ++i) {
  490 + uint16_t value = mTempDT8->actualColor.value.primary[i];
  491 + if (value == DALI_DT8_MASK16) {
  492 + return false;
  493 + }
  494 + }
  495 + break;
  496 +#else
  497 + return false;
  498 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  499 + break;
  500 +
  501 + case DALI_MASK:
  502 + break;
  503 +
  504 + default:
  505 + return false;
  506 + }
  507 +
  508 + return true;
  509 +}
  510 +
  511 +void MemoryDT8::resetRamDT8(bool initialize) {
  512 + mRamDT8.temporaryColor.reset();
  513 +#if !defined(DALI_DT8_SUPPORT_XY) && defined(DALI_DT8_SUPPORT_PRIMARY_N)
  514 + mRamDT8.temporaryX = DALI_DT8_MASK16;
  515 + mRamDT8.temporaryY = DALI_DT8_MASK16;
  516 +#endif
  517 + mRamDT8.reportColor.reset();
  518 + mRamDT8.featuresStatus = 0x01;
  519 +}
  520 +
  521 +void MemoryDT8::resetConfigDT8() {
  522 + writeConfig8(DATA_FIELD_OFFSET(ConfigDT8, version), CONFIG_VERSION);
  523 +
  524 +#ifdef DALI_DT8_SUPPORT_TC
  525 + setColorTemperaturePhisicalCoolest(mDefaults->tcCoolest);
  526 + setColorTemperaturePhisicalWarmest(mDefaults->tcWarmest);
  527 +#endif // DALI_DT8_SUPPORT_TC
  528 +
  529 + for (uint8_t i = 0; i < DALI_DT8_NUMBER_OF_PRIMARIES; ++i) {
  530 + Primary primary = getDefaults()->primaryConfig[i];
  531 + storePrimaryTy(i, primary.ty);
  532 + storePrimaryCoordinate(i, primary.xy.x, primary.xy.y);
  533 + }
  534 +}
  535 +
  536 +void MemoryDT8::resetDataDT8(bool initialize) {
  537 + ColorDT8 temp;
  538 + temp.setType(mDefaults->colorType);
  539 +
  540 +#ifdef DALI_DT8_SUPPORT_XY
  541 + if (mDefaults->colorType == DALI_DT8_COLOR_TYPE_XY) {
  542 + temp.value.xy.x = mDefaults->xCoordinate;
  543 + temp.value.xy.y = mDefaults->yCoordinate;
  544 + }
  545 +#endif // DALI_DT8_SUPPORT_XY
  546 +
  547 +#ifdef DALI_DT8_SUPPORT_TC
  548 + if (mDefaults->colorType == DALI_DT8_COLOR_TYPE_TC) {
  549 + temp.value.tc = mDefaults->tc;
  550 + }
  551 +#endif // DALI_DT8_SUPPORT_TC
  552 +
  553 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  554 + if (mDefaults->colorType == DALI_DT8_COLOR_TYPE_PRIMARY_N) {
  555 + for (uint8_t i = 0; i < DALI_DT8_NUMBER_OF_PRIMARIES; ++ i) {
  556 + temp.value.primary[i] = mDefaults->primary[i];
  557 + }
  558 + }
  559 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  560 +
  561 + setPowerOnColor(temp);
  562 +
  563 + temp.setType(mDefaults->colorType);
  564 +
  565 +#ifdef DALI_DT8_SUPPORT_XY
  566 + if (mDefaults->colorType == DALI_DT8_COLOR_TYPE_XY) {
  567 + temp.value.xy.x = mDefaults->xCoordinate;
  568 + temp.value.xy.y = mDefaults->yCoordinate;
  569 + }
  570 +#endif // DALI_DT8_SUPPORT_XY
  571 +
  572 +#ifdef DALI_DT8_SUPPORT_TC
  573 + if (mDefaults->colorType == DALI_DT8_COLOR_TYPE_TC) {
  574 + temp.value.tc = mDefaults->tc;
  575 + }
  576 +#endif // DALI_DT8_SUPPORT_TC
  577 +
  578 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  579 + if (mDefaults->colorType == DALI_DT8_COLOR_TYPE_PRIMARY_N) {
  580 + for (uint8_t i = 0; i < DALI_DT8_NUMBER_OF_PRIMARIES; ++ i) {
  581 + temp.value.primary[i] = mDefaults->primary[i];
  582 + }
  583 + }
  584 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  585 +
  586 + setFaliureColor(temp);
  587 +
  588 + temp.reset();
  589 + for (size_t i = 0; i <= DALI_SCENE_MAX; i++) {
  590 + setColorForScene(i, temp);
  591 + }
  592 +
  593 +#ifdef DALI_DT8_SUPPORT_TC
  594 + setColorTemperatureCoolest(getColorTemperaturePhisicalCoolest());
  595 + setColorTemperatureWarmest(getColorTemperaturePhisicalWarmest());
  596 +#endif //DALI_DT8_SUPPORT_TC
  597 +
  598 +}
  599 +
  600 +void MemoryDT8::resetTempDT8(bool initialize) {
  601 + ColorDT8 color;
  602 + if (initialize) {
  603 + writeTempColor(TEMP_FIELD_OFFSET(TempDT8, actualColor), &color);
  604 + }
  605 +}
  606 +
  607 +} // namespace controller
  608 +} // namespace dali
  609 +
  610 +#endif // DALI_DT8
src/dali/controller/memory_dt8.hpp 0 → 100644
  1 +/*
  2 + * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
  3 + *
  4 + * Licensed under GNU General Public License 3.0 or later.
  5 + *
  6 + * This program is distributed in the hope that it will be useful,
  7 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  8 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9 + */
  10 +
  11 +#ifndef DALI_MEMORY_DT8_CONTROLLER_HPP_
  12 +#define DALI_MEMORY_DT8_CONTROLLER_HPP_
  13 +
  14 +#include <dali/config_dt8.hpp>
  15 +
  16 +#ifdef DALI_DT8
  17 +
  18 +#include "color_dt8.hpp"
  19 +#include "memory.hpp"
  20 +
  21 +namespace dali {
  22 +namespace controller {
  23 +
  24 +class MemoryDT8: public Memory {
  25 +public:
  26 + explicit MemoryDT8(IMemory* memory, const DefaultsDT8* defaults);
  27 +
  28 + Status setPowerOnColor(const ColorDT8& color);
  29 + const ColorDT8& getPowerOnColor();
  30 + Status setFaliureColor(const ColorDT8& color);
  31 + const ColorDT8& getFaliureColor();
  32 + Status setColorForScene(uint8_t scene, const ColorDT8& color);
  33 + const ColorDT8& getColorForScene(uint8_t scene);
  34 + uint8_t getFeaturesStatus();
  35 + Status setFeaturesStatus(uint8_t value);
  36 + Status setTemporaryColor(const ColorDT8& color);
  37 + const ColorDT8& getTemporaryColor();
  38 + Status resetTemporaryColor();
  39 + Status setReportColor(const ColorDT8& color);
  40 + const ColorDT8& getReportColor();
  41 + Status resetReportColor();
  42 + Status copyReportToTemporary();
  43 + const ColorDT8& getActualColor();
  44 + Status setActualColor(const ColorDT8& color);
  45 +
  46 + bool isValid() override {
  47 + return Memory::isValid() && isValidDataDT8() && isValidTempDT8();
  48 + }
  49 +
  50 + bool isReset() override;
  51 + Status reset() override;
  52 +
  53 + const Primary* getPrimaries() {
  54 + return mConfigDT8->primary;
  55 + }
  56 +
  57 +#if defined(DALI_DT8_SUPPORT_XY) || defined(DALI_DT8_SUPPORT_PRIMARY_N)
  58 + Status setTemporaryCoordinateX(uint16_t value);
  59 + Status setTemporaryCoordinateY(uint16_t value);
  60 +
  61 +#if !defined(DALI_DT8_SUPPORT_XY)
  62 + uint16_t getTemporaryCooridanateX();
  63 + uint16_t getTemporaryCooridanateY();
  64 +#endif // !defined(DALI_DT8_SUPPORT_XY)
  65 +#endif // defined(DALI_DT8_SUPPORT_XY) || defined(DALI_DT8_SUPPORT_PRIMARY_N)
  66 +
  67 +#ifdef DALI_DT8_SUPPORT_TC
  68 + Status setTemporaryColorTemperature(uint16_t temperature);
  69 + Status setColorTemperatureCoolest(uint16_t temperature);
  70 + uint16_t getColorTemperatureCoolest();
  71 + Status setColorTemperatureWarmest(uint16_t temperature);
  72 + uint16_t getColorTemperatureWarmest();
  73 + Status setColorTemperaturePhisicalCoolest(uint16_t temperature);
  74 + uint16_t getColorTemperaturePhisicalCoolest();
  75 + Status setColorTemperaturePhisicalWarmest(uint16_t temperature);
  76 + uint16_t getColorTemperaturePhisicalWarmest();
  77 +#endif // DALI_DT8_SUPPORT_TC
  78 +
  79 + Status storePrimaryTy(uint8_t n, uint16_t ty);
  80 + Status storePrimaryCoordinate(uint8_t n, uint16_t x, uint16_t y);
  81 +
  82 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  83 + Status setTemporaryPrimaryLevel(uint8_t n, uint16_t level);
  84 + uint16_t getPrimaryTy(uint8_t n);
  85 + uint16_t getPrimaryCoordinateX(uint8_t n);
  86 + uint16_t getPrimaryCoordinateY(uint8_t n);
  87 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  88 +
  89 + const DefaultsDT8* getDefaults() {
  90 + return mDefaults;
  91 + }
  92 +
  93 +private:
  94 + MemoryDT8(const MemoryDT8& other) = delete;
  95 + MemoryDT8& operator=(const MemoryDT8&) = delete;
  96 +
  97 + bool isColorValid(const ColorDT8& color, bool canTypeBeMask);
  98 +
  99 + bool isValidConfigDT8();
  100 + bool isValidDataDT8();
  101 + bool isValidTempDT8();
  102 + void resetRamDT8(bool initialize);
  103 + void resetConfigDT8();
  104 + void resetDataDT8(bool initialize);
  105 + void resetTempDT8(bool initialize);
  106 +
  107 + Status writeConfig8(uintptr_t addr, uint8_t data) {
  108 + return internalBankWrite(3, addr, &data, sizeof(uint8_t));
  109 + }
  110 +
  111 + Status writeConfig16(uintptr_t addr, uint16_t data) {
  112 + return internalBankWrite(3, addr, (uint8_t*)&data, sizeof(uint16_t));
  113 + }
  114 +
  115 + Status writeData8(uintptr_t addr, uint8_t data) {
  116 + return internalBankWrite(4, addr, &data, sizeof(uint8_t));
  117 + }
  118 +
  119 + Status writeData16(uintptr_t addr, uint16_t data) {
  120 + return internalBankWrite(4, addr, (uint8_t*)&data, sizeof(uint16_t));
  121 + }
  122 +
  123 + Status writeData32(uintptr_t addr, uint32_t data) {
  124 + return internalBankWrite(4, addr, (uint8_t*)&data, sizeof(uint16_t));
  125 + }
  126 +
  127 + Status writeDataColor(uintptr_t addr, const ColorDT8* color) {
  128 + return internalBankWrite(4, addr, (uint8_t*) color, sizeof(ColorDT8));
  129 + }
  130 +
  131 + Status writeTempColor(uintptr_t addr, const ColorDT8* color) {
  132 + return writeTemp(addr, (uint8_t*) color, sizeof(ColorDT8));
  133 + }
  134 +
  135 + typedef struct __attribute__((__packed__)) {
  136 + uint8_t size; // BANK mandatory field
  137 + uint8_t crc; // BANK mandatory field
  138 + uint8_t protection;
  139 + uint8_t version;
  140 + uint16_t colorTemperaturePhisicalCoolest;
  141 + uint16_t colorTemperaturePhisicalWarmest;
  142 +
  143 + Primary primary[6];
  144 + } ConfigDT8;
  145 +
  146 + typedef struct __attribute__((__packed__)) {
  147 + uint8_t size; // BANK mandatory field
  148 + uint8_t crc; // BANK mandatory field
  149 + ColorDT8 powerOnColor;
  150 + ColorDT8 failureColor;
  151 + ColorDT8 sceneColor[16];
  152 +
  153 +#ifdef DALI_DT8_SUPPORT_TC
  154 + uint16_t colorTemperatureCoolest;
  155 + uint16_t colorTemperatureWarmest;
  156 +#endif
  157 +
  158 + } DataDT8;
  159 +
  160 + typedef struct {
  161 + ColorDT8 actualColor;
  162 + } TempDT8;
  163 +
  164 + typedef struct {
  165 + ColorDT8 temporaryColor;
  166 +#if !defined(DALI_DT8_SUPPORT_XY) && defined(DALI_DT8_SUPPORT_PRIMARY_N)
  167 + uint16_t temporaryX;
  168 + uint16_t temporaryY;
  169 +#endif
  170 + ColorDT8 reportColor;
  171 + uint8_t featuresStatus;
  172 + } RamDT8;
  173 +
  174 + RamDT8 mRamDT8;
  175 + const DefaultsDT8* mDefaults;
  176 + const ConfigDT8* mConfigDT8;
  177 + const DataDT8* mDataDT8;
  178 + const TempDT8* mTempDT8;
  179 +};
  180 +
  181 +} // namespace controller
  182 +} // namespace dali
  183 +
  184 +#endif // DALI_DT8
  185 +
  186 +#endif // DALI_MEMORY_DT8_CONTROLLER_HPP_
src/dali/controller/query_store_dt8.cpp 0 → 100644
  1 +/*
  2 + * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
  3 + *
  4 + * All right reversed. Usage for commercial on not commercial
  5 + * purpose without written permission is not allowed.
  6 + *
  7 + * This program is distributed in the hope that it will be useful,
  8 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10 + */
  11 +
  12 +#include "query_store_dt8.hpp"
  13 +
  14 +#ifdef DALI_DT8
  15 +
  16 +namespace dali {
  17 +namespace controller {
  18 +
  19 +QueryStoreDT8::QueryStoreDT8(MemoryDT8* memory, LampDT8* lamp) :
  20 + QueryStore(memory, lamp) {
  21 +}
  22 +
  23 +bool QueryStoreDT8::queryIsFading() {
  24 + if (getLampControllerDT8()->isColorChanging()) {
  25 + return true;
  26 + }
  27 + return QueryStore::queryIsFading();
  28 +}
  29 +
  30 +Status QueryStoreDT8::storeActualLevelInDtr() {
  31 + const ColorDT8& color = getLampControllerDT8()->getActualColor();
  32 + getMemoryControllerDT8()->setReportColor(color);
  33 + return QueryStore::storeActualLevelInDtr();
  34 +}
  35 +
  36 +Status QueryStoreDT8::storeDtrAsFailureLevel() {
  37 + const ColorDT8& color = getMemoryControllerDT8()->getTemporaryColor();
  38 + switch (color.type) {
  39 +#ifdef DALI_DT8_SUPPORT_XY
  40 + case DALI_DT8_COLOR_TYPE_XY:
  41 +#endif
  42 +
  43 +#ifdef DALI_DT8_SUPPORT_TC
  44 + case DALI_DT8_COLOR_TYPE_TC:
  45 +#endif
  46 +
  47 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  48 + case DALI_DT8_COLOR_TYPE_PRIMARY_N:
  49 +#endif
  50 +
  51 + getMemoryControllerDT8()->setFaliureColor(color);
  52 + break;
  53 + }
  54 + getMemoryControllerDT8()->resetTemporaryColor();
  55 + return QueryStore::storeDtrAsFailureLevel();
  56 +}
  57 +
  58 +Status QueryStoreDT8::storePowerOnLevel() {
  59 + const ColorDT8& color = getMemoryControllerDT8()->getTemporaryColor();
  60 + switch (color.type) {
  61 +
  62 +#ifdef DALI_DT8_SUPPORT_XY
  63 + case DALI_DT8_COLOR_TYPE_XY:
  64 +#endif
  65 +
  66 +#ifdef DALI_DT8_SUPPORT_TC
  67 + case DALI_DT8_COLOR_TYPE_TC:
  68 +#endif
  69 +
  70 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  71 + case DALI_DT8_COLOR_TYPE_PRIMARY_N:
  72 +#endif
  73 + getMemoryControllerDT8()->setPowerOnColor(color);
  74 + break;
  75 + }
  76 + getMemoryControllerDT8()->resetTemporaryColor();
  77 + return QueryStore::storePowerOnLevel();
  78 +}
  79 +
  80 +Status QueryStoreDT8::storeDtrAsScene(uint8_t scene) {
  81 + const ColorDT8& color = getMemoryControllerDT8()->getTemporaryColor();
  82 + switch (color.type) {
  83 +
  84 +#ifdef DALI_DT8_SUPPORT_XY
  85 + case DALI_DT8_COLOR_TYPE_XY:
  86 +#endif
  87 +
  88 +#ifdef DALI_DT8_SUPPORT_TC
  89 + case DALI_DT8_COLOR_TYPE_TC:
  90 +#endif
  91 +
  92 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  93 + case DALI_DT8_COLOR_TYPE_PRIMARY_N:
  94 +#endif
  95 + getMemoryControllerDT8()->setColorForScene(scene, color);
  96 + break;
  97 + }
  98 + getMemoryControllerDT8()->resetTemporaryColor(); // TODO reset if color type is invalid?
  99 + return QueryStore::storeDtrAsScene(scene);
  100 +}
  101 +
  102 +Status QueryStoreDT8::removeFromScene(uint8_t scene) {
  103 + ColorDT8 color;
  104 + getMemoryControllerDT8()->setColorForScene(scene, color);
  105 + return QueryStore::removeFromScene(scene);
  106 +}
  107 +
  108 +uint8_t QueryStoreDT8::queryActualLevel() {
  109 + getMemoryControllerDT8()->setReportColor(getLampControllerDT8()->getActualColor());
  110 + return QueryStore::queryActualLevel();
  111 +}
  112 +
  113 +uint8_t QueryStoreDT8::queryPowerOnLevel() {
  114 + getMemoryControllerDT8()->setReportColor(getMemoryControllerDT8()->getPowerOnColor());
  115 + return QueryStore::queryPowerOnLevel();
  116 +}
  117 +
  118 +uint8_t QueryStoreDT8::queryFaliureLevel() {
  119 + getMemoryControllerDT8()->setReportColor(getMemoryControllerDT8()->getFaliureColor());
  120 + return QueryStore::queryFaliureLevel();
  121 +}
  122 +
  123 +uint8_t QueryStoreDT8::queryLevelForScene(uint8_t scene) {
  124 + getMemoryControllerDT8()->setReportColor(getMemoryControllerDT8()->getColorForScene(scene));
  125 + return QueryStore::queryLevelForScene(scene);
  126 +}
  127 +
  128 +Status QueryStoreDT8::storeGearFeatures() {
  129 + uint8_t featuresStatus = getMemoryController()->getDTR();
  130 + return getMemoryControllerDT8()->setFeaturesStatus(featuresStatus & 0x01);
  131 +}
  132 +
  133 +uint8_t QueryStoreDT8::queryGearFeatures() {
  134 + uint8_t featuresStatus = getMemoryControllerDT8()->getFeaturesStatus();
  135 + return featuresStatus;
  136 +}
  137 +
  138 +uint8_t QueryStoreDT8::queryColorStatus() {
  139 + uint8_t status = 0;
  140 + if (getLampControllerDT8()->isXYCoordinateLimitError()) {
  141 + status |= (1 << DALI_DT8_COLOR_TYPE_XY);
  142 + }
  143 + if (getLampControllerDT8()->isTemeratureLimitError()) {
  144 + status |= (1 << DALI_DT8_COLOR_TYPE_TC);
  145 + }
  146 + switch (getLampControllerDT8()->getActualColor().type) {
  147 + case DALI_DT8_COLOR_TYPE_XY:
  148 + status |= (0x10 << DALI_DT8_COLOR_TYPE_XY);
  149 + break;
  150 + case DALI_DT8_COLOR_TYPE_TC:
  151 + status |= (0x10 << DALI_DT8_COLOR_TYPE_TC);
  152 + break;
  153 + case DALI_DT8_COLOR_TYPE_PRIMARY_N:
  154 + status |= (0x10 << DALI_DT8_COLOR_TYPE_PRIMARY_N);
  155 + break;
  156 + case DALI_DT8_COLOR_TYPE_RGBWAF:
  157 + status |= (0x10 << DALI_DT8_COLOR_TYPE_RGBWAF);
  158 + break;
  159 + }
  160 + return status;
  161 +}
  162 +
  163 +uint8_t QueryStoreDT8::queryColorTypes() {
  164 + uint8_t colorTypes = 0;
  165 +
  166 +#ifdef DALI_DT8_SUPPORT_XY
  167 + colorTypes |= DALI_DT8_COLOUR_TYPE_FEATURES_XY;
  168 +#endif // DALI_DT8_SUPPORT_XY
  169 +
  170 +#ifdef DALI_DT8_SUPPORT_TC
  171 + colorTypes |= DALI_DT8_COLOUR_TYPE_FEATURES_TC;
  172 +#endif // DALI_DT8_SUPPORT_TC
  173 +
  174 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  175 + colorTypes |= (DALI_DT8_NUMBER_OF_PRIMARIES << 2) & DALI_DT8_COLOUR_TYPE_FEATURES_PRIMARY_N;
  176 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  177 +
  178 + return colorTypes;
  179 +}
  180 +
  181 +Status QueryStoreDT8::queryColorValue() {
  182 + Status status = Status::OK;
  183 + uint16_t value = DALI_DT8_MASK16;
  184 + uint8_t type = getMemoryController()->getDTR();
  185 +
  186 + switch (type) {
  187 +#ifdef DALI_DT8_SUPPORT_XY
  188 + case 0: // x-COORDINATE
  189 + value = queryCoordinateX(getLampControllerDT8()->getActualColor());
  190 + break;
  191 +
  192 + case 1: // y-COORDINATE
  193 + value = queryCoordinateY(getLampControllerDT8()->getActualColor());
  194 + break;
  195 +#endif
  196 +
  197 +#ifdef DALI_DT8_SUPPORT_TC
  198 + case 2: // COLOUR TEMPERATURE TC
  199 + value = queryColorTemperature(getLampControllerDT8()->getActualColor());
  200 + break;
  201 +#endif
  202 +
  203 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  204 + case 3: // PRIMARY N DIMLEVEL 0
  205 + value = queryPrimaryLevel(getLampControllerDT8()->getActualColor(), 0);
  206 + break;
  207 +
  208 + case 4: // PRIMARY N DIMLEVEL 1
  209 + value = queryPrimaryLevel(getLampControllerDT8()->getActualColor(), 1);
  210 + break;
  211 +
  212 + case 5: // PRIMARY N DIMLEVEL 2
  213 + value = queryPrimaryLevel(getLampControllerDT8()->getActualColor(), 2);
  214 + break;
  215 +
  216 + case 6: // PRIMARY N DIMLEVEL 3
  217 + value = queryPrimaryLevel(getLampControllerDT8()->getActualColor(), 3);
  218 + break;
  219 +
  220 + case 7: // PRIMARY N DIMLEVEL 4
  221 + value = queryPrimaryLevel(getLampControllerDT8()->getActualColor(), 4);
  222 + break;
  223 +
  224 + case 8: // PRIMARY N DIMLEVEL 5
  225 + value = queryPrimaryLevel(getLampControllerDT8()->getActualColor(), 5);
  226 + break;
  227 +#endif
  228 +
  229 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  230 + case 64: // x-COORDINATE PRIMARY N 0
  231 + value = getMemoryControllerDT8()->getPrimaryCoordinateX(0);
  232 + break;
  233 + case 65: // y-COORDINATE PRIMARY N 0
  234 + value = getMemoryControllerDT8()->getPrimaryCoordinateY(0);
  235 + break;
  236 +
  237 + case 66: // TY PRIMARY N 0
  238 + value = getMemoryControllerDT8()->getPrimaryTy(0);
  239 + break;
  240 +
  241 + case 67: // x-COORDINATE PRIMARY N 1
  242 + value = getMemoryControllerDT8()->getPrimaryCoordinateX(1);
  243 + break;
  244 +
  245 + case 68: // y-COORDINATE PRIMARY N 1
  246 + value = getMemoryControllerDT8()->getPrimaryCoordinateY(1);
  247 + break;
  248 +
  249 + case 69: // TY PRIMARY N 1
  250 + value = getMemoryControllerDT8()->getPrimaryTy(1);
  251 + break;
  252 +
  253 + case 70: // x-COORDINATE PRIMARY N 2
  254 + value = getMemoryControllerDT8()->getPrimaryCoordinateX(2);
  255 + break;
  256 +
  257 + case 71: // y-COORDINATE PRIMARY N 2
  258 + value = getMemoryControllerDT8()->getPrimaryCoordinateY(2);
  259 + break;
  260 +
  261 + case 72: // TY PRIMARY N 2
  262 + value = getMemoryControllerDT8()->getPrimaryTy(2);
  263 + break;
  264 +
  265 + case 73: // x-COORDINATE PRIMARY N 3
  266 + value = getMemoryControllerDT8()->getPrimaryCoordinateX(3);
  267 + break;
  268 +
  269 + case 74: // y-COORDINATE PRIMARY N 3
  270 + value = getMemoryControllerDT8()->getPrimaryCoordinateY(3);
  271 + break;
  272 +
  273 + case 75: // TY PRIMARY N 3
  274 + value = getMemoryControllerDT8()->getPrimaryTy(3);
  275 + break;
  276 +
  277 + case 76: // x-COORDINATE PRIMARY N 4
  278 + value = getMemoryControllerDT8()->getPrimaryCoordinateX(4);
  279 + break;
  280 +
  281 + case 77: // y-COORDINATE PRIMARY N 4
  282 + value = getMemoryControllerDT8()->getPrimaryCoordinateY(4);
  283 + break;
  284 +
  285 + case 78: // TY PRIMARY N 4
  286 + value = getMemoryControllerDT8()->getPrimaryTy(3);
  287 + break;
  288 +
  289 + case 79: // x-COORDINATE PRIMARY N 5
  290 + value = getMemoryControllerDT8()->getPrimaryCoordinateX(5);
  291 + break;
  292 +
  293 + case 80: // y-COORDINATE PRIMARY N 5
  294 + value = getMemoryControllerDT8()->getPrimaryCoordinateY(5);
  295 + break;
  296 +
  297 + case 81: // TY PRIMARY N 5
  298 + value = getMemoryControllerDT8()->getPrimaryTy(5);
  299 + break;
  300 +
  301 + case 82: // NUMBER OF PRIMARIES
  302 + value = DALI_DT8_NUMBER_OF_PRIMARIES << 8;
  303 + break;
  304 +#else // DALI_DT8_SUPPORT_PRIMARY_N
  305 + case 64: // x-COORDINATE PRIMARY N 0
  306 + case 65: // y-COORDINATE PRIMARY N 0
  307 + case 66: // TY PRIMARY N 0
  308 + case 67: // x-COORDINATE PRIMARY N 1
  309 + case 68: // y-COORDINATE PRIMARY N 1
  310 + case 69: // TY PRIMARY N 1
  311 + case 70: // x-COORDINATE PRIMARY N 2
  312 + case 71: // y-COORDINATE PRIMARY N 2
  313 + case 72: // TY PRIMARY N 2
  314 + case 73: // x-COORDINATE PRIMARY N 3
  315 + case 74: // y-COORDINATE PRIMARY N 3
  316 + case 75: // TY PRIMARY N 3
  317 + case 76: // x-COORDINATE PRIMARY N 4
  318 + case 77: // y-COORDINATE PRIMARY N 4
  319 + case 78: // TY PRIMARY N 4
  320 + case 79: // x-COORDINATE PRIMARY N 5
  321 + case 80: // y-COORDINATE PRIMARY N 5
  322 + case 81: // TY PRIMARY N 5
  323 + case 82: // NUMBER OF PRIMARIES
  324 + value = DALI_DT8_MASK16;
  325 + break;
  326 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  327 +
  328 +#ifdef DALI_DT8_SUPPORT_TC
  329 + case 128: // COLOUR TEMPERATURE TC COOLEST
  330 + value = getMemoryControllerDT8()->getColorTemperatureCoolest();
  331 + break;
  332 +
  333 + case 129: // COLOUR TEMPERATURE TC PHYSICAL COOLEST
  334 + value = getMemoryControllerDT8()->getColorTemperaturePhisicalCoolest();
  335 + break;
  336 +
  337 + case 130: // COLOUR TEMPERATURE TC WARMEST
  338 + value = getMemoryControllerDT8()->getColorTemperatureWarmest();
  339 + break;
  340 +
  341 + case 131: // COLOUR TEMPERATURE TC PHYSICAL WARMEST
  342 + value = getMemoryControllerDT8()->getColorTemperaturePhisicalWarmest();
  343 + break;
  344 +#endif
  345 +
  346 +#if defined(DALI_DT8_SUPPORT_XY) || defined(DALI_DT8_SUPPORT_PRIMARY_N)
  347 + case 192: // TEMPORARY x-COORDINATE
  348 +# ifndef DALI_DT8_SUPPORT_XY
  349 + value = getMemoryControllerDT8()->getTemporaryCooridanateX();
  350 +# else
  351 + value = queryCoordinateX(getMemoryControllerDT8()->getTemporaryColor());
  352 +#endif
  353 + break;
  354 +
  355 + case 193: // TEMPORARY y-COORDINATE
  356 +# ifndef DALI_DT8_SUPPORT_XY
  357 + value = getMemoryControllerDT8()->getTemporaryCooridanateY();
  358 +# else
  359 + value = queryCoordinateY(getMemoryControllerDT8()->getTemporaryColor());
  360 +#endif
  361 + break;
  362 +#endif
  363 +
  364 +#ifdef DALI_DT8_SUPPORT_TC
  365 + case 194: // TEMPORARY COLOUR TEMPERATURE TC
  366 + value = queryColorTemperature(getMemoryControllerDT8()->getTemporaryColor());
  367 + break;
  368 +#endif
  369 +
  370 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  371 + case 195: // TEMPORARY PRIMARY N DIMLEVEL 0
  372 + value = queryPrimaryLevel(getMemoryControllerDT8()->getTemporaryColor(), 0);
  373 + break;
  374 +
  375 + case 196: // TEMPORARY PRIMARY N DIMLEVEL 1
  376 + value = queryPrimaryLevel(getMemoryControllerDT8()->getTemporaryColor(), 1);
  377 + break;
  378 +
  379 + case 197: // TEMPORARY PRIMARY N DIMLEVEL 2
  380 + value = queryPrimaryLevel(getMemoryControllerDT8()->getTemporaryColor(), 2);
  381 + break;
  382 +
  383 + case 198: // TEMPORARY PRIMARY N DIMLEVEL 3
  384 + value = queryPrimaryLevel(getMemoryControllerDT8()->getTemporaryColor(), 3);
  385 + break;
  386 +
  387 + case 199: // TEMPORARY PRIMARY N DIMLEVEL 4
  388 + value = queryPrimaryLevel(getMemoryControllerDT8()->getTemporaryColor(), 4);
  389 + break;
  390 +
  391 + case 200: // TEMPORARY PRIMARY N DIMLEVEL 5
  392 + value = queryPrimaryLevel(getMemoryControllerDT8()->getTemporaryColor(), 5);
  393 + break;
  394 +#endif
  395 +
  396 + case 208: // TEMPORARY COLOUR TYPE
  397 + value = queryColorType(getMemoryControllerDT8()->getTemporaryColor());
  398 + break;
  399 +
  400 +#ifdef DALI_DT8_SUPPORT_XY
  401 + case 224: // REPORT x-COORDINATE
  402 + value = queryCoordinateX(getMemoryControllerDT8()->getReportColor());
  403 + break;
  404 +
  405 + case 225: // REPORT y-COORDINATE
  406 + value = queryCoordinateY(getMemoryControllerDT8()->getReportColor());
  407 + break;
  408 +#endif
  409 +
  410 +#ifdef DALI_DT8_SUPPORT_TC
  411 + case 226: // REPORT COLOUR TEMPERATURE TC
  412 + value = queryColorTemperature(getMemoryControllerDT8()->getReportColor());
  413 + break;
  414 +#endif
  415 +
  416 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  417 + case 227: // REPORT PRIMARY N DIMLEVEL 0
  418 + value = queryPrimaryLevel(getMemoryControllerDT8()->getReportColor(), 0);
  419 + break;
  420 +
  421 + case 228: // REPORT PRIMARY N DIMLEVEL 1
  422 + value = queryPrimaryLevel(getMemoryControllerDT8()->getReportColor(), 1);
  423 + break;
  424 +
  425 + case 229: // REPORT PRIMARY N DIMLEVEL 2
  426 + value = queryPrimaryLevel(getMemoryControllerDT8()->getReportColor(), 2);
  427 + break;
  428 +
  429 + case 230: // REPORT PRIMARY N DIMLEVEL 3
  430 + value = queryPrimaryLevel(getMemoryControllerDT8()->getReportColor(), 3);
  431 + break;
  432 +
  433 + case 231: // REPORT PRIMARY N DIMLEVEL 4
  434 + value = queryPrimaryLevel(getMemoryControllerDT8()->getReportColor(), 4);
  435 + break;
  436 +
  437 + case 232: // REPORT PRIMARY N DIMLEVEL 5
  438 + value = queryPrimaryLevel(getMemoryControllerDT8()->getReportColor(), 5);
  439 + break;
  440 +#endif
  441 +
  442 + case 240: // REPORT COLOUR TYPE
  443 + value = queryColorType(getMemoryControllerDT8()->getReportColor());
  444 + break;
  445 +
  446 + default: // Not supported
  447 + status = Status::INVALID;
  448 + break;
  449 + }
  450 +
  451 + if (status == Status::OK) {
  452 + getMemoryController()->setDTR1(value >> 8);
  453 + getMemoryController()->setDTR(value & 0xff);
  454 + }
  455 +
  456 + return status;
  457 +}
  458 +
  459 +Status QueryStoreDT8::setTemporaryCoordinateX() {
  460 +#if defined(DALI_DT8_SUPPORT_XY) || defined(DALI_DT8_SUPPORT_PRIMARY_N)
  461 + return getMemoryControllerDT8()->setTemporaryCoordinateX(uint16FromDtrAndDtr1());
  462 +#else
  463 + return getMemoryControllerDT8()->resetTemporaryColor();
  464 +#endif
  465 +}
  466 +
  467 +Status QueryStoreDT8::setTemporaryCoordinateY() {
  468 +#if defined(DALI_DT8_SUPPORT_XY) || defined(DALI_DT8_SUPPORT_PRIMARY_N)
  469 + return getMemoryControllerDT8()->setTemporaryCoordinateY(uint16FromDtrAndDtr1());
  470 +#else
  471 + return getMemoryControllerDT8()->resetTemporaryColor();
  472 +#endif
  473 +}
  474 +
  475 +Status QueryStoreDT8::setTemporaryColorTemperature() {
  476 +#ifdef DALI_DT8_SUPPORT_TC
  477 + return getMemoryControllerDT8()->setTemporaryColorTemperature(uint16FromDtrAndDtr1());
  478 +#else
  479 + return getMemoryControllerDT8()->resetTemporaryColor();
  480 +#endif
  481 +}
  482 +
  483 +Status QueryStoreDT8::setTemporaryPrimaryLevel() {
  484 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  485 + return getMemoryControllerDT8()->setTemporaryPrimaryLevel(getMemoryController()->getDTR2(), uint16FromDtrAndDtr1());
  486 +#else
  487 + return getMemoryControllerDT8()->resetTemporaryColor();
  488 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  489 +
  490 +}
  491 +
  492 +Status QueryStoreDT8::setTemporaryRGB() {
  493 + return getMemoryControllerDT8()->resetTemporaryColor();
  494 +}
  495 +
  496 +Status QueryStoreDT8::setTemporaryWAF() {
  497 + return getMemoryControllerDT8()->resetTemporaryColor();
  498 +}
  499 +
  500 +Status QueryStoreDT8::setTemporaryRGBWAFControl() {
  501 + return getMemoryControllerDT8()->resetTemporaryColor();
  502 +}
  503 +
  504 +#ifdef DALI_DT8_SUPPORT_TC
  505 +
  506 +Status QueryStoreDT8::storeColourTemperatureCoolest(uint16_t temperature) {
  507 + MemoryDT8* memory = getMemoryControllerDT8();
  508 + uint16_t colorTemperaturePhisicalCoolest = memory->getColorTemperaturePhisicalCoolest();
  509 + if (temperature < colorTemperaturePhisicalCoolest) {
  510 + temperature = colorTemperaturePhisicalCoolest;
  511 + }
  512 + Status status = Status::OK;
  513 + if (temperature > memory->getColorTemperatureWarmest()) {
  514 + status = storeColourTemperatureWarmest(temperature);
  515 + uint16_t colorTemperatureWarmest = memory->getColorTemperatureWarmest();
  516 + if (temperature > colorTemperatureWarmest) {
  517 + temperature = colorTemperatureWarmest;
  518 + }
  519 + }
  520 + if (memory->setColorTemperatureCoolest(temperature) != Status::OK) {
  521 + status = Status::ERROR;
  522 + }
  523 + return status;
  524 +}
  525 +
  526 +Status QueryStoreDT8::storeColourTemperatureWarmest(uint16_t temperature) {
  527 + MemoryDT8* memory = getMemoryControllerDT8();
  528 + uint16_t colorTemperaturePhisicalWarmest = memory->getColorTemperaturePhisicalWarmest();
  529 + if (temperature > colorTemperaturePhisicalWarmest) {
  530 + temperature = colorTemperaturePhisicalWarmest;
  531 + }
  532 + Status status = Status::OK;
  533 + if (temperature < getMemoryControllerDT8()->getColorTemperatureCoolest()) {
  534 + status = storeColourTemperatureCoolest(temperature);
  535 + uint16_t colorTemperatureCoolest = memory->getColorTemperatureCoolest();
  536 + if (temperature < colorTemperatureCoolest) {
  537 + temperature = colorTemperatureCoolest;
  538 + }
  539 + }
  540 + if (memory->setColorTemperatureWarmest(temperature) != Status::OK) {
  541 + status = Status::ERROR;
  542 + }
  543 + return status;
  544 +}
  545 +
  546 +Status QueryStoreDT8::storeColourTemperaturePhisicalCoolest(uint16_t temperature) {
  547 + MemoryDT8* memory = getMemoryControllerDT8();
  548 + Status status = Status::OK;
  549 + if (temperature == DALI_DT8_MASK16) {
  550 + if (memory->setColorTemperatureCoolest(DALI_DT8_MASK16) != Status::OK)
  551 + status = Status::ERROR;
  552 + if (memory->setColorTemperatureWarmest(DALI_DT8_MASK16) != Status::OK)
  553 + status = Status::ERROR;
  554 + if (memory->setColorTemperaturePhisicalCoolest(DALI_DT8_MASK16) != Status::OK)
  555 + status = Status::ERROR;
  556 + if (memory->setColorTemperaturePhisicalWarmest(DALI_DT8_MASK16) != Status::OK)
  557 + status = Status::ERROR;
  558 + } else {
  559 + if (temperature < DALI_DT8_TC_COOLEST) {
  560 + temperature = DALI_DT8_TC_COOLEST;
  561 + }
  562 + uint16_t colorTemperaturePhisicalWarmest = memory->getColorTemperaturePhisicalWarmest();
  563 + if (colorTemperaturePhisicalWarmest != DALI_DT8_MASK16 && temperature > colorTemperaturePhisicalWarmest) {
  564 + if (memory->setColorTemperaturePhisicalWarmest(temperature) != Status::OK)
  565 + status = Status::ERROR;
  566 + uint16_t colorTemperatureWarmest = memory->getColorTemperatureWarmest();
  567 + if (temperature > colorTemperatureWarmest) {
  568 + if (memory->setColorTemperatureWarmest(temperature) != Status::OK)
  569 + status = Status::ERROR;
  570 + }
  571 + }
  572 + uint16_t colorTemperatureCoolest = memory->getColorTemperatureCoolest();
  573 + if (colorTemperatureCoolest == DALI_DT8_MASK16 || colorTemperatureCoolest < temperature) {
  574 + if (memory->setColorTemperatureCoolest(temperature) != Status::OK)
  575 + status = Status::ERROR;
  576 + }
  577 + if (memory->setColorTemperaturePhisicalCoolest(temperature) != Status::OK)
  578 + status = Status::ERROR;
  579 + }
  580 + return status;
  581 +}
  582 +
  583 +Status QueryStoreDT8::storeColourTemperaturePhisicalWarmest(uint16_t temperature) {
  584 + MemoryDT8* memory = getMemoryControllerDT8();
  585 + Status status = Status::OK;
  586 + if (temperature == DALI_DT8_MASK16) {
  587 + if (memory->setColorTemperatureCoolest(DALI_DT8_MASK16) != Status::OK)
  588 + status = Status::ERROR;
  589 + if (memory->setColorTemperatureWarmest(DALI_DT8_MASK16) != Status::OK)
  590 + status = Status::ERROR;
  591 + if (memory->setColorTemperaturePhisicalCoolest(DALI_DT8_MASK16) != Status::OK)
  592 + status = Status::ERROR;
  593 + if (memory->setColorTemperaturePhisicalWarmest(DALI_DT8_MASK16) != Status::OK)
  594 + status = Status::ERROR;
  595 + } else {
  596 + if (temperature > DALI_DT8_TC_WARMESR) {
  597 + temperature = DALI_DT8_TC_WARMESR;
  598 + }
  599 + uint16_t colorTemperaturePhisicalCoolest = memory->getColorTemperaturePhisicalCoolest();
  600 + if (colorTemperaturePhisicalCoolest != DALI_DT8_MASK16 && temperature < colorTemperaturePhisicalCoolest) {
  601 + if (memory->setColorTemperaturePhisicalCoolest(temperature) != Status::OK)
  602 + status = Status::ERROR;
  603 + uint16_t colorTemperatureCoolest = memory->getColorTemperatureCoolest();
  604 + if (temperature < colorTemperatureCoolest) {
  605 + if (memory->setColorTemperatureCoolest(temperature) != Status::OK)
  606 + status = Status::ERROR;
  607 + }
  608 + }
  609 + uint16_t colorTemperatureWarmest = memory->getColorTemperatureWarmest();
  610 + if (colorTemperatureWarmest == DALI_DT8_MASK16 || colorTemperatureWarmest > temperature) {
  611 + if (memory->setColorTemperatureWarmest(temperature) != Status::OK)
  612 + status = Status::ERROR;
  613 + }
  614 + if (memory->setColorTemperaturePhisicalWarmest(temperature) != Status::OK)
  615 + status = Status::ERROR;
  616 + }
  617 + return status;
  618 +}
  619 +
  620 +Status QueryStoreDT8::storeColourTemperatureLimit() {
  621 + uint8_t limitType = getMemoryController()->getDTR2();
  622 + uint16_t temperature = uint16FromDtrAndDtr1();
  623 + switch (limitType) {
  624 + case 0: // coolest
  625 + return storeColourTemperatureCoolest(temperature);
  626 + case 1: // warmest
  627 + return storeColourTemperatureWarmest(temperature);
  628 + case 2: // physical coolest
  629 + return storeColourTemperaturePhisicalCoolest(temperature);
  630 + case 3: // physical warmest
  631 + return storeColourTemperaturePhisicalWarmest(temperature);
  632 + }
  633 + return Status::INVALID;
  634 +}
  635 +
  636 +#endif // DALI_DT8_SUPPORT_TC
  637 +
  638 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  639 +Status QueryStoreDT8::storePrimaryTY() {
  640 + uint8_t n = getMemoryController()->getDTR2();
  641 + uint16_t ty = uint16FromDtrAndDtr1();
  642 + if (n < DALI_DT8_NUMBER_OF_PRIMARIES) {
  643 + return getMemoryControllerDT8()->storePrimaryTy(n, ty);
  644 + } else {
  645 + return Status::ERROR;
  646 + }
  647 +}
  648 +
  649 +Status QueryStoreDT8::storePrimaryCoordinate() {
  650 + uint8_t n = getMemoryController()->getDTR2();
  651 + if (n < DALI_DT8_NUMBER_OF_PRIMARIES) {
  652 + const ColorDT8& color = getMemoryControllerDT8()->getTemporaryColor();
  653 + if (color.type != DALI_DT8_COLOR_TYPE_XY) {
  654 + return Status::ERROR;
  655 + }
  656 + uint16_t x;
  657 + uint16_t y;
  658 +#ifdef DALI_DT8_SUPPORT_XY
  659 + x = color.value.xy.x;
  660 + y = color.value.xy.y;
  661 +#else
  662 + x = getMemoryControllerDT8()->getTemporaryCooridanateX();
  663 + y = getMemoryControllerDT8()->getTemporaryCooridanateY();
  664 +#endif
  665 + return getMemoryControllerDT8()->storePrimaryCoordinate(n, x, y);
  666 + }
  667 + return Status::ERROR;
  668 +}
  669 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  670 +
  671 +uint16_t QueryStoreDT8::queryColorType(const ColorDT8& color) {
  672 + switch (color.type) {
  673 +
  674 +#ifdef DALI_DT8_SUPPORT_XY
  675 + case DALI_DT8_COLOR_TYPE_XY:
  676 +#endif
  677 +
  678 +#ifdef DALI_DT8_SUPPORT_TC
  679 + case DALI_DT8_COLOR_TYPE_TC:
  680 +#endif
  681 +
  682 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  683 + case DALI_DT8_COLOR_TYPE_PRIMARY_N:
  684 +#endif
  685 +
  686 + return ((0x10 << (uint16_t)(color.type)) << 8) | 0x00ff;
  687 + default:
  688 + return DALI_DT8_MASK16;
  689 + }
  690 +}
  691 +
  692 +#ifdef DALI_DT8_SUPPORT_XY
  693 +uint16_t QueryStoreDT8::queryCoordinateX(const ColorDT8& color) {
  694 + if (color.type == DALI_DT8_COLOR_TYPE_XY) {
  695 + return color.value.xy.x;
  696 + } else {
  697 + return DALI_DT8_MASK16;
  698 + }
  699 +}
  700 +
  701 +uint16_t QueryStoreDT8::queryCoordinateY(const ColorDT8& color) {
  702 + if (color.type == DALI_DT8_COLOR_TYPE_XY) {
  703 + return color.value.xy.y;
  704 + } else {
  705 + return DALI_DT8_MASK16;
  706 + }
  707 +}
  708 +#endif // DALI_DT8_SUPPORT_XY
  709 +
  710 +#ifdef DALI_DT8_SUPPORT_TC
  711 +uint16_t QueryStoreDT8::queryColorTemperature(const ColorDT8& color) {
  712 + if (color.type == DALI_DT8_COLOR_TYPE_TC) {
  713 + return color.value.tc;
  714 + } else {
  715 + return DALI_DT8_MASK16;
  716 + }
  717 +}
  718 +#endif // DALI_DT8_SUPPORT_TC
  719 +
  720 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  721 +uint16_t QueryStoreDT8::queryPrimaryLevel(const ColorDT8& color, uint8_t n) {
  722 + if ((n < DALI_DT8_NUMBER_OF_PRIMARIES) && (color.type == DALI_DT8_COLOR_TYPE_PRIMARY_N)) {
  723 + return color.value.primary[n];
  724 + } else {
  725 + return DALI_DT8_MASK16;
  726 + }
  727 +}
  728 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  729 +
  730 +} // namespace controller
  731 +} // namespace dali
  732 +
  733 +#endif // DALI_DT8
src/dali/controller/query_store_dt8.hpp 0 → 100644
  1 +/*
  2 + * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
  3 + *
  4 + * All right reversed. Usage for commercial on not commercial
  5 + * purpose without written permission is not allowed.
  6 + *
  7 + * This program is distributed in the hope that it will be useful,
  8 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10 + */
  11 +
  12 +#ifndef DALI_CONTROLLER_QUERY_DT8_HPP_
  13 +#define DALI_CONTROLLER_QUERY_DT8_HPP_
  14 +
  15 +#include <dali/config_dt8.hpp>
  16 +
  17 +#ifdef DALI_DT8
  18 +
  19 +#include "lamp_dt8.hpp"
  20 +#include "memory_dt8.hpp"
  21 +#include "query_store.hpp"
  22 +
  23 +namespace dali {
  24 +namespace controller {
  25 +
  26 +class QueryStoreDT8: public QueryStore {
  27 +
  28 +public:
  29 + explicit QueryStoreDT8(MemoryDT8* memory, LampDT8* lamp);
  30 +
  31 + bool queryIsFading() override;
  32 +
  33 + Status storeActualLevelInDtr() override;
  34 + Status storeDtrAsFailureLevel() override;
  35 + Status storePowerOnLevel() override;
  36 + Status storeDtrAsScene(uint8_t scene) override;
  37 + Status removeFromScene(uint8_t scene) override;
  38 + uint8_t queryActualLevel() override;
  39 + uint8_t queryPowerOnLevel() override;
  40 + uint8_t queryFaliureLevel() override;
  41 + uint8_t queryLevelForScene(uint8_t scene) override;
  42 +
  43 + Status storeGearFeatures();
  44 + uint8_t queryGearFeatures();
  45 + uint8_t queryColorStatus();
  46 + uint8_t queryColorTypes();
  47 + Status queryColorValue();
  48 +
  49 + Status setTemporaryCoordinateX();
  50 + Status setTemporaryCoordinateY();
  51 + Status setTemporaryColorTemperature();
  52 + Status setTemporaryPrimaryLevel();
  53 + Status setTemporaryRGB();
  54 + Status setTemporaryWAF();
  55 + Status setTemporaryRGBWAFControl();
  56 +
  57 +#ifdef DALI_DT8_SUPPORT_TC
  58 + Status storeColourTemperatureLimit();
  59 +#endif
  60 +
  61 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  62 + Status storePrimaryTY();
  63 + Status storePrimaryCoordinate();
  64 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  65 +
  66 +private:
  67 + QueryStoreDT8(const QueryStoreDT8& other) = delete;
  68 + QueryStoreDT8& operator=(const QueryStoreDT8&) = delete;
  69 +
  70 + MemoryDT8* getMemoryControllerDT8() {
  71 + return (MemoryDT8*) getMemoryController();
  72 + }
  73 +
  74 + LampDT8* getLampControllerDT8() {
  75 + return (LampDT8*) getLampController();
  76 + }
  77 +
  78 + uint16_t uint16FromDtrAndDtr1() {
  79 + return getMemoryController()->uint16FromDtrAndDtr1();
  80 + }
  81 +
  82 + uint16_t queryColorType(const ColorDT8& color);
  83 +
  84 +#ifdef DALI_DT8_SUPPORT_XY
  85 + uint16_t queryCoordinateX(const ColorDT8& color);
  86 + uint16_t queryCoordinateY(const ColorDT8& color);
  87 +#endif
  88 +
  89 +#ifdef DALI_DT8_SUPPORT_TC
  90 + Status storeColourTemperatureCoolest(uint16_t temperature);
  91 + Status storeColourTemperatureWarmest(uint16_t temperature);
  92 + Status storeColourTemperaturePhisicalCoolest(uint16_t temperature);
  93 + Status storeColourTemperaturePhisicalWarmest(uint16_t temperature);
  94 +
  95 + uint16_t queryColorTemperature(const ColorDT8& color);
  96 +#endif
  97 +
  98 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  99 + uint16_t queryPrimaryLevel(const ColorDT8& color, uint8_t n);
  100 +#endif
  101 +};
  102 +
  103 +} // namespace controller
  104 +} // namespace dali
  105 +
  106 +#endif // DALI_DT8
  107 +
  108 +#endif // DALI_CONTROLLER_QUERY_DT8_HPP_
src/dali/dali_dt8.hpp 0 → 100644
  1 +/*
  2 + * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
  3 + *
  4 + * All right reversed. Usage for commercial on not commercial
  5 + * purpose without written permission is not allowed.
  6 + *
  7 + * This program is distributed in the hope that it will be useful,
  8 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10 + */
  11 +
  12 +#ifndef DALI_DALI_DT8_HPP_
  13 +#define DALI_DALI_DT8_HPP_
  14 +
  15 +#include "config_dt8.hpp"
  16 +
  17 +#ifdef DALI_DT8
  18 +
  19 +#include "commands_dt8.hpp"
  20 +#include "dali.hpp"
  21 +
  22 +#define DALI_DT8_COLOR_TYPE_XY 0
  23 +#define DALI_DT8_COLOR_TYPE_TC 1
  24 +#define DALI_DT8_COLOR_TYPE_PRIMARY_N 2
  25 +#define DALI_DT8_COLOR_TYPE_RGBWAF 3
  26 +
  27 +#define DALI_DT8_COLOUR_TYPE_FEATURES_XY 0x01
  28 +#define DALI_DT8_COLOUR_TYPE_FEATURES_TC 0x02
  29 +#define DALI_DT8_COLOUR_TYPE_FEATURES_PRIMARY_N 0x1C
  30 +#define DALI_DT8_COLOUR_TYPE_FEATURES_RGBWAF 0xE0
  31 +
  32 +#define DALI_DT8_FEATURES_AUTO_ACTIVATION 0x01
  33 +#define DALI_DT8_FEATURES_AUTO_CALIBRATION 0x40
  34 +#define DALI_DT8_FEATURES_AUTO_CALIBRATION_RECOVERY 0x80
  35 +
  36 +#define DALI_DT8_STATUS_XY_OUT_OF_RANGE 0x01
  37 +#define DALI_DT8_STATUS_TC_OUT_OF_RANGE 0x02
  38 +#define DALI_DT8_STATUS_AUTO_CALIBRATION_RUNNING 0x04
  39 +#define DALI_DT8_STATUS_AUTO_CALIBRATION_SUCCESSFUL 0x08
  40 +
  41 +#define DALI_DT8_TC_COOLEST 1
  42 +#define DALI_DT8_TC_WARMESR 65534
  43 +#define DALI_DT8_PRIMARY_TY_MAX 32767
  44 +#define DALI_DT8_RGBWAF_MAX 254
  45 +#define DALI_DT8_MASK16 65535
  46 +
  47 +#define DALI_DT8_RGBWAF_CONTROL_CHANNEL 0
  48 +#define DALI_DT8_RGBWAF_CONTROL_COLOR 1
  49 +#define DALI_DT8_RGBWAF_CONTROL_NORMALIZED 2
  50 +
  51 +#define DALI_DT8_RGBWAF_CONTROL_CANNELS_MASK ((1 << DALI_DT8_NUMBER_OF_PRIMARIES) - 1)
  52 +
  53 +namespace dali {
  54 +
  55 +typedef struct {
  56 + uint16_t x;
  57 + uint16_t y;
  58 +} PointXY;
  59 +
  60 +typedef struct {
  61 + uint16_t ty;
  62 + PointXY xy;
  63 +} Primary;
  64 +
  65 +class ILampDT8 : public ILamp {
  66 +public:
  67 + virtual void setPrimary(const uint16_t primary[], uint8_t size, uint32_t changeTime) = 0;
  68 + virtual void getPrimary(uint16_t primary[], uint8_t size) = 0;
  69 + virtual bool isColorChanging() = 0;
  70 + virtual void abortColorChanging() = 0;
  71 +};
  72 +
  73 +typedef struct {
  74 +public:
  75 + Primary primaryConfig[6];
  76 + uint8_t colorType;
  77 +#ifdef DALI_DT8_SUPPORT_XY
  78 + uint16_t xCoordinate;
  79 + uint16_t yCoordinate;
  80 +#endif // DALI_DT8_SUPPORT_XY
  81 +#ifdef DALI_DT8_SUPPORT_TC
  82 + uint16_t tcCoolest;
  83 + uint16_t tcWarmest;
  84 + uint16_t tc;
  85 +#endif // DALI_DT8_SUPPORT_TC
  86 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  87 + uint16_t primary[6];
  88 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  89 +} DefaultsDT8;
  90 +
  91 +extern const DefaultsDT8 kDefaultsDT8;
  92 +
  93 +} // namespace dali
  94 +
  95 +#endif // DALI_DT8
  96 +
  97 +#endif // DALI_DALI_DT8_HPP_
  98 +
src/dali/float_dt8.cpp 0 → 100644
  1 +/*
  2 + * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
  3 + *
  4 + * Licensed under GNU General Public License 3.0 or later.
  5 + *
  6 + * This program is distributed in the hope that it will be useful,
  7 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  8 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9 + */
  10 +
  11 +#include "float_dt8.hpp"
  12 +
  13 +namespace dali {
  14 +
  15 +} // namespace dali
src/dali/float_dt8.hpp 0 → 100644
  1 +/*
  2 + * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
  3 + *
  4 + * Licensed under GNU General Public License 3.0 or later.
  5 + *
  6 + * This program is distributed in the hope that it will be useful,
  7 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  8 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9 + */
  10 +
  11 +#ifndef DALI_FLOAT_DT8_HPP_
  12 +#define DALI_FLOAT_DT8_HPP_
  13 +
  14 +#ifdef HW_FLOATING_POINT
  15 +
  16 +typedef float Float;
  17 +
  18 +#else
  19 +
  20 +#include <stdint.h>
  21 +
  22 +#define BASE_PRECISION_SH 16
  23 +#define BASE_PRECISION (1 << BASE_PRECISION_SH)
  24 +#define EXTRA_PRECISION_SH 13
  25 +#define EXTRA_PRECISION (1 << EXTRA_PRECISION_SH)
  26 +#define PRECISION_SH (BASE_PRECISION_SH + EXTRA_PRECISION_SH)
  27 +#define PRECISION (BASE_PRECISION * EXTRA_PRECISION)
  28 +
  29 +namespace dali {
  30 +
  31 +class Float {
  32 +public:
  33 +
  34 + Float() {
  35 + }
  36 +
  37 + explicit Float(int32_t value) : mValue(value << EXTRA_PRECISION_SH) {
  38 + }
  39 +
  40 + Float(const Float& value) : mValue(value.mValue) {
  41 + }
  42 +
  43 + operator int32_t () const {
  44 + return (mValue + EXTRA_PRECISION / 2) >> EXTRA_PRECISION_SH;
  45 + }
  46 +
  47 + Float& operator = (const Float& r) {
  48 + mValue = r.mValue;
  49 + return *this;
  50 + }
  51 +
  52 + Float& operator = (int32_t value) {
  53 + mValue = value << EXTRA_PRECISION_SH;
  54 + return *this;
  55 + }
  56 +
  57 + bool operator == (const Float& r) const {
  58 + return mValue == r.mValue;
  59 + }
  60 +
  61 + bool operator != (const Float& r) const {
  62 + return mValue != r.mValue;
  63 + }
  64 +
  65 + bool operator < (const Float& r) const {
  66 + return mValue < r.mValue;
  67 + }
  68 +
  69 + bool operator <= (const Float& r) const {
  70 + return mValue <= r.mValue;
  71 + }
  72 +
  73 + bool operator > (const Float& r) const {
  74 + return mValue > r.mValue;
  75 + }
  76 +
  77 + bool operator >= (const Float& r) const {
  78 + return mValue >= r.mValue;
  79 + }
  80 +
  81 + Float operator + (const Float& r) const {
  82 + Float result = r;
  83 + result.mValue += mValue;
  84 + return result;
  85 + }
  86 +
  87 + void operator += (const Float& r) {
  88 + mValue += r.mValue;
  89 + }
  90 +
  91 + Float operator - (const Float& r) const {
  92 + Float result = *this;
  93 + result.mValue -= r.mValue;
  94 + return result;
  95 + }
  96 +
  97 + void operator -= (const Float& r) {
  98 + mValue -= r.mValue;
  99 + }
  100 +
  101 + Float operator * (const Float& r) const {
  102 + Float result;
  103 + result.mValue = ((int64_t) mValue * r.mValue + PRECISION / 2) >> PRECISION_SH;
  104 + return result;
  105 + }
  106 +
  107 + void operator *= (const Float& r) {
  108 + mValue = ((int64_t) mValue * r.mValue + PRECISION / 2) >> PRECISION_SH;
  109 + }
  110 +
  111 + Float operator / (Float r) const {
  112 + Float result;
  113 + result.mValue = (((int64_t) mValue << PRECISION_SH) + r.mValue / 2) / r.mValue;
  114 + return result;
  115 + }
  116 +
  117 + void operator /= (const Float& r) {
  118 + mValue = (((int64_t) mValue << PRECISION_SH) + r.mValue / 2) / r.mValue;
  119 + }
  120 +
  121 + friend Float operator + (Float value);
  122 + friend Float operator - (Float value);
  123 +
  124 +private:
  125 + int32_t mValue;
  126 +};
  127 +
  128 +} // namespace dali
  129 +
  130 +#endif // HW_FLOATING_POINT
  131 +#endif // DALI_FLOAT_DT8_HPP_
src/dali/slave_dt8.cpp 0 → 100644
  1 +/*
  2 + * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
  3 + *
  4 + * Licensed under GNU General Public License 3.0 or later.
  5 + *
  6 + * This program is distributed in the hope that it will be useful,
  7 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  8 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9 + */
  10 +
  11 +#include "slave_dt8.hpp"
  12 +
  13 +#ifdef DALI_DT8
  14 +
  15 +namespace dali {
  16 +
  17 +// static
  18 +Slave* SlaveDT8::create(IMemory* memoryDriver, ILamp* lampDriver, IBus* busDriver, ITimer* timer) {
  19 + controller::MemoryDT8* memory = new controller::MemoryDT8(memoryDriver, &kDefaultsDT8);
  20 + controller::LampDT8* lamp = new controller::LampDT8(lampDriver, memory);
  21 + controller::QueryStoreDT8* queryStore = new controller::QueryStoreDT8(memory, lamp);
  22 + controller::Bus* bus = new controller::Bus(busDriver);
  23 + controller::Initialization* initialization = new controller::Initialization(timer, memory);
  24 +
  25 + return new SlaveDT8(memory, lamp, queryStore, bus, initialization);
  26 +}
  27 +
  28 +SlaveDT8::SlaveDT8(controller::Memory* memory, controller::Lamp* lamp, controller::QueryStore* queryStore,
  29 + controller::Bus* bus, controller::Initialization* initialization) :
  30 + Slave(memory, lamp, queryStore, bus, initialization) {
  31 +}
  32 +
  33 +Status SlaveDT8::handleHandleDaliDeviceTypeCommand(uint16_t repeatCount, Command cmd, uint8_t param,
  34 + uint8_t device_type) {
  35 + if (device_type != 8) {
  36 + return Status::INVALID;
  37 + }
  38 +
  39 + CommandDT8 cmdDT8 = (CommandDT8)cmd;
  40 +
  41 + switch (cmdDT8) {
  42 + case CommandDT8::SET_TEMPORARY_X_COORDINATE_WORD:
  43 + return getQueryStoreControllerDT8()->setTemporaryCoordinateX();
  44 +
  45 + case CommandDT8::SET_TEMPORARY_Y_COORDINATE_WORD:
  46 + return getQueryStoreControllerDT8()->setTemporaryCoordinateY();
  47 +
  48 + case CommandDT8::ACTIVATE:
  49 + return getLampControllerDT8()->activate();
  50 +
  51 +#ifdef DALI_DT8_SUPPORT_XY
  52 + case CommandDT8::X_COORDINATE_STEP_UP:
  53 + return getLampControllerDT8()->coordinateStepUpX();
  54 +
  55 + case CommandDT8::X_COORDINATE_STEP_DOWN:
  56 + return getLampControllerDT8()->coordinateStepDownX();
  57 +
  58 + case CommandDT8::Y_COORDINATE_STEP_UP:
  59 + return getLampControllerDT8()->coordinateStepUpY();
  60 +
  61 + case CommandDT8::Y_COORDINATE_STEP_DOWN:
  62 + return getLampControllerDT8()->coordinateStepDownY();
  63 +#endif // DALI_DT8_SUPPORT_XY
  64 +
  65 + case CommandDT8::SET_TEMPORARY_COLOUR_TEMPERATURE:
  66 + return getQueryStoreControllerDT8()->setTemporaryColorTemperature();
  67 +
  68 +#ifdef DALI_DT8_SUPPORT_TC
  69 + case CommandDT8::COLOUR_TEMPERATURE_STEP_COOLER:
  70 + return getLampControllerDT8()->colorTemperatureStepCooler();
  71 +
  72 + case CommandDT8::COLOUR_TEMPERATURE_STEP_WARMER:
  73 + return getLampControllerDT8()->colorTemperatureStepWarmer();
  74 +#endif // DALI_DT8_SUPPORT_TC
  75 +
  76 + case CommandDT8::SET_TEMPORARY_PRIMARY_N_DIMLEVEL:
  77 + return getQueryStoreControllerDT8()->setTemporaryPrimaryLevel();
  78 +
  79 + case CommandDT8::SET_TEMPORARY_RGB_DIMLEVEL:
  80 + return getQueryStoreControllerDT8()->setTemporaryRGB();
  81 +
  82 + case CommandDT8::SET_TEMPORARY_WAF_DIMLEVEL:
  83 + return getQueryStoreControllerDT8()->setTemporaryWAF();
  84 +
  85 + case CommandDT8::SET_TEMPORARY_RGBWAF_CONTROL:
  86 + return getQueryStoreControllerDT8()->setTemporaryRGBWAFControl();
  87 +
  88 + case CommandDT8::COPY_REPORT_TO_TEMPORARY:
  89 + return getMemoryControllerDT8()->copyReportToTemporary();
  90 +
  91 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  92 + case CommandDT8::STORE_TY_PRIMARY_N:
  93 + if (repeatCount == 0) {
  94 + return Status::REPEAT_REQUIRED;
  95 + }
  96 + return getQueryStoreControllerDT8()->storePrimaryTY();
  97 +
  98 + case CommandDT8::STORE_XY_COORDINATE_PRIMARY_N:
  99 + if (repeatCount == 0) {
  100 + return Status::REPEAT_REQUIRED;
  101 + }
  102 + return getQueryStoreControllerDT8()->storePrimaryCoordinate();
  103 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  104 +
  105 +#ifdef DALI_DT8_SUPPORT_TC
  106 + case CommandDT8::STORE_COLOUR_TEMPERATURE_LIMIT:
  107 + if (repeatCount == 0) {
  108 + return Status::REPEAT_REQUIRED;
  109 + }
  110 + return getQueryStoreControllerDT8()->storeColourTemperatureLimit();
  111 +#endif // DALI_DT8_SUPPORT_TC
  112 +
  113 + case CommandDT8::STORE_GEAR_FEATURES_STATUS:
  114 + if (repeatCount == 0) {
  115 + return Status::REPEAT_REQUIRED;
  116 + }
  117 + return getQueryStoreControllerDT8()->storeGearFeatures();
  118 +
  119 + case CommandDT8::START_AUTO_CALIBRATION:
  120 + if (repeatCount == 0) {
  121 + return Status::REPEAT_REQUIRED;
  122 + }
  123 + // TODO Implement in the future
  124 + return Status::INVALID;
  125 +
  126 + case CommandDT8::QUERY_GEAR_FEATURES_STATUS:
  127 + return sendAck(getQueryStoreControllerDT8()->queryGearFeatures());
  128 +
  129 + case CommandDT8::QUERY_COLOUR_STATUS:
  130 + return sendAck(getQueryStoreControllerDT8()->queryColorStatus());
  131 +
  132 + case CommandDT8::QUERY_COLOUR_TYPE_FEATURES:
  133 + return sendAck(getQueryStoreControllerDT8()->queryColorTypes());
  134 +
  135 + case CommandDT8::QUERY_COLOUR_VALUE: {
  136 + if (getQueryStoreControllerDT8()->queryColorValue() == Status::OK) {
  137 + return sendAck(getMemoryController()->getDTR1());
  138 + }
  139 + return Status::INVALID;
  140 + }
  141 +
  142 + case CommandDT8::QUERY_EXTENDED_VERSION_NUMBER:
  143 + return sendAck(2);
  144 +
  145 + default:
  146 + return Status::INVALID;
  147 + }
  148 +}
  149 +
  150 +} // namespace dali
  151 +
  152 +#endif // DALI_DT8
src/dali/slave_dt8.hpp 0 → 100644
  1 +/*
  2 + * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
  3 + *
  4 + * Licensed under GNU General Public License 3.0 or later.
  5 + *
  6 + * This program is distributed in the hope that it will be useful,
  7 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  8 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9 + */
  10 +
  11 +#ifndef DALI_SLAVE_DT8_H_
  12 +#define DALI_SLAVE_DT8_H_
  13 +
  14 +#include <dali/config_dt8.hpp>
  15 +
  16 +#ifdef DALI_DT8
  17 +
  18 +#include <dali/commands_dt8.hpp>
  19 +#include <dali/dali_dt8.hpp>
  20 +#include <dali/controller/lamp_dt8.hpp>
  21 +#include <dali/controller/memory_dt8.hpp>
  22 +#include <dali/controller/query_store_dt8.hpp>
  23 +#include <dali/slave.hpp>
  24 +
  25 +namespace dali {
  26 +
  27 +class SlaveDT8: public Slave {
  28 +public:
  29 + static Slave* create(IMemory* memoryDriver, ILamp* lampDriver, IBus* busDriver, ITimer* timer);
  30 +
  31 +protected:
  32 + SlaveDT8(controller::Memory* memory, controller::Lamp* lamp, controller::QueryStore* queryStore,
  33 + controller::Bus* busDriver, controller::Initialization* initializationController);
  34 +
  35 + Status handleHandleDaliDeviceTypeCommand(uint16_t repeat, Command cmd, uint8_t param, uint8_t device_type) override;
  36 +
  37 +private:
  38 + SlaveDT8(const SlaveDT8& other) = delete;
  39 + SlaveDT8& operator=(const SlaveDT8&) = delete;
  40 +
  41 + controller::MemoryDT8* getMemoryControllerDT8() {
  42 + return (controller::MemoryDT8*) getMemoryController();
  43 + }
  44 +
  45 + controller::LampDT8* getLampControllerDT8() {
  46 + return (controller::LampDT8*) getLampController();
  47 + }
  48 +
  49 + controller::QueryStoreDT8* getQueryStoreControllerDT8() {
  50 + return (controller::QueryStoreDT8*) getQueryStoreController();
  51 + }
  52 +};
  53 +
  54 +} // namespace dali
  55 +
  56 +#endif // DALI_DT8
  57 +
  58 +#endif // DALI_SLAVE_DT8_H_
src/xmc1200/dali/lamp.cpp
@@ -117,6 +117,44 @@ void LampRGB::waitForFade() { @@ -117,6 +117,44 @@ void LampRGB::waitForFade() {
117 } 117 }
118 } 118 }
119 119
  120 +
  121 +void LampRGB::setPrimary(const uint16_t primary[], uint8_t size, uint32_t changeTime) {
  122 + for (uint8_t i = 0; i < 3; ++i) {
  123 + mPrimary[i] = primary[i];
  124 + }
  125 + mLamp.setColor(dali2driver(primary[0]), dali2driver(primary[1]), dali2driver(primary[2]), changeTime);
  126 +}
  127 +
  128 +void LampRGB::getPrimary(uint16_t primary[], uint8_t size) {
  129 + if (isColorChanging()) {
  130 + primary[0] = driver2dali(mLamp.getColorR());
  131 + primary[1] = driver2dali(mLamp.getColorG());
  132 + primary[2] = driver2dali(mLamp.getColorB());
  133 + } else {
  134 + for (uint8_t i = 0; i < 3; ++i) {
  135 + mPrimary[i] = mPrimary[i];
  136 + }
  137 + }
  138 +}
  139 +
  140 +bool LampRGB::isColorChanging() {
  141 + return mLamp.isColorChanging();
  142 +}
  143 +
  144 +void LampRGB::abortColorChanging() {
  145 + if (mLamp.isColorChanging()) {
  146 + mLamp.abortColorChanging();
  147 + mPrimary[0] = driver2dali(mLamp.getColorR());
  148 + mPrimary[1] = driver2dali(mLamp.getColorG());
  149 + mPrimary[2] = driver2dali(mLamp.getColorB());
  150 + }
  151 +}
  152 +
  153 +void LampRGB::waitForColorChange() {
  154 + while (mLamp.isColorChanging()) {
  155 + }
  156 +}
  157 +
120 void LampRGB::onLampStateChnaged(ILampState state) { 158 void LampRGB::onLampStateChnaged(ILampState state) {
121 for (uint16_t i = 0; i < kMaxClients; ++i) { 159 for (uint16_t i = 0; i < kMaxClients; ++i) {
122 if (mClients[i] != nullptr) { 160 if (mClients[i] != nullptr) {
src/xmc1200/dali/lamp.hpp
@@ -11,13 +11,13 @@ @@ -11,13 +11,13 @@
11 #ifndef XMC_DALI_LAMP_HPP_ 11 #ifndef XMC_DALI_LAMP_HPP_
12 #define XMC_DALI_LAMP_HPP_ 12 #define XMC_DALI_LAMP_HPP_
13 13
14 -#include <dali/dali.hpp> 14 +#include <dali/dali_dt8.hpp>
15 #include <xmc1200/bccu.hpp> 15 #include <xmc1200/bccu.hpp>
16 16
17 namespace dali { 17 namespace dali {
18 namespace xmc { 18 namespace xmc {
19 19
20 -class LampRGB: public dali::ILamp { 20 +class LampRGB: public dali::ILampDT8 {
21 public: 21 public:
22 22
23 static LampRGB* getInstance(); 23 static LampRGB* getInstance();
@@ -30,6 +30,12 @@ public: @@ -30,6 +30,12 @@ public:
30 void abortFading() override; 30 void abortFading() override;
31 void waitForFade(); 31 void waitForFade();
32 32
  33 + void setPrimary(const uint16_t primary[], uint8_t size, uint32_t changeTime) override;
  34 + void getPrimary(uint16_t primary[], uint8_t size) override;
  35 + bool isColorChanging() override;
  36 + void abortColorChanging() override;
  37 + void waitForColorChange();
  38 +
33 bool isOff() { 39 bool isOff() {
34 return getLevel() == 0; 40 return getLevel() == 0;
35 } 41 }
@@ -48,6 +54,7 @@ private: @@ -48,6 +54,7 @@ private:
48 ILampClient* mClients[kMaxClients]; 54 ILampClient* mClients[kMaxClients];
49 ::xmc::BccuLampRGB mLamp; 55 ::xmc::BccuLampRGB mLamp;
50 uint16_t mLevel; 56 uint16_t mLevel;
  57 + uint16_t mPrimary[3];
51 }; 58 };
52 59
53 60
src/xmc1200/dali_defaults_dt8.cpp 0 → 100644
  1 +/*
  2 + * Copyright (c) 2015-2016, Arkadiusz Materek (arekmat@poczta.fm)
  3 + *
  4 + * Licensed under GNU General Public License 3.0 or later.
  5 + *
  6 + * This program is distributed in the hope that it will be useful,
  7 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  8 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9 + */
  10 +
  11 +#include <dali/dali_dt8.hpp>
  12 +
  13 +namespace dali {
  14 +
  15 +const dali::DefaultsDT8 kDefaultsDT8 = {
  16 + primaryConfig: {
  17 + {32767, {48149, 17387}},
  18 + {32767, {17944, 47016}},
  19 + {32767, {10918, 583}},
  20 + {65535, {65535, 65535}},
  21 + {65535, {65535, 65535}},
  22 + {65535, {65535, 65535}},
  23 + },
  24 + colorType: DALI_DT8_COLOR_TYPE_TC,
  25 +#ifdef DALI_DT8_SUPPORT_XY
  26 + xCoordinate: 21845,
  27 + yCoordinate: 21846,
  28 +#endif // DALI_DT8_SUPPORT_XY
  29 +#ifdef DALI_DT8_SUPPORT_TC
  30 + tcCoolest: 50,
  31 + tcWarmest: 1000,
  32 + tc: 500,
  33 +#endif /// DALI_DT8_SUPPORT_TC
  34 +#ifdef DALI_DT8_SUPPORT_PRIMARY_N
  35 + primary: { 10920, 10921, 10922, 10923, 10924, 10925},
  36 +#endif // DALI_DT8_SUPPORT_PRIMARY_N
  37 +#ifdef DALI_DT8_SUPPORT_RGBWAF
  38 + color: {128, 253, 200, 129, 150, 201},
  39 +#endif // DALI_DT8_SUPPORT_RGBWAF
  40 +};
  41 +
  42 +} // namespace dali
src/xmc1200/main.cpp
@@ -10,13 +10,11 @@ @@ -10,13 +10,11 @@
10 10
11 #if (CPU_CLOCK == 32000000) 11 #if (CPU_CLOCK == 32000000)
12 #define XMC_CPU_FREQ xmc::Clock::FREQ_32MHZ 12 #define XMC_CPU_FREQ xmc::Clock::FREQ_32MHZ
13 -#elif (CPU_CLOCK == 16000000)  
14 -#define XMC_CPU_FREQ xmc::Clock::FREQ_16MHZ  
15 #else 13 #else
16 #error Unsupported CPU clock 14 #error Unsupported CPU clock
17 #endif 15 #endif
18 16
19 -#include <dali/slave.hpp> 17 +#include <dali/slave_dt8.hpp>
20 18
21 #include <xmc1200/clock.hpp> 19 #include <xmc1200/clock.hpp>
22 #include <xmc1200/dali/bus.hpp> 20 #include <xmc1200/dali/bus.hpp>
@@ -78,7 +76,7 @@ int main(void) { @@ -78,7 +76,7 @@ int main(void) {
78 76
79 dali::xmc::Memory* daliMemory1 = dali::xmc::Memory::getInstance(); 77 dali::xmc::Memory* daliMemory1 = dali::xmc::Memory::getInstance();
80 dali::xmc::LampRGB* daliLamp1 = dali::xmc::LampRGB::getInstance(); 78 dali::xmc::LampRGB* daliLamp1 = dali::xmc::LampRGB::getInstance();
81 - gSlave = dali::Slave::create(daliMemory1, daliLamp1, daliBus, daliTimer); 79 + gSlave = dali::SlaveDT8::create(daliMemory1, daliLamp1, daliBus, daliTimer);
82 80
83 daliTimer->schedule(&gPowerOnTimerTask, 600, 0); 81 daliTimer->schedule(&gPowerOnTimerTask, 600, 0);
84 82