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 {} }