use std::vec::Vec; use std::string::String; struct Sevensegment { segments: Vec, } 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 { let mut instructions:Vec = 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 } }