run.py 15 KB

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