door5/main.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 {}
}