ya2 · news · projects · code · about

enforced resolution
[pmachines.git] / lib / engine / log.py
1 from logging import basicConfig, info, INFO, DEBUG, getLogger
2 from configparser import ConfigParser
3 from sys import platform, argv
4 from platform import system
5 from pathlib import Path
6 from glob import glob
7 from json import load, dumps
8 #from datetime import datetime
9 from pprint import pprint
10 from os import getcwd, environ
11 from os.path import exists, dirname
12 from traceback import print_stack
13 from sys import version_info
14 # from platform import system, release, architecture, platform, processor, \
15 # version, machine
16 # from multiprocessing import cpu_count
17 from panda3d.core import Filename, GraphicsWindow, PandaSystem
18 from panda3d.bullet import get_bullet_version
19 from lib.gameobject import Colleague
20 from lib.lib.builder import LibP3d
21 import sys
22
23
24 lev = INFO
25 opt_path = ''
26 if platform in ['win32', 'linux'] and not exists('main.py'):
27 # it is the deployed version for windows
28 opt_path = str(Filename.get_user_appdata_directory()) + '/pmachines'
29 opath = LibP3d.fixpath(opt_path + '/options.ini') if opt_path else \
30 'options.ini'
31 if exists(opath):
32 with open(opath) as json_file:
33 #optfile = load(json_file)
34 optfile = ConfigParser()
35 optfile.read(opath)
36 # optfile['development']['verbose'] and int(optfile['development']['verbose']) or \
37 if optfile['development']['verbose_log'] and int(optfile['development']['verbose_log']):
38 lev = DEBUG
39
40 basicConfig(level=lev, format='%(asctime)s %(message)s', datefmt='%H:%M:%S')
41 getLogger().setLevel(lev) # it doesn't work otherwise
42
43
44 class LogMgrBase(Colleague): # headless log manager
45
46 @staticmethod
47 def init_cls():
48 return LogMgr if base.win else LogMgrBase
49
50 def __init__(self, mediator):
51 Colleague.__init__(self, mediator)
52 self.log_cfg()
53
54 def log(self, msg, verbose=False):
55 if verbose and not self.eng.cfg.dev_cfg.verbose_log: return
56 info(msg)
57
58 @property
59 def is_appimage(self):
60 par_path = str(Path(__file__).parent.absolute())
61 is_appimage = par_path.startswith('/tmp/.mount_Pmachi')
62 return is_appimage and par_path.endswith('/usr/bin')
63
64 @property
65 def curr_path(self):
66 # this is different from the music's one since it does not work
67 # with the version in windows
68 if sys.platform == 'darwin':
69 return dirname(__file__) + '/../Resources/'
70 # return dirname(__file__)
71 par_path = str(Path(__file__).parent.absolute())
72 if self.is_appimage:
73 return str(Path(par_path).absolute())
74 is_snap = par_path.startswith('/snap/')
75 is_snap = is_snap and par_path.endswith('/x1')
76 if is_snap:
77 return str(Path(par_path).absolute())
78 #return getcwd()
79 #curr_path = dirname(__file__)
80 curr_path = str(Path(__file__).parent.parent.parent.absolute())
81 info('current path: %s' % curr_path)
82 return curr_path
83
84 @property
85 def build_version(self):
86 appimg_mnt = glob('/tmp/.mount_Pmachi*')
87 if appimg_mnt:
88 #with open(appimg_mnt[0] + '/usr/bin/appimage_version.txt') as fver:
89 with open(self.curr_path + '/assets/bld_version.txt') as fver:
90 return fver.read().strip()
91 try:
92 with open(self.curr_path + '/assets/bld_version.txt') as fver:
93 return fver.read().strip()
94 except FileNotFoundError:
95 info('not found ' + self.curr_path + '/assets/bld_version.txt')
96 return 'notfound'
97
98 def log_cfg(self):
99 if '--version' in argv:
100 path = str(Filename.get_user_appdata_directory())
101 home = '/home/flavio' # we must force this for wine
102 if path.startswith('/c/users/') and exists(home + '/.wine/'):
103 path = home + '/.wine/drive_' + path[1:]
104 info('writing %s' % path + '/pmachines/obs_version.txt')
105 with open(path + '/pmachines/obs_version.txt', 'w') as f:
106 #f.write(self.eng.logic.version)
107 f.write(self.build_version)
108 if not platform.startswith('win'):
109 from os import ttyname # here because it doesn't work on windows
110 import sys
111 with open(ttyname(0), 'w') as fout:
112 sys.stdout = fout
113 print('version: ' + self.build_version) # self.eng.logic.version)
114 messages = ['version: ' + self.build_version] # self.eng.logic.version]
115 messages += ['argv[0]: %s' % argv[0]]
116 messages += ['getcwd: %s' % getcwd()]
117 messages += ['__file__: %s' % __file__]
118 for elm in environ.items():
119 messages += ['env::%s: %s' % elm]
120 # os_info = (system(), release(), version())
121 # messages += ['operative system: %s %s %s' % os_info]
122 # messages += ['architecture: ' + str(architecture())]
123 # messages += ['machine: ' + machine()]
124 # messages += ['platform: ' + platform()]
125 # messages += ['processor: ' + processor()]
126 # try:
127 # messages += ['cores: ' + str(cpu_count())]
128 # except NotImplementedError: # on Windows
129 # messages += ['cores: not implemented']
130 lib_ver = PandaSystem.get_version_string()
131 try:
132 import psutil
133 mem = psutil.virtual_memory().total / 1000000000.0
134 messages += ['memory: %s GB' % round(mem, 2)]
135 except ImportError: info("can't import psutil") # windows
136 lib_commit = PandaSystem.get_git_commit()
137 py_ver = [str(elm) for elm in version_info[:3]]
138 messages += ['python version: %s' % '.'.join(py_ver)]
139 messages += ['panda version: %s %s' % (lib_ver, lib_commit)]
140 messages += ['bullet version: ' + str(get_bullet_version())]
141 messages += ['appdata: ' + str(Filename.get_user_appdata_directory())]
142 if base.win and isinstance(base.win, GraphicsWindow): # not headless
143 print(base.win.get_keyboard_map())
144 list(map(self.log, messages))
145
146 @staticmethod
147 def log_tasks():
148 info('tasks: %s' % taskMgr.getAllTasks())
149 info('do-laters: %s' % taskMgr.getDoLaters())
150
151 @staticmethod
152 def plog(obj):
153 print('\n\n')
154 print_stack()
155 pprint(obj)
156 print('\n\n')
157
158
159 class LogMgr(LogMgrBase):
160
161 def log_cfg(self):
162 LogMgrBase.log_cfg(self)
163 messages = [base.win.get_gsg().get_driver_vendor()]
164 messages += [base.win.get_gsg().get_driver_renderer()]
165 shad_maj = base.win.get_gsg().get_driver_shader_version_major()
166 shad_min = base.win.get_gsg().get_driver_shader_version_minor()
167 messages += ['shader: {maj}.{min}'.format(maj=shad_maj, min=shad_min)]
168 messages += [base.win.get_gsg().get_driver_version()]
169 drv_maj = base.win.get_gsg().get_driver_version_major()
170 drv_min = base.win.get_gsg().get_driver_version_minor()
171 drv = 'driver version: {maj}.{min}'
172 messages += [drv.format(maj=drv_maj, min=drv_min)]
173 fullscreen = None
174 if isinstance(base.win, GraphicsWindow):
175 fullscreen = base.win.get_properties().get_fullscreen()
176 messages += ['fullscreen: ' + str(fullscreen)]
177 def resolution():
178 if not isinstance(base.win, GraphicsWindow):
179 return 800, 600
180 win_prop = base.win.get_properties()
181 return win_prop.get_x_size(), win_prop.get_y_size()
182 res_x, res_y = resolution()
183 res_tmpl = 'resolution: {res_x}x{res_y}'
184 messages += [res_tmpl.format(res_x=res_x, res_y=res_y)]
185 list(map(self.log, messages))