borg_hw_lolshield.c: counter intervals now calculated entirely at
compile time, saving 154 bytes
This commit is contained in:
parent
79704e9b3f
commit
e97eeecc0a
|
@ -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__) || \
|
||||
|
|
Loading…
Reference in New Issue