run.py 15 KB

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