run.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  1. # -*- coding: utf-8 -*-
  2. import dbus
  3. import dbus.service
  4. import sys
  5. import commands
  6. from wicd import misc
  7. ##misc.to_bool
  8. ##misc.misc.noneToString
  9. ##misc.to_unicode
  10. ##misc.Noneify
  11. from wicd.translations import _
  12. from wicd import wpath
  13. from wicd import dbusmanager
  14. import time
  15. import gobject
  16. import socket
  17. import pygame
  18. from sys import exit
  19. import os
  20. from beeprint import pp
  21. ########
  22. if getattr(dbus, 'version', (0, 0, 0)) < (0, 80, 0):
  23. import dbus.glib
  24. else:
  25. from dbus.mainloop.glib import DBusGMainLoop
  26. DBusGMainLoop(set_as_default=True)
  27. #local UI import
  28. from UI.constants import Width,Height,bg_color,icon_width,icon_height,DT,GMEVT,RUNEVT,RUNSYS,ICON_TYPES,POWEROPT
  29. from UI.util_funcs import ReplaceSuffix,FileExists, ReadTheFileContent,midRect,color_surface,SwapAndShow,GetExePath,X_center_mouse
  30. from UI.page import PageStack,PageSelector,Page
  31. from UI.label import Label
  32. from UI.icon_item import IconItem
  33. #from UI.fonts import fonts
  34. from UI.title_bar import TitleBar
  35. from UI.foot_bar import FootBar
  36. from UI.main_screen import MainScreen
  37. from UI.above_all_patch import SoundPatch
  38. from UI.icon_pool import MyIconPool
  39. from libs.DBUS import setup_dbus
  40. import config
  41. if not pygame.display.get_init():
  42. pygame.display.init()
  43. if not pygame.font.get_init():
  44. pygame.font.init()
  45. gobject_main_loop = None
  46. sound_patch = None
  47. myscriptname = os.path.basename(os.path.realpath(__file__))
  48. everytime_keydown = time.time()
  49. passout_time_stage = 0
  50. last_brt = -1
  51. gobject_flash_led1 = -1
  52. gobject_flash_led1_counter = 0
  53. def gobject_loop():
  54. """
  55. here to receive dbus signal
  56. """
  57. try:
  58. gobject_main_loop.run()
  59. except KeyboardInterrupt:
  60. gobject_main_loop.quit()
  61. exit(-1)
  62. def GobjectFlashLed1(main_screen):
  63. global gobject_flash_led1_counter
  64. if main_screen._Closed == False:
  65. if gobject_flash_led1_counter > 0:
  66. try:
  67. f = open("/proc/driver/led1","w")
  68. except IOError:
  69. print( "open /proc/driver/led1 IOError")
  70. pass
  71. else:
  72. with f:
  73. f.seek(0)
  74. f.write("0")
  75. f.truncate()
  76. f.close()
  77. gobject_flash_led1_counter = 0
  78. return True
  79. gobject_flash_led1_counter+=1
  80. if gobject_flash_led1_counter == 3:
  81. try:
  82. f = open("/proc/driver/led1","w")
  83. except IOError:
  84. print( "open /proc/driver/led1 IOError")
  85. pass
  86. else:
  87. with f:
  88. f.seek(0)
  89. f.write("1")
  90. f.truncate()
  91. f.close()
  92. elif gobject_flash_led1_counter == 5:
  93. try:
  94. f = open("/proc/driver/led1","w")
  95. except IOError:
  96. print( "open /proc/driver/led1 IOError")
  97. pass
  98. else:
  99. with f:
  100. f.seek(0)
  101. f.write("0")
  102. f.truncate()
  103. f.close()
  104. if gobject_flash_led1_counter == 11:
  105. gobject_flash_led1_counter = 1
  106. return True
  107. def RestoreLastBackLightBrightness(main_screen):
  108. global last_brt,passout_time_stage,gobject_flash_led1
  109. passout_time_stage = 0
  110. main_screen._TitleBar._InLowBackLight = -1
  111. main_screen._Closed = False
  112. if last_brt == -1:
  113. return True
  114. try:
  115. f = open(config.BackLight,"r+")
  116. except IOError:
  117. print( "RestoreLastBackLightBrightness open %s failed, try to adjust brightness in Settings" % config.BackLight)
  118. pass
  119. else:
  120. with f:
  121. content = f.readlines()
  122. content = [x.strip() for x in content]
  123. brt=int(content[0])
  124. if brt < last_brt:
  125. f.seek(0)
  126. f.write(str( last_brt ))
  127. f.truncate()
  128. f.close()
  129. last_brt = -1
  130. else:
  131. f.close()
  132. try:
  133. f = open("/proc/driver/led1","w")
  134. except IOError:
  135. print( "open /proc/driver/led1 IOError")
  136. pass
  137. else:
  138. with f:
  139. f.seek(0)
  140. f.write("0")
  141. f.truncate()
  142. f.close()
  143. if main_screen._CounterScreen._Counting==True:
  144. main_screen._CounterScreen.StopCounter()
  145. main_screen.Draw()
  146. main_screen.SwapAndShow()
  147. return False
  148. return True
  149. def InspectionTeam(main_screen):
  150. global everytime_keydown,last_brt,passout_time_stage,gobject_flash_led1
  151. cur_time = time.time()
  152. time_1 = config.PowerLevels[config.PowerLevel][0]
  153. time_2 = config.PowerLevels[config.PowerLevel][1]
  154. time_3 = config.PowerLevels[config.PowerLevel][2]
  155. if cur_time - everytime_keydown > time_1 and passout_time_stage == 0:
  156. print("timeout, dim screen %d" % int(cur_time - everytime_keydown))
  157. try:
  158. f = open(config.BackLight,"r+")
  159. except IOError:
  160. pass
  161. else:
  162. with f:
  163. content = f.readlines()
  164. content = [x.strip() for x in content]
  165. brt=int(content[0])
  166. if brt > 0:
  167. if last_brt < 0:
  168. last_brt = brt ## remember brt for restore
  169. brt = 1
  170. f.seek(0)
  171. f.write(str(brt))
  172. f.truncate()
  173. f.close()
  174. main_screen._TitleBar._InLowBackLight = 0
  175. if time_2 != 0:
  176. passout_time_stage = 1 # next
  177. everytime_keydown = cur_time
  178. elif cur_time - everytime_keydown > time_2 and passout_time_stage == 1:
  179. print("timeout, close screen %d" % int(cur_time - everytime_keydown))
  180. try:
  181. f = open(config.BackLight,"r+")
  182. except IOError:
  183. pass
  184. else:
  185. with f:
  186. brt = 0
  187. f.seek(0)
  188. f.write(str(brt))
  189. f.truncate()
  190. f.close()
  191. main_screen._TitleBar._InLowBackLight = 0
  192. main_screen._Closed = True
  193. if time_3 != 0:
  194. passout_time_stage = 2 # next
  195. everytime_keydown = cur_time
  196. elif cur_time - everytime_keydown > time_3 and passout_time_stage == 2:
  197. print("Power Off counting down")
  198. main_screen._CounterScreen.Draw()
  199. main_screen._CounterScreen.SwapAndShow()
  200. main_screen._CounterScreen.StartCounter()
  201. try:
  202. f = open(config.BackLight,"r+")
  203. except IOError:
  204. pass
  205. else:
  206. with f:
  207. brt = last_brt
  208. f.seek(0)
  209. f.write(str(brt))
  210. f.truncate()
  211. f.close()
  212. main_screen._TitleBar._InLowBackLight = 0
  213. passout_time_stage = 4
  214. return True
  215. def event_process(event,main_screen):
  216. global sound_patch
  217. global everytime_keydown
  218. if event != None:
  219. pygame.event.clear()
  220. if event.type == pygame.ACTIVEEVENT:
  221. print(" ACTIVEEVENT !")
  222. return
  223. if event.type == pygame.QUIT:
  224. exit()
  225. if event.type == GMEVT:
  226. main_screen.Draw()
  227. main_screen.SwapAndShow()
  228. pygame.event.clear(GMEVT)
  229. return
  230. if event.type == RUNEVT:
  231. if config.DontLeave==True:
  232. os.chdir(GetExePath())
  233. os.system( "/bin/sh -c "+event.message)
  234. else:
  235. on_exit_cb = getattr(main_screen,"OnExitCb",None)
  236. if on_exit_cb != None:
  237. if callable( on_exit_cb ):
  238. main_screen.OnExitCb(event)
  239. pygame.quit()
  240. gobject_main_loop.quit()
  241. os.chdir( GetExePath())
  242. exec_app_cmd = "./gsnotify/gsnotify-arm& cd "+os.path.dirname(event.message)+";"
  243. exec_app_cmd += event.message
  244. exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname
  245. print(exec_app_cmd)
  246. os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd)
  247. os.chdir( GetExePath())
  248. os.exelp("python","python"," "+myscriptname)
  249. sys.exit(-1)
  250. return
  251. if event.type == RUNSYS:
  252. if config.DontLeave==True:
  253. os.chdir(GetExePath())
  254. os.system( "/bin/sh -c "+event.message)
  255. else:
  256. pygame.quit()
  257. gobject_main_loop.quit()
  258. os.chdir( GetExePath())
  259. exec_app_cmd = "cd "+os.path.dirname(event.message)+";"
  260. exec_app_cmd += event.message
  261. exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname
  262. print(exec_app_cmd)
  263. os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd)
  264. os.chdir( GetExePath())
  265. os.exelp("python","python"," "+myscriptname)
  266. return
  267. if event.type == POWEROPT:
  268. everytime_keydown = time.time()
  269. return
  270. if event.type == pygame.KEYUP:
  271. pygame.event.clear(pygame.KEYDOWN)
  272. return
  273. if event.type == pygame.KEYDOWN:
  274. everytime_keydown = time.time()
  275. if RestoreLastBackLightBrightness(main_screen) == False:
  276. return
  277. ###########################################################
  278. if event.key == pygame.K_q:
  279. on_exit_cb = getattr(main_screen,"OnExitCb",None)
  280. if on_exit_cb != None:
  281. if callable( on_exit_cb ):
  282. main_screen.OnExitCb(event)
  283. gobject_main_loop.quit()
  284. exit()
  285. if event.key == pygame.K_KP_PLUS:
  286. if main_screen._CurrentPage._Name != "Sound volume": ## name from Menu/GameShell/10_Settings/Sound/pages.py
  287. main_screen.Draw()
  288. sound_patch.VolumeUp()
  289. sound_patch.Draw()
  290. main_screen.SwapAndShow()
  291. #pygame.time.delay(200)
  292. #main_screen.Draw()
  293. #main_screen.SwapAndShow()
  294. if event.key == pygame.K_KP_MINUS:
  295. if main_screen._CurrentPage._Name != "Sound volume":
  296. main_screen.Draw()
  297. sound_patch.VolumeDown()
  298. sound_patch.Draw()
  299. main_screen.SwapAndShow()
  300. #pygame.time.delay(200)
  301. #main_screen.Draw()
  302. #main_screen.SwapAndShow()
  303. ###########################################################
  304. if event.key == pygame.K_ESCAPE:
  305. pygame.event.clear()
  306. key_down_cb = getattr(main_screen,"KeyDown",None)
  307. if key_down_cb != None:
  308. if callable( key_down_cb ):
  309. main_screen.KeyDown(event)
  310. return
  311. def gobject_pygame_event_poll_timer(main_screen):
  312. event = pygame.event.poll()
  313. event_process(event,main_screen)
  314. InspectionTeam(main_screen)
  315. return True
  316. def gobject_pygame_event_timer(main_screen):
  317. global sound_patch
  318. for event in pygame.event.get():
  319. event_process(event,main_screen)
  320. return True
  321. @misc.threaded
  322. def socket_thread(main_screen):
  323. socket_path = "/tmp/gameshell"
  324. if os.path.exists(socket_path):
  325. os.remove(socket_path)
  326. server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  327. server.bind(socket_path)
  328. while True:
  329. server.listen(1)
  330. conn, addr = server.accept()
  331. datagram = conn.recv(1024)
  332. if datagram:
  333. tokens = datagram.strip().split()
  334. if tokens[0].lower() == "esc":
  335. escevent = pygame.event.Event(pygame.KEYDOWN,{'scancode':9,'key': 27, 'unicode': u'\x1b', 'mod': 0})
  336. current_page_key_down_cb = getattr(main_screen._CurrentPage,"KeyDown",None)
  337. if current_page_key_down_cb != None:
  338. if callable( current_page_key_down_cb ):
  339. main_screen._CurrentPage.KeyDown(escevent)
  340. if tokens[0].lower() == "quit": #eg: echo "quit" | socat - UNIX-CONNECT:/tmp/gameshell
  341. conn.close()
  342. on_exit_cb = getattr(main_screen,"OnExitCb",None)
  343. if on_exit_cb != None:
  344. if callable( on_exit_cb ):
  345. main_screen.OnExitCb(None)
  346. gobject_main_loop.quit()
  347. exit()
  348. if tokens[0].lower() == "poweroff":
  349. escevent = pygame.event.Event(pygame.KEYDOWN,{'scancode':9,'key': 27, 'unicode': u'\x1b', 'mod': 0})
  350. for i in range(0,5):
  351. current_page_key_down_cb = getattr(main_screen._CurrentPage,"KeyDown",None)
  352. if current_page_key_down_cb != None:
  353. if callable( current_page_key_down_cb ):
  354. main_screen._CurrentPage.KeyDown(escevent)
  355. if main_screen._MyPageStack.Length() == 0: ## on Top Level
  356. break
  357. if main_screen._CurrentPage._Name == "GameShell":
  358. for i in main_screen._CurrentPage._Icons:
  359. if i._MyType == ICON_TYPES["FUNC"]:
  360. if i._Label.GetText() == "PowerOFF":
  361. api_cb = getattr(i._CmdPath,"API",None)
  362. if api_cb != None:
  363. if callable(api_cb):
  364. i._CmdPath.API(main_screen)
  365. def big_loop():
  366. global sound_patch,gobject_flash_led1
  367. title_bar = TitleBar()
  368. title_bar.Init(screen)
  369. foot_bar = FootBar()
  370. foot_bar.Init(screen)
  371. main_screen = MainScreen()
  372. main_screen._HWND = screen
  373. main_screen._TitleBar = title_bar
  374. main_screen._FootBar = foot_bar
  375. main_screen.Init()
  376. main_screen.ReadTheDirIntoPages("../Menu",0,None)
  377. main_screen.FartherPages()
  378. title_bar._SkinManager = main_screen._SkinManager
  379. foot_bar._SkinManager = main_screen._SkinManager
  380. sound_patch = SoundPatch()
  381. sound_patch._Parent = main_screen
  382. sound_patch.Init()
  383. #pp(main_screen._Pages[0],True,6)
  384. screen.fill(bg_color)
  385. main_screen.Draw()
  386. main_screen.SwapAndShow()
  387. #gobject.timeout_add(DT,gobject_pygame_event_timer,main_screen)
  388. gobject_flash_led1 = gobject.timeout_add(200,GobjectFlashLed1,main_screen)
  389. gobject.timeout_add(DT,gobject_pygame_event_poll_timer,main_screen)
  390. gobject.timeout_add(3000,title_bar.GObjectRoundRobin)
  391. socket_thread(main_screen)
  392. gobject_loop()
  393. ###MAIN()###
  394. if __name__ == '__main__':
  395. os.environ['SDL_VIDEO_CENTERED'] = '1'
  396. X_center_mouse()
  397. os.chdir( os.path.dirname(os.path.realpath(__file__)) )
  398. SCREEN_SIZE = (Width,Height)
  399. screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
  400. pygame.event.set_allowed(None)
  401. pygame.event.set_allowed([pygame.KEYDOWN,pygame.KEYUP,GMEVT,RUNEVT,RUNSYS,POWEROPT])
  402. pygame.key.set_repeat(DT+DT*6+DT/2, DT+DT*3+DT/2)
  403. MyIconPool.Init()
  404. setup_dbus()
  405. gobject.threads_init()
  406. gobject_main_loop = gobject.MainLoop()
  407. # if pygame.display.get_active() == True:
  408. # print("I am actived")
  409. if pygame.image.get_extended() == False:
  410. print("This pygame does not support PNG")
  411. exit()
  412. if FileExists(".powerlevel") == False:
  413. os.system("touch .powerlevel")
  414. with open(".powerlevel","r") as f:
  415. powerlevel = f.read()
  416. powerlevel = powerlevel.strip()
  417. if powerlevel != "":
  418. config.PowerLevel = powerlevel
  419. if powerlevel != "supersaving":
  420. os.system("sudo iw wlan0 set power_save off")
  421. else:
  422. os.system("sudo iw wlan0 set power_save on")
  423. os.spawnlp(os.P_NOWAIT,"./gsnotify/gsnotify-arm", "./gsnotify/gsnotify-arm")
  424. big_loop()