You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
4.2 KiB

use std::vec::Vec;
use std::string::String;
struct Sevensegment {
segments: Vec<bool>,
}
impl Sevensegment {
pub fn new() -> Sevensegment {
Sevensegment {
segments: [false, false, false, false, false, false, false, false].to_vec(),
}
}
// --a--
// | |
// f b
// | |
// --g--
// | |
// e c
// | |
// --d-- h
pub fn encode(&mut self, val: char) {
self.segments = match val {
'0' => [true, true, true, true, true, true, false, false].to_vec(),
'1' => [false, true, true, false, false, false, false, false].to_vec(),
'2' => [true, true, false, true, true, false, true, false].to_vec(),
'3' => [true, true, true, true, false, false, true, false].to_vec(),
'4' => [false, true, true, false, false, true, true, false].to_vec(),
'5' => [true, false, true, true, false, true, true, false].to_vec(),
'6' => [true, false, true, true, true, true, true, false].to_vec(),
'7' => [true, true, true, false, false, false, false, false].to_vec(),
'8' => [true, true, true, true, true, true, true, false].to_vec(),
'9' => [true, true, true, true, false, true, true, false].to_vec(),
'a'|'A' => [true, true, true, false, true, true, true, false].to_vec(),
'b'|'B' => [false, false, true, true, true, true, true, false].to_vec(),
'c'|'C' => [true, false, false, true, true, true, false, false].to_vec(),
'd'|'D' => [false, true, true, true, true, false, true, false].to_vec(),
'e'|'E' => [true, false, false, true, true, true, true, false].to_vec(),
'f'|'F' => [true, false, false, false, true, true, true, false].to_vec(),
'h'|'H' => [false, true, true, false, true, true, true, false].to_vec(),
'i'|'I' => [false, false, true, false, false, false, false, false].to_vec(),
'j'|'J' => [false, true, true, true, false, false, false, false].to_vec(),
'l'|'L' => [false, false, false, true, true, true, false, false].to_vec(),
'n'|'N' => [false, false, true, false, true, false, true, false].to_vec(),
'o'|'O' => [false, false, true, true, true, false, true, false].to_vec(),
'p'|'P' => [true, true, false, false, true, true, true, false].to_vec(),
't'|'T' => [false, false, false, true, true, true, true, false].to_vec(),
'u'|'U' => [false, false, true, true, true, false, false, false].to_vec(),
'y'|'Y' => [false, true, true, true, false, true, true, false].to_vec(),
_ => [false, false, false, false, false, false, false, false].to_vec(),
};
}
pub fn set_segment(&mut self, index: usize, val: bool) {
if index < self.segments.len() {
self.segments[index] = val;
} else {
panic!("index out of bounds!");
}
}
pub fn get_segment(&self, index: usize) -> bool {
if index < self.segments.len() {
self.segments[index]
} else {
panic!("index out of bounds!")
}
}
}
pub struct Encodestate {
current: Sevensegment,
next: Sevensegment,
}
impl Encodestate {
pub fn new() -> Encodestate {
Encodestate {
current: Sevensegment::new(),
next: Sevensegment::new(),
}
}
pub fn encode_next_char(&mut self, c: char) -> Vec<String> {
let mut instructions:Vec<String> = Vec::new();
self.next.encode(c);
for i in 0 .. 8 {
if self.current.get_segment(i) != self.next.get_segment(i) {
let mut text = String::new();
text.push_str("set ");
text.push(std::char::from_u32(('0' as u32) + i as u32).unwrap());
text.push(' ');
text.push_str(match self.next.get_segment(i) {
true => "0",
false => "1",
});
self.current.set_segment(i, self.next.get_segment(i));
instructions.push(text);
}
}
instructions.push(String::from("show"));
instructions
}
}