Tie fan into config (both ui and fan daemon)

This commit is contained in:
KemoNine 2020-09-05 15:49:49 -04:00
parent 5eab31f093
commit 3ca4b66304
5 changed files with 111 additions and 49 deletions

View File

@ -10,6 +10,7 @@ import (
argonFan "git.sungo.io/sungo/argon/fan" argonFan "git.sungo.io/sungo/argon/fan"
"git.kemonine.info/PiFrame/utils" "git.kemonine.info/PiFrame/utils"
"git.kemonine.info/PiFrame/config"
) )
const ( const (
@ -17,15 +18,19 @@ const (
ADDRESS = 0x1a ADDRESS = 0x1a
) )
const (
POLL_INTERVAL = "30s"
SPEED_TWENTY_FIVE_PERCENT_TEMP = 45.00
SPEED_FIFTY_PERCENT_TEMP = 50.00
SPEED_SEVENTY_FIVE_PERCENT_TEMP = 52.00
SPEED_FULL_TEMP = 55.00
)
func main() { func main() {
// Load the config file
pfConfig, _ := config.LoadConfig()
// Get the various fan related config options as local variables
speedMap := pfConfig.Float64Map(config.CONFIG_KEY_FAN_SPEEDS)
POLL_INTERVAL := pfConfig.String(config.CONFIG_KEY_FAN_POLL_INTERVAL)
SPEED_FULL_TEMP := speedMap[pfConfig.String(config.CONFIG_MAP_KEY_FAN_SPEED_100)]
SPEED_SEVENTY_FIVE_PERCENT_TEMP := speedMap[pfConfig.String(config.CONFIG_MAP_KEY_FAN_SPEED_75)]
SPEED_FIFTY_PERCENT_TEMP := speedMap[pfConfig.String(config.CONFIG_MAP_KEY_FAN_SPEED_50)]
SPEED_TWENTY_FIVE_PERCENT_TEMP := speedMap[pfConfig.String(config.CONFIG_MAP_KEY_FAN_SPEED_25)]
SPEED_MINIMUM := pfConfig.Int(config.CONFIG_KEY_FAN_MIN_SPEED)
// Setup fan and bail if we can't see it // Setup fan and bail if we can't see it
fan, err := argonFan.New(ADDRESS, BUS) fan, err := argonFan.New(ADDRESS, BUS)
if err != nil { if err != nil {
@ -59,26 +64,43 @@ func main() {
gpuTemp := utils.GetGPUTemp() gpuTemp := utils.GetGPUTemp()
if cpuTemp >= SPEED_FULL_TEMP || gpuTemp >= SPEED_FULL_TEMP { if cpuTemp >= SPEED_FULL_TEMP || gpuTemp >= SPEED_FULL_TEMP {
fan.SetSpeed(100) if SPEED_MINIMUM > 100 {
fan.SetSpeed(SPEED_MINIMUM)
} else {
fan.SetSpeed(100)
}
continue continue
} }
if cpuTemp >= SPEED_SEVENTY_FIVE_PERCENT_TEMP || gpuTemp >= SPEED_SEVENTY_FIVE_PERCENT_TEMP { if cpuTemp >= SPEED_SEVENTY_FIVE_PERCENT_TEMP || gpuTemp >= SPEED_SEVENTY_FIVE_PERCENT_TEMP {
fan.SetSpeed(75) if SPEED_MINIMUM > 75 {
fan.SetSpeed(SPEED_MINIMUM)
} else {
fan.SetSpeed(75)
}
continue continue
} }
if cpuTemp >= SPEED_FIFTY_PERCENT_TEMP || gpuTemp >= SPEED_FIFTY_PERCENT_TEMP { if cpuTemp >= SPEED_FIFTY_PERCENT_TEMP || gpuTemp >= SPEED_FIFTY_PERCENT_TEMP {
fan.SetSpeed(50) if SPEED_MINIMUM > 50 {
fan.SetSpeed(SPEED_MINIMUM)
} else {
fan.SetSpeed(50)
}
continue continue
} }
if cpuTemp >= SPEED_TWENTY_FIVE_PERCENT_TEMP || gpuTemp >= SPEED_TWENTY_FIVE_PERCENT_TEMP { if cpuTemp >= SPEED_TWENTY_FIVE_PERCENT_TEMP || gpuTemp >= SPEED_TWENTY_FIVE_PERCENT_TEMP {
fan.SetSpeed(25) if SPEED_MINIMUM > 25 {
fan.SetSpeed(SPEED_MINIMUM)
} else {
fan.SetSpeed(25)
}
continue continue
} }
if cpuTemp < SPEED_TWENTY_FIVE_PERCENT_TEMP || gpuTemp < SPEED_TWENTY_FIVE_PERCENT_TEMP { if cpuTemp < SPEED_TWENTY_FIVE_PERCENT_TEMP || gpuTemp < SPEED_TWENTY_FIVE_PERCENT_TEMP {
fan.SetSpeed(10) fan.SetSpeed(SPEED_MINIMUM)
continue continue
} }
// We should never get here but... // We should never get here but...
// Maxing fan to be on the safe side
fan.SetSpeed(100) fan.SetSpeed(100)
} }
} }

View File

@ -4,7 +4,9 @@ This is the main source code for the custom UI used by PiFrame. This is responsi
## Config ## Config
The GUI will work off a config similar to the following. Use the ```generate config``` option to generate a default configuration in ```/etc/default/pf.toml``` The GUI uses a config similar to the following. To generate a default config, launch the gui and immediatly select the ```Save & Exit``` button. The generated configuration will be at ```/etc/default/pf.toml```.
**Please Note**: The below is a sample and may or may not match the coded defaults. We also do *not* recommend changing values that are not present in the UI unless you are sure of the consequences.
``` ```
@ -18,7 +20,7 @@ slideshow.restartinterval = "7d"
hdmi.off = "*-*-* 00:00:00" hdmi.off = "*-*-* 00:00:00"
hdmi.on = "*-*-* 06:00:00" hdmi.on = "*-*-* 06:00:00"
# Album configuration # Album configuration (DO NOT CHANGE albums.root )
albums.root = "/tank/pictures" albums.root = "/tank/pictures"
albums.selected = ["/", "/KemoNine"] albums.selected = ["/", "/KemoNine"]

View File

@ -6,14 +6,11 @@ import (
"os" "os"
"time" "time"
"github.com/knadh/koanf"
"github.com/knadh/koanf/parsers/toml"
"github.com/knadh/koanf/providers/confmap" "github.com/knadh/koanf/providers/confmap"
"github.com/knadh/koanf/providers/file"
"github.com/knadh/koanf/providers/posflag" "github.com/knadh/koanf/providers/posflag"
flag "github.com/spf13/pflag" flag "github.com/spf13/pflag"
pfconfig "git.kemonine.info/PiFrame/config" "git.kemonine.info/PiFrame/config"
"git.kemonine.info/PiFrame/ui" "git.kemonine.info/PiFrame/ui"
) )
@ -25,37 +22,16 @@ func main() {
os.Exit(0) os.Exit(0)
} }
// Command line flags // Command line flags
f.Bool(pfconfig.CLI_FLAG_CONFIG_ONLY, false, "Only show the config UI, NOT the slideshow") f.Bool(config.CLI_FLAG_CONFIG_ONLY, false, "Only show the config UI, NOT the slideshow")
cliFlag := f.Lookup(pfconfig.CLI_FLAG_CONFIG_ONLY) cliFlag := f.Lookup(config.CLI_FLAG_CONFIG_ONLY)
if cliFlag != nil { if cliFlag != nil {
cliFlag.NoOptDefVal = "true" cliFlag.NoOptDefVal = "true"
} }
// Process command line flags into handler // Process command line flags into handler
f.Parse(os.Args[1:]) f.Parse(os.Args[1:])
// Main config variable // Load the config file
var pfConfig = koanf.New(".") pfConfig, configFileProvider := config.LoadConfig()
// Setup some defaults
pfConfig.Load(confmap.Provider(map[string]interface{}{
pfconfig.CONFIG_KEY_SLIDESHOW_INTERVAL: pfconfig.DEFAULT_SLIDESHOW_INTERVAL,
pfconfig.CONFIG_KEY_SLIDESHOW_RESTART_INTERVAL: pfconfig.DEFAULT_SLIDESHOW_RESTART_INTERVAL,
pfconfig.CONFIG_KEY_HDMI_OFF: pfconfig.DEFAULT_HDMI_OFF,
pfconfig.CONFIG_KEY_HDMI_ON: pfconfig.DEFAULT_HDMI_ON,
pfconfig.CONFIG_KEY_ALBUMS_ROOT: pfconfig.DEFAULT_ALBUMS_ROOT,
pfconfig.CONFIG_KEY_ALBUMS_SELECTED: []string{pfconfig.DEFAULT_ALBUM_SELECTED},
}, "."), nil)
// Bring in /etc/defaults/pf.toml if it exists
configFileProvider := file.Provider(pfconfig.CONFIG_FILE_PATH)
_, err := os.Stat(pfconfig.CONFIG_FILE_PATH)
if os.IsNotExist(err) {
//log.Printf("%s does not exist, USING DEFAULTS", ui.CONFIG_FILE_PATH)
} else {
if errConfigFile := pfConfig.Load(configFileProvider, toml.Parser()); errConfigFile != nil {
log.Fatalf("Error loading config : %s", err)
}
}
// Watch for config changes and re-load config if needed // Watch for config changes and re-load config if needed
configFileProvider.Watch(func(event interface{}, err error) { configFileProvider.Watch(func(event interface{}, err error) {
@ -76,14 +52,16 @@ func main() {
log.Fatalf("Error loading command line flags : %s", err) log.Fatalf("Error loading command line flags : %s", err)
} }
if !pfConfig.Bool(pfconfig.CLI_FLAG_CONFIG_ONLY) { hideSlideshow := pfConfig.Bool(config.CLI_FLAG_CONFIG_ONLY)
ui.Slideshow(pfConfig)
}
// Reset the CLI flag so it's never writted to the config as 'true' // Reset the CLI flag so it's never writted to the config as 'true'
pfConfig.Load(confmap.Provider(map[string]interface{}{ pfConfig.Load(confmap.Provider(map[string]interface{}{
pfconfig.CLI_FLAG_CONFIG_ONLY: false, config.CLI_FLAG_CONFIG_ONLY: false,
}, "."), nil) }, "."), nil)
if !hideSlideshow {
ui.Slideshow(pfConfig)
}
ui.ConfigGui(pfConfig) ui.ConfigGui(pfConfig)
} }

42
config/config.go Normal file
View File

@ -0,0 +1,42 @@
package config
import (
"log"
"os"
"github.com/knadh/koanf"
"github.com/knadh/koanf/parsers/toml"
"github.com/knadh/koanf/providers/confmap"
kfile "github.com/knadh/koanf/providers/file"
)
func LoadConfig() (*koanf.Koanf, *kfile.File) {
// Main config variable
var pfConfig = koanf.New(".")
// Setup defaults
pfConfig.Load(confmap.Provider(map[string]interface{}{
CONFIG_KEY_SLIDESHOW_INTERVAL: DEFAULT_SLIDESHOW_INTERVAL,
CONFIG_KEY_SLIDESHOW_RESTART_INTERVAL: DEFAULT_SLIDESHOW_RESTART_INTERVAL,
CONFIG_KEY_HDMI_OFF: DEFAULT_HDMI_OFF,
CONFIG_KEY_HDMI_ON: DEFAULT_HDMI_ON,
CONFIG_KEY_ALBUMS_ROOT: DEFAULT_ALBUMS_ROOT,
CONFIG_KEY_ALBUMS_SELECTED: DEFAULT_ALBUM_SELECTED,
CONFIG_KEY_FAN_POLL_INTERVAL: DEFAULT_FAN_POLL_INTERVAL,
CONFIG_KEY_FAN_SPEEDS: DEFAULT_FAN_SPEEDS,
CONFIG_KEY_FAN_MIN_SPEED: DEFAULT_FAN_MIN_SPEED,
}, "."), nil)
// Bring in /etc/defaults/pf.toml if it exists
configFileProvider := kfile.Provider(CONFIG_FILE_PATH)
_, err := os.Stat(CONFIG_FILE_PATH)
if os.IsNotExist(err) {
//log.Printf("%s does not exist, USING DEFAULTS", ui.CONFIG_FILE_PATH)
} else {
if errConfigFile := pfConfig.Load(configFileProvider, toml.Parser()); errConfigFile != nil {
log.Fatalf("Error loading config : %s", err)
}
}
return pfConfig, configFileProvider
}

View File

@ -13,6 +13,13 @@ const (
CONFIG_KEY_HDMI_ON = "hdmi.on" CONFIG_KEY_HDMI_ON = "hdmi.on"
CONFIG_KEY_ALBUMS_ROOT = "albums.root" CONFIG_KEY_ALBUMS_ROOT = "albums.root"
CONFIG_KEY_ALBUMS_SELECTED = "albums.selected" CONFIG_KEY_ALBUMS_SELECTED = "albums.selected"
CONFIG_KEY_FAN_POLL_INTERVAL = "fan.pollinginterval"
CONFIG_KEY_FAN_SPEEDS = "fan.speeds"
CONFIG_KEY_FAN_MIN_SPEED = "fan.minspeed"
CONFIG_MAP_KEY_FAN_SPEED_25 = "25"
CONFIG_MAP_KEY_FAN_SPEED_50 = "50"
CONFIG_MAP_KEY_FAN_SPEED_75 = "75"
CONFIG_MAP_KEY_FAN_SPEED_100 = "100"
) )
const ( const (
@ -21,5 +28,16 @@ const (
DEFAULT_HDMI_OFF = "*-*-* 00:00:00" DEFAULT_HDMI_OFF = "*-*-* 00:00:00"
DEFAULT_HDMI_ON = "*-*-* 06:00:00" DEFAULT_HDMI_ON = "*-*-* 06:00:00"
DEFAULT_ALBUMS_ROOT = "/tank/pictures" DEFAULT_ALBUMS_ROOT = "/tank/pictures"
DEFAULT_ALBUM_SELECTED = "/" DEFAULT_FAN_POLL_INTERVAL = "30s"
DEFAULT_FAN_MIN_SPEED = 10
) )
var DEFAULT_ALBUM_SELECTED = []string{"/"}
// Speed : Temp to activate speed
var DEFAULT_FAN_SPEEDS = map[string]float64{
CONFIG_MAP_KEY_FAN_SPEED_25: 45.00,
CONFIG_MAP_KEY_FAN_SPEED_50: 50.00,
CONFIG_MAP_KEY_FAN_SPEED_75: 52.00,
CONFIG_MAP_KEY_FAN_SPEED_100: 55.00,
}