Adjusted the linear led table and hsv_to_rgb to better handle 255 hue (#5739)

* Adjusted the linear led table and hsv_to_rgb to better handle 255 hue

* small math adjustments to better handle specific uint8_t rounding and overflows
This commit is contained in:
XScorpion2 2019-05-01 20:59:01 -05:00 committed by MechMerlin
parent 3235c8527d
commit 12a07dae33
2 changed files with 24 additions and 33 deletions

View File

@ -22,8 +22,8 @@
RGB hsv_to_rgb( HSV hsv ) RGB hsv_to_rgb( HSV hsv )
{ {
RGB rgb; RGB rgb;
uint8_t region, p, q, t; uint8_t region, remainder, p, q, t;
uint16_t h, s, v, remainder; uint16_t h, s, v;
if ( hsv.s == 0 ) if ( hsv.s == 0 )
{ {
@ -37,8 +37,8 @@ RGB hsv_to_rgb( HSV hsv )
s = hsv.s; s = hsv.s;
v = hsv.v; v = hsv.v;
region = h / 43; region = h * 6 / 255;
remainder = (h - (region * 43)) * 6; remainder = (h * 2 - region * 85) * 3;
p = (v * (255 - s)) >> 8; p = (v * (255 - s)) >> 8;
q = (v * (255 - ((s * remainder) >> 8))) >> 8; q = (v * (255 - ((s * remainder) >> 8))) >> 8;
@ -46,6 +46,7 @@ RGB hsv_to_rgb( HSV hsv )
switch ( region ) switch ( region )
{ {
case 6:
case 0: case 0:
rgb.r = v; rgb.r = v;
rgb.g = t; rgb.g = t;

View File

@ -19,38 +19,28 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifdef USE_CIE1931_CURVE #ifdef USE_CIE1931_CURVE
// Lightness curve using the CIE 1931 lightness formula // Lightness curve using the CIE 1931 lightness formula
//Generated by the python script provided in http://jared.geek.nz/2013/feb/linear-led-pwm //Generated by the python script provided in http://jared.geek.nz/2013/feb/linear-led-pwm
const uint8_t CIE1931_CURVE[] PROGMEM = { const uint8_t CIE1931_CURVE[256] PROGMEM = {
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6,
3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11,
5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16,
7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24,
10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 25, 25, 26, 26, 27, 28, 28, 29, 29, 30, 31, 31, 32, 33, 33, 34,
13, 14, 14, 15, 15, 15, 16, 16, 17, 17, 35, 35, 36, 37, 37, 38, 39, 40, 40, 41, 42, 43, 44, 44, 45, 46,
17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 47, 48, 49, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 75, 76, 77, 78,
28, 28, 29, 29, 30, 31, 31, 32, 32, 33, 79, 80, 82, 83, 84, 85, 87, 88, 89, 90, 92, 93, 94, 96, 97, 99,
34, 34, 35, 36, 37, 37, 38, 39, 39, 40, 100, 101, 103, 104, 106, 107, 108, 110, 111, 113, 114, 116, 118, 119, 121, 122,
41, 42, 43, 43, 44, 45, 46, 47, 47, 48, 124, 125, 127, 129, 130, 132, 134, 135, 137, 139, 141, 142, 144, 146, 148, 149,
49, 50, 51, 52, 53, 54, 54, 55, 56, 57, 151, 153, 155, 157, 159, 161, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180,
58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 182, 185, 187, 189, 191, 193, 195, 197, 200, 202, 204, 206, 208, 211, 213, 215,
68, 70, 71, 72, 73, 74, 75, 76, 77, 79, 218, 220, 222, 225, 227, 230, 232, 234, 237, 239, 242, 244, 247, 249, 252, 255
80, 81, 82, 83, 85, 86, 87, 88, 90, 91,
92, 94, 95, 96, 98, 99, 100, 102, 103, 105,
106, 108, 109, 110, 112, 113, 115, 116, 118, 120,
121, 123, 124, 126, 128, 129, 131, 132, 134, 136,
138, 139, 141, 143, 145, 146, 148, 150, 152, 154,
155, 157, 159, 161, 163, 165, 167, 169, 171, 173,
175, 177, 179, 181, 183, 185, 187, 189, 191, 193,
196, 198, 200, 202, 204, 207, 209, 211, 214, 216,
218, 220, 223, 225, 228, 230, 232, 235, 237, 240,
242, 245, 247, 250, 252, 255,
}; };
#endif #endif
#ifdef USE_LED_BREATHING_TABLE #ifdef USE_LED_BREATHING_TABLE
const uint8_t LED_BREATHING_TABLE[] PROGMEM = { const uint8_t LED_BREATHING_TABLE[256] PROGMEM = {
0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 9, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 9,
10, 11, 12, 14, 15, 17, 18, 20, 21, 23, 25, 27, 29, 31, 33, 35, 10, 11, 12, 14, 15, 17, 18, 20, 21, 23, 25, 27, 29, 31, 33, 35,
37, 40, 42, 44, 47, 49, 52, 54, 57, 59, 62, 65, 67, 70, 73, 76, 37, 40, 42, 44, 47, 49, 52, 54, 57, 59, 62, 65, 67, 70, 73, 76,