main.go 11 KB

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