|
|
@ -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 |
|
|
|
|
|
|
|
/**
|
|
|
|
* Set the overall brightness of the screen from 0 (off) to 127 (full on). |
|
|
|
*/ |
|
|
|
static void setBrightness() |
|
|
|
{ |
|
|
|
/* ---- This needs review! Please review. -- thilo */ |
|
|
|
// set up page counts
|
|
|
|
uint8_t i; |
|
|
|
#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)) |
|
|
|
|
|
|
|
// 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), |
|
|
|
// 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 |
|
|
|
C(0.138414548846168578011273), |
|
|
|
C(0.481987453865643789008288), |
|
|
|
COUNT(0.000000000000000000000000, 0.138414548846168578011273), |
|
|
|
COUNT(0.138414548846168578011273, 0.481987453865643789008288), |
|
|
|
COUNT(0.481987453865643789008288, 1.000000000000000000000000), |
|
|
|
# elif NUMPLANE == 4 |
|
|
|
C(0.082469244423305887448095), |
|
|
|
C(0.287174588749258719033719), |
|
|
|
C(0.595813410589956848895099), |
|
|
|
COUNT(0.000000000000000000000000, 0.082469244423305887448095), |
|
|
|
COUNT(0.082469244423305887448095, 0.287174588749258719033719), |
|
|
|
COUNT(0.287174588749258719033719, 0.595813410589956848895099), |
|
|
|
COUNT(0.595813410589956848895099, 1.000000000000000000000000), |
|
|
|
# elif NUMPLANE == 5 |
|
|
|
C(0.055189186458448592775827), |
|
|
|
C(0.192179909437029006191722), |
|
|
|
C(0.398723883569384374148115), |
|
|
|
C(0.669209313658414961523135), |
|
|
|
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 |
|
|
|
C(0.039749141141812646682574), |
|
|
|
C(0.138414548846168578011273), |
|
|
|
C(0.287174588749258719033719), |
|
|
|
C(0.481987453865643789008288), |
|
|
|
C(0.720234228706005730202833), |
|
|
|
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 |
|
|
|
C(0.030117819624378608378557), |
|
|
|
C(0.104876339357015443964904), |
|
|
|
C(0.217591430058779483625031), |
|
|
|
C(0.365200625214741059210155), |
|
|
|
C(0.545719579451565794947498), |
|
|
|
C(0.757697368024318751444923), |
|
|
|
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 |
|
|
|
C(1.000000000000000000000000), |
|
|
|
}; |
|
|
|
LAST_COUNT(1.0) |
|
|
|
}; |
|
|
|
#else |
|
|
|
uint8_t counts[NUMPLANE + 1]; |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if NUMPLANE >= 8 |
|
|
|
/**
|
|
|
|
* 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: 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__) || \ |
|
|
|