Commit f2151106f93a5f394d369a592264c139907813c7
1 parent
678db6cc
DALI device type 8 implementation.
Showing
21 changed files
with
3237 additions
and
8 deletions
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 | 14 | #define DALI_VERSION 1 |
| 15 | 15 | #define DALI_DEVICE_TYPE 8 |
| 16 | 16 | |
| 17 | -#define DALI_BANKS 3 | |
| 17 | +#define DALI_BANKS 5 | |
| 18 | 18 | #define DALI_BANK0_ADDR 0 // Bank 0 (16 bytes) according to 62386-102 |
| 19 | 19 | #define DALI_BANK1_ADDR 16 // Bank 1 (16 bytes) according to 62386-102 |
| 20 | 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 | 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 | 317 | return DALI_BANK2_ADDR - DALI_BANK1_ADDR; |
| 318 | 318 | case 2: |
| 319 | 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 | 324 | default: |
| 321 | 325 | return 0; |
| 322 | 326 | } |
| ... | ... | @@ -330,6 +334,10 @@ uintptr_t Memory::getBankAddr(uint8_t bank) { |
| 330 | 334 | return DALI_BANK1_ADDR; |
| 331 | 335 | case 2: |
| 332 | 336 | return DALI_BANK2_ADDR; |
| 337 | + case 3: | |
| 338 | + return DALI_BANK3_ADDR; | |
| 339 | + case 4: | |
| 340 | + return DALI_BANK4_ADDR; | |
| 333 | 341 | default: |
| 334 | 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 | 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 | 158 | void LampRGB::onLampStateChnaged(ILampState state) { |
| 121 | 159 | for (uint16_t i = 0; i < kMaxClients; ++i) { |
| 122 | 160 | if (mClients[i] != nullptr) { | ... | ... |
src/xmc1200/dali/lamp.hpp
| ... | ... | @@ -11,13 +11,13 @@ |
| 11 | 11 | #ifndef XMC_DALI_LAMP_HPP_ |
| 12 | 12 | #define XMC_DALI_LAMP_HPP_ |
| 13 | 13 | |
| 14 | -#include <dali/dali.hpp> | |
| 14 | +#include <dali/dali_dt8.hpp> | |
| 15 | 15 | #include <xmc1200/bccu.hpp> |
| 16 | 16 | |
| 17 | 17 | namespace dali { |
| 18 | 18 | namespace xmc { |
| 19 | 19 | |
| 20 | -class LampRGB: public dali::ILamp { | |
| 20 | +class LampRGB: public dali::ILampDT8 { | |
| 21 | 21 | public: |
| 22 | 22 | |
| 23 | 23 | static LampRGB* getInstance(); |
| ... | ... | @@ -30,6 +30,12 @@ public: |
| 30 | 30 | void abortFading() override; |
| 31 | 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 | 39 | bool isOff() { |
| 34 | 40 | return getLevel() == 0; |
| 35 | 41 | } |
| ... | ... | @@ -48,6 +54,7 @@ private: |
| 48 | 54 | ILampClient* mClients[kMaxClients]; |
| 49 | 55 | ::xmc::BccuLampRGB mLamp; |
| 50 | 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 | 10 | |
| 11 | 11 | #if (CPU_CLOCK == 32000000) |
| 12 | 12 | #define XMC_CPU_FREQ xmc::Clock::FREQ_32MHZ |
| 13 | -#elif (CPU_CLOCK == 16000000) | |
| 14 | -#define XMC_CPU_FREQ xmc::Clock::FREQ_16MHZ | |
| 15 | 13 | #else |
| 16 | 14 | #error Unsupported CPU clock |
| 17 | 15 | #endif |
| 18 | 16 | |
| 19 | -#include <dali/slave.hpp> | |
| 17 | +#include <dali/slave_dt8.hpp> | |
| 20 | 18 | |
| 21 | 19 | #include <xmc1200/clock.hpp> |
| 22 | 20 | #include <xmc1200/dali/bus.hpp> |
| ... | ... | @@ -78,7 +76,7 @@ int main(void) { |
| 78 | 76 | |
| 79 | 77 | dali::xmc::Memory* daliMemory1 = dali::xmc::Memory::getInstance(); |
| 80 | 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 | 81 | daliTimer->schedule(&gPowerOnTimerTask, 600, 0); |
| 84 | 82 | ... | ... |