#[derive(Copy, Clone)]
pub struct LedFont {
char_map: &'static [([u8; 8], char)],
}
impl LedFont {
pub const fn new(char_map: &'static [([u8; 8], char)]) -> Self {
Self { char_map }
}
pub fn get_char(&self, ch: char) -> [u8; 8] {
for &(bitmap, c) in self.char_map {
if c == ch {
return bitmap;
}
}
FONT8X8_UNKNOWN
}
}
pub const STANDARD_LED_FONT: LedFont = LedFont::new(FONT8X8);
pub const FONT8X8_UNKNOWN: [u8; 8] = [
0b00000000, 0b00111100, 0b01000010, 0b00000010, 0b00001100, 0b00000000, 0b00001100, 0b00000000,
];
#[rustfmt::skip]
pub const FONT8X8: &[([u8; 8], char)] = &[
(
[
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
],
' ',
), (
[
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00000000,
0b00011000,
0b00000000,
],
'!',
),
(
[
0b01101100,
0b01101100,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
],
'"',
),
(
[
0b01101100,
0b01101100,
0b11111110,
0b01101100,
0b11111110,
0b01101100,
0b01101100,
0b00000000,
],
'#',
),
(
[
0b00011000,
0b00111110,
0b01100000,
0b00111100,
0b00000110,
0b01111100,
0b00011000,
0b00000000,
],
'$',
),
(
[
0b01100010,
0b01100100,
0b00001000,
0b00010000,
0b00100000,
0b01000110,
0b10000110,
0b00000000,
],
'%',
),
(
[
0b00111000,
0b01101100,
0b00111000,
0b01110110,
0b11011100,
0b11001100,
0b01110110,
0b00000000,
],
'&',
),
(
[
0b00011000,
0b00011000,
0b00010000,
0b00100000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
],
'\'',
),
(
[
0b00001100,
0b00011000,
0b00110000,
0b00110000,
0b00110000,
0b00011000,
0b00001100,
0b00000000,
],
'(',
),
(
[
0b00110000,
0b00011000,
0b00001100,
0b00001100,
0b00001100,
0b00011000,
0b00110000,
0b00000000,
],
')',
),
(
[
0b00000000,
0b01100110,
0b00111100,
0b01111110,
0b00111100,
0b01100110,
0b00000000,
0b00000000,
],
'*',
),
(
[
0b00000000,
0b00011000,
0b00011000,
0b01111110,
0b00011000,
0b00011000,
0b00000000,
0b00000000,
],
'+',
),
(
[
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00011000,
0b00011000,
0b00010000,
0b00100000,
],
',',
),
(
[
0b00000000,
0b00000000,
0b00000000,
0b01111110,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
],
'-',
),
(
[
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00011000,
0b00011000,
0b00000000,
],
'.',
),
(
[
0b00000010,
0b00000110,
0b00001100,
0b00011000,
0b00110000,
0b01100000,
0b01000000,
0b00000000,
],
'/',
),
(
[
0b00111100,
0b01100110,
0b01101110,
0b01110110,
0b01100110,
0b01100110,
0b00111100,
0b00000000,
],
'0',
),
(
[
0b00011000,
0b00111000,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b01111110,
0b00000000,
],
'1',
),
(
[
0b00111100,
0b01100110,
0b00000110,
0b00001100,
0b00110000,
0b01100000,
0b01111110,
0b00000000,
],
'2',
),
(
[
0b00111100,
0b01100110,
0b00000110,
0b00011100,
0b00000110,
0b01100110,
0b00111100,
0b00000000,
],
'3',
),
(
[
0b00001100,
0b00011100,
0b00111100,
0b01101100,
0b01111110,
0b00001100,
0b00011110,
0b00000000,
],
'4',
),
(
[
0b01111110,
0b01100000,
0b01111100,
0b00000110,
0b00000110,
0b01100110,
0b00111100,
0b00000000,
],
'5',
),
(
[
0b00111100,
0b01100110,
0b01100000,
0b01111100,
0b01100110,
0b01100110,
0b00111100,
0b00000000,
],
'6',
),
(
[
0b01111110,
0b01100110,
0b00000110,
0b00001100,
0b00011000,
0b00011000,
0b00011000,
0b00000000,
],
'7',
),
(
[
0b00111100,
0b01100110,
0b01100110,
0b00111100,
0b01100110,
0b01100110,
0b00111100,
0b00000000,
],
'8',
),
(
[
0b00111100,
0b01100110,
0b01100110,
0b00111110,
0b00000110,
0b01100110,
0b00111100,
0b00000000,
],
'9',
),
(
[
0b00000000,
0b00011000,
0b00011000,
0b00000000,
0b00011000,
0b00011000,
0b00000000,
0b00000000,
],
':',
),
(
[
0b00000000,
0b00011000,
0b00011000,
0b00000000,
0b00011000,
0b00010000,
0b00100000,
0b00000000,
],
';',
),
(
[
0b00000110,
0b00001100,
0b00011000,
0b00110000,
0b00011000,
0b00001100,
0b00000110,
0b00000000,
],
'<',
),
(
[
0b00000000,
0b00000000,
0b01111110,
0b00000000,
0b01111110,
0b00000000,
0b00000000,
0b00000000,
],
'=',
),
(
[
0b01100000,
0b00110000,
0b00011000,
0b00001100,
0b00011000,
0b00110000,
0b01100000,
0b00000000,
],
'>',
),
(
[
0b00111100,
0b01100110,
0b00000110,
0b00001100,
0b00011000,
0b00000000,
0b00011000,
0b00000000,
],
'?',
),
(
[
0b01111100,
0b11001100,
0b11011110,
0b11011110,
0b11011110,
0b11000000,
0b01111100,
0b00000000,
],
'@',
),
(
[
0b00011000,
0b00111100,
0b01100110,
0b01100110,
0b01111110,
0b01100110,
0b01100110,
0b00000000,
],
'A',
),
(
[
0b01111100,
0b00110010,
0b00110010,
0b00111100,
0b00110010,
0b00110010,
0b01111100,
0b00000000,
],
'B',
),
(
[
0b00011100,
0b00100010,
0b01000000,
0b01000000,
0b01000000,
0b00100010,
0b00011100,
0b00000000,
],
'C',
),
(
[
0b01111000,
0b00110100,
0b00110010,
0b00110010,
0b00110010,
0b00110100,
0b01111000,
0b00000000,
],
'D',
),
(
[
0b01111110,
0b00100000,
0b00100000,
0b00111100,
0b00100000,
0b00100000,
0b01111110,
0b00000000,
],
'E',
),
(
[
0b01111110,
0b00110000,
0b00100000,
0b00111100,
0b00100000,
0b00100000,
0b01110000,
0b00000000,
],
'F',
),
(
[
0b00011100,
0b00100010,
0b01000000,
0b01001110,
0b01000010,
0b00100010,
0b00011100,
0b00000000,
],
'G',
),
(
[
0b01100110,
0b01100110,
0b01100110,
0b01111110,
0b01100110,
0b01100110,
0b01100110,
0b00000000,
],
'H',
),
(
[
0b00111100,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00111100,
0b00000000,
],
'I',
),
(
[
0b00011110,
0b00001100,
0b00001100,
0b00001100,
0b00001100,
0b01101100,
0b00111000,
0b00000000,
],
'J',
),
(
[
0b01100011,
0b01100110,
0b01101100,
0b01111000,
0b01101100,
0b01100110,
0b01100011,
0b00000000,
],
'K',
),
(
[
0b01110000,
0b00100000,
0b00100000,
0b00100000,
0b00100000,
0b00110000,
0b01111110,
0b00000000,
],
'L',
),
(
[
0b01100011,
0b01110111,
0b01111111,
0b01101011,
0b01100011,
0b01100011,
0b01100011,
0b00000000,
],
'M',
),
(
[
0b01100011,
0b01110011,
0b01111011,
0b01101111,
0b01100111,
0b01100011,
0b01100011,
0b00000000,
],
'N',
),
(
[
0b00011000,
0b00100100,
0b01000010,
0b01000010,
0b01000010,
0b00100100,
0b00011000,
0b00000000,
],
'O',
),
(
[
0b01111100,
0b00110010,
0b00110010,
0b00111100,
0b00100000,
0b00100000,
0b01110000,
0b00000000,
],
'P',
),
(
[
0b00011000,
0b00100100,
0b01000010,
0b01000010,
0b01001010,
0b00100100,
0b00011010,
0b00000000,
],
'Q',
),
(
[
0b01111100,
0b00110010,
0b00110010,
0b00111100,
0b00110100,
0b00110110,
0b01100110,
0b00000000,
],
'R',
),
(
[
0b00111100,
0b01100010,
0b01100000,
0b00111100,
0b00000110,
0b01000110,
0b00111100,
0b00000000,
],
'S',
),
(
[
0b01111110,
0b01011010,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00111100,
0b00000000,
],
'T',
),
(
[
0b01100110,
0b01100110,
0b01100110,
0b01100110,
0b01100110,
0b01100110,
0b00111100,
0b00000000,
],
'U',
),
(
[
0b01100110,
0b01100110,
0b01100110,
0b01100110,
0b00111100,
0b00011000,
0b00011000,
0b00000000,
],
'V',
),
(
[
0b01100011,
0b01100011,
0b01100011,
0b01101011,
0b01111111,
0b01110111,
0b01100011,
0b00000000,
],
'W',
),
(
[
0b01100011,
0b00110110,
0b00011100,
0b00001000,
0b00011100,
0b00110110,
0b01100011,
0b00000000,
],
'X',
),
(
[
0b01100011,
0b00110110,
0b00011100,
0b00001000,
0b00001000,
0b00001000,
0b00011100,
0b00000000,
],
'Y',
),
(
[
0b01111110,
0b00000110,
0b00001100,
0b00011000,
0b00110000,
0b01100000,
0b01111110,
0b00000000,
],
'Z',
),
(
[
0b00011100,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00011100,
0b00000000,
],
'[',
),
(
[
0b11000000,
0b01100000,
0b00110000,
0b00011000,
0b00001100,
0b00000110,
0b00000011,
0b00000001,
],
'\\',
),
(
[
0b00111000,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00111000,
0b00000000,
],
']',
),
(
[
0b00010000,
0b00111000,
0b01101100,
0b11000110,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
],
'^',
),
(
[
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b11111111,
],
'_',
),
(
[
0b00010000,
0b00001000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
],
'`',
),
(
[
0b00000000,
0b00000000,
0b01111000,
0b00001100,
0b01111100,
0b11001100,
0b01110110,
0b00000000,
],
'a',
),
(
[
0b11100000,
0b01100000,
0b01100000,
0b01111100,
0b01100110,
0b01100110,
0b11011100,
0b00000000,
],
'b',
),
(
[
0b00000000,
0b00000000,
0b01111000,
0b11001100,
0b11000000,
0b11001100,
0b01111000,
0b00000000,
],
'c',
),
(
[
0b00011110,
0b00001100,
0b00001100,
0b01111100,
0b11001100,
0b11001100,
0b01110110,
0b00000000,
],
'd',
),
(
[
0b00000000,
0b00000000,
0b01111000,
0b11001100,
0b11111100,
0b11000000,
0b01111000,
0b00000000,
],
'e',
),
(
[
0b00011100,
0b00110000,
0b00110000,
0b01111100,
0b00110000,
0b00110000,
0b00110000,
0b00000000,
],
'f',
),
(
[
0b00000000,
0b00000000,
0b01110110,
0b11001100,
0b11001100,
0b01111100,
0b00001100,
0b11111000,
],
'g',
),
(
[
0b11100000,
0b01100000,
0b01101100,
0b01110110,
0b01100110,
0b01100110,
0b11100110,
0b00000000,
],
'h',
),
(
[
0b00110000,
0b00000000,
0b01110000,
0b00110000,
0b00110000,
0b00110000,
0b01111000,
0b00000000,
],
'i',
),
(
[
0b00000110,
0b00000000,
0b00000110,
0b00000110,
0b00000110,
0b01100110,
0b00111100,
0b00000000,
],
'j',
),
(
[
0b11100000,
0b01100000,
0b01101100,
0b01101100,
0b01111000,
0b01101100,
0b11100110,
0b00000000,
],
'k',
),
(
[
0b01110000,
0b00110000,
0b00110000,
0b00110000,
0b00110000,
0b00110000,
0b01111000,
0b00000000,
],
'l',
),
(
[
0b00000000,
0b00000000,
0b01101100,
0b11111110,
0b11011010,
0b11011010,
0b11011010,
0b00000000,
],
'm',
),
(
[
0b00000000,
0b00000000,
0b11110000,
0b11001100,
0b11001100,
0b11001100,
0b11001100,
0b00000000,
],
'n',
),
(
[
0b00000000,
0b00000000,
0b01111000,
0b11001100,
0b11001100,
0b11001100,
0b01111000,
0b00000000,
],
'o',
),
(
[
0b00000000,
0b00000000,
0b11011100,
0b01100110,
0b01100110,
0b01111100,
0b01100000,
0b11110000,
],
'p',
),
(
[
0b00000000,
0b00000000,
0b01110110,
0b11001100,
0b11001100,
0b01111100,
0b00001100,
0b00011110,
],
'q',
),
(
[
0b00000000,
0b00000000,
0b11011100,
0b01110110,
0b01100110,
0b01100000,
0b11110000,
0b00000000,
],
'r',
),
(
[
0b00000000,
0b00000000,
0b00111100,
0b01100000,
0b00111100,
0b00000110,
0b01111100,
0b00000000,
],
's',
),
(
[
0b00010000,
0b00010000,
0b01111100,
0b00010000,
0b00010000,
0b00010000,
0b00001100,
0b00000000,
],
't',
),
(
[
0b00000000,
0b00000000,
0b11001100,
0b11001100,
0b11001100,
0b11001100,
0b01110110,
0b00000000,
],
'u',
),
(
[
0b00000000,
0b00000000,
0b11001100,
0b11001100,
0b11001100,
0b01111000,
0b00110000,
0b00000000,
],
'v',
),
(
[
0b00000000,
0b00000000,
0b11011010,
0b11011010,
0b11011010,
0b11111110,
0b01101100,
0b00000000,
],
'w',
),
(
[
0b00000000,
0b00000000,
0b11001100,
0b01111000,
0b00110000,
0b01111000,
0b11001100,
0b00000000,
],
'x',
),
(
[
0b00000000,
0b00000000,
0b11001100,
0b11001100,
0b11001100,
0b01111100,
0b00001100,
0b11110000,
],
'y',
),
(
[
0b00000000,
0b00000000,
0b11111100,
0b10011000,
0b00110000,
0b01100100,
0b11111100,
0b00000000,
],
'z',
),
(
[
0b00001100,
0b00011000,
0b00011000,
0b01110000,
0b00011000,
0b00011000,
0b00001100,
0b00000000,
],
'{',
),
(
[
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b00000000,
],
'|',
),
(
[
0b00110000,
0b00011000,
0b00011000,
0b00001110,
0b00011000,
0b00011000,
0b00110000,
0b00000000,
],
'}',
),
(
[
0b01110110,
0b11011100,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
],
'~',
),
];
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_font() {
const TEST_FONT_DATA: &[([u8; 8], char)] = &[
(
[
0b00111100, 0b01100110, 0b01101110, 0b01110110, 0b01100110, 0b01100110,
0b00111100, 0b00000000,
],
'0',
),
(
[
0b00011000, 0b00111000, 0b00011000, 0b00011000, 0b00011000, 0b00011000,
0b01111110, 0b00000000,
],
'1',
),
];
let font = LedFont::new(TEST_FONT_DATA);
assert_eq!(font.char_map, TEST_FONT_DATA);
}
#[test]
fn test_get_char_existing() {
let bitmap_0 = STANDARD_LED_FONT.get_char('0');
let expected_0 = [
0b00111100, 0b01100110, 0b01101110, 0b01110110, 0b01100110, 0b01100110, 0b00111100,
0b00000000,
];
assert_eq!(bitmap_0, expected_0);
let bitmap_a = STANDARD_LED_FONT.get_char('A');
let expected_a = [
0b00011000, 0b00111100, 0b01100110, 0b01100110, 0b01111110, 0b01100110, 0b01100110,
0b00000000,
];
assert_eq!(bitmap_a, expected_a);
}
#[test]
fn test_get_char_missing() {
let bitmap_unknown = STANDARD_LED_FONT.get_char('€');
assert_eq!(bitmap_unknown, FONT8X8_UNKNOWN);
}
#[test]
fn test_get_char_case_sensitivity() {
let bitmap_upper_a = STANDARD_LED_FONT.get_char('A');
let bitmap_lower_a = STANDARD_LED_FONT.get_char('a');
assert_ne!(bitmap_upper_a, bitmap_lower_a);
let expected_upper_a = [
0b00011000, 0b00111100, 0b01100110, 0b01100110, 0b01111110, 0b01100110, 0b01100110,
0b00000000,
];
let expected_lower_a = [
0b00000000, 0b00000000, 0b01111000, 0b00001100, 0b01111100, 0b11001100, 0b01110110,
0b00000000,
];
assert_eq!(bitmap_upper_a, expected_upper_a);
assert_eq!(bitmap_lower_a, expected_lower_a);
}
#[test]
fn test_special_characters() {
let space_bitmap = STANDARD_LED_FONT.get_char(' ');
let expected_space = [
0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000,
0b00000000,
];
assert_eq!(space_bitmap, expected_space);
let exclamation_bitmap = STANDARD_LED_FONT.get_char('!');
let expected_exclamation = [
0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00000000, 0b00011000,
0b00000000,
];
assert_eq!(exclamation_bitmap, expected_exclamation);
}
}