run.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  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 UI.createby_screen import CreateByScreen
  40. from libs.DBUS import setup_dbus
  41. import config
  42. if not pygame.display.get_init():
  43. pygame.display.init()
  44. if not pygame.font.get_init():
  45. pygame.font.init()
  46. gobject_main_loop = None
  47. sound_patch = None
  48. myscriptname = os.path.basename(os.path.realpath(__file__))
  49. everytime_keydown = time.time()
  50. passout_time_stage = 0
  51. last_brt = -1
  52. gobject_flash_led1 = -1
  53. gobject_flash_led1_counter = 0
  54. Keys = []
  55. crt_screen = None
  56. def gobject_loop():
  57. """
  58. here to receive dbus signal
  59. """
  60. try:
  61. gobject_main_loop.run()
  62. except KeyboardInterrupt:
  63. gobject_main_loop.quit()
  64. exit(-1)
  65. def GobjectFlashLed1(main_screen):
  66. global gobject_flash_led1_counter
  67. if main_screen._Closed == False:
  68. if gobject_flash_led1_counter > 0:
  69. try:
  70. f = open("/proc/driver/led1","w")
  71. except IOError:
  72. print( "open /proc/driver/led1 IOError")
  73. pass
  74. else:
  75. with f:
  76. f.seek(0)
  77. f.write("0")
  78. f.truncate()
  79. f.close()
  80. gobject_flash_led1_counter = 0
  81. return True
  82. gobject_flash_led1_counter+=1
  83. if gobject_flash_led1_counter == 3:
  84. try:
  85. f = open("/proc/driver/led1","w")
  86. except IOError:
  87. print( "open /proc/driver/led1 IOError")
  88. pass
  89. else:
  90. with f:
  91. f.seek(0)
  92. f.write("1")
  93. f.truncate()
  94. f.close()
  95. elif gobject_flash_led1_counter == 5:
  96. try:
  97. f = open("/proc/driver/led1","w")
  98. except IOError:
  99. print( "open /proc/driver/led1 IOError")
  100. pass
  101. else:
  102. with f:
  103. f.seek(0)
  104. f.write("0")
  105. f.truncate()
  106. f.close()
  107. if gobject_flash_led1_counter == 11:
  108. gobject_flash_led1_counter = 1
  109. return True
  110. def RestoreLastBackLightBrightness(main_screen):
  111. global last_brt,passout_time_stage,gobject_flash_led1
  112. passout_time_stage = 0
  113. main_screen._TitleBar._InLowBackLight = -1
  114. main_screen._Closed = False
  115. if last_brt == -1:
  116. return True
  117. try:
  118. f = open(config.BackLight,"r+")
  119. except IOError:
  120. print( "RestoreLastBackLightBrightness open %s failed, try to adjust brightness in Settings" % config.BackLight)
  121. pass
  122. else:
  123. with f:
  124. content = f.readlines()
  125. content = [x.strip() for x in content]
  126. brt=int(content[0])
  127. if brt < last_brt:
  128. f.seek(0)
  129. f.write(str( last_brt ))
  130. f.truncate()
  131. f.close()
  132. last_brt = -1
  133. else:
  134. f.close()
  135. try:
  136. f = open("/proc/driver/led1","w")
  137. except IOError:
  138. print( "open /proc/driver/led1 IOError")
  139. pass
  140. else:
  141. with f:
  142. f.seek(0)
  143. f.write("0")
  144. f.truncate()
  145. f.close()
  146. if main_screen._CounterScreen._Counting==True:
  147. main_screen._CounterScreen.StopCounter()
  148. main_screen.Draw()
  149. main_screen.SwapAndShow()
  150. return False
  151. return True
  152. def InspectionTeam(main_screen):
  153. global everytime_keydown,last_brt,passout_time_stage,gobject_flash_led1
  154. cur_time = time.time()
  155. time_1 = config.PowerLevels[config.PowerLevel][0]
  156. time_2 = config.PowerLevels[config.PowerLevel][1]
  157. time_3 = config.PowerLevels[config.PowerLevel][2]
  158. if cur_time - everytime_keydown > time_1 and passout_time_stage == 0:
  159. print("timeout, dim screen %d" % int(cur_time - everytime_keydown))
  160. try:
  161. f = open(config.BackLight,"r+")
  162. except IOError:
  163. pass
  164. else:
  165. with f:
  166. content = f.readlines()
  167. content = [x.strip() for x in content]
  168. brt=int(content[0])
  169. if brt > 0:
  170. if last_brt < 0:
  171. last_brt = brt ## remember brt for restore
  172. brt = 1
  173. f.seek(0)
  174. f.write(str(brt))
  175. f.truncate()
  176. f.close()
  177. main_screen._TitleBar._InLowBackLight = 0
  178. if time_2 != 0:
  179. passout_time_stage = 1 # next
  180. everytime_keydown = cur_time
  181. elif cur_time - everytime_keydown > time_2 and passout_time_stage == 1:
  182. print("timeout, close screen %d" % int(cur_time - everytime_keydown))
  183. try:
  184. f = open(config.BackLight,"r+")
  185. except IOError:
  186. pass
  187. else:
  188. with f:
  189. brt = 0
  190. f.seek(0)
  191. f.write(str(brt))
  192. f.truncate()
  193. f.close()
  194. main_screen._TitleBar._InLowBackLight = 0
  195. main_screen._Closed = True
  196. if time_3 != 0:
  197. passout_time_stage = 2 # next
  198. everytime_keydown = cur_time
  199. elif cur_time - everytime_keydown > time_3 and passout_time_stage == 2:
  200. print("Power Off counting down")
  201. main_screen._CounterScreen.Draw()
  202. main_screen._CounterScreen.SwapAndShow()
  203. main_screen._CounterScreen.StartCounter()
  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._TitleBar._InLowBackLight = 0
  216. passout_time_stage = 4
  217. return True
  218. def RecordKeyDns(thekey,main_screen):
  219. global Keys,crt_screen
  220. if len(Keys) < 10:
  221. Keys.append(thekey)
  222. else:
  223. Keys = []
  224. Keys.append(thekey)
  225. keys = ''.join(map(str,Keys))
  226. print(keys)
  227. if keys == "273273274274276276275275106107":##uuddllrrab
  228. crt_screen.Draw()
  229. crt_screen.SwapAndShow()
  230. main_screen._TitleBar._InLowBackLight = 0 ##pause titlebar drawing
  231. return True
  232. return False
  233. def event_process(event,main_screen):
  234. global sound_patch
  235. global everytime_keydown
  236. if event != None:
  237. pygame.event.clear()
  238. if event.type == pygame.ACTIVEEVENT:
  239. print(" ACTIVEEVENT !")
  240. return
  241. if event.type == pygame.QUIT:
  242. exit()
  243. if event.type == GMEVT:
  244. main_screen.Draw()
  245. main_screen.SwapAndShow()
  246. pygame.event.clear(GMEVT)
  247. return
  248. if event.type == RUNEVT:
  249. if config.DontLeave==True:
  250. os.chdir(GetExePath())
  251. os.system( "/bin/sh -c "+event.message)
  252. else:
  253. on_exit_cb = getattr(main_screen,"OnExitCb",None)
  254. if on_exit_cb != None:
  255. if callable( on_exit_cb ):
  256. main_screen.OnExitCb(event)
  257. pygame.quit()
  258. gobject_main_loop.quit()
  259. os.chdir( GetExePath())
  260. exec_app_cmd = "cd "+os.path.dirname(event.message)+";"
  261. exec_app_cmd += event.message
  262. exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname
  263. print(exec_app_cmd)
  264. os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd)
  265. os.chdir( GetExePath())
  266. os.exelp("python","python"," "+myscriptname)
  267. sys.exit(-1)
  268. return
  269. if event.type == RUNSYS:
  270. if config.DontLeave==True:
  271. os.chdir(GetExePath())
  272. os.system( "/bin/sh -c "+event.message)
  273. else:
  274. pygame.quit()
  275. gobject_main_loop.quit()
  276. os.chdir( GetExePath())
  277. exec_app_cmd = "cd "+os.path.dirname(event.message)+";"
  278. exec_app_cmd += event.message
  279. exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname
  280. print(exec_app_cmd)
  281. os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd)
  282. os.chdir( GetExePath())
  283. os.exelp("python","python"," "+myscriptname)
  284. return
  285. if event.type == POWEROPT:
  286. everytime_keydown = time.time()
  287. return
  288. if event.type == pygame.KEYUP:
  289. pygame.event.clear(pygame.KEYDOWN)
  290. return
  291. if event.type == pygame.KEYDOWN:
  292. everytime_keydown = time.time()
  293. if RestoreLastBackLightBrightness(main_screen) == False:
  294. return
  295. ###########################################################
  296. if event.key == pygame.K_q:
  297. on_exit_cb = getattr(main_screen,"OnExitCb",None)
  298. if on_exit_cb != None:
  299. if callable( on_exit_cb ):
  300. main_screen.OnExitCb(event)
  301. gobject_main_loop.quit()
  302. exit()
  303. if event.key == pygame.K_KP_PLUS:
  304. if main_screen._CurrentPage._Name != "Sound volume": ## name from Menu/GameShell/10_Settings/Sound/pages.py
  305. main_screen.Draw()
  306. sound_patch.VolumeUp()
  307. sound_patch.Draw()
  308. main_screen.SwapAndShow()
  309. #pygame.time.delay(200)
  310. #main_screen.Draw()
  311. #main_screen.SwapAndShow()
  312. if event.key == pygame.K_KP_MINUS:
  313. if main_screen._CurrentPage._Name != "Sound volume":
  314. main_screen.Draw()
  315. sound_patch.VolumeDown()
  316. sound_patch.Draw()
  317. main_screen.SwapAndShow()
  318. #pygame.time.delay(200)
  319. #main_screen.Draw()
  320. #main_screen.SwapAndShow()
  321. ###########################################################
  322. if event.key == pygame.K_ESCAPE:
  323. pygame.event.clear()
  324. if RecordKeyDns(event.key,main_screen) == False:
  325. key_down_cb = getattr(main_screen,"KeyDown",None)
  326. if key_down_cb != None:
  327. if callable( key_down_cb ):
  328. main_screen.KeyDown(event)
  329. return
  330. def gobject_pygame_event_poll_timer(main_screen):
  331. event = pygame.event.poll()
  332. event_process(event,main_screen)
  333. InspectionTeam(main_screen)
  334. return True
  335. def gobject_pygame_event_timer(main_screen):
  336. global sound_patch
  337. for event in pygame.event.get():
  338. event_process(event,main_screen)
  339. return True
  340. @misc.threaded
  341. def socket_thread(main_screen):
  342. global everytime_keydown
  343. socket_path = "/tmp/gameshell"
  344. if os.path.exists(socket_path):
  345. os.remove(socket_path)
  346. server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  347. server.bind(socket_path)
  348. while True:
  349. server.listen(1)
  350. conn, addr = server.accept()
  351. datagram = conn.recv(1024)
  352. if datagram:
  353. tokens = datagram.strip().split()
  354. if tokens[0].lower() == "esc":
  355. escevent = pygame.event.Event(pygame.KEYDOWN,{'scancode':9,'key': 27, 'unicode': u'\x1b', 'mod': 0})
  356. current_page_key_down_cb = getattr(main_screen._CurrentPage,"KeyDown",None)
  357. if current_page_key_down_cb != None:
  358. if callable( current_page_key_down_cb ):
  359. main_screen._CurrentPage.KeyDown(escevent)
  360. if tokens[0].lower() == "quit": #eg: echo "quit" | socat - UNIX-CONNECT:/tmp/gameshell
  361. conn.close()
  362. on_exit_cb = getattr(main_screen,"OnExitCb",None)
  363. if on_exit_cb != None:
  364. if callable( on_exit_cb ):
  365. main_screen.OnExitCb(None)
  366. gobject_main_loop.quit()
  367. exit()
  368. if tokens[0].lower() == "keydown": ## simulate keydown event
  369. everytime_keydown = time.time()
  370. if RestoreLastBackLightBrightness(main_screen) == False:
  371. print("RestoreLastBackLightBrightness unix socket false")
  372. if tokens[0].lower() == "poweroff":
  373. escevent = pygame.event.Event(pygame.KEYDOWN,{'scancode':9,'key': 27, 'unicode': u'\x1b', 'mod': 0})
  374. for i in range(0,5):
  375. current_page_key_down_cb = getattr(main_screen._CurrentPage,"KeyDown",None)
  376. if current_page_key_down_cb != None:
  377. if callable( current_page_key_down_cb ):
  378. main_screen._CurrentPage.KeyDown(escevent)
  379. if main_screen._MyPageStack.Length() == 0: ## on Top Level
  380. break
  381. if main_screen._CurrentPage._Name == "GameShell":
  382. for i in main_screen._CurrentPage._Icons:
  383. if i._MyType == ICON_TYPES["FUNC"]:
  384. if i._Label.GetText() == "PowerOFF":
  385. api_cb = getattr(i._CmdPath,"API",None)
  386. if api_cb != None:
  387. if callable(api_cb):
  388. i._CmdPath.API(main_screen)
  389. def big_loop():
  390. global sound_patch,gobject_flash_led1
  391. title_bar = TitleBar()
  392. title_bar.Init(screen)
  393. foot_bar = FootBar()
  394. foot_bar.Init(screen)
  395. main_screen = MainScreen()
  396. main_screen._HWND = screen
  397. main_screen._TitleBar = title_bar
  398. main_screen._FootBar = foot_bar
  399. main_screen.Init()
  400. main_screen.ReadTheDirIntoPages("../Menu",0,None)
  401. main_screen.ReadTheDirIntoPages("/home/cpi/apps/Menu",1,main_screen._Pages[ len(main_screen._Pages) -1])
  402. main_screen.ReunionPagesIcons()
  403. main_screen.FartherPages()
  404. title_bar._SkinManager = main_screen._SkinManager
  405. foot_bar._SkinManager = main_screen._SkinManager
  406. sound_patch = SoundPatch()
  407. sound_patch._Parent = main_screen
  408. sound_patch.Init()
  409. #pp(main_screen._Pages[0],True,6)
  410. screen.fill(bg_color)
  411. main_screen.Draw()
  412. main_screen.SwapAndShow()
  413. #gobject.timeout_add(DT,gobject_pygame_event_timer,main_screen)
  414. gobject_flash_led1 = gobject.timeout_add(200,GobjectFlashLed1,main_screen)
  415. gobject.timeout_add(DT,gobject_pygame_event_poll_timer,main_screen)
  416. gobject.timeout_add(3000,title_bar.GObjectRoundRobin)
  417. socket_thread(main_screen)
  418. gobject_loop()
  419. ###MAIN()###
  420. if __name__ == '__main__':
  421. os.environ['SDL_VIDEO_CENTERED'] = '1'
  422. X_center_mouse()
  423. os.chdir( os.path.dirname(os.path.realpath(__file__)) )
  424. SCREEN_SIZE = (Width,Height)
  425. screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
  426. pygame.event.set_allowed(None)
  427. pygame.event.set_allowed([pygame.KEYDOWN,pygame.KEYUP,GMEVT,RUNEVT,RUNSYS,POWEROPT])
  428. pygame.key.set_repeat(DT+DT*6+DT/2, DT+DT*3+DT/2)
  429. MyIconPool.Init()
  430. setup_dbus()
  431. gobject.threads_init()
  432. gobject_main_loop = gobject.MainLoop()
  433. # if pygame.display.get_active() == True:
  434. # print("I am actived")
  435. if pygame.image.get_extended() == False:
  436. print("This pygame does not support PNG")
  437. exit()
  438. if FileExists(".powerlevel") == False:
  439. os.system("touch .powerlevel")
  440. with open(".powerlevel","r") as f:
  441. powerlevel = f.read()
  442. powerlevel = powerlevel.strip()
  443. if powerlevel != "":
  444. config.PowerLevel = powerlevel
  445. if powerlevel != "supersaving":
  446. os.system("sudo iw wlan0 set power_save off")
  447. else:
  448. os.system("sudo iw wlan0 set power_save on")
  449. crt_screen = CreateByScreen()
  450. crt_screen.Init()
  451. crt_screen._HWND = screen
  452. big_loop()