main.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "log"
  6. "os"
  7. "os/exec"
  8. "path/filepath"
  9. "runtime"
  10. "strconv"
  11. "strings"
  12. "syscall"
  13. //"encoding/json"
  14. "github.com/veandco/go-sdl2/sdl"
  15. gotime "time"
  16. //"github.com/go-ini/ini"
  17. "github.com/cuu/gogame"
  18. "github.com/cuu/gogame/display"
  19. "github.com/cuu/gogame/event"
  20. // "github.com/cuu/gogame/color"
  21. "github.com/cuu/gogame/font"
  22. //"github.com/cuu/gogame/time"
  23. "github.com/clockworkpi/LauncherGoDev/sysgo"
  24. "github.com/clockworkpi/LauncherGoDev/sysgo/UI"
  25. )
  26. var (
  27. flash_led1_counter = 0
  28. last_brt = -1
  29. passout_time_stage = 0
  30. led1_proc_file = "/proc/driver/led1"
  31. everytime_keydown = gotime.Now()
  32. sound_patch *UI.SoundPatch
  33. )
  34. // flash the Led1 on the GS back
  35. func FlashLed1(main_screen *UI.MainScreen) {
  36. for {
  37. if UI.FileExists(led1_proc_file) {
  38. if main_screen.Closed == false {
  39. if flash_led1_counter > 0 {
  40. d := []byte(fmt.Sprintf("%d", 0))
  41. err := ioutil.WriteFile(led1_proc_file, d, 0644) // turn off led1
  42. if err != nil {
  43. fmt.Println(err)
  44. }
  45. flash_led1_counter = 0
  46. }
  47. } else {
  48. flash_led1_counter += 1
  49. if flash_led1_counter == 3 {
  50. d := []byte(fmt.Sprintf("%d", 1))
  51. err := ioutil.WriteFile(led1_proc_file, d, 0644)
  52. if err != nil {
  53. fmt.Println(err)
  54. }
  55. }
  56. if flash_led1_counter == 5 {
  57. d := []byte(fmt.Sprintf("%d", 0))
  58. err := ioutil.WriteFile(led1_proc_file, d, 0644)
  59. if err != nil {
  60. fmt.Println(err)
  61. }
  62. }
  63. if flash_led1_counter == 11 {
  64. flash_led1_counter = 1
  65. }
  66. }
  67. }
  68. gotime.Sleep(200 * gotime.Millisecond)
  69. }
  70. }
  71. //happens everytime when KeyDown occurs
  72. func RestoreLastBackLightBrightness(main_screen *UI.MainScreen) bool {
  73. passout_time_stage = 0
  74. main_screen.TitleBar.InLowBackLight = -1
  75. main_screen.Closed = false
  76. if last_brt == -1 {
  77. return true
  78. }
  79. if UI.FileExists(sysgo.BackLight) {
  80. lines, err := UI.ReadLines(sysgo.BackLight)
  81. if err == nil {
  82. brt, err2 := strconv.Atoi(strings.Trim(lines[0], "\r\n "))
  83. if err2 == nil {
  84. if brt < last_brt {
  85. d := []byte(fmt.Sprintf("%d", last_brt))
  86. ioutil.WriteFile(sysgo.BackLight, d, 0644)
  87. last_brt = -1
  88. }
  89. }
  90. } else {
  91. fmt.Println(err)
  92. }
  93. } else {
  94. }
  95. if UI.FileExists(led1_proc_file) {
  96. d := []byte(fmt.Sprintf("%d", 0))
  97. err := ioutil.WriteFile(led1_proc_file, d, 0644)
  98. if err != nil {
  99. fmt.Println(err)
  100. }
  101. }
  102. //Stop CounterScreen here
  103. if main_screen.CounterScreen.Counting == true {
  104. main_screen.CounterScreen.StopCounter()
  105. main_screen.Refresh()
  106. return false
  107. }
  108. return true
  109. }
  110. //power stuff dealer
  111. func InspectionTeam(main_screen *UI.MainScreen) {
  112. for {
  113. cur_time := gotime.Now()
  114. elapsed := cur_time.Sub(everytime_keydown)
  115. time1 := sysgo.PowerLevels[sysgo.CurPowerLevel].Dim
  116. time2 := sysgo.PowerLevels[sysgo.CurPowerLevel].Close
  117. time3 := sysgo.PowerLevels[sysgo.CurPowerLevel].PowerOff
  118. if elapsed > gotime.Duration(time1)*gotime.Second && passout_time_stage == 0 {
  119. fmt.Println("timeout, dim screen ", elapsed)
  120. if main_screen.TitleBar.InLowBackLight >= 0 {
  121. everytime_keydown = cur_time
  122. continue
  123. }
  124. if UI.FileExists(sysgo.BackLight) {
  125. lines, err := UI.ReadLines(sysgo.BackLight)
  126. if err == nil {
  127. brt, err2 := strconv.Atoi(strings.Trim(lines[0], "\r\n "))
  128. if err2 == nil {
  129. if brt > 0 {
  130. if last_brt < 0 {
  131. last_brt = brt
  132. }
  133. d := []byte(fmt.Sprintf("%d", 1)) // lowest backlight
  134. ioutil.WriteFile(sysgo.BackLight, d, 0644)
  135. }
  136. }
  137. }
  138. main_screen.TitleBar.InLowBackLight = 0
  139. if time2 != 0 {
  140. passout_time_stage = 1 // next
  141. }
  142. }
  143. everytime_keydown = cur_time
  144. } else if elapsed > gotime.Duration(time2)*gotime.Second && passout_time_stage == 1 {
  145. fmt.Println("timeout, close screen ", elapsed)
  146. if main_screen.Closed == true {
  147. everytime_keydown = cur_time
  148. continue
  149. }
  150. if UI.FileExists(sysgo.BackLight) {
  151. d := []byte(fmt.Sprintf("%d", 0))
  152. ioutil.WriteFile(sysgo.BackLight, d, 0644)
  153. }
  154. main_screen.TitleBar.InLowBackLight = 0
  155. main_screen.Closed = true
  156. if time3 != 0 {
  157. passout_time_stage = 2 // next
  158. }
  159. everytime_keydown = cur_time
  160. } else if elapsed > gotime.Duration(time3)*gotime.Second && passout_time_stage == 2 {
  161. fmt.Println("Power Off counting down")
  162. if UI.FileExists(sysgo.BackLight) { //hdmi does not have BackLight dev node
  163. d := []byte(fmt.Sprintf("%d", last_brt))
  164. ioutil.WriteFile(sysgo.BackLight, d, 0644)
  165. main_screen.CounterScreen.Draw()
  166. main_screen.CounterScreen.SwapAndShow()
  167. main_screen.CounterScreen.StartCounter()
  168. }
  169. main_screen.TitleBar.InLowBackLight = 0
  170. passout_time_stage = 4
  171. }
  172. gotime.Sleep(gotime.Duration(UI.DT) * gotime.Millisecond)
  173. }
  174. }
  175. //If not under awesomeWM, AutoRedraw improves the experience of gsnotify
  176. //awesomeWM can hold individual window's content from being polluted without redrawing
  177. func AutoRedraw(main_screen *UI.MainScreen) {
  178. for {
  179. if main_screen.TitleBar.InLowBackLight < 0 {
  180. UI.DisplayFlip()
  181. }
  182. gotime.Sleep(650 * gotime.Millisecond)
  183. }
  184. }
  185. func PreparationInAdv() {
  186. if strings.Contains(runtime.GOARCH, "arm") == false {
  187. return
  188. }
  189. if UI.FileExists("sysgo/.powerlevel") == false {
  190. UI.System("touch sysgo/.powerlevel")
  191. UI.System(fmt.Sprintf("sudo iw %s set power_save off >/dev/null", sysgo.WifiDev))
  192. } else {
  193. b, err := ioutil.ReadFile("sysgo/.powerlevel")
  194. if err != nil {
  195. log.Fatal(err)
  196. }
  197. pwl := strings.Trim(string(b), "\r\n ")
  198. if pwl != "" {
  199. sysgo.CurPowerLevel = pwl
  200. if pwl == "supersaving" {
  201. UI.System(fmt.Sprintf("sudo iw %s set power_save on >/dev/null", sysgo.WifiDev))
  202. } else {
  203. UI.System(fmt.Sprintf("sudo iw %s set power_save off >/dev/null", sysgo.WifiDev))
  204. }
  205. } else {
  206. UI.System(fmt.Sprintf("sudo iw %s set power_save off >/dev/null", sysgo.WifiDev))
  207. }
  208. }
  209. }
  210. func release_self_fds() {
  211. fds_flags := []string{ ".ttf",".layout"}
  212. file_paths, err := filepath.Glob("/proc/self/fd/*")
  213. if err != nil {
  214. fmt.Println("release_self_fds error", err)
  215. return
  216. }
  217. ret := make(map[string]string)
  218. path := ""
  219. for _, v := range file_paths {
  220. path, err = os.Readlink(v)
  221. if err == nil {
  222. ret[v] = path
  223. }
  224. }
  225. for k, v := range ret {
  226. for _, f := range fds_flags {
  227. if strings.Contains(v, f) {
  228. id, _ := strconv.Atoi(filepath.Base(k))
  229. //fmt.Println("closing ",id)
  230. err = syscall.Close(id)
  231. if err != nil {
  232. fmt.Println("syscall.CLose err ", err)
  233. }
  234. }
  235. }
  236. }
  237. }
  238. func run() int {
  239. display.Init()
  240. font.Init()
  241. screen := display.SetMode(int32(UI.Width), int32(UI.Height), 0, 32)
  242. UI.Init()
  243. PreparationInAdv()
  244. main_screen := UI.NewMainScreen()
  245. main_screen.HWND = screen
  246. main_screen.Init()
  247. title_bar := UI.NewTitleBar()
  248. foot_bar := UI.NewFootBar()
  249. title_bar.Init(main_screen)
  250. foot_bar.Init(main_screen)
  251. main_screen.TitleBar = title_bar
  252. main_screen.FootBar = foot_bar
  253. ReadTheDirIntoPages(main_screen, "Menu", 0, nil)
  254. ReadTheDirIntoPages(main_screen, "/home/cpi/apps/Menu", 1, main_screen.Pages[len(main_screen.Pages)-1])
  255. ReunionPagesIcons(main_screen)
  256. main_screen.FartherPages()
  257. sound_patch = UI.NewSoundPatch()
  258. sound_patch.Parent = main_screen
  259. sound_patch.Init()
  260. main_screen.Refresh()
  261. //fmt.Println(main_screen)
  262. event.AllocEvents(5)
  263. event.AddCustomEvent(UI.RUNEVT)
  264. event.AddCustomEvent(UI.RUNSH)
  265. event.AddCustomEvent(UI.RUNSYS)
  266. event.AddCustomEvent(UI.RESTARTUI)
  267. event.AddCustomEvent(UI.POWEROPT)
  268. go FlashLed1(main_screen)
  269. go InspectionTeam(main_screen)
  270. go main_screen.TitleBar.RoundRobinCheck()
  271. //go AutoRedraw(main_screen)
  272. running := true
  273. for running {
  274. peeped := event.Peep(true,sdl.KEYDOWN,sdl.KEYUP)
  275. if peeped > 1 {
  276. fmt.Println("event Peeped: ",peeped)
  277. event.Clear(sdl.KEYDOWN)
  278. event.Clear(sdl.KEYUP)
  279. continue
  280. }
  281. ev := event.Poll()
  282. //fmt.Println(ev.Data["Repeat"]) //0 or "" ,1
  283. if ev.Type == event.QUIT {
  284. running = false
  285. break
  286. }
  287. if ev.Type == event.USEREVENT {
  288. fmt.Println("UserEvent: ", ev.Data["Msg"])
  289. switch ev.Code {
  290. case UI.RUNEVT:
  291. main_screen.OnExitCb()
  292. gogame.Quit()
  293. fmt.Println("RUNEVT")
  294. endpos := len(ev.Data["Msg"])
  295. space_break_pos := endpos
  296. for i := 0; i < endpos; i++ {
  297. if i > 6 && string(ev.Data["Msg"][i]) == "/" && string(ev.Data["Msg"][i-1]) == " " {
  298. space_break_pos = i - 1
  299. break
  300. }
  301. }
  302. exec_app_cmd := "cd " + filepath.Dir(ev.Data["Msg"][:space_break_pos]) + ";"
  303. exec_app_cmd += ev.Data["Msg"]
  304. exec_app_cmd += "; sync & cd " + UI.GetExePath() + "; " + os.Args[0] + ">/tmp/x.log;"
  305. fmt.Println(exec_app_cmd)
  306. release_self_fds()
  307. cmd := exec.Command("/bin/sh", "-c", exec_app_cmd)
  308. err := cmd.Start()
  309. if err != nil {
  310. fmt.Println(err)
  311. }
  312. err = cmd.Process.Release()
  313. if err != nil {
  314. fmt.Println(err)
  315. }
  316. os.Exit(0)
  317. case UI.RUNSYS:
  318. main_screen.OnExitCb()
  319. gogame.Quit()
  320. release_self_fds()
  321. exec_app_cmd := ev.Data["Msg"]
  322. cmd := exec.Command("/bin/sh", "-c", exec_app_cmd)
  323. err := cmd.Start()
  324. if err != nil {
  325. fmt.Println(err)
  326. }
  327. err = cmd.Process.Release()
  328. if err != nil {
  329. fmt.Println(err)
  330. }
  331. os.Exit(0)
  332. case UI.RUNSH:
  333. main_screen.OnExitCb()
  334. gogame.Quit()
  335. fmt.Println("RUNSH")
  336. exec_app_cmd := ev.Data["Msg"] + ";"
  337. fmt.Println(exec_app_cmd)
  338. release_self_fds()
  339. cmd := exec.Command("/bin/sh", "-c", exec_app_cmd)
  340. err := cmd.Start()
  341. if err != nil {
  342. fmt.Println(err)
  343. }
  344. err = cmd.Process.Release()
  345. if err != nil {
  346. fmt.Println(err)
  347. }
  348. os.Exit(0)
  349. case UI.RESTARTUI:
  350. main_screen.OnExitCb()
  351. gogame.Quit()
  352. exec_app_cmd := " sync & cd " + UI.GetExePath() + "; " + os.Args[0] + ";"
  353. fmt.Println(exec_app_cmd)
  354. release_self_fds()
  355. cmd := exec.Command("/bin/sh", "-c", exec_app_cmd)
  356. err := cmd.Start()
  357. if err != nil {
  358. fmt.Println(err)
  359. }
  360. err = cmd.Process.Release()
  361. if err != nil {
  362. fmt.Println(err)
  363. }
  364. os.Exit(0)
  365. case UI.POWEROPT:
  366. everytime_keydown = gotime.Now()
  367. }
  368. }
  369. if ev.Type == event.KEYDOWN {
  370. everytime_keydown = gotime.Now()
  371. if RestoreLastBackLightBrightness(main_screen) == false {
  372. continue
  373. }
  374. if ev.Data["Key"] == "Q" {
  375. main_screen.OnExitCb()
  376. return 0
  377. }
  378. if ev.Data["Key"] == "Keypad +" {
  379. if main_screen.CurPage().GetName() != "Sound volume" {
  380. main_screen.Draw()
  381. sound_patch.VolumeUp()
  382. sound_patch.Draw()
  383. main_screen.SwapAndShow()
  384. }
  385. continue
  386. }
  387. if ev.Data["Key"] == "Keypad -" {
  388. if main_screen.CurPage().GetName() != "Sound volume" {
  389. main_screen.Draw()
  390. sound_patch.VolumeDown()
  391. sound_patch.Draw()
  392. main_screen.SwapAndShow()
  393. }
  394. continue
  395. }
  396. main_screen.KeyDown(ev)
  397. main_screen.LastKeyDown = everytime_keydown
  398. }
  399. gotime.Sleep(50 * gotime.Millisecond)
  400. }
  401. return 0
  402. }
  403. func main() {
  404. var exitcode int
  405. defer gogame.Quit()
  406. //runtime.GOMAXPROCS(1)
  407. os.Setenv("SDL_VIDEO_CENTERED", "1")
  408. gogame.AsyncStart(func() {
  409. exitcode = run()
  410. })
  411. os.Exit(exitcode)
  412. }