run.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  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,RUNEVT,RUNSYS,ICON_TYPES,POWEROPT,RESTARTUI,RUNSH
  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 == RUNEVT:
  245. if config.DontLeave==True:
  246. os.chdir(GetExePath())
  247. os.system( "/bin/sh -c "+event.message)
  248. else:
  249. on_exit_cb = getattr(main_screen,"OnExitCb",None)
  250. if on_exit_cb != None:
  251. if callable( on_exit_cb ):
  252. main_screen.OnExitCb(event)
  253. pygame.quit()
  254. gobject_main_loop.quit()
  255. os.chdir( GetExePath())
  256. exec_app_cmd = "cd "+os.path.dirname(event.message)+";"
  257. exec_app_cmd += event.message
  258. exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname
  259. print(exec_app_cmd)
  260. os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd)
  261. os.chdir( GetExePath())
  262. os.exelp("python","python"," "+myscriptname)
  263. sys.exit(-1)
  264. return
  265. if event.type == RUNSYS:
  266. if config.DontLeave==True:
  267. os.chdir(GetExePath())
  268. os.system( "/bin/sh -c "+event.message)
  269. else:
  270. pygame.quit()
  271. gobject_main_loop.quit()
  272. os.chdir( GetExePath())
  273. exec_app_cmd = "cd "+os.path.dirname(event.message)+";"
  274. exec_app_cmd += event.message
  275. exec_app_cmd += "; sync & cd "+GetExePath()+"; exec python "+myscriptname
  276. print(exec_app_cmd)
  277. os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd)
  278. os.chdir( GetExePath())
  279. os.exelp("python","python"," "+myscriptname)
  280. return
  281. if event.type == RESTARTUI:
  282. pygame.quit()
  283. gobject_main_loop.quit()
  284. os.chdir(GetExePath())
  285. exec_app_cmd = " sync & cd "+GetExePath()+"; exec python "+myscriptname
  286. print(exec_app_cmd)
  287. os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd)
  288. os.chdir( GetExePath())
  289. os.exelp("python","python"," "+myscriptname)
  290. return
  291. if event.type == RUNSH:
  292. pygame.quit()
  293. gobject_main_loop.quit()
  294. exec_app_cmd = event.message +";"
  295. os.execlp("/bin/sh","/bin/sh","-c", exec_app_cmd)
  296. sys.exit(-1)
  297. return
  298. if event.type == POWEROPT:
  299. everytime_keydown = time.time()
  300. return
  301. if event.type == pygame.KEYUP:
  302. pygame.event.clear(pygame.KEYDOWN)
  303. return
  304. if event.type == pygame.KEYDOWN:
  305. everytime_keydown = time.time()
  306. if RestoreLastBackLightBrightness(main_screen) == False:
  307. return
  308. ###########################################################
  309. if event.key == pygame.K_q:
  310. on_exit_cb = getattr(main_screen,"OnExitCb",None)
  311. if on_exit_cb != None:
  312. if callable( on_exit_cb ):
  313. main_screen.OnExitCb(event)
  314. gobject_main_loop.quit()
  315. exit()
  316. if event.key == pygame.K_KP_PLUS:
  317. if main_screen._CurrentPage._Name != "Sound volume": ## name from Menu/GameShell/10_Settings/Sound/pages.py
  318. main_screen.Draw()
  319. sound_patch.VolumeUp()
  320. sound_patch.Draw()
  321. main_screen.SwapAndShow()
  322. #pygame.time.delay(200)
  323. #main_screen.Draw()
  324. #main_screen.SwapAndShow()
  325. if event.key == pygame.K_KP_MINUS:
  326. if main_screen._CurrentPage._Name != "Sound volume":
  327. main_screen.Draw()
  328. sound_patch.VolumeDown()
  329. sound_patch.Draw()
  330. main_screen.SwapAndShow()
  331. #pygame.time.delay(200)
  332. #main_screen.Draw()
  333. #main_screen.SwapAndShow()
  334. ###########################################################
  335. if event.key == pygame.K_ESCAPE:
  336. pygame.event.clear()
  337. if RecordKeyDns(event.key,main_screen) == False:
  338. key_down_cb = getattr(main_screen,"KeyDown",None)
  339. if key_down_cb != None:
  340. if callable( key_down_cb ):
  341. main_screen.KeyDown(event)
  342. main_screen._LastKeyDown = everytime_keydown
  343. return
  344. def gobject_pygame_event_poll_timer(main_screen):
  345. event = pygame.event.poll()
  346. event_process(event,main_screen)
  347. InspectionTeam(main_screen)
  348. return True
  349. def gobject_pygame_event_timer(main_screen):
  350. global sound_patch
  351. for event in pygame.event.get():
  352. event_process(event,main_screen)
  353. return True
  354. @misc.threaded
  355. def socket_thread(main_screen):
  356. global everytime_keydown
  357. socket_path = "/tmp/gameshell"
  358. if os.path.exists(socket_path):
  359. os.remove(socket_path)
  360. server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  361. server.bind(socket_path)
  362. while True:
  363. server.listen(1)
  364. conn, addr = server.accept()
  365. datagram = conn.recv(1024)
  366. if datagram:
  367. tokens = datagram.strip().split()
  368. if tokens[0].lower() == "esc":
  369. escevent = pygame.event.Event(pygame.KEYDOWN,{'scancode':9,'key': 27, 'unicode': u'\x1b', 'mod': 0})
  370. current_page_key_down_cb = getattr(main_screen._CurrentPage,"KeyDown",None)
  371. if current_page_key_down_cb != None:
  372. if callable( current_page_key_down_cb ):
  373. main_screen._CurrentPage.KeyDown(escevent)
  374. if tokens[0].lower() == "quit": #eg: echo "quit" | socat - UNIX-CONNECT:/tmp/gameshell
  375. conn.close()
  376. on_exit_cb = getattr(main_screen,"OnExitCb",None)
  377. if on_exit_cb != None:
  378. if callable( on_exit_cb ):
  379. main_screen.OnExitCb(None)
  380. gobject_main_loop.quit()
  381. exit()
  382. if tokens[0].lower() == "keydown": ## simulate keydown event
  383. everytime_keydown = time.time()
  384. if RestoreLastBackLightBrightness(main_screen) == False:
  385. print("RestoreLastBackLightBrightness unix socket false")
  386. if tokens[0].lower() == "poweroff":
  387. escevent = pygame.event.Event(pygame.KEYDOWN,{'scancode':9,'key': 27, 'unicode': u'\x1b', 'mod': 0})
  388. for i in range(0,5):
  389. current_page_key_down_cb = getattr(main_screen._CurrentPage,"KeyDown",None)
  390. if current_page_key_down_cb != None:
  391. if callable( current_page_key_down_cb ):
  392. main_screen._CurrentPage.KeyDown(escevent)
  393. if main_screen._MyPageStack.Length() == 0: ## on Top Level
  394. break
  395. if main_screen._CurrentPage._Name == "GameShell":
  396. for i in main_screen._CurrentPage._Icons:
  397. if i._MyType == ICON_TYPES["FUNC"]:
  398. if i._Label.GetText() == "PowerOFF":
  399. api_cb = getattr(i._CmdPath,"API",None)
  400. if api_cb != None:
  401. if callable(api_cb):
  402. i._CmdPath.API(main_screen)
  403. def big_loop():
  404. global sound_patch,gobject_flash_led1
  405. title_bar = TitleBar()
  406. title_bar.Init(screen)
  407. foot_bar = FootBar()
  408. foot_bar.Init(screen)
  409. main_screen = MainScreen()
  410. main_screen._HWND = screen
  411. main_screen._TitleBar = title_bar
  412. main_screen._FootBar = foot_bar
  413. main_screen.Init()
  414. main_screen.ReadTheDirIntoPages("../Menu",0,None)
  415. main_screen.ReadTheDirIntoPages("/home/cpi/apps/Menu",1,main_screen._Pages[ len(main_screen._Pages) -1])
  416. main_screen.ReunionPagesIcons()
  417. main_screen.FartherPages()
  418. title_bar._SkinManager = main_screen._SkinManager
  419. foot_bar._SkinManager = main_screen._SkinManager
  420. sound_patch = SoundPatch()
  421. sound_patch._Parent = main_screen
  422. sound_patch.Init()
  423. #pp(main_screen._Pages[0],True,6)
  424. screen.fill(bg_color)
  425. main_screen.Draw()
  426. main_screen.SwapAndShow()
  427. #gobject.timeout_add(DT,gobject_pygame_event_timer,main_screen)
  428. gobject_flash_led1 = gobject.timeout_add(200,GobjectFlashLed1,main_screen)
  429. gobject.timeout_add(DT,gobject_pygame_event_poll_timer,main_screen)
  430. gobject.timeout_add(3000,title_bar.GObjectRoundRobin)
  431. socket_thread(main_screen)
  432. gobject_loop()
  433. def PreparationInAdv():
  434. if "arm" not in platform.machine():
  435. return
  436. if FileExists(".powerlevel") == False:
  437. os.system("touch .powerlevel")
  438. with open(".powerlevel","r") as f:
  439. powerlevel = f.read()
  440. powerlevel = powerlevel.strip()
  441. if powerlevel != "":
  442. config.PowerLevel = powerlevel
  443. if powerlevel != "supersaving":
  444. os.system("sudo iw wlan0 set power_save off >/dev/null")
  445. else:
  446. os.system("sudo iw wlan0 set power_save on > /dev/null")
  447. else:
  448. os.system("sudo iw wlan0 set power_save off >/dev/null")
  449. ###MAIN()###
  450. if __name__ == '__main__':
  451. os.environ['SDL_VIDEO_CENTERED'] = '1'
  452. X_center_mouse()
  453. os.chdir( os.path.dirname(os.path.realpath(__file__)) )
  454. SCREEN_SIZE = (Width,Height)
  455. screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
  456. pygame.event.set_allowed(None)
  457. pygame.event.set_allowed([pygame.KEYDOWN,pygame.KEYUP,RUNEVT,RUNSYS,POWEROPT,RESTARTUI,RUNSH])
  458. pygame.key.set_repeat(DT+DT*6+DT/2, DT+DT*3+DT/2)
  459. MyIconPool.Init()
  460. setup_dbus()
  461. gobject.threads_init()
  462. gobject_main_loop = gobject.MainLoop()
  463. # if pygame.display.get_active() == True:
  464. # print("I am actived")
  465. if pygame.image.get_extended() == False:
  466. print("This pygame does not support PNG")
  467. exit()
  468. PreparationInAdv()
  469. crt_screen = CreateByScreen()
  470. crt_screen.Init()
  471. crt_screen._HWND = screen
  472. big_loop()