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
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, \
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
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 \
32 with
open(opath
) as json_file
:
33 #optfile = load(json_file)
34 optfile
= ConfigParser()
36 # optfile['development']['verbose'] and int(optfile['development']['verbose']) or \
37 if optfile
['development']['verbose_log'] and int(optfile
['development']['verbose_log']):
40 basicConfig(level
=lev
, format
='%(asctime)s %(message)s', datefmt
='%H:%M:%S')
41 getLogger().setLevel(lev
) # it doesn't work otherwise
44 class LogMgrBase(Colleague
): # headless log manager
48 return LogMgr
if base
.win
else LogMgrBase
50 def __init__(self
, mediator
):
51 Colleague
.__init
__(self
, mediator
)
54 def log(self
, msg
, verbose
=False):
55 if verbose
and not self
.eng
.cfg
.dev_cfg
.verbose_log
: return
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')
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())
73 return str(Path(par_path
).absolute())
74 is_snap
= par_path
.startswith('/snap/')
75 is_snap
= is_snap
and par_path
.endswith('/x1')
77 return str(Path(par_path
).absolute())
79 #curr_path = dirname(__file__)
80 curr_path
= str(Path(__file__
).parent
.parent
.parent
.absolute())
81 info('current path: %s' % curr_path
)
85 def build_version(self
):
86 appimg_mnt
= glob('/tmp/.mount_Pmachi*')
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()
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')
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
111 with
open(ttyname(0), 'w') as 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()]
127 # messages += ['cores: ' + str(cpu_count())]
128 # except NotImplementedError: # on Windows
129 # messages += ['cores: not implemented']
130 lib_ver
= PandaSystem
.get_version_string()
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
))
148 info('tasks: %s' % taskMgr
.getAllTasks())
149 info('do-laters: %s' % taskMgr
.getDoLaters())
159 class LogMgr(LogMgrBase
):
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
)]
174 if isinstance(base
.win
, GraphicsWindow
):
175 fullscreen
= base
.win
.get_properties().get_fullscreen()
176 messages
+= ['fullscreen: ' + str(fullscreen
)]
178 if not isinstance(base
.win
, GraphicsWindow
):
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
))