From df15190e33a44421393d0c3a73d3cbeed9044db3 Mon Sep 17 00:00:00 2001 From: Karan Misra Date: Sat, 22 Mar 2014 09:08:23 +0530 Subject: [PATCH] separate file for digitalPin --- digitalpin.go | 124 +++++++++++++++++++++++++++++++++++++++++++++++++ gpiogeneric.go | 118 ---------------------------------------------- 2 files changed, 124 insertions(+), 118 deletions(-) create mode 100644 digitalpin.go diff --git a/digitalpin.go b/digitalpin.go new file mode 100644 index 0000000..72d287f --- /dev/null +++ b/digitalpin.go @@ -0,0 +1,124 @@ +package embd + +import ( + "errors" + "fmt" + "os" + "path" +) + +type digitalPin struct { + n int + + dir *os.File + val *os.File + activeLow *os.File + edge *os.File +} + +func newDigitalPin(n int) (*digitalPin, error) { + p := &digitalPin{n: n} + if err := p.init(); err != nil { + return nil, err + } + return p, nil +} + +func (p *digitalPin) init() error { + var err error + if p.dir, err = p.directionFile(); err != nil { + return err + } + if p.val, err = p.valueFile(); err != nil { + return err + } + if p.activeLow, err = p.activeLowFile(); err != nil { + return err + } + + return nil +} + +func (p *digitalPin) basePath() string { + return fmt.Sprintf("/sys/class/gpio/gpio%v", p.n) +} + +func (p *digitalPin) openFile(path string) (*os.File, error) { + return os.OpenFile(path, os.O_RDWR, os.ModeExclusive) +} + +func (p *digitalPin) directionFile() (*os.File, error) { + return p.openFile(path.Join(p.basePath(), "direction")) +} + +func (p *digitalPin) valueFile() (*os.File, error) { + return p.openFile(path.Join(p.basePath(), "value")) +} + +func (p *digitalPin) activeLowFile() (*os.File, error) { + return p.openFile(path.Join(p.basePath(), "active_low")) +} + +func (p *digitalPin) SetDirection(dir Direction) error { + str := "in" + if dir == Out { + str = "out" + } + _, err := p.dir.WriteString(str) + return err +} + +func (p *digitalPin) Read() (int, error) { + buf := make([]byte, 1) + if _, err := p.val.Read(buf); err != nil { + return 0, err + } + var val int + if buf[0] == '1' { + val = 1 + } + return val, nil +} + +func (p *digitalPin) Write(val int) error { + str := "0" + if val == High { + str = "1" + } + _, err := p.val.WriteString(str) + return err +} + +func (p *digitalPin) ActiveLow(b bool) error { + str := "0" + if b { + str = "1" + } + _, err := p.activeLow.WriteString(str) + return err +} + +func (p *digitalPin) PullUp() error { + return errors.New("not implemented") +} + +func (p *digitalPin) PullDown() error { + return errors.New("not implemented") +} + +func (p *digitalPin) Close() error { + if err := p.dir.Close(); err != nil { + return err + } + if err := p.val.Close(); err != nil { + return err + } + if err := p.activeLow.Close(); err != nil { + return err + } + if err := p.edge.Close(); err != nil { + return err + } + + return nil +} diff --git a/gpiogeneric.go b/gpiogeneric.go index 0e32b94..3f5406b 100644 --- a/gpiogeneric.go +++ b/gpiogeneric.go @@ -1,10 +1,8 @@ package embd import ( - "errors" "fmt" "os" - "path" "strconv" "github.com/golang/glog" @@ -153,119 +151,3 @@ func (io *gpioDriver) Close() error { return nil } - -type digitalPin struct { - n int - - dir *os.File - val *os.File - activeLow *os.File - edge *os.File -} - -func newDigitalPin(n int) (*digitalPin, error) { - p := &digitalPin{n: n} - if err := p.init(); err != nil { - return nil, err - } - return p, nil -} - -func (p *digitalPin) init() error { - var err error - if p.dir, err = p.directionFile(); err != nil { - return err - } - if p.val, err = p.valueFile(); err != nil { - return err - } - if p.activeLow, err = p.activeLowFile(); err != nil { - return err - } - - return nil -} - -func (p *digitalPin) basePath() string { - return fmt.Sprintf("/sys/class/gpio/gpio%v", p.n) -} - -func (p *digitalPin) openFile(path string) (*os.File, error) { - return os.OpenFile(path, os.O_RDWR, os.ModeExclusive) -} - -func (p *digitalPin) directionFile() (*os.File, error) { - return p.openFile(path.Join(p.basePath(), "direction")) -} - -func (p *digitalPin) valueFile() (*os.File, error) { - return p.openFile(path.Join(p.basePath(), "value")) -} - -func (p *digitalPin) activeLowFile() (*os.File, error) { - return p.openFile(path.Join(p.basePath(), "active_low")) -} - -func (p *digitalPin) SetDirection(dir Direction) error { - str := "in" - if dir == Out { - str = "out" - } - _, err := p.dir.WriteString(str) - return err -} - -func (p *digitalPin) Read() (int, error) { - buf := make([]byte, 1) - if _, err := p.val.Read(buf); err != nil { - return 0, err - } - var val int - if buf[0] == '1' { - val = 1 - } - return val, nil -} - -func (p *digitalPin) Write(val int) error { - str := "0" - if val == High { - str = "1" - } - _, err := p.val.WriteString(str) - return err -} - -func (p *digitalPin) ActiveLow(b bool) error { - str := "0" - if b { - str = "1" - } - _, err := p.activeLow.WriteString(str) - return err -} - -func (p *digitalPin) PullUp() error { - return errors.New("not implemented") -} - -func (p *digitalPin) PullDown() error { - return errors.New("not implemented") -} - -func (p *digitalPin) Close() error { - if err := p.dir.Close(); err != nil { - return err - } - if err := p.val.Close(); err != nil { - return err - } - if err := p.activeLow.Close(); err != nil { - return err - } - if err := p.edge.Close(); err != nil { - return err - } - - return nil -}