run.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import dbus
  4. import dbus.service
  5. import sys
  6. import commands
  7. import logging
  8. import errno
  9. from wicd import misc
  10. import libs.websocket as websocket
  11. ##misc.to_bool
  12. ##misc.misc.noneToString
  13. ##misc.to_unicode
  14. ##misc.Noneify
  15. from wicd.translations import _
  16. from wicd import wpath
  17. from wicd import dbusmanager
  18. import time
  19. import gobject
  20. import socket
  21. import pygame
  22. from sys import exit
  23. import json
  24. #from beeprint import pp
  25. ########
  26. if getattr(dbus, 'version', (0, 0, 0)) < (0, 80, 0):
  27. import dbus.glib
  28. else:
  29. from dbus.mainloop.glib import DBusGMainLoop
  30. DBusGMainLoop(set_as_default=True)
  31. import config
  32. #local UI import
  33. from UI.constants import Width,Height,icon_width,icon_height,DT,RUNEVT,RUNSYS,ICON_TYPES,POWEROPT,RESTARTUI,RUNSH
  34. from UI.util_funcs import ReplaceSuffix,FileExists, ReadTheFileContent,midRect,color_surface,SwapAndShow,GetExePath,X_center_mouse,ArmSystem
  35. from UI.page import PageStack,PageSelector,Page
  36. from UI.label import Label
  37. from UI.icon_item import IconItem
  38. #from UI.fonts import fonts
  39. from UI.title_bar import TitleBar
  40. from UI.foot_bar import FootBar
  41. from UI.main_screen import MainScreen
  42. from UI.above_all_patch import SoundPatch
  43. from UI.icon_pool import MyIconPool
  44. from UI.createby_screen import CreateByScreen
  45. from UI.skin_manager import MySkinManager
  46. from libs.DBUS import setup_dbus
  47. if not pygame.display.get_init():
  48. pygame.display.init()
  49. if not pygame.font.get_init():
  50. pygame.font.init()
  51. gobject_main_loop = None
  52. sound_patch = None
  53. myscriptname = os.path.basename(os.path.realpath(__file__))
  54. everytime_keydown = time.time()
  55. passout_time_stage = 0
  56. last_brt = -1
  57. gobject_flash_led1 = -1
  58. gobject_flash_led1_counter = 0
  59. Keys = []
  60. crt_screen = None
  61. def gobject_loop():
  62. """
  63. here to receive dbus signal
  64. """
  65. try:
  66. gobject_main_loop.run()
  67. except KeyboardInterrupt:
  68. gobject_main_loop.quit()
  69. exit(-1)
  70. def GobjectFlashLed1(main_screen):
  71. global gobject_flash_led1_counter
  72. if main_screen._Closed == False:
  73. if gobject_flash_led1_counter > 0:
  74. try:
  75. f = open("/proc/driver/led1","w")
  76. except IOError:
  77. print( "open /proc/driver/led1 IOError")
  78. pass
  79. else:
  80. with f:
  81. f.seek(0)
  82. f.write("0")
  83. f.truncate()
  84. f.close()
  85. gobject_flash_led1_counter = 0
  86. return True
  87. gobject_flash_led1_counter+=1
  88. if gobject_flash_led1_counter == 3:
  89. try:
  90. f = open("/proc/driver/led1","w")
  91. except IOError:
  92. print( "open /proc/driver/led1 IOError")
  93. pass
  94. else:
  95. with f:
  96. f.seek(0)
  97. f.write("1")
  98. f.truncate()
  99. f.close()
  100. elif gobject_flash_led1_counter == 5:
  101. try:
  102. f = open("/proc/driver/led1","w")
  103. except IOError:
  104. print( "open /proc/driver/led1 IOError")
  105. pass
  106. else:
  107. with f:
  108. f.seek(0)
  109. f.write("0")
  110. f.truncate()
  111. f.close()
  112. if gobject_flash_led1_counter == 11:
  113. gobject_flash_led1_counter = 1
  114. return True
  115. def RestoreLastBackLightBrightness(main_screen):
  116. global last_brt,passout_time_stage,gobject_flash_led1
  117. passout_time_stage = 0
  118. main_screen._TitleBar._InLowBackLight = -1
  119. main_screen._Closed = False
  120. if last_brt == -1:
  121. return True
  122. try:
  123. f = open(config.BackLight,"r+")
  124. except IOError:
  125. print( "RestoreLastBackLightBrightness open %s failed, try to adjust brightness in Settings" % config.BackLight)
  126. pass
  127. else:
  128. with f:
  129. content = f.readlines()
  130. content = [x.strip() for x in content]
  131. brt=int(content[0])
  132. if brt < last_brt:
  133. f.seek(0)
  134. f.write(str( last_brt ))
  135. f.truncate()
  136. f.close()
  137. last_brt = -1
  138. try:
  139. f = open("/proc/driver/led1","w")
  140. except IOError:
  141. print( "open /proc/driver/led1 IOError")
  142. pass
  143. else:
  144. with f:
  145. f.seek(0)
  146. f.write("0")
  147. f.truncate()
  148. f.close()
  149. if main_screen._CounterScreen._Counting==True:
  150. main_screen._CounterScreen.StopCounter()
  151. main_screen.Draw()
  152. main_screen.SwapAndShow()
  153. return False
  154. return True
  155. def InspectionTeam(main_screen):
  156. global everytime_keydown,last_brt,passout_time_stage,gobject_flash_led1
  157. cur_time = time.time()
  158. time_1 = config.PowerLevels[config.PowerLevel][0]
  159. time_2 = config.PowerLevels[config.PowerLevel][1]
  160. time_3 = config.PowerLevels[config.PowerLevel][2]
  161. if cur_time - everytime_keydown > time_1 and passout_time_stage == 0:
  162. print("timeout, dim screen %d" % int(cur_time - everytime_keydown))
  163. try:
  164. f = open(config.BackLight,"r+")
  165. except IOError:
  166. pass
  167. else:
  168. with f:
  169. content = f.readlines()
  170. content = [x.strip() for x in content]
  171. brt=int(content[0])
  172. if brt > 0:
  173. if last_brt < 0:
  174. last_brt = brt ## remember brt for restore
  175. brt = 1
  176. f.seek(0)
  177. f.write(str(brt))
  178. f.truncate()
  179. f.close()
  180. main_screen._TitleBar._InLowBackLight = 0
  181. if time_2 != 0:
  182. passout_time_stage = 1 # next
  183. everytime_keydown = cur_time
  184. elif cur_time - everytime_keydown > time_2 and passout_time_stage == 1:
  185. print("timeout, close screen %d" % int(cur_time - everytime_keydown))
  186. try:
  187. f = open(config.BackLight,"r+")
  188. except IOError:
  189. pass
  190. else:
  191. with f:
  192. brt = 0
  193. f.seek(0)
  194. f.write(str(brt))
  195. f.truncate()
  196. f.close()
  197. main_screen._TitleBar._InLowBackLight = 0
  198. main_screen._Closed = True
  199. if time_3 != 0:
  200. passout_time_stage = 2 # next
  201. everytime_keydown = cur_time
  202. elif cur_time - everytime_keydown > time_3 and passout_time_stage == 2:
  203. print("Power Off counting down")
  204. try:
  205. f = open(config.BackLight,"r+")
  206. except IOError:
  207. pass
  208. else:
  209. with f:
  210. brt = last_brt
  211. f.seek(0)
  212. f.write(str(brt))
  213. f.truncate()
  214. f.close()
  215. main_screen._CounterScreen.Draw()
  216. main_screen._CounterScreen.SwapAndShow()
  217. main_screen._CounterScreen.StartCounter()
  218. main_screen._TitleBar._InLowBackLight = 0
  219. passout_time_stage = 4
  220. return True
  221. def RecordKeyDns(thekey,main_screen):
  222. global Keys,crt_screen
  223. if len(Keys) < 10:
  224. Keys.append(thekey)
  225. else:
  226. Keys = []
  227. Keys.append(thekey)
  228. keys = ''.join(map(str,Keys))
  229. #print(keys)
  230. if keys == "273273274274276276275275106107":##uuddllrrab
  231. crt_screen.Draw()
  232. crt_screen.SwapAndShow()
  233. main_screen._TitleBar._InLowBackLight = 0 ##pause titlebar drawing
  234. return True
  235. return False
  236. def release_self_fds():
  237. fds_flags= ["pipe","socket",".ttf"]
  238. """List process currently open FDs and their target """
  239. if sys.platform != 'linux2':
  240. raise NotImplementedError('Unsupported platform: %s' % sys.platform)
  241. ret = {}
  242. base = '/proc/self/fd'
  243. for num in os.listdir(base):
  244. path = None
  245. try:
  246. path = os.readlink(os.path.join(base, num))
  247. except OSError as err:
  248. # Last FD is always the "listdir" one (which may be closed)
  249. if err.errno != errno.ENOENT:
  250. raise
  251. ret[int(num)] = path
  252. for key in ret:
  253. if ret[key] != None and isinstance(ret[key], str):
  254. for i in fds_flags:
  255. if i in ret[key]:
  256. os.close(key)
  257. break
  258. return ret
  259. def event_process(event,main_screen):
  260. global sound_patch
  261. global everytime_keydown
  262. if event != None:
  263. pygame.event.clear()
  264. if event.type == pygame.ACTIVEEVENT:
  265. print(" ACTIVEEVENT !")
  266. return
  267. if event.type == pygame.QUIT:
  268. exit()
  269. if event.type == RUNEVT:
  270. if config.DontLeave==True:
  271. os.chdir(GetExePath())
  272. os.system( "/bin/sh -c "+event.message)
  273. else:
  274. on_exit_cb = getattr(main_screen,"OnExitCb",None)
  275. if on_exit_cb != None:
  276. if callable( on_exit_cb ):
  277. main_screen.OnExitCb(event)
  278. pygame.quit()
  279. gobject_main_loop.quit()
  280. os.chdir( GetExePath())
  281. endpos = len(event.message)
  282. space_break_pos = endpos
  283. for i in range(0,endpos):
  284. if event.message[i] == "/" and event.message[i-1] == " " and i > 6:
  285. space_break_pos = i-1
  286. break
  287. exec_app_cmd = "cd "+os.path.dirname(event.message[:space_break_pos])+";"
  288. exec_app_cmd += event.message
  289. exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname
  290. print(exec_app_cmd)
  291. release_self_fds()
  292. os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd)
  293. os.chdir( GetExePath())
  294. os.execlp("python","python"," "+myscriptname)
  295. sys.exit(-1)
  296. return
  297. if event.type == RUNSYS:
  298. if config.DontLeave==True:
  299. os.chdir(GetExePath())
  300. os.system( "/bin/sh -c "+event.message)
  301. else:
  302. pygame.quit()
  303. gobject_main_loop.quit()
  304. os.chdir( GetExePath())
  305. endpos = len(event.message)
  306. space_break_pos = endpos
  307. for i in range(0,endpos):
  308. if event.message[i] == "/" and event.message[i-1] == " " and i > 6:
  309. space_break_pos = i-1
  310. break
  311. exec_app_cmd = "cd "+os.path.dirname(event.message[:space_break_pos])+";"
  312. exec_app_cmd += event.message
  313. exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname
  314. print(exec_app_cmd)
  315. release_self_fds()
  316. os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd)
  317. os.chdir( GetExePath())
  318. os.execlp("python","python"," "+myscriptname)
  319. return
  320. if event.type == RESTARTUI:
  321. pygame.quit()
  322. gobject_main_loop.quit()
  323. os.chdir(GetExePath())
  324. exec_app_cmd = " sync & cd "+GetExePath()+"; exec python "+myscriptname
  325. print(exec_app_cmd)
  326. release_self_fds()
  327. os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd)
  328. os.chdir( GetExePath())
  329. os.execlp("python","python"," "+myscriptname)
  330. return
  331. if event.type == RUNSH:
  332. pygame.quit()
  333. gobject_main_loop.quit()
  334. exec_app_cmd = event.message +";"
  335. release_self_fds()
  336. os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd)
  337. sys.exit(-1)
  338. return
  339. if event.type == POWEROPT:
  340. everytime_keydown = time.time()
  341. return
  342. if event.type == pygame.KEYUP:
  343. pygame.event.clear(pygame.KEYDOWN)
  344. return
  345. if event.type == pygame.KEYDOWN:
  346. everytime_keydown = time.time()
  347. if RestoreLastBackLightBrightness(main_screen) == False:
  348. return
  349. ###########################################################
  350. if event.key == pygame.K_q:
  351. on_exit_cb = getattr(main_screen,"OnExitCb",None)
  352. if on_exit_cb != None:
  353. if callable( on_exit_cb ):
  354. main_screen.OnExitCb(event)
  355. gobject_main_loop.quit()
  356. exit()
  357. if event.key == pygame.K_KP_PLUS:
  358. if main_screen._CurrentPage._Name != "Sound volume": ## name from Menu/GameShell/10_Settings/Sound/pages.py
  359. main_screen.Draw()
  360. sound_patch.VolumeUp()
  361. sound_patch.Draw()
  362. main_screen.SwapAndShow()
  363. #pygame.time.delay(200)
  364. #main_screen.Draw()
  365. #main_screen.SwapAndShow()
  366. if event.key == pygame.K_KP_MINUS:
  367. if main_screen._CurrentPage._Name != "Sound volume":
  368. main_screen.Draw()
  369. sound_patch.VolumeDown()
  370. sound_patch.Draw()
  371. main_screen.SwapAndShow()
  372. #pygame.time.delay(200)
  373. #main_screen.Draw()
  374. #main_screen.SwapAndShow()
  375. ###########################################################
  376. if event.key == pygame.K_ESCAPE:
  377. pygame.event.clear()
  378. if RecordKeyDns(event.key,main_screen) == False:
  379. key_down_cb = getattr(main_screen,"KeyDown",None)
  380. if key_down_cb != None:
  381. if callable( key_down_cb ):
  382. main_screen.KeyDown(event)
  383. main_screen._LastKeyDown = everytime_keydown
  384. return
  385. def gobject_pygame_event_poll_timer(main_screen):
  386. event = pygame.event.poll()
  387. event_process(event,main_screen)
  388. InspectionTeam(main_screen)
  389. return True
  390. def gobject_pygame_event_timer(main_screen):
  391. global sound_patch
  392. for event in pygame.event.get():
  393. event_process(event,main_screen)
  394. return True
  395. @misc.threaded
  396. def aria2_ws(main_screen):
  397. def on_message(ws, message):
  398. print("run.py aria2_ws on_message: ",message)
  399. try:
  400. aria2_noti = json.loads(message)
  401. if "method" in aria2_noti and aria2_noti["method"] == "aria2.onDownloadError":
  402. gid = aria2_noti["params"][0]["gid"]
  403. if "method" in aria2_noti and aria2_noti["method"] == "aria2.onDownloadComplete":
  404. gid = aria2_noti["params"][0]["gid"]
  405. on_comp_cb = getattr(main_screen._CurrentPage,"OnAria2CompleteCb",None)
  406. if on_comp_cb != None:
  407. if callable( on_comp_cb ):
  408. main_screen._CurrentPage.OnAria2CompleteCb(gid)
  409. #game_install_thread(gid)
  410. except Exception as ex:
  411. print(ex)
  412. def on_error(ws, error):
  413. print(error)
  414. def on_close(ws):
  415. print("### closed ###")
  416. #websocket.enableTrace(True)
  417. try:
  418. ws = websocket.WebSocketApp("ws://localhost:6800/jsonrpc",
  419. on_message = on_message,
  420. on_error = on_error,
  421. on_close = on_close)
  422. # ws.on_open = on_open
  423. ws.run_forever()
  424. except:
  425. return
  426. @misc.threaded
  427. def socket_thread(main_screen):
  428. global everytime_keydown
  429. socket_path = "/tmp/gameshell"
  430. if os.path.exists(socket_path):
  431. os.remove(socket_path)
  432. server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  433. server.bind(socket_path)
  434. while True:
  435. server.listen(1)
  436. conn, addr = server.accept()
  437. datagram = conn.recv(1024)
  438. if datagram:
  439. tokens = datagram.strip().split()
  440. if tokens[0].lower() == "esc":
  441. escevent = pygame.event.Event(pygame.KEYDOWN,{'scancode':9,'key': 27, 'unicode': u'\x1b', 'mod': 0})
  442. current_page_key_down_cb = getattr(main_screen._CurrentPage,"KeyDown",None)
  443. if current_page_key_down_cb != None:
  444. if callable( current_page_key_down_cb ):
  445. main_screen._CurrentPage.KeyDown(escevent)
  446. if tokens[0].lower() == "quit": #eg: echo "quit" | socat - UNIX-CONNECT:/tmp/gameshell
  447. conn.close()
  448. on_exit_cb = getattr(main_screen,"OnExitCb",None)
  449. if on_exit_cb != None:
  450. if callable( on_exit_cb ):
  451. main_screen.OnExitCb(None)
  452. gobject_main_loop.quit()
  453. exit()
  454. if tokens[0].lower() == "keydown": ## simulate keydown event
  455. everytime_keydown = time.time()
  456. if RestoreLastBackLightBrightness(main_screen) == False:
  457. print("RestoreLastBackLightBrightness unix socket false")
  458. if tokens[0].lower() == "poweroff":
  459. escevent = pygame.event.Event(pygame.KEYDOWN,{'scancode':9,'key': 27, 'unicode': u'\x1b', 'mod': 0})
  460. for i in range(0,5):
  461. current_page_key_down_cb = getattr(main_screen._CurrentPage,"KeyDown",None)
  462. if current_page_key_down_cb != None:
  463. if callable( current_page_key_down_cb ):
  464. main_screen._CurrentPage.KeyDown(escevent)
  465. if main_screen._MyPageStack.Length() == 0: ## on Top Level
  466. break
  467. if main_screen._CurrentPage._Name == "GameShell":
  468. for i in main_screen._CurrentPage._Icons:
  469. if i._MyType == ICON_TYPES["FUNC"]:
  470. if i._Label.GetText() == "PowerOFF":
  471. api_cb = getattr(i._CmdPath,"API",None)
  472. if api_cb != None:
  473. if callable(api_cb):
  474. i._CmdPath.API(main_screen)
  475. if tokens[0].lower() == "redraw": #echo "redraw titlebar" | socat - UNIX-CONNECT:/tmp/gameshell
  476. if len(tokens) > 1:
  477. area = tokens[1].lower()
  478. if area == "titlebar":
  479. if hasattr(main_screen._TitleBar,'Redraw'):
  480. if main_screen._TitleBar.Redraw != None and callable(main_screen._TitleBar.Redraw):
  481. main_screen._TitleBar.Redraw()
  482. def big_loop():
  483. global sound_patch,gobject_flash_led1
  484. title_bar = TitleBar()
  485. title_bar.Init(screen)
  486. foot_bar = FootBar()
  487. foot_bar.Init(screen)
  488. main_screen = MainScreen()
  489. main_screen._HWND = screen
  490. main_screen._TitleBar = title_bar
  491. main_screen._FootBar = foot_bar
  492. main_screen.Init()
  493. main_screen.ReadTheDirIntoPages("../Menu",0,None)
  494. main_screen.ReadTheDirIntoPages("/home/cpi/apps/Menu",1,main_screen._Pages[ len(main_screen._Pages) -1])
  495. main_screen.ReunionPagesIcons()
  496. main_screen.FartherPages()
  497. title_bar._SkinManager = main_screen._SkinManager
  498. foot_bar._SkinManager = main_screen._SkinManager
  499. sound_patch = SoundPatch()
  500. sound_patch._Parent = main_screen
  501. sound_patch.Init()
  502. #pp(main_screen._Pages[0],True,6)
  503. screen.fill(MySkinManager.GiveColor("White"))
  504. main_screen.Draw()
  505. main_screen.SwapAndShow()
  506. #gobject.timeout_add(DT,gobject_pygame_event_timer,main_screen)
  507. gobject_flash_led1 = gobject.timeout_add(200,GobjectFlashLed1,main_screen)
  508. gobject.timeout_add(DT,gobject_pygame_event_poll_timer,main_screen)
  509. gobject.timeout_add(3000,title_bar.GObjectRoundRobin)
  510. socket_thread(main_screen)
  511. aria2_ws(main_screen)
  512. gobject_loop()
  513. ###MAIN()###
  514. if __name__ == '__main__':
  515. os.environ['SDL_VIDEO_CENTERED'] = '1'
  516. X_center_mouse()
  517. os.chdir( os.path.dirname(os.path.realpath(__file__)) )
  518. SCREEN_SIZE = (Width,Height)
  519. screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
  520. pygame.event.set_allowed(None)
  521. pygame.event.set_allowed([pygame.KEYDOWN,pygame.KEYUP,RUNEVT,RUNSYS,POWEROPT,RESTARTUI,RUNSH])
  522. pygame.key.set_repeat(DT+DT*6+DT/2, DT+DT*3+DT/2)
  523. MyIconPool.Init()
  524. setup_dbus()
  525. gobject.threads_init()
  526. gobject_main_loop = gobject.MainLoop()
  527. # if pygame.display.get_active() == True:
  528. # print("I am actived")
  529. if pygame.image.get_extended() == False:
  530. print("This pygame does not support PNG")
  531. exit()
  532. crt_screen = CreateByScreen()
  533. crt_screen.Init()
  534. crt_screen._HWND = screen
  535. big_loop()