Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 348 → Rev 349

/C-OSD/trunk/max7456_software_spi.c
147,123 → 147,150
}
 
/**
* Write only the last three digits of a <number> at <x>/<y> to MAX7456
* display memory. takes full 16bit numbers as well for stuff
* like compass only taking three characters (values <= 999)
* Write only some digits of a unsigned <number> at <x>/<y> to MAX7456 display memory
* <num> represents the largest multiple of 10 that will still be displayable as
* the first digit, so num = 10 will be 0-99 and so on
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_3digit_number_u(uint8_t x, uint8_t y, uint16_t number) {
uint16_t num = 100;
uint8_t started = 0;
void write_ndigit_number_u(uint8_t x, uint8_t y, uint16_t number, int16_t num, uint8_t pad) {
// if number is largar than 99[..]9 we must decrease it
while (number >= (num * 10)) {
number -= num * 10;
}
 
while (num > 0) {
uint8_t b = number / num;
if (b > 0 || started || num == 1) {
write_ascii_char((x++)+(y * 30), '0' + b);
started = 1;
} else {
write_ascii_char((x++)+(y * 30), 0);
}
number -= b * num;
uint8_t started = 0;
 
num /= 10;
}
while (num > 0) {
uint8_t b = number / num;
if (b > 0 || started || num == 1) {
write_ascii_char((x++)+(y * 30), '0' + b);
started = 1;
} else {
if (pad) write_ascii_char((x++)+(y * 30), '0');
else write_ascii_char((x++)+(y * 30), 0);
}
number -= b * num;
 
num /= 10;
}
}
 
/**
* Write only the last two digits of a number at <x>/<y> to MAX7456
* display memory. takes full 16bit numbers as well for stuff
* like seconds only taking two characters (values <= 99)
* Since this is used for seconds only and it looks better, there
* is a trading 0 attached
* Write only some digits of a signed <number> at <x>/<y> to MAX7456 display memory
* <num> represents the largest multiple of 10 that will still be displayable as
* the first digit, so num = 10 will be 0-99 and so on
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_2digit_number_u(uint8_t x, uint8_t y, uint16_t number) {
uint16_t num = 10;
uint8_t started = 0;
void write_ndigit_number_s(uint8_t x, uint8_t y, int16_t number, int16_t num, uint8_t pad) {
if (((uint16_t) number) > 32767) {
number = number - 65536;
num *= -1;
 
while (num > 0) {
uint8_t b = number / num;
if (b > 0 || started || num == 1) {
write_ascii_char((x++)+(y * 30), '0' + b);
started = 1;
} else {
write_ascii_char((x++)+(y * 30), '0');
}
number -= b * num;
// if number is smaller than -99[..]9 we must increase it
while (number <= (num * 10)) {
number -= num * 10;
}
 
num /= 10;
}
}
uint8_t started = 0;
 
/**
* write a unsigned number as /10th at <x>/<y> to MAX7456 display memory
*/
void write_number_u_10th(uint8_t x, uint8_t y, uint16_t number) {
uint16_t num = 10000;
uint8_t started = 0;
while (num < 0) {
uint8_t b = number / num;
if (pad) write_ascii_char((x)+(y * 30), '0');
if (b > 0 || started || num == 1) {
if (!started) write_char((x - 1)+(y * 30), 0x49);
write_ascii_char((x++)+(y * 30), '0' + b);
started = 1;
} else {
write_ascii_char((x++)+(y * 30), 0);
}
number -= b * num;
 
while (num > 0) {
uint8_t b = number / num;
 
if (b > 0 || started || num == 1) {
if ((num / 10) == 0) write_char((x++)+(y * 30), 65);
write_ascii_char((x++)+(y * 30), '0' + b);
started = 1;
} else {
write_ascii_char((x++)+(y * 30), 0);
}
number -= b * num;
 
num /= 10;
num /= 10;
}
} else {
write_char((x)+(y * 30), 0);
write_ndigit_number_u(x, y, number, num, pad);
}
}
 
/**
* write a unsigned number at <x>/<y> to MAX7456 display memory
* Write only some digits of a unsigned <number> at <x>/<y> to MAX7456 display memory
* as /10th of the value
* <num> represents the largest multiple of 10 that will still be displayable as
* the first digit, so num = 10 will be 0-99 and so on
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_number_u(uint8_t x, uint8_t y, uint16_t number) {
uint16_t num = 10000;
uint8_t started = 0;
void write_ndigit_number_u_10th(uint8_t x, uint8_t y, uint16_t number, int16_t num, uint8_t pad) {
// if number is largar than 99[..]9 we must decrease it
while (number >= (num * 10)) {
number -= num * 10;
}
 
while (num > 0) {
uint8_t b = number / num;
if (b > 0 || started || num == 1) {
write_ascii_char((x++)+(y * 30), '0' + b);
started = 1;
} else {
write_ascii_char((x++)+(y * 30), 0);
}
number -= b * num;
uint8_t started = 0;
while (num > 0) {
uint8_t b = number / num;
if (b > 0 || started || num == 1) {
if ((num / 10) == 0) {
if (!started) write_ascii_char((x - 1)+(y * 30), '0');
write_char((x++)+(y * 30), 65); // decimal point
}
write_ascii_char((x++)+(y * 30), '0' + b);
started = 1;
} else {
if (pad) write_ascii_char((x++)+(y * 30), '0');
else write_ascii_char((x++)+(y * 30), ' ');
}
number -= b * num;
 
num /= 10;
}
num /= 10;
}
}
 
/**
* write a signed number at <x>/<y> to MAX7456 display memory
* Write only some digits of a signed <number> at <x>/<y> to MAX7456 display memory
* as /10th of the value
* <num> represents the largest multiple of 10 that will still be displayable as
* the first digit, so num = 10 will be 0-99 and so on
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_number_s(uint8_t x, uint8_t y, int16_t w) {
if (((uint16_t) w) > 32767) {
w = w - 65536;
void write_ndigit_number_s_10th(uint8_t x, uint8_t y, int16_t number, int16_t num, uint8_t pad) {
if (((uint16_t) number) > 32767) {
number = number - 65536;
num *= -1;
 
int16_t num = -10000;
uint8_t started = 0;
// if number is smaller than -99[..]9 we must increase it
while (number <= (num * 10)) {
number -= num * 10;
}
 
while (num < 0) {
uint8_t b = w / num;
if (b > 0 || started || num == 1) {
if (!started) write_char((x - 1)+(y * 30), 0x49);
write_ascii_char((x++)+(y * 30), '0' + b);
started = 1;
} else {
write_ascii_char((x++)+(y * 30), 0);
}
w -= b * num;
uint8_t started = 0;
 
num /= 10;
}
} else {
while (num < 0) {
uint8_t b = number / num;
if (pad) write_ascii_char((x)+(y * 30), '0');
if (b > 0 || started || num == 1) {
if ((num / 10) == 0) {
if (!started) {
write_ascii_char((x - 2)+(y * 30), '-');
write_ascii_char((x - 1)+(y * 30), '0');
}
write_char((x++)+(y * 30), 65); // decimal point
} else if (!started) {
write_char((x - 1)+(y * 30), 0x49); // minus
}
write_ascii_char((x++)+(y * 30), '0' + b);
started = 1;
} else {
write_ascii_char((x++)+(y * 30), 0);
}
number -= b * num;
 
num /= 10;
}
} else {
write_char((x)+(y * 30), 0);
write_number_u(x, y, w);
write_ndigit_number_u_10th(x, y, number, num, pad);
}
}
 
273,9 → 300,9
void write_time(uint8_t x, uint8_t y, uint16_t seconds) {
uint16_t min = seconds / 60;
seconds -= min * 60;
write_3digit_number_u(x, y, min);
write_ndigit_number_u(x, y, min, 100, 0);
write_char_xy(x + 3, y, 68);
write_2digit_number_u(x + 4, y, seconds);
write_ndigit_number_u(x + 4, y, seconds, 10, 1);
}
 
/**