run.py 16 KB

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