From df146d7c0a8f3862e2f4bde0590fa97cf9039c54 Mon Sep 17 00:00:00 2001 From: Sofia Date: Sat, 13 Sep 2025 19:10:45 +0300 Subject: [PATCH] Add formatting for numbers too --- src/font.rs | 130 ++++++++++++++++++++++++++++++++++++++++++++-------- src/main.rs | 20 +++++--- 2 files changed, 123 insertions(+), 27 deletions(-) diff --git a/src/font.rs b/src/font.rs index d0ab594..771f251 100644 --- a/src/font.rs +++ b/src/font.rs @@ -127,6 +127,46 @@ pub static COMMA: [u8; 8] = [ pub static EMPTY: [u8; 8] = [ 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, ]; +#[unsafe(link_section = ".progmem.data")] +pub static NUM_1: [u8; 8] = [ + 0b00011000, 0b00111000, 0b01111000, 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00011000, +]; +#[unsafe(link_section = ".progmem.data")] +pub static NUM_2: [u8; 8] = [ + 0b11111110, 0b11110110, 0b00001100, 0b00011000, 0b00110000, 0b01100000, 0b11111111, 0b11111111, +]; +#[unsafe(link_section = ".progmem.data")] +pub static NUM_3: [u8; 8] = [ + 0b01111110, 0b10000001, 0b00011110, 0b00011110, 0b00000001, 0b10000001, 0b11111111, 0b01111110, +]; +#[unsafe(link_section = ".progmem.data")] +pub static NUM_4: [u8; 8] = [ + 0b11000110, 0b11000110, 0b11000110, 0b11111111, 0b11111110, 0b00000110, 0b00000110, 0b00000110, +]; +#[unsafe(link_section = ".progmem.data")] +pub static NUM_5: [u8; 8] = [ + 0b11111111, 0b11111111, 0b11000000, 0b11111100, 0b00000110, 0b11000011, 0b11111111, 0b01111110, +]; +#[unsafe(link_section = ".progmem.data")] +pub static NUM_6: [u8; 8] = [ + 0b01111110, 0b11000011, 0b11000000, 0b11111110, 0b11000011, 0b11000011, 0b11000011, 0b01111110, +]; +#[unsafe(link_section = ".progmem.data")] +pub static NUM_7: [u8; 8] = [ + 0b11111111, 0b11111111, 0b00000110, 0b00001100, 0b00011000, 0b00110000, 0b01100000, 0b11000000, +]; +#[unsafe(link_section = ".progmem.data")] +pub static NUM_8: [u8; 8] = [ + 0b01111110, 0b11111111, 0b11000011, 0b01111110, 0b11000011, 0b11000011, 0b11111111, 0b01111110, +]; +#[unsafe(link_section = ".progmem.data")] +pub static NUM_9: [u8; 8] = [ + 0b01111110, 0b11000011, 0b11000011, 0b01111111, 0b00000011, 0b11000011, 0b11000011, 0b01111110, +]; +#[unsafe(link_section = ".progmem.data")] +pub static NUM_0: [u8; 8] = [ + 0b01111110, 0b11000111, 0b11001011, 0b11001011, 0b11010011, 0b11010011, 0b11100011, 0b01111110, +]; fn letter(character: char) -> *const [u8; 8] { match character { @@ -156,6 +196,16 @@ fn letter(character: char) -> *const [u8; 8] { 'x' => addr_of!(X), 'y' => addr_of!(Y), 'z' => addr_of!(Z), + '0' => addr_of!(NUM_0), + '1' => addr_of!(NUM_1), + '2' => addr_of!(NUM_2), + '3' => addr_of!(NUM_3), + '4' => addr_of!(NUM_4), + '5' => addr_of!(NUM_5), + '6' => addr_of!(NUM_6), + '7' => addr_of!(NUM_7), + '8' => addr_of!(NUM_8), + '9' => addr_of!(NUM_9), '!' => addr_of!(EXCLAMATION), ',' => addr_of!(COMMA), _ => addr_of!(EMPTY), @@ -167,43 +217,83 @@ pub fn draw_text( text: &str, fg: Rgb565, bg: Rgb565, - position: Vec2, + position: &mut Vec2, scale: u16, ) { - let mut curr_pos = position; - let kerning = 9 * scale; let original_x = position.x; for line in text.split('\n') { for word in line.split(' ') { let word_length = word.len() as u16 * kerning; - if curr_pos.x + word_length > 240 { - curr_pos.x = original_x; - curr_pos.y += kerning; + if position.x + word_length > 240 { + position.x = original_x; + position.y += kerning; } for c in word.chars() { - if curr_pos.x + kerning > 240 { - curr_pos.x = original_x; - curr_pos.y += kerning; - } - if curr_pos.y + kerning > 240 { - curr_pos.y = 0; - } - - Letter::from(c, fg, bg) - .iter() - .draw(display, curr_pos, scale); - curr_pos.x += kerning; + draw_character(display, c, fg, bg, original_x, position, scale); } - curr_pos.x += kerning; + position.x += kerning; } - curr_pos.y += kerning; + position.y += kerning; + position.x = original_x; } } +pub fn draw_character( + display: &mut Display, + character: char, + fg: Rgb565, + bg: Rgb565, + original_x: u16, + position: &mut Vec2, + scale: u16, +) { + let kerning = 9 * scale; + + if position.x + kerning > 240 { + position.x = original_x; + position.y += kerning; + } + if position.y + kerning > 240 { + position.y = 0; + } + + Letter::from(character, fg, bg) + .iter() + .draw(display, *position, scale); + position.x += kerning; +} + +pub fn draw_number( + display: &mut Display, + number: u32, + fg: Rgb565, + bg: Rgb565, + position: &mut Vec2, + scale: u16, +) { + if number > 10 { + draw_number(display, number / 10, fg, bg, position, scale); + } + let character = match number % 10 { + 0 => '0', + 1 => '1', + 2 => '2', + 3 => '3', + 4 => '4', + 5 => '5', + 6 => '6', + 7 => '7', + 8 => '8', + 9 => '9', + _ => 'X', + }; + draw_character(display, character, fg, bg, position.x, position, scale); +} + pub struct Letter { base: [u8; 8], pub fg: Rgb565, diff --git a/src/main.rs b/src/main.rs index 656a178..956b104 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,7 +19,7 @@ use panic_halt as _; use crate::{ display::{Display, Rgb565, Vec2}, - font::{Letter, draw_text}, + font::{Letter, draw_number, draw_text}, graphics::{Image, LARGE_CAT_UNSAFE, PRESS_BTN_UNSAFE, draw_image}, peripherals::Button, }; @@ -82,17 +82,23 @@ fn main() -> ! { let images = [Image::from(addr_of!(LARGE_CAT_UNSAFE))]; let len = images.len(); - ufmt::uwriteln!(serial, "Drawing text").unwrap(); + let mut position = Vec2 { x: 10, y: 10 }; draw_text( &mut display, - "hi,my name is adafruit!nice to meet you!", + "hi,my name is adafruit!nice to meet you!\n", Rgb565::white(), Rgb565::black(), - Vec2 { x: 10, y: 10 }, + &mut position, + 3, + ); + draw_number( + &mut display, + 1234, + Rgb565::white(), + Rgb565::black(), + &mut position, 3, ); - - ufmt::uwriteln!(serial, "Text drawn!").unwrap(); loop { if button.poll() { @@ -111,7 +117,7 @@ fn main() -> ! { "you just lost the game!", Rgb565::white(), Rgb565::black(), - Vec2 { x: 10, y: 10 }, + &mut Vec2 { x: 10, y: 10 }, 3, );