run.py 18 KB

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