* Fix bit loss in cie_lightness() when doing division. * Use the right types * Format Co-authored-by: zvecr <git@zvecr.com>
This commit is contained in:
parent
23d3ebd78a
commit
84b8cdc1a4
1 changed files with 4 additions and 4 deletions
|
@ -232,19 +232,19 @@ ISR(TIMERx_OVF_vect) {
|
||||||
|
|
||||||
// See http://jared.geek.nz/2013/feb/linear-led-pwm
|
// See http://jared.geek.nz/2013/feb/linear-led-pwm
|
||||||
static uint16_t cie_lightness(uint16_t v) {
|
static uint16_t cie_lightness(uint16_t v) {
|
||||||
if (v <= ICRx / 12) // If the value is less than or equal to ~8% of max
|
if (v <= (uint32_t)ICRx / 12) // If the value is less than or equal to ~8% of max
|
||||||
{
|
{
|
||||||
return v / 9; // Same as dividing by 900%
|
return v / 9; // Same as dividing by 900%
|
||||||
} else {
|
} else {
|
||||||
// In the next two lines values are bit-shifted. This is to avoid loosing decimals in integer math.
|
// In the next two lines values are bit-shifted. This is to avoid loosing decimals in integer math.
|
||||||
uint32_t y = (((uint32_t)v + ICRx / 6) << 5) / (ICRx / 6 + ICRx); // If above 8%, add ~16% of max, and normalize with (max + ~16% max)
|
uint32_t y = (((uint32_t)v + (uint32_t)ICRx / 6) << 5) / ((uint32_t)ICRx / 6 + ICRx); // If above 8%, add ~16% of max, and normalize with (max + ~16% max)
|
||||||
uint32_t out = (y * y * y * ICRx) >> 15; // Cube it and undo the bit-shifting. (which is now three times as much due to the cubing)
|
uint32_t out = (y * y * y * ICRx) >> 15; // Cube it and undo the bit-shifting. (which is now three times as much due to the cubing)
|
||||||
|
|
||||||
if (out > ICRx) // Avoid overflows
|
if (out > ICRx) // Avoid overflows
|
||||||
{
|
{
|
||||||
out = ICRx;
|
out = ICRx;
|
||||||
}
|
}
|
||||||
return out;
|
return (uint16_t)out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue