main.go 11 KB

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