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
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
|
|
}
|
|
}
|
|
|
|
|