1
0
Fork 0
mirror of https://github.com/kidoman/embd synced 2025-07-04 20:37:46 +02:00

Initial attempt to implemented GPIO Interrupts

Basicly imported Dave Cheney's code from
http://github.com/davecheney/gpio
This commit is contained in:
SjB 2014-04-08 23:09:21 -04:00
parent 5c0ae1c83a
commit a54e7dc7ff
3 changed files with 154 additions and 4 deletions

View file

@ -28,10 +28,19 @@ type digitalPin struct {
readBuf []byte
initialized bool
epollInitialTrigger bool
callback embd.IRQEvent
}
func NewDigitalPin(pd *embd.PinDesc, drv embd.GPIODriver) embd.DigitalPin {
return &digitalPin{id: pd.ID, n: pd.DigitalLogical, drv: drv, readBuf: make([]byte, 1)}
return &digitalPin{
id: pd.ID,
n: pd.DigitalLogical,
drv: drv,
epollInitialTrigger: true,
readBuf: make([]byte, 1),
}
}
func (p *digitalPin) N() int {
@ -102,6 +111,37 @@ func (p *digitalPin) activeLowFile() (*os.File, error) {
return p.openFile(path.Join(p.basePath(), "active_low"))
}
func (p *digitalPin) setEdge(edge embd.Edge) error {
file, err := p.openFile(path.Join(p.basePath(), "edge"))
if err != nil {
return err
}
defer file.Close()
_, err = file.Write([]byte(edge))
return err
}
func (p *digitalPin) Watch(edge embd.Edge, callback embd.IRQEvent) error {
if err := p.setEdge(edge); err != nil {
return err
}
p.callback = callback
return p.drv.RegisterInterrupt(int(p.val.Fd()), p)
}
func (p *digitalPin) StopWatching() error {
return p.drv.UnregisterInterrupt(int(p.val.Fd()))
}
func (p *digitalPin) Signal() {
if p.epollInitialTrigger {
p.epollInitialTrigger = false
} else {
p.callback(embd.DigitalPin(p))
}
}
func (p *digitalPin) SetDirection(dir embd.Direction) error {
if err := p.init(); err != nil {
return err