115 lines
2.5 KiB
Go
115 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"github.com/davecgh/go-spew/spew"
|
|
"github.com/stianeikeland/go-rpio/v4"
|
|
|
|
"git.tcp.direct/kayos/door5/pkg/assets"
|
|
"git.tcp.direct/kayos/door5/pkg/config"
|
|
"git.tcp.direct/kayos/door5/pkg/logger"
|
|
)
|
|
|
|
var conf *config.Config
|
|
|
|
func OpenDoor() {
|
|
pin := rpio.Pin(conf.Pins[config.Door])
|
|
pin.Output()
|
|
pin.High()
|
|
}
|
|
|
|
func CloseDoor() {
|
|
pin := rpio.Pin(conf.Pins[config.Door])
|
|
pin.Output()
|
|
pin.Low()
|
|
}
|
|
|
|
func watchButton() {
|
|
logger.Get().Logger.Trace().Uint8("pin", uint8(conf.Pins[config.Button])).Msg("exit button daemon started")
|
|
defer logger.Get().Logger.Trace().Msg("exit button daemon stopped")
|
|
pin := rpio.Pin(conf.Pins[config.Button])
|
|
pin.Input()
|
|
pin.PullUp()
|
|
count := 0
|
|
for {
|
|
if pin.Read() != rpio.Low {
|
|
time.Sleep(5 * time.Millisecond)
|
|
if count > 0 {
|
|
count--
|
|
}
|
|
continue
|
|
}
|
|
count++
|
|
if count >= 100 {
|
|
logger.Get().Logger.Info().Int("count", count).Msg("door unlocked")
|
|
OpenDoor()
|
|
time.Sleep(5 * time.Second)
|
|
CloseDoor()
|
|
count = 0
|
|
}
|
|
time.Sleep(5 * time.Millisecond)
|
|
}
|
|
}
|
|
|
|
var DoorOpen bool
|
|
|
|
func watchReed() {
|
|
logger.Get().Logger.Trace().Uint8("pin", uint8(conf.Pins[config.Reed])).Msg("reed switch daemon started")
|
|
defer logger.Get().Logger.Trace().Msg("reed switch daemon stopped")
|
|
pin := rpio.Pin(conf.Pins[config.Reed])
|
|
pin.Input()
|
|
pin.PullUp()
|
|
for {
|
|
switch {
|
|
case pin.Read() == rpio.Low && !DoorOpen:
|
|
logger.Get().Logger.Info().Msg("door opened")
|
|
DoorOpen = true
|
|
go assets.PlayChime()
|
|
case pin.Read() == rpio.High && DoorOpen:
|
|
logger.Get().Logger.Info().Msg("door closed")
|
|
DoorOpen = false
|
|
}
|
|
time.Sleep(100 * time.Millisecond)
|
|
}
|
|
}
|
|
|
|
func loadConfig() {
|
|
var err error
|
|
path, _ := os.UserConfigDir()
|
|
path = filepath.Join(path, "door5", "config.toml")
|
|
if conf, err = config.ReadConfig(path); err != nil {
|
|
logger.Get().Logger.Warn().Err(err).Msg("error reading config")
|
|
logger.Get().Logger.Warn().Msg("writing default config")
|
|
c := &config.Config{
|
|
Pins: config.Pins{
|
|
config.Door: 22,
|
|
config.Button: 5,
|
|
config.Reed: 26,
|
|
},
|
|
}
|
|
if err = c.WriteConfig(path); err != nil {
|
|
println(err.Error())
|
|
}
|
|
conf = c
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
logger.Get().Logger.Info().Msg("starting door5")
|
|
logger.Get().Logger.Trace().Msg("loading config")
|
|
loadConfig()
|
|
logger.Get().Logger.Debug().Msg(spew.Sdump(conf))
|
|
logger.Get().Logger.Info().Msg("initializing gpio")
|
|
if err := rpio.Open(); err != nil {
|
|
logger.Get().Logger.Fatal().Msg(err.Error())
|
|
}
|
|
|
|
go watchButton()
|
|
go watchReed()
|
|
|
|
select {}
|
|
}
|