Skip to content
This repository has been archived by the owner on Apr 19, 2024. It is now read-only.

Commit

Permalink
Merge pull request #48 from zllovesuki/resilience
Browse files Browse the repository at this point in the history
use oversight for supervisor tree; log to C:\Logs
  • Loading branch information
zllovesuki authored Oct 9, 2020
2 parents 8a8ca62 + 87a115c commit d1feff8
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 94 deletions.
90 changes: 90 additions & 0 deletions controller/cmd.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package controller

import (
"context"
"time"

"github.com/zllovesuki/G14Manager/system/battery"
"github.com/zllovesuki/G14Manager/system/keyboard"
"github.com/zllovesuki/G14Manager/system/persist"
"github.com/zllovesuki/G14Manager/system/power"
"github.com/zllovesuki/G14Manager/system/thermal"
"github.com/zllovesuki/G14Manager/system/volume"
"github.com/zllovesuki/G14Manager/util"
)

const defaultCommandWithArgs = "Taskmgr.exe"

// RunConfig contains the start up configuration for the controller
type RunConfig struct {
RogRemap util.ArrayFlags
EnableExperimental bool
DryRun bool
}

// Run start the controller daemon
func Run(ctx context.Context, conf RunConfig) error {

if len(conf.RogRemap) == 0 {
conf.RogRemap = []string{defaultCommandWithArgs}
}

config, _ := persist.NewRegistryHelper()

powercfg, err := power.NewCfg()
if err != nil {
return err
}

// TODO: allow user to specify profiles
thermalCfg := thermal.Config{
PowerCfg: powercfg,
Profiles: thermal.GetDefaultThermalProfiles(),
}

profile, err := thermal.NewControl(thermalCfg)
if err != nil {
return err
}

// TODO: allow user to change the charge limit
battery, err := battery.NewChargeLimit()
if err != nil {
return err
}

kbCtrl, err := keyboard.NewControl()
if err != nil {
return err
}

volCtrl, err := volume.NewControl()
if err != nil {
return err
}

// order powercfg to last
config.Register(battery)
config.Register(profile)
config.Register(powercfg)
config.Register(kbCtrl)

control, err := NewController(Config{
EnableExperimental: conf.EnableExperimental,
DryRun: conf.DryRun,
VolumeControl: volCtrl,
KeyboardControl: kbCtrl,
Thermal: profile,
Registry: config,
ROGKey: conf.RogRemap,
})

if err != nil {
return err
}

control.Run(ctx)

<-time.After(time.Second)
return nil
}
16 changes: 8 additions & 8 deletions controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import (
"errors"
"fmt"
"log"
"os"
"os/exec"
"runtime"
"syscall"
"time"

Expand Down Expand Up @@ -39,6 +39,7 @@ const (

type Config struct {
EnableExperimental bool
DryRun bool

VolumeControl *volume.Control
KeyboardControl *keyboard.Control
Expand All @@ -64,8 +65,7 @@ type Controller struct {
acpiCh chan uint32
powerEvCh chan uint32

wmi atkacpi.WMI
isDryRun bool
wmi atkacpi.WMI
}

func NewController(conf Config) (*Controller, error) {
Expand Down Expand Up @@ -93,8 +93,6 @@ func NewController(conf Config) (*Controller, error) {
keyCodeCh: make(chan uint32, 1),
acpiCh: make(chan uint32, 1),
powerEvCh: make(chan uint32, 1),

isDryRun: os.Getenv("DRY_RUN") != "",
}, nil
}

Expand Down Expand Up @@ -173,10 +171,10 @@ func (c *Controller) initialize(haltCtx context.Context) {
}
}

// seed the channel so we get the the charger status
c.workQueueCh[fnCheckCharger].noisy <- struct{}{}
// load and apply configurations
c.workQueueCh[fnApplyConfigs].noisy <- struct{}{}
// seed the channel so we get the the charger status
c.workQueueCh[fnCheckCharger].noisy <- struct{}{}
}

func (c *Controller) handleACPINotification(haltCtx context.Context) {
Expand Down Expand Up @@ -315,6 +313,8 @@ func (c *Controller) handleNotify(haltCtx context.Context) {
}

func (c *Controller) handleWorkQueue(haltCtx context.Context) {
runtime.LockOSThread()
defer runtime.UnlockOSThread()
for {
select {
case ev := <-c.workQueueCh[58].clean:
Expand Down Expand Up @@ -357,7 +357,7 @@ func (c *Controller) handleWorkQueue(haltCtx context.Context) {
}

case <-c.workQueueCh[fnPersistConfigs].clean:
if c.isDryRun {
if c.Config.DryRun {
continue
}
if err := c.Config.Registry.Save(); err != nil {
Expand Down
4 changes: 4 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ module github.com/zllovesuki/G14Manager
go 1.14

require (
cirello.io/oversight v1.0.3
github.com/BurntSushi/toml v0.3.1 // indirect
github.com/bi-zone/wmi v1.1.4
github.com/go-ole/go-ole v1.2.4
github.com/karalabe/usb v0.0.0-20191104083709-911d15fe12a9
Expand All @@ -11,5 +13,7 @@ require (
github.com/scjalliance/comshim v0.0.0-20190308082608-cf06d2532c4e
github.com/stretchr/testify v1.6.1
golang.org/x/sys v0.0.0-20200806060901-a37d78b92225
gopkg.in/natefinch/lumberjack.v2 v2.0.0
gopkg.in/toast.v1 v1.0.0-20180812000517-0a84660828b2
gopkg.in/yaml.v2 v2.3.0 // indirect
)
8 changes: 8 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
cirello.io/oversight v1.0.3 h1:EcfL4xF6XfbxWMEMdDuMBoMxFWCODyMm+CQstXQf39g=
cirello.io/oversight v1.0.3/go.mod h1:Rdj5qP4E3yk0/L/gXpElXtYZECfPgPFY+4pBhOmx9vE=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/bi-zone/go-ole v1.2.5 h1:/4G2KrTbq1e3FsMkd40quzwIrLb4QdxZJnUUlG7UjcM=
github.com/bi-zone/go-ole v1.2.5/go.mod h1:BxzT498d9QAq10L6G/pTMscpDzqnpKN6DUBbmFKwyQY=
github.com/bi-zone/wmi v1.1.4 h1:82DmCVK/Qf0MKSvUP52tfoJPsD/LPebHI1gZMN6izG4=
Expand Down Expand Up @@ -30,7 +34,11 @@ golang.org/x/sys v0.0.0-20200806060901-a37d78b92225 h1:a5kp7Ohh+lqGCGHUBQdPwGHTJ
golang.org/x/sys v0.0.0-20200806060901-a37d78b92225/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200820212457-1fb795427249 h1:tKP05IMsVLZ4VeeCEFmrIUmxAAx6UD8IBdPtYlYNa8g=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
gopkg.in/toast.v1 v1.0.0-20180812000517-0a84660828b2 h1:MZF6J7CV6s/h0HBkfqebrYfKCVEo5iN+wzE4QhV3Evo=
gopkg.in/toast.v1 v1.0.0-20180812000517-0a84660828b2/go.mod h1:s1Sn2yZos05Qfs7NKt867Xe18emOmtsO3eAKbDaon0o=
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
112 changes: 27 additions & 85 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,12 @@ import (
"flag"
"log"
"os"
"os/signal"
"syscall"
"time"

"github.com/zllovesuki/G14Manager/controller"
"github.com/zllovesuki/G14Manager/system/battery"
"github.com/zllovesuki/G14Manager/system/keyboard"
"github.com/zllovesuki/G14Manager/system/persist"
"github.com/zllovesuki/G14Manager/system/power"
"github.com/zllovesuki/G14Manager/system/thermal"
"github.com/zllovesuki/G14Manager/system/volume"
"github.com/zllovesuki/G14Manager/util"

"cirello.io/oversight"
"gopkg.in/natefinch/lumberjack.v2"
)

var (
Expand All @@ -27,90 +21,38 @@ var defaultCommandWithArgs = "Taskmgr.exe"

func main() {

var enableExperimental = flag.Bool("experimental", false, "enable experimental features (such as Fn+Left remapping)")
if Version != "dev" {
log.SetOutput(&lumberjack.Logger{
Filename: `C:\Logs\G14Manager.log`,
MaxSize: 5,
MaxBackups: 3,
MaxAge: 7,
Compress: true,
})
}

var rogRemap util.ArrayFlags
flag.Var(&rogRemap, "rog", "customize ROG key behavior when pressed multiple times")
var enableExperimental = flag.Bool("experimental", false, "enable experimental features (such as Fn+Left remapping)")

flag.Parse()

log.Printf("G14Manager version: %s\n", Version)
log.Printf("Experimental enabled: %v\n", *enableExperimental)
if os.Getenv("DRY_RUN") != "" {
log.Printf("[dry run] no hardware i/o will be performed")
}

if len(rogRemap) == 0 {
rogRemap = []string{defaultCommandWithArgs}
}

config, _ := persist.NewRegistryHelper()

powercfg, err := power.NewCfg()
if err != nil {
log.Fatalln(err)
}

// TODO: allow user to specify profiles
thermalCfg := thermal.Config{
PowerCfg: powercfg,
Profiles: thermal.GetDefaultThermalProfiles(),
}

profile, err := thermal.NewControl(thermalCfg)
if err != nil {
log.Fatalln(err)
}

// TODO: allow user to change the charge limit
battery, err := battery.NewChargeLimit()
if err != nil {
log.Fatalln(err)
}

kbCtrl, err := keyboard.NewControl()
if err != nil {
log.Fatalln(err)
}

volCtrl, err := volume.NewControl()
if err != nil {
log.Fatalln(err)
}

// order powercfg to last
config.Register(battery)
config.Register(profile)
config.Register(powercfg)
config.Register(kbCtrl)

control, err := controller.NewController(controller.Config{
EnableExperimental: *enableExperimental,
VolumeControl: volCtrl,
KeyboardControl: kbCtrl,
Thermal: profile,
Registry: config,
ROGKey: rogRemap,
})

if err != nil {
log.Fatalln(err)
}

supervisor := oversight.New(
oversight.WithRestartStrategy(oversight.OneForOne()),
oversight.Processes(func(ctx context.Context) error {
return controller.Run(ctx, controller.RunConfig{
RogRemap: rogRemap,
EnableExperimental: *enableExperimental,
DryRun: os.Getenv("DRY_RUN") != "",
})
}),
)
ctx, cancel := context.WithCancel(context.Background())

sigc := make(chan os.Signal, 1)
signal.Notify(sigc,
syscall.SIGHUP,
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGQUIT)
go func() {
<-sigc
cancel()
time.Sleep(time.Second * 5) // 5 second for grace period
os.Exit(0)
}()

control.Run(ctx)
defer cancel()
if err := supervisor.Start(ctx); err != nil {
log.Fatal(err)
}
}
2 changes: 1 addition & 1 deletion scripts/build.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ $env:CDO_ENABLED = 1

rsrc.exe -arch amd64 -manifest G14Manager.exe.manifest -ico go.ico -o G14Manager.exe.syso

go build -ldflags="-H=windowsgui -s -w" -o "build/G14Manager.exe" .
go build -ldflags="-H=windowsgui -s -w -X 'main.Version=staging'" -o "build/G14Manager.exe" .
go build -gcflags="-N -l" -o "build/G14Manager.debug.exe" .

0 comments on commit d1feff8

Please sign in to comment.