hd44780/
hosts.rs

1
2use std::fs::OpenOptions;
3use std::fs::File;
4use std::io::{Write, Error};
5
6pub enum Mode {
7    Command,
8    Data
9}
10
11/// A host device the HD44780 is connected to.
12pub 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}