run.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  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 = event.message
  232. exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname
  233. print(exec_app_cmd)
  234. os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd)
  235. os.chdir( GetExePath())
  236. os.exelp("python","python"," "+myscriptname)
  237. sys.exit(-1)
  238. return
  239. if event.type == RUNSYS:
  240. if config.DontLeave==True:
  241. os.chdir(GetExePath())
  242. os.system( "/bin/sh -c "+event.message)
  243. else:
  244. pygame.quit()
  245. gobject_main_loop.quit()
  246. os.chdir( GetExePath())
  247. exec_app_cmd = event.message
  248. exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname
  249. print(exec_app_cmd)
  250. os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd)
  251. os.chdir( GetExePath())
  252. os.exelp("python","python"," "+myscriptname)
  253. return
  254. if event.type == POWEROPT:
  255. everytime_keydown = time.time()
  256. return
  257. if event.type == pygame.KEYUP:
  258. pygame.event.clear(pygame.KEYDOWN)
  259. return
  260. if event.type == pygame.KEYDOWN:
  261. everytime_keydown = time.time()
  262. if RestoreLastBackLightBrightness(main_screen) == False:
  263. return
  264. ###########################################################
  265. if event.key == pygame.K_q:
  266. on_exit_cb = getattr(main_screen,"OnExitCb",None)
  267. if on_exit_cb != None:
  268. if callable( on_exit_cb ):
  269. main_screen.OnExitCb(event)
  270. gobject_main_loop.quit()
  271. exit()
  272. if event.key == pygame.K_KP_PLUS:
  273. if main_screen._CurrentPage._Name != "Sound volume": ## name from Menu/GameShell/10_Settings/Sound/pages.py
  274. main_screen.Draw()
  275. sound_patch.VolumeUp()
  276. sound_patch.Draw()
  277. main_screen.SwapAndShow()
  278. #pygame.time.delay(200)
  279. #main_screen.Draw()
  280. #main_screen.SwapAndShow()
  281. if event.key == pygame.K_KP_MINUS:
  282. if main_screen._CurrentPage._Name != "Sound volume":
  283. main_screen.Draw()
  284. sound_patch.VolumeDown()
  285. sound_patch.Draw()
  286. main_screen.SwapAndShow()
  287. #pygame.time.delay(200)
  288. #main_screen.Draw()
  289. #main_screen.SwapAndShow()
  290. ###########################################################
  291. if event.key == pygame.K_ESCAPE:
  292. pygame.event.clear()
  293. key_down_cb = getattr(main_screen,"KeyDown",None)
  294. if key_down_cb != None:
  295. if callable( key_down_cb ):
  296. main_screen.KeyDown(event)
  297. return
  298. def gobject_pygame_event_poll_timer(main_screen):
  299. event = pygame.event.poll()
  300. event_process(event,main_screen)
  301. InspectionTeam(main_screen)
  302. return True
  303. def gobject_pygame_event_timer(main_screen):
  304. global sound_patch
  305. for event in pygame.event.get():
  306. event_process(event,main_screen)
  307. return True
  308. @misc.threaded
  309. def socket_thread(main_screen):
  310. socket_path = "/tmp/gameshell"
  311. if os.path.exists(socket_path):
  312. os.remove(socket_path)
  313. server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  314. server.bind(socket_path)
  315. while True:
  316. server.listen(1)
  317. conn, addr = server.accept()
  318. datagram = conn.recv(1024)
  319. if datagram:
  320. tokens = datagram.strip().split()
  321. if tokens[0].lower() == "esc":
  322. escevent = pygame.event.Event(pygame.KEYDOWN,{'scancode':9,'key': 27, 'unicode': u'\x1b', 'mod': 0})
  323. current_page_key_down_cb = getattr(main_screen._CurrentPage,"KeyDown",None)
  324. if current_page_key_down_cb != None:
  325. if callable( current_page_key_down_cb ):
  326. main_screen._CurrentPage.KeyDown(escevent)
  327. if tokens[0].lower() == "quit":
  328. conn.close()
  329. on_exit_cb = getattr(main_screen,"OnExitCb",None)
  330. if on_exit_cb != None:
  331. if callable( on_exit_cb ):
  332. main_screen.OnExitCb(None)
  333. gobject_main_loop.quit()
  334. exit()
  335. if tokens[0].lower() == "poweroff":
  336. escevent = pygame.event.Event(pygame.KEYDOWN,{'scancode':9,'key': 27, 'unicode': u'\x1b', 'mod': 0})
  337. for i in range(0,5):
  338. current_page_key_down_cb = getattr(main_screen._CurrentPage,"KeyDown",None)
  339. if current_page_key_down_cb != None:
  340. if callable( current_page_key_down_cb ):
  341. main_screen._CurrentPage.KeyDown(escevent)
  342. if main_screen._MyPageStack.Length() == 0: ## on Top Level
  343. break
  344. if main_screen._CurrentPage._Name == "GameShell":
  345. for i in main_screen._CurrentPage._Icons:
  346. if i._MyType == ICON_TYPES["FUNC"]:
  347. if i._Label.GetText() == "PowerOFF":
  348. api_cb = getattr(i._CmdPath,"API",None)
  349. if api_cb != None:
  350. if callable(api_cb):
  351. i._CmdPath.API(main_screen)
  352. def big_loop():
  353. global sound_patch
  354. title_bar = TitleBar()
  355. title_bar.Init(screen)
  356. foot_bar = FootBar()
  357. foot_bar.Init(screen)
  358. main_screen = MainScreen()
  359. main_screen._HWND = screen
  360. main_screen._TitleBar = title_bar
  361. main_screen._FootBar = foot_bar
  362. main_screen.Init()
  363. main_screen.ReadTheDirIntoPages("../Menu",0,None)
  364. main_screen.FartherPages()
  365. title_bar._SkinManager = main_screen._SkinManager
  366. foot_bar._SkinManager = main_screen._SkinManager
  367. sound_patch = SoundPatch()
  368. sound_patch._Parent = main_screen
  369. sound_patch.Init()
  370. #pp(main_screen._Pages[0],True,6)
  371. screen.fill(bg_color)
  372. main_screen.Draw()
  373. main_screen.SwapAndShow()
  374. #gobject.timeout_add(DT,gobject_pygame_event_timer,main_screen)
  375. gobject.timeout_add(DT,gobject_pygame_event_poll_timer,main_screen)
  376. gobject.timeout_add(3000,title_bar.GObjectRoundRobin)
  377. # socket_thread(main_screen)
  378. gobject_loop()
  379. ###MAIN()###
  380. if __name__ == '__main__':
  381. os.environ['SDL_VIDEO_CENTERED'] = '1'
  382. X_center_mouse()
  383. os.chdir( os.path.dirname(os.path.realpath(__file__)) )
  384. SCREEN_SIZE = (Width,Height)
  385. screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
  386. pygame.event.set_allowed(None)
  387. pygame.event.set_allowed([pygame.KEYDOWN,pygame.KEYUP,GMEVT,RUNEVT,RUNSYS,POWEROPT])
  388. pygame.key.set_repeat(DT+DT*6+DT/2, DT+DT*3+DT/2)
  389. MyIconPool.Init()
  390. setup_dbus()
  391. gobject.threads_init()
  392. gobject_main_loop = gobject.MainLoop()
  393. # if pygame.display.get_active() == True:
  394. # print("I am actived")
  395. if pygame.image.get_extended() == False:
  396. print("This pygame does not support PNG")
  397. exit()
  398. if FileExists(".powerlevel") == False:
  399. os.system("touch .powerlevel")
  400. with open(".powerlevel","r") as f:
  401. powerlevel = f.read()
  402. powerlevel = powerlevel.strip()
  403. if powerlevel != "":
  404. config.PowerLevel = powerlevel
  405. big_loop()