main.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  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. "syscall"
  13. //"encoding/json"
  14. gotime "time"
  15. "github.com/veandco/go-sdl2/sdl"
  16. "github.com/cuu/gogame"
  17. "github.com/cuu/gogame/display"
  18. "github.com/cuu/gogame/event"
  19. // "github.com/cuu/gogame/color"
  20. "github.com/cuu/gogame/font"
  21. //"github.com/cuu/gogame/time"
  22. "github.com/clockworkpi/LauncherGoDev/sysgo"
  23. "github.com/clockworkpi/LauncherGoDev/sysgo/UI"
  24. )
  25. var (
  26. flash_led1_counter = 0
  27. last_brt = -1
  28. passout_time_stage = 0
  29. led1_proc_file = "/proc/driver/led1"
  30. everytime_keydown = gotime.Now()
  31. sound_patch *UI.SoundPatch
  32. )
  33. // flash the Led1 on the GS back
  34. func FlashLed1(main_screen *UI.MainScreen) {
  35. for {
  36. if UI.FileExists(led1_proc_file) {
  37. if main_screen.Closed == false {
  38. if flash_led1_counter > 0 {
  39. d := []byte(fmt.Sprintf("%d",0))
  40. err := ioutil.WriteFile(led1_proc_file, d, 0644) // turn off led1
  41. if err != nil {
  42. fmt.Println(err)
  43. }
  44. flash_led1_counter = 0
  45. }
  46. } else {
  47. flash_led1_counter +=1
  48. if flash_led1_counter == 3 {
  49. d := []byte(fmt.Sprintf("%d",1))
  50. err := ioutil.WriteFile(led1_proc_file, d, 0644)
  51. if err != nil {
  52. fmt.Println(err)
  53. }
  54. }
  55. if flash_led1_counter == 5 {
  56. d := []byte(fmt.Sprintf("%d",0))
  57. err := ioutil.WriteFile(led1_proc_file, d, 0644)
  58. if err != nil {
  59. fmt.Println(err)
  60. }
  61. }
  62. if flash_led1_counter == 11 {
  63. flash_led1_counter = 1
  64. }
  65. }
  66. }
  67. gotime.Sleep(200 * gotime.Millisecond)
  68. }
  69. }
  70. //happens everytime when KeyDown occurs
  71. func RestoreLastBackLightBrightness(main_screen *UI.MainScreen) bool {
  72. passout_time_stage = 0
  73. main_screen.TitleBar.InLowBackLight = -1
  74. main_screen.Closed = false
  75. if last_brt == -1 {
  76. return true
  77. }
  78. if UI.FileExists(sysgo.BackLight) {
  79. lines,err := UI.ReadLines(sysgo.BackLight)
  80. if err == nil {
  81. brt,err2 := strconv.Atoi(strings.Trim(lines[0],"\r\n "))
  82. if err2 == nil {
  83. if brt < last_brt {
  84. d := []byte(fmt.Sprintf("%d",last_brt))
  85. ioutil.WriteFile(sysgo.BackLight,d,0644)
  86. last_brt = -1
  87. }
  88. }
  89. }else {
  90. fmt.Println(err)
  91. }
  92. }else {
  93. }
  94. if UI.FileExists(led1_proc_file) {
  95. d := []byte(fmt.Sprintf("%d",0))
  96. err := ioutil.WriteFile(led1_proc_file, d, 0644)
  97. if err != nil {
  98. fmt.Println(err)
  99. }
  100. }
  101. //Stop CounterScreen here
  102. if main_screen.CounterScreen.Counting == true {
  103. main_screen.CounterScreen.StopCounter()
  104. main_screen.Draw()
  105. main_screen.SwapAndShow()
  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.SwapAndShow()
  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("sudo iw wlan0 set power_save off >/dev/null")
  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("sudo iw wlan0 set power_save on >/dev/null")
  202. }else{
  203. UI.System("sudo iw wlan0 set power_save off >/dev/null")
  204. }
  205. }else {
  206. UI.System("sudo iw wlan0 set power_save off >/dev/null")
  207. }
  208. }
  209. }
  210. func release_self_fds() {
  211. fds_flags := []string{"pipe","socket:",".ttf"}
  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.Draw()
  261. main_screen.SwapAndShow()
  262. UI.SwapAndShow()
  263. //fmt.Println(main_screen)
  264. event.AllocEvents(5)
  265. event.AddCustomEvent(UI.RUNEVT)
  266. event.AddCustomEvent(UI.RUNSH)
  267. event.AddCustomEvent(UI.RUNSYS)
  268. event.AddCustomEvent(UI.RESTARTUI)
  269. event.AddCustomEvent(UI.POWEROPT)
  270. go FlashLed1(main_screen)
  271. go InspectionTeam(main_screen)
  272. go main_screen.TitleBar.RoundRobinCheck()
  273. //go AutoRedraw(main_screen)
  274. running := true
  275. for running {
  276. ev := event.Poll()
  277. if ev.Type == event.QUIT {
  278. running = false
  279. break
  280. }
  281. if ev.Type == event.USEREVENT {
  282. fmt.Println("UserEvent: ",ev.Data["Msg"])
  283. switch ev.Code {
  284. case UI.RUNEVT:
  285. main_screen.OnExitCb()
  286. gogame.Quit()
  287. fmt.Println("RUNEVT")
  288. exec_app_cmd := "cd " + filepath.Dir( strings.Split(strings.TrimSpace(ev.Data["Msg"]), " ")[0] )+";"
  289. exec_app_cmd += ev.Data["Msg"]
  290. exec_app_cmd +="; sync & cd "+UI.GetExePath()+"; "+os.Args[0]+";"
  291. fmt.Println(exec_app_cmd)
  292. release_self_fds()
  293. cmd := exec.Command("/bin/sh","-c",exec_app_cmd)
  294. err := cmd.Start()
  295. if err != nil {
  296. fmt.Println(err)
  297. }
  298. err = cmd.Process.Release()
  299. if err != nil {
  300. fmt.Println(err)
  301. }
  302. os.Exit(0)
  303. case UI.RUNSYS:
  304. main_screen.OnExitCb()
  305. gogame.Quit()
  306. release_self_fds()
  307. exec_app_cmd := ev.Data["Msg"]
  308. cmd := exec.Command("/bin/sh","-c",exec_app_cmd)
  309. err := cmd.Start()
  310. if err != nil {
  311. fmt.Println(err)
  312. }
  313. err = cmd.Process.Release()
  314. if err != nil {
  315. fmt.Println(err)
  316. }
  317. os.Exit(0)
  318. case UI.RUNSH:
  319. main_screen.OnExitCb()
  320. gogame.Quit()
  321. fmt.Println("RUNSH")
  322. exec_app_cmd := ev.Data["Msg"]+";"
  323. fmt.Println(exec_app_cmd)
  324. release_self_fds()
  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.RESTARTUI:
  336. main_screen.OnExitCb()
  337. gogame.Quit()
  338. exec_app_cmd :=" sync & cd "+UI.GetExePath()+"; "+os.Args[0]+";"
  339. fmt.Println(exec_app_cmd)
  340. release_self_fds()
  341. cmd := exec.Command("/bin/sh","-c",exec_app_cmd)
  342. err := cmd.Start()
  343. if err != nil {
  344. fmt.Println(err)
  345. }
  346. err = cmd.Process.Release()
  347. if err != nil {
  348. fmt.Println(err)
  349. }
  350. os.Exit(0)
  351. case UI.POWEROPT:
  352. everytime_keydown = gotime.Now()
  353. }
  354. }
  355. if ev.Type == event.KEYDOWN {
  356. everytime_keydown = gotime.Now()
  357. if RestoreLastBackLightBrightness(main_screen) == false {
  358. continue
  359. }
  360. if ev.Data["Key"] == "Q" {
  361. main_screen.OnExitCb()
  362. return 0
  363. }
  364. if ev.Data["Key"] == "Keypad +" {
  365. if main_screen.CurPage().GetName() != "Sound volume" {
  366. main_screen.Draw()
  367. sound_patch.VolumeUp()
  368. sound_patch.Draw()
  369. main_screen.SwapAndShow()
  370. }
  371. continue
  372. }
  373. if ev.Data["Key"] == "Keypad -" {
  374. if main_screen.CurPage().GetName() != "Sound volume" {
  375. main_screen.Draw()
  376. sound_patch.VolumeDown()
  377. sound_patch.Draw()
  378. main_screen.SwapAndShow()
  379. }
  380. continue
  381. }
  382. main_screen.KeyDown(ev)
  383. main_screen.LastKeyDown = everytime_keydown
  384. }
  385. gotime.Sleep(50*gotime.Millisecond)
  386. }
  387. return 0
  388. }
  389. func main() {
  390. var exitcode int
  391. //runtime.GOMAXPROCS(1)
  392. os.Setenv("SDL_VIDEO_CENTERED","1")
  393. sdl.Main(func() {
  394. exitcode = run()
  395. })
  396. os.Exit(exitcode)
  397. }