From e97eeecc0a44f04a1de9818f48047cf234698f35 Mon Sep 17 00:00:00 2001 From: Christian Kroll Date: Thu, 29 May 2014 09:02:02 +0200 Subject: [PATCH] borg_hw_lolshield.c: counter intervals now calculated entirely at compile time, saving 154 bytes --- src/borg_hw/borg_hw_lolshield.c | 128 +++++++++++++++++--------------- 1 file changed, 69 insertions(+), 59 deletions(-) diff --git a/src/borg_hw/borg_hw_lolshield.c b/src/borg_hw/borg_hw_lolshield.c index e7356ac..001b4af 100644 --- a/src/borg_hw/borg_hw_lolshield.c +++ b/src/borg_hw/borg_hw_lolshield.c @@ -125,17 +125,6 @@ unsigned char pixmap[NUMPLANE][NUM_ROWS][LINEBYTES]; # error no support for this chip #endif - -#ifndef BRIGHTNESS -# define BRIGHTNESS 127 /* full brightness by default */ -#elif BRIGHTNESS < 0 || BRIGHTNESS > 127 -# error BRIGHTNESS must be between 0 and 127 -#endif - -#define BRIGHTNESSPERCENT ((BRIGHTNESS * BRIGHTNESS + 8ul) / 16ul) -#define M (TICKS << FASTSCALERSHIFT) * BRIGHTNESSPERCENT /*10b*/ -#define C(x) ((M * (unsigned long)(x * 1024) + (1 << 19)) >> 20) /*10b+10b-20b=0b*/ - #if NUMPLANE < 8 uint8_t const prescaler[NUMPLANE + 1] = { FASTPRESCALER, @@ -163,81 +152,100 @@ uint8_t const prescaler[NUMPLANE + 1] = { uint8_t prescaler[NUMPLANE + 1] = {0}; #endif -uint8_t counts[NUMPLANE + 1] = {0}; +/* adjust brightness in the menuconfig, this is just a fallback */ +#ifndef BRIGHTNESS +# define BRIGHTNESS 127 /* full brightness by default */ +#elif BRIGHTNESS < 0 || BRIGHTNESS > 127 +# error BRIGHTNESS must be between 0 and 127 +#endif +#define BRIGHTNESSPERCENT ((BRIGHTNESS * BRIGHTNESS + 8ul) / 16ul) +#define M (TICKS << FASTSCALERSHIFT) * BRIGHTNESSPERCENT /*10b*/ +#define C(x) ((M * (unsigned long)(x * 1024UL) + (1UL << 19)) >> 20) /*10b+10b-20b=0b*/ + +#define COUNT(u, v) (256 - (((C(v) - C(u)) != 0) ? (C(v) - C(u)) : 1)) +#define LAST_COUNT(u) (256 - (((TICKS - (C(u) >> FASTSCALERSHIFT)) != 0) ? \ + (TICKS - (C(u) >> FASTSCALERSHIFT)) : 1)) + +#if NUMPLANE < 8 +// NOTE: The argumentS of COUNT() are calculated as follows: +// pow((double)x / (double)NUMPLANE, 1.8) with 0 <= x <= NUMPLANE +// Changing the scale of 1.8 invalidates any tables above! +uint8_t const counts[NUMPLANE + 1] = { +# if NUMPLANE == 1 + COUNT(0.000000000000000000000000, 1.000000000000000000000000), +# elif NUMPLANE == 2 + COUNT(0.000000000000000000000000, 0.287174588749258719033719), + COUNT(0.287174588749258719033719, 1.000000000000000000000000), +# elif NUMPLANE == 3 + COUNT(0.000000000000000000000000, 0.138414548846168578011273), + COUNT(0.138414548846168578011273, 0.481987453865643789008288), + COUNT(0.481987453865643789008288, 1.000000000000000000000000), +# elif NUMPLANE == 4 + COUNT(0.000000000000000000000000, 0.082469244423305887448095), + COUNT(0.082469244423305887448095, 0.287174588749258719033719), + COUNT(0.287174588749258719033719, 0.595813410589956848895099), + COUNT(0.595813410589956848895099, 1.000000000000000000000000), +# elif NUMPLANE == 5 + COUNT(0.000000000000000000000000, 0.055189186458448592775827), + COUNT(0.055189186458448592775827, 0.192179909437029006191722), + COUNT(0.192179909437029006191722, 0.398723883569384374148115), + COUNT(0.398723883569384374148115, 0.669209313658414961523135), + COUNT(0.669209313658414961523135, 1.000000000000000000000000), +# elif NUMPLANE == 6 + COUNT(0.000000000000000000000000, 0.039749141141812646682574), + COUNT(0.039749141141812646682574, 0.138414548846168578011273), + COUNT(0.138414548846168578011273, 0.287174588749258719033719), + COUNT(0.287174588749258719033719, 0.481987453865643789008288), + COUNT(0.481987453865643789008288, 0.720234228706005730202833), + COUNT(0.720234228706005730202833, 1.000000000000000000000000), +# elif NUMPLANE == 7 + COUNT(0.000000000000000000000000, 0.030117819624378608378557), + COUNT(0.030117819624378608378557, 0.104876339357015443964904), + COUNT(0.104876339357015443964904, 0.217591430058779483625031), + COUNT(0.217591430058779483625031, 0.365200625214741059210155), + COUNT(0.365200625214741059210155, 0.545719579451565794947498), + COUNT(0.545719579451565794947498, 0.757697368024318751444923), + COUNT(0.757697368024318751444923, 1.000000000000000000000000), +# endif + LAST_COUNT(1.0) +}; +#else +uint8_t counts[NUMPLANE + 1]; +#endif + + +#if NUMPLANE >= 8 /** - * Set the overall brightness of the screen from 0 (off) to 127 (full on). + * Set the overall brightness of the screen from 0 (very dim) to 127 (full on). */ static void setBrightness() { +# warning "NUMPLANE >= 8 links floating point stuff into the image" /* ---- This needs review! Please review. -- thilo */ // set up page counts uint8_t i; - - // NOTE: The argument of C() is calculated as follows: - // pow((double)x / (double)NUMPLANE, 1.8) with 0 <= x <= NUMPLANE - // Changing the scale of 1.8 invalidates any tables above! -#if NUMPLANE < 8 - int const temp_counts[NUMPLANE + 1] = { - 0.000000000000000000000000000, -# if NUMPLANE == 2 - C(0.287174588749258719033719), -# elif NUMPLANE == 3 - C(0.138414548846168578011273), - C(0.481987453865643789008288), -# elif NUMPLANE == 4 - C(0.082469244423305887448095), - C(0.287174588749258719033719), - C(0.595813410589956848895099), -# elif NUMPLANE == 5 - C(0.055189186458448592775827), - C(0.192179909437029006191722), - C(0.398723883569384374148115), - C(0.669209313658414961523135), -# elif NUMPLANE == 6 - C(0.039749141141812646682574), - C(0.138414548846168578011273), - C(0.287174588749258719033719), - C(0.481987453865643789008288), - C(0.720234228706005730202833), -# elif NUMPLANE == 7 - C(0.030117819624378608378557), - C(0.104876339357015443964904), - C(0.217591430058779483625031), - C(0.365200625214741059210155), - C(0.545719579451565794947498), - C(0.757697368024318751444923), -# endif - C(1.000000000000000000000000), - }; -#else -# warning "NUMPLANE >= 8 links floating point stuff into the image" // NOTE: Changing "scale" invalidates any tables above! const float scale = 1.8f; int temp_counts[NUMPLANE + 1] = {0}; - for (i = 1; i < (NUMPLANE + 1); i++) { temp_counts[i] = C(pow(i / (float)(NUMPLANE), scale)); } -#endif // Compute on time for each of the pages // Use the fast timer; slow timer is only useful for < 3 shades. for (i = 0; i < NUMPLANE; i++) { int interval = temp_counts[i + 1] - temp_counts[i]; counts[i] = 256 - (interval ? interval : 1); -#if NUMPLANE >= 8 prescaler[i] = FASTPRESCALER; -#endif } // Compute off time int interval = TICKS - (temp_counts[i] >> FASTSCALERSHIFT); counts[i] = 256 - (interval ? interval : 1); -#if NUMPLANE >= 8 - prescaler[i] = SLOWPRESCALER; -#endif + prescaler[i] = SLOWPRESCALER; } +#endif /** * Distributes the framebuffer content among current cycle pins. @@ -930,7 +938,9 @@ void borg_hw_init() { OCR1A = 256; #endif +#if NUMPLANE >= 8 setBrightness(); +#endif // Then start the display #if defined (__AVR_ATmega48__) || \