use crate::mappings::{DigitBits, UpsideDownDigitBits};
pub fn i16_to_4digits(n: i16) -> [u8; 4] {
let mut bytes: [u8; 4] = [0; 4];
let mut m: i16 = n.clamp(-999, 9999).abs();
for position in (0..4).rev() {
bytes[position as usize] = DigitBits::from_digit((m % 10) as u8) as u8;
m /= 10;
if m == 0 {
if n < 0 {
bytes[position as usize - 1] = 0b01000000; }
break;
};
}
bytes
}
pub fn i32_to_6digits(n: i32) -> [u8; 6] {
let mut b: [u8; 6] = [0; 6];
let mut m: i32 = n.clamp(-99999, 999999).abs();
for position in (0..6).rev() {
b[position as usize] = DigitBits::from_digit((m % 10) as u8) as u8;
m /= 10;
if m == 0 {
if !n.is_positive() {
b[position as usize - 1] = 0b01000000; }
break;
};
}
[b[2], b[1], b[0], b[5], b[4], b[3]]
}
pub fn celsius_to_4digits(n: i8) -> [u8; 4] {
let mut m: i8 = n.clamp(-9, 99);
let mut b: [u8; 4] = [0, 0, 0x63, 0x39];
for position in (0..2).rev() {
b[position as usize] = DigitBits::from_digit((m.abs() % 10) as u8) as u8;
m /= 10;
if m == 0 {
if !n.is_positive() {
b[position as usize - 1] = 0b01000000; }
break;
};
}
b
}
pub fn degrees_to_4digits(n: i16) -> [u8; 4] {
let mut m: i16 = n.clamp(-99, 999);
let mut b: [u8; 4] = [0, 0, 0, 0x63];
for position in (0..3).rev() {
b[position as usize] = DigitBits::from_digit((m.abs() % 10) as u8) as u8;
m /= 10;
if m == 0 {
if !n.is_positive() {
b[position as usize - 1] = 0b01000000; }
break;
};
}
b
}
pub fn clock_to_4digits(hour: u8, minute: u8, colon: bool) -> [u8; 4] {
let mut b: [u8; 4] = [0, 0, 0, 0];
if hour >= 10 {
b[0] = DigitBits::from_digit(hour / 10) as u8;
}
b[1] = DigitBits::from_digit(hour % 10) as u8;
if colon {
b[1] |= 0b1000_0000
}
b[2] = DigitBits::from_digit(minute / 10) as u8;
b[3] = DigitBits::from_digit(minute % 10) as u8;
b
}
pub fn i16_to_upside_down_4digits(n: i16) -> [u8; 4] {
let mut bytes: [u8; 4] = [0; 4];
let mut m: i16 = n.clamp(-999, 9999).abs();
for position in 0..4 {
bytes[position as usize] = UpsideDownDigitBits::from_digit((m % 10) as u8) as u8;
m /= 10;
if m == 0 {
if !n.is_positive() {
bytes[position as usize + 1] = 0b01000000; }
break;
};
}
bytes
}
pub fn f32_to_6digits(n: f32, decimals: u8) -> [u8; 6] {
use ::core::ops::Mul;
let mut b: [u8; 6] = [0; 6];
let decimal_position = 5 - decimals;
let mut m: i32 = ((n.mul(10i32.pow(decimals as u32) as f32)
+ if n.is_sign_positive() {
0.5_f32
} else {
-0.5_f32
}) as i32)
.clamp(-99999, 999999)
.abs();
for position in (0..6).rev() {
b[position as usize] = DigitBits::from_digit((m % 10) as u8) as u8;
m /= 10;
if position == decimal_position {
b[position as usize] |= 0b1000_0000;
}
if m == 0 && position <= decimal_position {
if !n.is_sign_positive() {
b[position as usize - 1] = 0b01000000; }
break;
};
}
[b[2], b[1], b[0], b[5], b[4], b[3]]
}