123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508 |
- package main
- import (
- "fmt"
- "io/ioutil"
- "log"
- "os"
- "os/exec"
- "path/filepath"
- "runtime"
- "strconv"
- "strings"
- "syscall"
- //"encoding/json"
- "github.com/veandco/go-sdl2/sdl"
- gotime "time"
- //"github.com/go-ini/ini"
- "github.com/cuu/gogame"
- "github.com/cuu/gogame/display"
- "github.com/cuu/gogame/event"
- // "github.com/cuu/gogame/color"
- "github.com/cuu/gogame/font"
- "github.com/cuu/gogame/time"
-
- "github.com/clockworkpi/LauncherGoDev/sysgo"
- "github.com/clockworkpi/LauncherGoDev/sysgo/UI"
- )
- var (
- flash_led1_counter = 0
- last_brt = -1
- passout_time_stage = 0
- led1_proc_file = "/proc/driver/led1"
- everytime_keydown = gotime.Now()
- sound_patch *UI.SoundPatch
- )
- // flash the Led1 on the GS back
- func FlashLed1(main_screen *UI.MainScreen) {
- for {
- if UI.FileExists(led1_proc_file) {
- if main_screen.Closed == false {
- if flash_led1_counter > 0 {
- d := []byte(fmt.Sprintf("%d", 0))
- err := ioutil.WriteFile(led1_proc_file, d, 0644) // turn off led1
- if err != nil {
- fmt.Println(err)
- }
- flash_led1_counter = 0
- }
- } else {
- flash_led1_counter += 1
- if flash_led1_counter == 3 {
- d := []byte(fmt.Sprintf("%d", 1))
- err := ioutil.WriteFile(led1_proc_file, d, 0644)
- if err != nil {
- fmt.Println(err)
- }
- }
- if flash_led1_counter == 5 {
- d := []byte(fmt.Sprintf("%d", 0))
- err := ioutil.WriteFile(led1_proc_file, d, 0644)
- if err != nil {
- fmt.Println(err)
- }
- }
- if flash_led1_counter == 11 {
- flash_led1_counter = 1
- }
- }
- }
- gotime.Sleep(200 * gotime.Millisecond)
- }
- }
- //happens everytime when KeyDown occurs
- func RestoreLastBackLightBrightness(main_screen *UI.MainScreen) bool {
- passout_time_stage = 0
- main_screen.TitleBar.InLowBackLight = -1
- main_screen.Closed = false
- if last_brt == -1 {
- return true
- }
- if UI.FileExists(sysgo.BackLight) {
- lines, err := UI.ReadLines(sysgo.BackLight)
- if err == nil {
- brt, err2 := strconv.Atoi(strings.Trim(lines[0], "\r\n "))
- if err2 == nil {
- if brt < last_brt {
- d := []byte(fmt.Sprintf("%d", last_brt))
- ioutil.WriteFile(sysgo.BackLight, d, 0644)
- last_brt = -1
- }
- }
- } else {
- fmt.Println(err)
- }
- } else {
- }
- if UI.FileExists(led1_proc_file) {
- d := []byte(fmt.Sprintf("%d", 0))
- err := ioutil.WriteFile(led1_proc_file, d, 0644)
- if err != nil {
- fmt.Println(err)
- }
- }
- //Stop CounterScreen here
- if main_screen.CounterScreen.Counting == true {
- main_screen.CounterScreen.StopCounter()
- main_screen.Draw()
- main_screen.SwapAndShow()
- return false
- }
- return true
- }
- //power stuff dealer
- func InspectionTeam(main_screen *UI.MainScreen) {
- for {
- cur_time := gotime.Now()
- elapsed := cur_time.Sub(everytime_keydown)
- time1 := sysgo.PowerLevels[sysgo.CurPowerLevel].Dim
- time2 := sysgo.PowerLevels[sysgo.CurPowerLevel].Close
- time3 := sysgo.PowerLevels[sysgo.CurPowerLevel].PowerOff
- if elapsed > gotime.Duration(time1)*gotime.Second && passout_time_stage == 0 {
- fmt.Println("timeout, dim screen ", elapsed)
- if main_screen.TitleBar.InLowBackLight >= 0 {
- everytime_keydown = cur_time
- continue
- }
- if UI.FileExists(sysgo.BackLight) {
- lines, err := UI.ReadLines(sysgo.BackLight)
- if err == nil {
- brt, err2 := strconv.Atoi(strings.Trim(lines[0], "\r\n "))
- if err2 == nil {
- if brt > 0 {
- if last_brt < 0 {
- last_brt = brt
- }
- d := []byte(fmt.Sprintf("%d", 1)) // lowest backlight
- ioutil.WriteFile(sysgo.BackLight, d, 0644)
- }
- }
- }
- main_screen.TitleBar.InLowBackLight = 0
- if time2 != 0 {
- passout_time_stage = 1 // next
- }
- }
- everytime_keydown = cur_time
- } else if elapsed > gotime.Duration(time2)*gotime.Second && passout_time_stage == 1 {
- fmt.Println("timeout, close screen ", elapsed)
- if main_screen.Closed == true {
- everytime_keydown = cur_time
- continue
- }
- if UI.FileExists(sysgo.BackLight) {
- d := []byte(fmt.Sprintf("%d", 0))
- ioutil.WriteFile(sysgo.BackLight, d, 0644)
- }
- main_screen.TitleBar.InLowBackLight = 0
- main_screen.Closed = true
- if time3 != 0 {
- passout_time_stage = 2 // next
- }
- everytime_keydown = cur_time
- } else if elapsed > gotime.Duration(time3)*gotime.Second && passout_time_stage == 2 {
- fmt.Println("Power Off counting down")
- if UI.FileExists(sysgo.BackLight) { //hdmi does not have BackLight dev node
- d := []byte(fmt.Sprintf("%d", last_brt))
- ioutil.WriteFile(sysgo.BackLight, d, 0644)
- main_screen.CounterScreen.Draw()
- main_screen.CounterScreen.SwapAndShow()
- main_screen.CounterScreen.StartCounter()
- }
- main_screen.TitleBar.InLowBackLight = 0
- passout_time_stage = 4
- }
- gotime.Sleep(gotime.Duration(UI.DT) * gotime.Millisecond)
- }
- }
- //If not under awesomeWM, AutoRedraw improves the experience of gsnotify
- //awesomeWM can hold individual window's content from being polluted without redrawing
- func AutoRedraw(main_screen *UI.MainScreen) {
- for {
- if main_screen.TitleBar.InLowBackLight < 0 {
- UI.SwapAndShow()
- }
- gotime.Sleep(650 * gotime.Millisecond)
- }
- }
- func PreparationInAdv() {
- if strings.Contains(runtime.GOARCH, "arm") == false {
- return
- }
- if UI.FileExists("sysgo/.powerlevel") == false {
- UI.System("touch sysgo/.powerlevel")
- UI.System(fmt.Sprintf("sudo iw %s set power_save off >/dev/null", sysgo.WifiDev))
- } else {
- b, err := ioutil.ReadFile("sysgo/.powerlevel")
- if err != nil {
- log.Fatal(err)
- }
- pwl := strings.Trim(string(b), "\r\n ")
- if pwl != "" {
- sysgo.CurPowerLevel = pwl
- if pwl == "supersaving" {
- UI.System(fmt.Sprintf("sudo iw %s set power_save on >/dev/null", sysgo.WifiDev))
- } else {
- UI.System(fmt.Sprintf("sudo iw %s set power_save off >/dev/null", sysgo.WifiDev))
- }
- } else {
- UI.System(fmt.Sprintf("sudo iw %s set power_save off >/dev/null", sysgo.WifiDev))
- }
- }
- }
- func release_self_fds() {
-
- fds_flags := []string{ ".ttf",".layout"}
- file_paths, err := filepath.Glob("/proc/self/fd/*")
- if err != nil {
- fmt.Println("release_self_fds error", err)
- return
- }
- ret := make(map[string]string)
- path := ""
- for _, v := range file_paths {
- path, err = os.Readlink(v)
- if err == nil {
- ret[v] = path
- }
- }
- for k, v := range ret {
- for _, f := range fds_flags {
- if strings.Contains(v, f) {
- id, _ := strconv.Atoi(filepath.Base(k))
- //fmt.Println("closing ",id)
- err = syscall.Close(id)
- if err != nil {
- fmt.Println("syscall.CLose err ", err)
- }
- }
- }
- }
-
- }
- func run() int {
- display.Init()
- font.Init()
- screen := display.SetMode(int32(UI.Width), int32(UI.Height), 0, 32)
- UI.Init()
- PreparationInAdv()
- main_screen := UI.NewMainScreen()
- main_screen.HWND = screen
- main_screen.Init()
- title_bar := UI.NewTitleBar()
- foot_bar := UI.NewFootBar()
- title_bar.Init(main_screen)
- foot_bar.Init(main_screen)
- main_screen.TitleBar = title_bar
- main_screen.FootBar = foot_bar
- ReadTheDirIntoPages(main_screen, "Menu", 0, nil)
- ReadTheDirIntoPages(main_screen, "/home/cpi/apps/Menu", 1, main_screen.Pages[len(main_screen.Pages)-1])
- ReunionPagesIcons(main_screen)
- main_screen.FartherPages()
- sound_patch = UI.NewSoundPatch()
- sound_patch.Parent = main_screen
- sound_patch.Init()
- main_screen.Draw()
- main_screen.SwapAndShow()
- UI.SwapAndShow()
- //fmt.Println(main_screen)
- event.AllocEvents(5)
- event.AddCustomEvent(UI.RUNEVT)
- event.AddCustomEvent(UI.RUNSH)
- event.AddCustomEvent(UI.RUNSYS)
- event.AddCustomEvent(UI.RESTARTUI)
- event.AddCustomEvent(UI.POWEROPT)
- go FlashLed1(main_screen)
- go InspectionTeam(main_screen)
- go main_screen.TitleBar.RoundRobinCheck()
- //go AutoRedraw(main_screen)
- running := true
- for running {
- peeped := event.Peep(true,sdl.KEYDOWN,sdl.KEYUP)
- if peeped > 1 {
- fmt.Println("event Peeped: ",peeped)
- event.Clear(sdl.KEYDOWN)
- event.Clear(sdl.KEYUP)
- continue
- }
- ev := event.Poll()
- //fmt.Println(ev.Data["Repeat"]) //0 or "" ,1
- if ev.Type == event.QUIT {
- running = false
- break
- }
- if ev.Type == event.USEREVENT {
- fmt.Println("UserEvent: ", ev.Data["Msg"])
- switch ev.Code {
- case UI.RUNEVT:
- main_screen.OnExitCb()
- gogame.Quit()
- fmt.Println("RUNEVT")
- endpos := len(ev.Data["Msg"])
- space_break_pos := endpos
- for i := 0; i < endpos; i++ {
- if i > 6 && string(ev.Data["Msg"][i]) == "/" && string(ev.Data["Msg"][i-1]) == " " {
- space_break_pos = i - 1
- break
- }
- }
- exec_app_cmd := "cd " + filepath.Dir(ev.Data["Msg"][:space_break_pos]) + ";"
- exec_app_cmd += ev.Data["Msg"]
- exec_app_cmd += "; sync & cd " + UI.GetExePath() + "; " + os.Args[0] + ">/tmp/x.log;"
- fmt.Println(exec_app_cmd)
- release_self_fds()
- cmd := exec.Command("/bin/sh", "-c", exec_app_cmd)
- err := cmd.Start()
- if err != nil {
- fmt.Println(err)
- }
- err = cmd.Process.Release()
- if err != nil {
- fmt.Println(err)
- }
- os.Exit(0)
- case UI.RUNSYS:
- main_screen.OnExitCb()
- gogame.Quit()
- release_self_fds()
- exec_app_cmd := ev.Data["Msg"]
- cmd := exec.Command("/bin/sh", "-c", exec_app_cmd)
- err := cmd.Start()
- if err != nil {
- fmt.Println(err)
- }
- err = cmd.Process.Release()
- if err != nil {
- fmt.Println(err)
- }
- os.Exit(0)
- case UI.RUNSH:
- main_screen.OnExitCb()
- gogame.Quit()
- fmt.Println("RUNSH")
- exec_app_cmd := ev.Data["Msg"] + ";"
- fmt.Println(exec_app_cmd)
- release_self_fds()
- cmd := exec.Command("/bin/sh", "-c", exec_app_cmd)
- err := cmd.Start()
- if err != nil {
- fmt.Println(err)
- }
- err = cmd.Process.Release()
- if err != nil {
- fmt.Println(err)
- }
- os.Exit(0)
- case UI.RESTARTUI:
- main_screen.OnExitCb()
- gogame.Quit()
- exec_app_cmd := " sync & cd " + UI.GetExePath() + "; " + os.Args[0] + ";"
- fmt.Println(exec_app_cmd)
- release_self_fds()
- cmd := exec.Command("/bin/sh", "-c", exec_app_cmd)
- err := cmd.Start()
- if err != nil {
- fmt.Println(err)
- }
- err = cmd.Process.Release()
- if err != nil {
- fmt.Println(err)
- }
- os.Exit(0)
- case UI.POWEROPT:
- everytime_keydown = gotime.Now()
- }
- }
- if ev.Type == event.KEYDOWN {
-
- everytime_keydown = gotime.Now()
- if RestoreLastBackLightBrightness(main_screen) == false {
- continue
- }
- if ev.Data["Key"] == "Q" {
- main_screen.OnExitCb()
- return 0
- }
- if ev.Data["Key"] == "Keypad +" {
- if main_screen.CurPage().GetName() != "Sound volume" {
- main_screen.Draw()
- sound_patch.VolumeUp()
- sound_patch.Draw()
- main_screen.SwapAndShow()
- }
- continue
- }
- if ev.Data["Key"] == "Keypad -" {
- if main_screen.CurPage().GetName() != "Sound volume" {
- main_screen.Draw()
- sound_patch.VolumeDown()
- sound_patch.Draw()
- main_screen.SwapAndShow()
- }
- continue
- }
- main_screen.KeyDown(ev)
- main_screen.LastKeyDown = everytime_keydown
- }
- //gotime.Sleep(50 * gotime.Millisecond)
- time.SDL_Delay(20)
- }
- return 0
- }
- func main() {
- var exitcode int
- defer gogame.Quit()
- //runtime.GOMAXPROCS(1)
- os.Setenv("SDL_VIDEO_CENTERED", "1")
- exitcode = run()
- os.Exit(exitcode)
- }
|