1
2use std::fs::OpenOptions;
3use std::fs::File;
4use std::io::{Write, Error};
5
6pub enum Mode {
7 Command,
8 Data
9}
10
11pub trait HD44780Host {
13 fn init(&mut self) -> Result<(), Error>;
14 fn rs(&mut self, mode: Mode) -> ();
15 fn enable(&mut self, b: bool) -> ();
16 fn data4(&mut self, b: bool) -> ();
17 fn data5(&mut self, b: bool) -> ();
18 fn data6(&mut self, b: bool) -> ();
19 fn data7(&mut self, b: bool) -> ();
20}
21
22pub struct RaspberryPiBPlus {
23 rs: Option<File>,
24 enable: Option<File>,
25 data4: Option<File>,
26 data5: Option<File>,
27 data6: Option<File>,
28 data7: Option<File>
29}
30
31impl RaspberryPiBPlus {
32 pub fn new() -> RaspberryPiBPlus {
33 return RaspberryPiBPlus{rs: None, enable: None,
34 data4: None, data5: None, data6: None, data7: None};
35 }
36}
37
38fn io(file_opt: &mut Option<File>, b: bool) {
39 let out = if b { b"1"} else {b"0"};
40 match *file_opt {
41 Some(ref mut file) => {
42 file.write_all(out).unwrap();
43 file.flush().unwrap();
44 ()
45 },
46 None => println!("some io not writable")
47 }
48 return;
49}
50
51impl HD44780Host for RaspberryPiBPlus {
52
53 fn init(&mut self) -> Result<(), Error> {
54 let mut o = OpenOptions::new();
55 let fso = o.write(true);
56 self.rs = Some(try!(fso.open("/sys/class/gpio/gpio7/value")));
57 self.enable = Some(try!(fso.open("/sys/class/gpio/gpio8/value")));
58 self.data4 = Some(try!(fso.open("/sys/class/gpio/gpio25/value")));
59 self.data5 = Some(try!(fso.open("/sys/class/gpio/gpio24/value")));
60 self.data6 = Some(try!(fso.open("/sys/class/gpio/gpio23/value")));
61 self.data7 = Some(try!(fso.open("/sys/class/gpio/gpio18/value")));
62 return Ok(());
63 }
64 fn rs(&mut self, mode: Mode) -> () {
65 match mode {
66 Mode::Command => io(&mut self.rs, false),
67 Mode::Data => io(&mut self.rs, true)
68 }
69 }
70 fn enable(&mut self, b: bool) -> () {
71 io(&mut self.enable, b);
72 }
73 fn data4(&mut self, b: bool) -> () {
74 io(&mut self.data4, b);
75 }
76 fn data5(&mut self, b: bool) -> () {
77 io(&mut self.data5, b);
78 }
79 fn data6(&mut self, b: bool) -> () {
80 io(&mut self.data6, b);
81 }
82 fn data7(&mut self, b: bool) -> () {
83 io(&mut self.data7, b);
84 }
85}