run.py 20 KB

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