update devkit server and model files
This commit is contained in:
BIN
devkit/__pycache__/sensor_server.cpython-313.pyc
Normal file
BIN
devkit/__pycache__/sensor_server.cpython-313.pyc
Normal file
Binary file not shown.
BIN
devkit/__pycache__/sensor_stream_pb2.cpython-313.pyc
Normal file
BIN
devkit/__pycache__/sensor_stream_pb2.cpython-313.pyc
Normal file
Binary file not shown.
BIN
devkit/__pycache__/sensor_stream_pb2_grpc.cpython-313.pyc
Normal file
BIN
devkit/__pycache__/sensor_stream_pb2_grpc.cpython-313.pyc
Normal file
Binary file not shown.
2718
devkit/build/je-skin-devkit-server/Analysis-00.toc
Normal file
2718
devkit/build/je-skin-devkit-server/Analysis-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
423
devkit/build/je-skin-devkit-server/EXE-00.toc
Normal file
423
devkit/build/je-skin-devkit-server/EXE-00.toc
Normal file
@@ -0,0 +1,423 @@
|
|||||||
|
('D:\\Workspace\\je-skin-customer-demo\\devkit\\dist\\je-skin-devkit-server.exe',
|
||||||
|
True,
|
||||||
|
False,
|
||||||
|
False,
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\PyInstaller\\bootloader\\images\\icon-console.ico',
|
||||||
|
None,
|
||||||
|
False,
|
||||||
|
False,
|
||||||
|
b'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<assembly xmlns='
|
||||||
|
b'"urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">\n <trustInfo x'
|
||||||
|
b'mlns="urn:schemas-microsoft-com:asm.v3">\n <security>\n <requested'
|
||||||
|
b'Privileges>\n <requestedExecutionLevel level="asInvoker" uiAccess='
|
||||||
|
b'"false"/>\n </requestedPrivileges>\n </security>\n </trustInfo>\n '
|
||||||
|
b'<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">\n <'
|
||||||
|
b'application>\n <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f'
|
||||||
|
b'0}"/>\n <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>\n '
|
||||||
|
b' <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>\n <s'
|
||||||
|
b'upportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>\n <supporte'
|
||||||
|
b'dOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>\n </application>\n <'
|
||||||
|
b'/compatibility>\n <application xmlns="urn:schemas-microsoft-com:asm.v3">'
|
||||||
|
b'\n <windowsSettings>\n <longPathAware xmlns="http://schemas.micros'
|
||||||
|
b'oft.com/SMI/2016/WindowsSettings">true</longPathAware>\n </windowsSett'
|
||||||
|
b'ings>\n </application>\n <dependency>\n <dependentAssembly>\n <ass'
|
||||||
|
b'emblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version='
|
||||||
|
b'"6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" langua'
|
||||||
|
b'ge="*"/>\n </dependentAssembly>\n </dependency>\n</assembly>',
|
||||||
|
True,
|
||||||
|
False,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\build\\je-skin-devkit-server\\je-skin-devkit-server.pkg',
|
||||||
|
[('pyi-contents-directory _internal', '', 'OPTION'),
|
||||||
|
('PYZ-00.pyz',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\build\\je-skin-devkit-server\\PYZ-00.pyz',
|
||||||
|
'PYZ'),
|
||||||
|
('struct',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\build\\je-skin-devkit-server\\localpycs\\struct.pyc',
|
||||||
|
'PYMODULE'),
|
||||||
|
('pyimod01_archive',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\build\\je-skin-devkit-server\\localpycs\\pyimod01_archive.pyc',
|
||||||
|
'PYMODULE'),
|
||||||
|
('pyimod02_importers',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\build\\je-skin-devkit-server\\localpycs\\pyimod02_importers.pyc',
|
||||||
|
'PYMODULE'),
|
||||||
|
('pyimod03_ctypes',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\build\\je-skin-devkit-server\\localpycs\\pyimod03_ctypes.pyc',
|
||||||
|
'PYMODULE'),
|
||||||
|
('pyimod04_pywin32',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\build\\je-skin-devkit-server\\localpycs\\pyimod04_pywin32.pyc',
|
||||||
|
'PYMODULE'),
|
||||||
|
('pyiboot01_bootstrap',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
|
||||||
|
'PYSOURCE'),
|
||||||
|
('pyi_rth_inspect',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py',
|
||||||
|
'PYSOURCE'),
|
||||||
|
('pyi_rth_pkgutil',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py',
|
||||||
|
'PYSOURCE'),
|
||||||
|
('pyi_rth_multiprocessing',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py',
|
||||||
|
'PYSOURCE'),
|
||||||
|
('sensor_server',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\sensor_server.py',
|
||||||
|
'PYSOURCE'),
|
||||||
|
('python313.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\python313.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('numpy.libs\\libscipy_openblas64_-63c857e738469261263c764a36be9436.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy.libs\\libscipy_openblas64_-63c857e738469261263c764a36be9436.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('numpy.libs\\msvcp140-a4c2229bdc2a2a630acdc095b4d86008.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy.libs\\msvcp140-a4c2229bdc2a2a630acdc095b4d86008.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('select.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\select.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_multiprocessing.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_multiprocessing.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('pyexpat.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\pyexpat.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_ssl.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_ssl.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_hashlib.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_hashlib.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('unicodedata.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\unicodedata.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_decimal.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_decimal.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_socket.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_socket.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_lzma.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_lzma.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_bz2.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_bz2.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_ctypes.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_ctypes.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_queue.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_queue.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\_core\\_multiarray_tests.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\_core\\_multiarray_tests.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\_core\\_multiarray_umath.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\_core\\_multiarray_umath.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_overlapped.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_overlapped.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_asyncio.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_asyncio.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_wmi.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_wmi.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\linalg\\_umath_linalg.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\linalg\\_umath_linalg.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\mtrand.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\mtrand.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\bit_generator.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\bit_generator.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\_sfc64.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\_sfc64.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\_philox.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\_philox.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\_pcg64.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\_pcg64.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\_mt19937.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\_mt19937.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\_generator.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\_generator.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\_common.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\_common.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\_bounded_integers.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\_bounded_integers.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\fft\\_pocketfft_umath.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\fft\\_pocketfft_umath.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_elementtree.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_elementtree.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('grpc\\_cython\\cygrpc.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\grpc\\_cython\\cygrpc.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('google\\_upb\\_message.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\google\\_upb\\_message.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('grpc_tools\\_protoc_compiler.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\grpc_tools\\_protoc_compiler.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('api-ms-win-crt-process-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-process-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-time-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-time-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-runtime-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-runtime-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-locale-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-locale-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-heap-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-heap-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('zlib.dll', 'C:\\Users\\Administrator\\miniconda3\\zlib.dll', 'BINARY'),
|
||||||
|
('api-ms-win-crt-string-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-string-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-environment-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-environment-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-convert-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-convert-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-stdio-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-stdio-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-conio-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-conio-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('VCRUNTIME140.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\VCRUNTIME140.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-math-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-math-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-private-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-private-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-utility-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-utility-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('VCRUNTIME140_1.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\VCRUNTIME140_1.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('libexpat.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Library\\bin\\libexpat.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('libssl-3-x64.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Library\\bin\\libssl-3-x64.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('libcrypto-3-x64.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Library\\bin\\libcrypto-3-x64.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('libmpdec-4.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Library\\bin\\libmpdec-4.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('liblzma.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Library\\bin\\liblzma.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('LIBBZ2.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Library\\bin\\LIBBZ2.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('ffi.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Library\\bin\\ffi.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('python3.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\python3.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('ucrtbase.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\ucrtbase.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-synch-l1-2-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-synch-l1-2-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-console-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-console-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-processthreads-l1-1-1.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-processthreads-l1-1-1.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-debug-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-debug-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-string-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-string-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-profile-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-profile-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-localization-l1-2-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-localization-l1-2-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-file-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-file-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-timezone-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-timezone-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-heap-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-heap-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-memory-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-memory-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-file-l1-2-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-file-l1-2-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-interlocked-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-interlocked-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-util-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-util-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-handle-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-handle-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-synch-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-synch-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-fibers-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-fibers-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-processthreads-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-processthreads-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-datetime-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-datetime-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-file-l2-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-file-l2-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('sensor_stream_pb2.py',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\sensor_stream_pb2.py',
|
||||||
|
'DATA'),
|
||||||
|
('sensor_stream_pb2_grpc.py',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\sensor_stream_pb2_grpc.py',
|
||||||
|
'DATA'),
|
||||||
|
('grpc\\_cython\\_cygrpc\\private_key_signing\\private_key_signer_py_wrapper.cc',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\grpc\\_cython\\_cygrpc\\private_key_signing\\private_key_signer_py_wrapper.cc',
|
||||||
|
'DATA'),
|
||||||
|
('grpc\\_cython\\_cygrpc\\private_key_signing\\private_key_signer_py_wrapper.h',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\grpc\\_cython\\_cygrpc\\private_key_signing\\private_key_signer_py_wrapper.h',
|
||||||
|
'DATA'),
|
||||||
|
('grpc\\_cython\\_credentials\\roots.pem',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\grpc\\_cython\\_credentials\\roots.pem',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\WHEEL',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\WHEEL',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\distributions\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\distributions\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\REQUESTED',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\REQUESTED',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\mt19937\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\mt19937\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\sfc64\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\sfc64\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\linalg\\lapack_lite\\LICENSE.txt',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\linalg\\lapack_lite\\LICENSE.txt',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\random\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\random\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\INSTALLER',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\INSTALLER',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\multiarray\\dragon4_LICENSE.txt',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\multiarray\\dragon4_LICENSE.txt',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\fft\\pocketfft\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\fft\\pocketfft\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\ma\\LICENSE',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\ma\\LICENSE',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\entry_points.txt',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\entry_points.txt',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\common\\pythoncapi-compat\\COPYING',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\common\\pythoncapi-compat\\COPYING',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\LICENSE.txt',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\LICENSE.txt',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\splitmix64\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\splitmix64\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\umath\\svml\\LICENSE',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\umath\\svml\\LICENSE',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\include\\numpy\\libdivide\\LICENSE.txt',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\include\\numpy\\libdivide\\LICENSE.txt',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\DELVEWHEEL',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\DELVEWHEEL',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\npysort\\x86-simd-sort\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\npysort\\x86-simd-sort\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\METADATA',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\METADATA',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\philox\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\philox\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\RECORD',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\RECORD',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\highway\\LICENSE',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\highway\\LICENSE',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\pcg64\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\pcg64\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('base_library.zip',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\build\\je-skin-devkit-server\\base_library.zip',
|
||||||
|
'DATA')],
|
||||||
|
[],
|
||||||
|
False,
|
||||||
|
False,
|
||||||
|
1780277624,
|
||||||
|
[('run.exe',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\PyInstaller\\bootloader\\Windows-64bit-intel\\run.exe',
|
||||||
|
'EXECUTABLE')],
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\python313.dll')
|
||||||
401
devkit/build/je-skin-devkit-server/PKG-00.toc
Normal file
401
devkit/build/je-skin-devkit-server/PKG-00.toc
Normal file
@@ -0,0 +1,401 @@
|
|||||||
|
('D:\\Workspace\\je-skin-customer-demo\\devkit\\build\\je-skin-devkit-server\\je-skin-devkit-server.pkg',
|
||||||
|
{'BINARY': True,
|
||||||
|
'DATA': True,
|
||||||
|
'EXECUTABLE': True,
|
||||||
|
'EXTENSION': True,
|
||||||
|
'PYMODULE': True,
|
||||||
|
'PYSOURCE': True,
|
||||||
|
'PYZ': False,
|
||||||
|
'SPLASH': True,
|
||||||
|
'SYMLINK': False},
|
||||||
|
[('pyi-contents-directory _internal', '', 'OPTION'),
|
||||||
|
('PYZ-00.pyz',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\build\\je-skin-devkit-server\\PYZ-00.pyz',
|
||||||
|
'PYZ'),
|
||||||
|
('struct',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\build\\je-skin-devkit-server\\localpycs\\struct.pyc',
|
||||||
|
'PYMODULE'),
|
||||||
|
('pyimod01_archive',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\build\\je-skin-devkit-server\\localpycs\\pyimod01_archive.pyc',
|
||||||
|
'PYMODULE'),
|
||||||
|
('pyimod02_importers',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\build\\je-skin-devkit-server\\localpycs\\pyimod02_importers.pyc',
|
||||||
|
'PYMODULE'),
|
||||||
|
('pyimod03_ctypes',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\build\\je-skin-devkit-server\\localpycs\\pyimod03_ctypes.pyc',
|
||||||
|
'PYMODULE'),
|
||||||
|
('pyimod04_pywin32',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\build\\je-skin-devkit-server\\localpycs\\pyimod04_pywin32.pyc',
|
||||||
|
'PYMODULE'),
|
||||||
|
('pyiboot01_bootstrap',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
|
||||||
|
'PYSOURCE'),
|
||||||
|
('pyi_rth_inspect',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py',
|
||||||
|
'PYSOURCE'),
|
||||||
|
('pyi_rth_pkgutil',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py',
|
||||||
|
'PYSOURCE'),
|
||||||
|
('pyi_rth_multiprocessing',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py',
|
||||||
|
'PYSOURCE'),
|
||||||
|
('sensor_server',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\sensor_server.py',
|
||||||
|
'PYSOURCE'),
|
||||||
|
('python313.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\python313.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('numpy.libs\\libscipy_openblas64_-63c857e738469261263c764a36be9436.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy.libs\\libscipy_openblas64_-63c857e738469261263c764a36be9436.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('numpy.libs\\msvcp140-a4c2229bdc2a2a630acdc095b4d86008.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy.libs\\msvcp140-a4c2229bdc2a2a630acdc095b4d86008.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('select.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\select.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_multiprocessing.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_multiprocessing.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('pyexpat.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\pyexpat.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_ssl.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_ssl.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_hashlib.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_hashlib.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('unicodedata.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\unicodedata.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_decimal.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_decimal.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_socket.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_socket.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_lzma.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_lzma.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_bz2.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_bz2.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_ctypes.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_ctypes.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_queue.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_queue.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\_core\\_multiarray_tests.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\_core\\_multiarray_tests.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\_core\\_multiarray_umath.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\_core\\_multiarray_umath.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_overlapped.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_overlapped.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_asyncio.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_asyncio.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_wmi.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_wmi.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\linalg\\_umath_linalg.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\linalg\\_umath_linalg.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\mtrand.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\mtrand.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\bit_generator.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\bit_generator.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\_sfc64.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\_sfc64.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\_philox.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\_philox.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\_pcg64.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\_pcg64.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\_mt19937.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\_mt19937.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\_generator.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\_generator.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\_common.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\_common.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\random\\_bounded_integers.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\random\\_bounded_integers.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('numpy\\fft\\_pocketfft_umath.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy\\fft\\_pocketfft_umath.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('_elementtree.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\DLLs\\_elementtree.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('grpc\\_cython\\cygrpc.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\grpc\\_cython\\cygrpc.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('google\\_upb\\_message.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\google\\_upb\\_message.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('grpc_tools\\_protoc_compiler.cp313-win_amd64.pyd',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\grpc_tools\\_protoc_compiler.cp313-win_amd64.pyd',
|
||||||
|
'EXTENSION'),
|
||||||
|
('api-ms-win-crt-process-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-process-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-time-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-time-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-runtime-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-runtime-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-locale-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-locale-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-heap-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-heap-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('zlib.dll', 'C:\\Users\\Administrator\\miniconda3\\zlib.dll', 'BINARY'),
|
||||||
|
('api-ms-win-crt-string-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-string-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-filesystem-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-environment-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-environment-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-convert-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-convert-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-stdio-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-stdio-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-conio-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-conio-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('VCRUNTIME140.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\VCRUNTIME140.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-math-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-math-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-private-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-private-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-crt-utility-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-crt-utility-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('VCRUNTIME140_1.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\VCRUNTIME140_1.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('libexpat.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Library\\bin\\libexpat.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('libssl-3-x64.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Library\\bin\\libssl-3-x64.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('libcrypto-3-x64.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Library\\bin\\libcrypto-3-x64.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('libmpdec-4.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Library\\bin\\libmpdec-4.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('liblzma.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Library\\bin\\liblzma.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('LIBBZ2.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Library\\bin\\LIBBZ2.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('ffi.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Library\\bin\\ffi.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('python3.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\python3.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('ucrtbase.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\ucrtbase.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-synch-l1-2-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-synch-l1-2-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-errorhandling-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-console-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-console-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-processthreads-l1-1-1.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-processthreads-l1-1-1.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-debug-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-debug-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-string-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-string-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-profile-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-profile-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-localization-l1-2-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-localization-l1-2-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-file-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-file-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-timezone-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-timezone-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-processenvironment-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-sysinfo-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-rtlsupport-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-heap-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-heap-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-memory-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-memory-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-file-l1-2-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-file-l1-2-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-interlocked-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-interlocked-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-util-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-util-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-libraryloader-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-handle-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-handle-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-synch-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-synch-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-fibers-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-fibers-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-processthreads-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-processthreads-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-datetime-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-datetime-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-namedpipe-l1-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('api-ms-win-core-file-l2-1-0.dll',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\api-ms-win-core-file-l2-1-0.dll',
|
||||||
|
'BINARY'),
|
||||||
|
('sensor_stream_pb2.py',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\sensor_stream_pb2.py',
|
||||||
|
'DATA'),
|
||||||
|
('sensor_stream_pb2_grpc.py',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\sensor_stream_pb2_grpc.py',
|
||||||
|
'DATA'),
|
||||||
|
('grpc\\_cython\\_cygrpc\\private_key_signing\\private_key_signer_py_wrapper.cc',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\grpc\\_cython\\_cygrpc\\private_key_signing\\private_key_signer_py_wrapper.cc',
|
||||||
|
'DATA'),
|
||||||
|
('grpc\\_cython\\_cygrpc\\private_key_signing\\private_key_signer_py_wrapper.h',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\grpc\\_cython\\_cygrpc\\private_key_signing\\private_key_signer_py_wrapper.h',
|
||||||
|
'DATA'),
|
||||||
|
('grpc\\_cython\\_credentials\\roots.pem',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\grpc\\_cython\\_credentials\\roots.pem',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\WHEEL',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\WHEEL',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\distributions\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\distributions\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\REQUESTED',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\REQUESTED',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\mt19937\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\mt19937\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\sfc64\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\sfc64\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\linalg\\lapack_lite\\LICENSE.txt',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\linalg\\lapack_lite\\LICENSE.txt',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\random\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\random\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\INSTALLER',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\INSTALLER',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\multiarray\\dragon4_LICENSE.txt',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\multiarray\\dragon4_LICENSE.txt',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\fft\\pocketfft\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\fft\\pocketfft\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\ma\\LICENSE',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\ma\\LICENSE',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\entry_points.txt',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\entry_points.txt',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\common\\pythoncapi-compat\\COPYING',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\common\\pythoncapi-compat\\COPYING',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\LICENSE.txt',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\LICENSE.txt',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\splitmix64\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\splitmix64\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\umath\\svml\\LICENSE',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\umath\\svml\\LICENSE',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\include\\numpy\\libdivide\\LICENSE.txt',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\include\\numpy\\libdivide\\LICENSE.txt',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\DELVEWHEEL',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\DELVEWHEEL',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\npysort\\x86-simd-sort\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\npysort\\x86-simd-sort\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\METADATA',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\METADATA',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\philox\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\philox\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\RECORD',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\RECORD',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\highway\\LICENSE',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\_core\\src\\highway\\LICENSE',
|
||||||
|
'DATA'),
|
||||||
|
('numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\pcg64\\LICENSE.md',
|
||||||
|
'C:\\Users\\Administrator\\miniconda3\\Lib\\site-packages\\numpy-2.4.6.dist-info\\licenses\\numpy\\random\\src\\pcg64\\LICENSE.md',
|
||||||
|
'DATA'),
|
||||||
|
('base_library.zip',
|
||||||
|
'D:\\Workspace\\je-skin-customer-demo\\devkit\\build\\je-skin-devkit-server\\base_library.zip',
|
||||||
|
'DATA')],
|
||||||
|
'python313.dll',
|
||||||
|
False,
|
||||||
|
False,
|
||||||
|
False,
|
||||||
|
[],
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
None)
|
||||||
BIN
devkit/build/je-skin-devkit-server/PYZ-00.pyz
Normal file
BIN
devkit/build/je-skin-devkit-server/PYZ-00.pyz
Normal file
Binary file not shown.
1881
devkit/build/je-skin-devkit-server/PYZ-00.toc
Normal file
1881
devkit/build/je-skin-devkit-server/PYZ-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
BIN
devkit/build/je-skin-devkit-server/base_library.zip
Normal file
BIN
devkit/build/je-skin-devkit-server/base_library.zip
Normal file
Binary file not shown.
BIN
devkit/build/je-skin-devkit-server/je-skin-devkit-server.pkg
Normal file
BIN
devkit/build/je-skin-devkit-server/je-skin-devkit-server.pkg
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
devkit/build/je-skin-devkit-server/localpycs/pyimod03_ctypes.pyc
Normal file
BIN
devkit/build/je-skin-devkit-server/localpycs/pyimod03_ctypes.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
devkit/build/je-skin-devkit-server/localpycs/struct.pyc
Normal file
BIN
devkit/build/je-skin-devkit-server/localpycs/struct.pyc
Normal file
Binary file not shown.
@@ -0,0 +1,246 @@
|
|||||||
|
|
||||||
|
This file lists modules PyInstaller was not able to find. This does not
|
||||||
|
necessarily mean these modules are required for running your program. Both
|
||||||
|
Python's standard library and 3rd-party Python packages often conditionally
|
||||||
|
import optional modules, some of which may be available only on certain
|
||||||
|
platforms.
|
||||||
|
|
||||||
|
Types of import:
|
||||||
|
* top-level: imported at the top-level - look at these first
|
||||||
|
* conditional: imported within an if-statement
|
||||||
|
* delayed: imported within a function
|
||||||
|
* optional: imported within a try-except-statement
|
||||||
|
|
||||||
|
IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
|
||||||
|
tracking down the missing module yourself. Thanks!
|
||||||
|
|
||||||
|
missing module named pwd - imported by posixpath (delayed, conditional, optional), shutil (delayed, optional), tarfile (optional), pathlib._local (optional), subprocess (delayed, conditional, optional), http.server (delayed, optional), netrc (delayed, optional), getpass (delayed, optional)
|
||||||
|
missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib._local (optional), subprocess (delayed, conditional, optional)
|
||||||
|
missing module named 'collections.abc' - imported by traceback (top-level), typing (top-level), inspect (top-level), logging (top-level), importlib.resources.readers (top-level), selectors (top-level), tracemalloc (top-level), http.client (top-level), typing_extensions (top-level), asyncio.base_events (top-level), asyncio.coroutines (top-level), grpc.aio._metadata (top-level), google.protobuf.internal.containers (top-level), google.protobuf.internal.well_known_types (top-level), numpy._typing._array_like (top-level), numpy._typing._nested_sequence (conditional), numpy._typing._shape (top-level), numpy._typing._dtype_like (top-level), numpy.lib._function_base_impl (top-level), numpy.lib._npyio_impl (top-level), numpy.random._common (top-level), numpy.random._generator (top-level), numpy.random.bit_generator (top-level), numpy.random.mtrand (top-level), numpy.polynomial._polybase (top-level), xml.etree.ElementTree (top-level)
|
||||||
|
missing module named _posixsubprocess - imported by subprocess (conditional), multiprocessing.util (delayed)
|
||||||
|
missing module named fcntl - imported by subprocess (optional)
|
||||||
|
missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional)
|
||||||
|
missing module named _scproxy - imported by urllib.request (conditional)
|
||||||
|
missing module named termios - imported by tty (top-level), _pyrepl.pager (delayed, optional), getpass (optional)
|
||||||
|
missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||||
|
missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
|
||||||
|
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||||
|
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
|
||||||
|
missing module named posix - imported by os (conditional, optional), posixpath (optional), shutil (conditional), importlib._bootstrap_external (conditional)
|
||||||
|
missing module named resource - imported by posix (top-level)
|
||||||
|
missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
|
||||||
|
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
|
||||||
|
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||||
|
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
|
||||||
|
missing module named pyimod02_importers - imported by C:\Users\Administrator\miniconda3\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (delayed)
|
||||||
|
missing module named _dummy_thread - imported by numpy._core.arrayprint (optional)
|
||||||
|
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
|
||||||
|
missing module named annotationlib - imported by typing_extensions (conditional)
|
||||||
|
missing module named 'numpy_distutils.cpuinfo' - imported by numpy.f2py.diagnose (delayed, conditional, optional)
|
||||||
|
missing module named 'numpy_distutils.fcompiler' - imported by numpy.f2py.diagnose (delayed, conditional, optional)
|
||||||
|
missing module named 'numpy_distutils.command' - imported by numpy.f2py.diagnose (delayed, conditional, optional)
|
||||||
|
missing module named numpy_distutils - imported by numpy.f2py.diagnose (delayed, optional)
|
||||||
|
missing module named vms_lib - imported by platform (delayed, optional)
|
||||||
|
missing module named 'java.lang' - imported by platform (delayed, optional)
|
||||||
|
missing module named java - imported by platform (delayed)
|
||||||
|
missing module named psutil - imported by numpy.testing._private.utils (delayed, optional)
|
||||||
|
missing module named readline - imported by cmd (delayed, conditional, optional), code (delayed, conditional, optional), pdb (delayed, conditional, optional), rlcompleter (optional)
|
||||||
|
missing module named win32pdh - imported by numpy.testing._private.utils (delayed, conditional)
|
||||||
|
missing module named _typeshed - imported by numpy.random.bit_generator (top-level)
|
||||||
|
missing module named numpy.random.RandomState - imported by numpy.random (top-level), numpy.random._generator (top-level)
|
||||||
|
missing module named threadpoolctl - imported by numpy.lib._utils_impl (delayed, optional)
|
||||||
|
missing module named numpy._core.zeros - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.vstack - imported by numpy._core (top-level), numpy.lib._shape_base_impl (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.void - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.vecmat - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.vecdot - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.ushort - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.unsignedinteger - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.ulonglong - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.ulong - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.uintp - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.uintc - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.uint64 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||||
|
missing module named numpy._core.uint32 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||||
|
missing module named numpy._core.uint16 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||||
|
missing module named numpy._core.uint - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.ubyte - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.trunc - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.true_divide - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.transpose - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.lib._function_base_impl (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.trace - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.timedelta64 - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.tensordot - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.tanh - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.tan - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.swapaxes - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.sum - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.subtract - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.str_ - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.square - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.sqrt - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||||
|
missing module named numpy._core.spacing - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.sort - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.sinh - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.single - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.signedinteger - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.signbit - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||||
|
missing module named numpy._core.sign - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.short - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.rint - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.right_shift - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.result_type - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||||
|
missing module named numpy._core.remainder - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.reciprocal - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||||
|
missing module named numpy._core.radians - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.rad2deg - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.prod - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.power - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.positive - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.pi - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.outer - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.ones - imported by numpy._core (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.object_ - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||||
|
missing module named numpy._core.number - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||||
|
missing module named numpy._core.not_equal - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.nextafter - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.newaxis - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.negative - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.ndarray - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy.lib._utils_impl (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.multiply - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.moveaxis - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.modf - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.mod - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.minimum - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.maximum - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.max - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||||
|
missing module named numpy._core.matvec - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.matrix_transpose - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.matmul - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.longlong - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.longdouble - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.long - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.logical_xor - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.logical_or - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.logical_not - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.logical_and - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.logaddexp2 - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.logaddexp - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.log10 - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.log2 - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.log1p - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.log - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.linspace - imported by numpy._core (top-level), numpy.lib._index_tricks_impl (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.less_equal - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.less - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.left_shift - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.ldexp - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.lcm - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.isscalar - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.isnat - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.isnan - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||||
|
missing module named numpy._core.isfinite - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.intp - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy._array_api_info (top-level)
|
||||||
|
missing module named numpy._core.integer - imported by numpy._core (conditional), numpy (conditional), numpy.fft._helper (top-level)
|
||||||
|
missing module named numpy._core.intc - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.int64 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||||
|
missing module named numpy._core.int32 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||||
|
missing module named numpy._core.int16 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||||
|
missing module named numpy._core.int8 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||||
|
missing module named numpy._core.inf - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||||
|
missing module named numpy._core.inexact - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.iinfo - imported by numpy._core (top-level), numpy.lib._twodim_base_impl (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.hypot - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.hstack - imported by numpy._core (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.heaviside - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.half - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.greater_equal - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.greater - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.gcd - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.frompyfunc - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.frexp - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.fmod - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.fmin - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.fmax - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.floor_divide - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.floor - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.floating - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.float_power - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.float32 - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy._array_api_info (top-level)
|
||||||
|
missing module named numpy._core.float16 - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.finfo - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.fabs - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.expm1 - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.exp2 - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.exp - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.euler_gamma - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.errstate - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||||
|
missing module named numpy._core.equal - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.empty_like - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||||
|
missing module named numpy._core.empty - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy.fft._helper (top-level)
|
||||||
|
missing module named numpy._core.e - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.double - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.dot - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.divmod - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.divide - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.diagonal - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.degrees - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.deg2rad - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.datetime64 - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.csingle - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.cross - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.count_nonzero - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.cosh - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.cos - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.copysign - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.conjugate - imported by numpy._core (conditional), numpy (conditional), numpy.fft._pocketfft (top-level)
|
||||||
|
missing module named numpy._core.conj - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.complexfloating - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.complex64 - imported by numpy._core (conditional), numpy (conditional), numpy._array_api_info (top-level)
|
||||||
|
missing module named numpy._core.clongdouble - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.character - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.ceil - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.cdouble - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.cbrt - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.bytes_ - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.byte - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.bool_ - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.bitwise_xor - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.bitwise_or - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.bitwise_count - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.bitwise_and - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.atleast_3d - imported by numpy._core (top-level), numpy.lib._shape_base_impl (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.atleast_2d - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.atleast_1d - imported by numpy._core (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.asarray - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.lib._array_utils_impl (top-level), numpy (conditional), numpy.fft._helper (top-level), numpy.fft._pocketfft (top-level)
|
||||||
|
missing module named numpy._core.asanyarray - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.array_repr - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.array2string - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||||
|
missing module named numpy._core.array - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (top-level), numpy.lib._polynomial_impl (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.argsort - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.arctanh - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.arctan2 - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.arctan - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.arcsinh - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.arcsin - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.arccosh - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.arccos - imported by numpy._core (conditional), numpy (conditional)
|
||||||
|
missing module named numpy._core.arange - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), numpy (conditional), numpy.fft._helper (top-level)
|
||||||
|
missing module named numpy._core.amin - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.amax - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named numpy._core.all - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional)
|
||||||
|
missing module named numpy._core.add - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional)
|
||||||
|
missing module named yaml - imported by numpy.__config__ (delayed)
|
||||||
|
missing module named numpy._distributor_init_local - imported by numpy (optional), numpy._distributor_init (optional)
|
||||||
|
missing module named defusedxml - imported by openpyxl.xml (delayed, optional)
|
||||||
|
missing module named lxml - imported by openpyxl.xml (delayed, optional)
|
||||||
|
missing module named 'defusedxml.ElementTree' - imported by openpyxl.xml.functions (conditional)
|
||||||
|
missing module named 'lxml.etree' - imported by openpyxl.xml.functions (conditional)
|
||||||
|
missing module named PIL - imported by openpyxl.drawing.image (optional)
|
||||||
|
missing module named openpyxl.tests - imported by openpyxl.reader.excel (optional)
|
||||||
|
missing module named google.protobuf.pyext._message - imported by google.protobuf.pyext (conditional, optional), google.protobuf.internal.api_implementation (conditional, optional), google.protobuf.descriptor (conditional), google.protobuf.pyext.cpp_message (conditional)
|
||||||
|
missing module named google.protobuf.enable_deterministic_proto_serialization - imported by google.protobuf (optional), google.protobuf.internal.api_implementation (optional)
|
||||||
|
missing module named google.protobuf.internal._api_implementation - imported by google.protobuf.internal (optional), google.protobuf.internal.api_implementation (optional)
|
||||||
|
missing module named grpc_reflection - imported by grpc (optional)
|
||||||
|
missing module named grpc_health - imported by grpc (optional)
|
||||||
|
missing module named pkg_resources - imported by grpc_tools.protoc (conditional)
|
||||||
26418
devkit/build/je-skin-devkit-server/xref-je-skin-devkit-server.html
Normal file
26418
devkit/build/je-skin-devkit-server/xref-je-skin-devkit-server.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
devkit/dist/je-skin-devkit-server.exe
vendored
Normal file
BIN
devkit/dist/je-skin-devkit-server.exe
vendored
Normal file
Binary file not shown.
@@ -5,8 +5,8 @@ a = Analysis(
|
|||||||
['sensor_server.py'],
|
['sensor_server.py'],
|
||||||
pathex=[],
|
pathex=[],
|
||||||
binaries=[],
|
binaries=[],
|
||||||
datas=[('sensor_stream_pb2.py', '.'), ('sensor_stream_pb2_grpc.py', '.')],
|
datas=[('sensor_stream_pb2*.py', '.')],
|
||||||
hiddenimports=['grpc', 'openpyxl', 'numpy'],
|
hiddenimports=['grpc', 'openpyxl'],
|
||||||
hookspath=[],
|
hookspath=[],
|
||||||
hooksconfig={},
|
hooksconfig={},
|
||||||
runtime_hooks=[],
|
runtime_hooks=[],
|
||||||
|
|||||||
@@ -235,25 +235,45 @@ class SensorPushServicer(sensor_stream_pb2_grpc.SensorPushServicer):
|
|||||||
self.frame_count = 0
|
self.frame_count = 0
|
||||||
self.last_report_time = time.time()
|
self.last_report_time = time.time()
|
||||||
self.last_angle = None
|
self.last_angle = None
|
||||||
|
self.last_state = 0
|
||||||
|
self.last_magnitude = 0.0
|
||||||
|
|
||||||
def Upload(self, request_iterator, context):
|
def Upload(self, request_iterator, context):
|
||||||
print("[SensorPush] Client connected, waiting for frames...")
|
print("[SensorPush] Client connected, waiting for frames...")
|
||||||
reset_baseline()
|
reset_baseline()
|
||||||
self.last_angle = None
|
self.last_angle = None
|
||||||
|
self.last_state = 0
|
||||||
|
self.last_magnitude = 0.0
|
||||||
|
|
||||||
for frame in request_iterator:
|
for frame in request_iterator:
|
||||||
self.frame_count += 1
|
self.frame_count += 1
|
||||||
angle = 0.0
|
angle = 0.0
|
||||||
|
magnitude = 0.0
|
||||||
|
state = 0
|
||||||
|
cop_x = 0.0
|
||||||
|
cop_y = 0.0
|
||||||
|
base_x = 0.0
|
||||||
|
base_y = 0.0
|
||||||
|
total_press = 0.0
|
||||||
|
threshold = 0.0
|
||||||
ok = True
|
ok = True
|
||||||
message = "OK"
|
message = "OK"
|
||||||
if len(frame.matrix) == SENSOR_ROWS * SENSOR_COLS:
|
if len(frame.matrix) == SENSOR_ROWS * SENSOR_COLS:
|
||||||
try:
|
try:
|
||||||
angle = get_pzt_angle(frame.matrix)
|
result = get_pzt_angle(frame.matrix, float(frame.dts_ms))
|
||||||
|
angle, magnitude, state, cop_x, cop_y, base_x, base_y, total_press, threshold = result
|
||||||
|
threshold = threshold or 0.0
|
||||||
self.last_angle = angle
|
self.last_angle = angle
|
||||||
|
self.last_state = state
|
||||||
|
self.last_magnitude = magnitude
|
||||||
if self.frame_count <= 10 or self.frame_count % 30 == 0:
|
if self.frame_count <= 10 or self.frame_count % 30 == 0:
|
||||||
print(
|
print(
|
||||||
f"[SensorPush] PZT angle frame #{frame.seq} "
|
f"[SensorPush] PZT angle frame #{frame.seq} "
|
||||||
f"dts={frame.dts_ms} angle={angle:.2f} "
|
f"dts={frame.dts_ms} angle={angle:.2f} "
|
||||||
|
f"mag={magnitude:.2f} state={state} "
|
||||||
|
f"cop=({cop_x:.2f},{cop_y:.2f}) "
|
||||||
|
f"base=({base_x:.2f},{base_y:.2f}) "
|
||||||
|
f"total={total_press:.2f} threshold={threshold:.2f}"
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
ok = False
|
ok = False
|
||||||
@@ -270,6 +290,14 @@ class SensorPushServicer(sensor_stream_pb2_grpc.SensorPushServicer):
|
|||||||
dts_ms=frame.dts_ms,
|
dts_ms=frame.dts_ms,
|
||||||
ok=ok,
|
ok=ok,
|
||||||
message=message,
|
message=message,
|
||||||
|
magnitude=magnitude,
|
||||||
|
state=state,
|
||||||
|
cop_x=cop_x,
|
||||||
|
cop_y=cop_y,
|
||||||
|
base_x=base_x,
|
||||||
|
base_y=base_y,
|
||||||
|
total_press=total_press,
|
||||||
|
threshold=threshold or 0.0,
|
||||||
)
|
)
|
||||||
|
|
||||||
if self.frame_count % 100 == 0:
|
if self.frame_count % 100 == 0:
|
||||||
@@ -286,6 +314,8 @@ class SensorPushServicer(sensor_stream_pb2_grpc.SensorPushServicer):
|
|||||||
f"[SensorPush] Frame #{frame.seq} | "
|
f"[SensorPush] Frame #{frame.seq} | "
|
||||||
f"{frame.rows}x{frame.cols} | "
|
f"{frame.rows}x{frame.cols} | "
|
||||||
f"angle={angle_text} | "
|
f"angle={angle_text} | "
|
||||||
|
f"mag={self.last_magnitude:.2f} | "
|
||||||
|
f"state={self.last_state} | "
|
||||||
f"force={frame.resultant_force:.1f} | "
|
f"force={frame.resultant_force:.1f} | "
|
||||||
f"total={self.frame_count} | ~{fps:.1f} fps"
|
f"total={self.frame_count} | ~{fps:.1f} fps"
|
||||||
)
|
)
|
||||||
@@ -351,14 +381,24 @@ def serve(port: int):
|
|||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import threading
|
import threading
|
||||||
|
from collections import deque
|
||||||
|
|
||||||
# ===================== 算法参数=====================
|
# ===================== 切向力算法参数 ======================
|
||||||
TOTAL_PRESSURE_LOW_THRESHOLD = 500
|
COP_INIT_MEDIAN_FRAMES = 1
|
||||||
COP_STABILITY_FRAMES_REQUIRED = 5
|
NOISE_COLLECT_FRAMES = 20
|
||||||
|
THRESH_K = 5
|
||||||
SENSOR_ROWS = 12
|
SENSOR_ROWS = 12
|
||||||
SENSOR_COLS = 7
|
SENSOR_COLS = 7
|
||||||
|
|
||||||
# ===================== 线程安全全局状态 =====================
|
SNAP_CENTER_X, SNAP_CENTER_Y = 3.0, 5.5
|
||||||
|
SNAP_RANGE_X = 0.0
|
||||||
|
SNAP_RANGE_Y = 0.0
|
||||||
|
|
||||||
|
POST_INIT_WINDOW_CNT = 600000
|
||||||
|
POST_INIT_STABLE_CNT = 500
|
||||||
|
POST_INIT_STABLE_THRESH = 0.1
|
||||||
|
|
||||||
|
# ===================== 线程安全全局状态 ======================
|
||||||
first_frame = None
|
first_frame = None
|
||||||
first_frame_lock = threading.Lock()
|
first_frame_lock = threading.Lock()
|
||||||
|
|
||||||
@@ -366,7 +406,17 @@ first_contact_CoP_x = None
|
|||||||
first_contact_CoP_y = None
|
first_contact_CoP_y = None
|
||||||
contact_initialized = False
|
contact_initialized = False
|
||||||
|
|
||||||
total_pressure_low_counter = 0
|
cop_init_x_buf = deque(maxlen=COP_INIT_MEDIAN_FRAMES)
|
||||||
|
cop_init_y_buf = deque(maxlen=COP_INIT_MEDIAN_FRAMES)
|
||||||
|
|
||||||
|
noise_sum_buf = deque(maxlen=NOISE_COLLECT_FRAMES)
|
||||||
|
dynamic_thresh = None
|
||||||
|
|
||||||
|
post_init_frame_cnt = 0
|
||||||
|
post_stable_cnt = 0
|
||||||
|
post_refined_flag = False
|
||||||
|
post_cand_x = None
|
||||||
|
post_cand_y = None
|
||||||
|
|
||||||
# ===================== 基线减除 =====================
|
# ===================== 基线减除 =====================
|
||||||
def subtract_baseline(current_frame):
|
def subtract_baseline(current_frame):
|
||||||
@@ -381,36 +431,46 @@ def subtract_baseline(current_frame):
|
|||||||
return np.clip(diff, 0, None)
|
return np.clip(diff, 0, None)
|
||||||
|
|
||||||
# ===================== 重置CoP状态 =====================
|
# ===================== 重置CoP状态 =====================
|
||||||
def reset_cop_state():
|
def _legacy_reset_cop_state():
|
||||||
global first_contact_CoP_x, first_contact_CoP_y, contact_initialized
|
global first_contact_CoP_x, first_contact_CoP_y, contact_initialized
|
||||||
global total_pressure_low_counter
|
global post_init_frame_cnt, post_stable_cnt, post_refined_flag
|
||||||
|
global post_cand_x, post_cand_y
|
||||||
|
|
||||||
first_contact_CoP_x = None
|
first_contact_CoP_x = None
|
||||||
first_contact_CoP_y = None
|
first_contact_CoP_y = None
|
||||||
contact_initialized = False
|
contact_initialized = False
|
||||||
total_pressure_low_counter = 0
|
cop_init_x_buf.clear()
|
||||||
|
cop_init_y_buf.clear()
|
||||||
|
post_init_frame_cnt = 0
|
||||||
|
post_stable_cnt = 0
|
||||||
|
post_refined_flag = False
|
||||||
|
post_cand_x = None
|
||||||
|
post_cand_y = None
|
||||||
|
|
||||||
# ===================== CoP压力中心计算 =====================
|
|
||||||
def compute_pressure_direction(baseline_subtracted_frame):
|
# ===================== CoP压力中心计算(新算法) =====================
|
||||||
|
def _legacy_compute_pressure_direction(baseline_subtracted_frame):
|
||||||
global first_contact_CoP_x, first_contact_CoP_y, contact_initialized
|
global first_contact_CoP_x, first_contact_CoP_y, contact_initialized
|
||||||
global total_pressure_low_counter
|
global post_init_frame_cnt, post_stable_cnt, post_refined_flag
|
||||||
|
global post_cand_x, post_cand_y
|
||||||
|
global noise_sum_buf, dynamic_thresh
|
||||||
|
|
||||||
rows, cols = SENSOR_ROWS, SENSOR_COLS
|
rows, cols = SENSOR_ROWS, SENSOR_COLS
|
||||||
frame_flat = np.asarray(baseline_subtracted_frame, dtype=np.float32).flatten()
|
frame_flat = np.asarray(baseline_subtracted_frame, dtype=np.float32).flatten()
|
||||||
frame2d = frame_flat.reshape(rows, cols)
|
frame2d = frame_flat.reshape(rows, cols)
|
||||||
|
|
||||||
total_pressure = np.sum(frame2d)
|
total_pressure = np.sum(frame2d)
|
||||||
if total_pressure < TOTAL_PRESSURE_LOW_THRESHOLD:
|
|
||||||
total_pressure_low_counter += 1
|
|
||||||
else:
|
|
||||||
total_pressure_low_counter = 0
|
|
||||||
|
|
||||||
if total_pressure_low_counter >= COP_STABILITY_FRAMES_REQUIRED:
|
if dynamic_thresh is None:
|
||||||
reset_cop_state()
|
noise_sum_buf.append(total_pressure)
|
||||||
return 0.0, 0.0
|
if len(noise_sum_buf) >= NOISE_COLLECT_FRAMES:
|
||||||
|
sums = np.array(noise_sum_buf)
|
||||||
|
dynamic_thresh = THRESH_K * float(np.mean(sums))
|
||||||
|
|
||||||
if total_pressure == 0:
|
if total_pressure == 0 or (dynamic_thresh is not None and total_pressure < dynamic_thresh):
|
||||||
return 0.0, 0.0
|
if contact_initialized and dynamic_thresh is not None:
|
||||||
|
_legacy_reset_cop_state()
|
||||||
|
return 0.0, 0.0, 0, rows-1, 0, cols-1, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0.0, dynamic_thresh
|
||||||
|
|
||||||
x_grid = np.tile(np.arange(cols), (rows, 1))
|
x_grid = np.tile(np.arange(cols), (rows, 1))
|
||||||
y_grid = np.repeat(np.arange(rows), cols).reshape(rows, cols)
|
y_grid = np.repeat(np.arange(rows), cols).reshape(rows, cols)
|
||||||
@@ -419,19 +479,69 @@ def compute_pressure_direction(baseline_subtracted_frame):
|
|||||||
|
|
||||||
delta_CoP_x = 0.0
|
delta_CoP_x = 0.0
|
||||||
delta_CoP_y = 0.0
|
delta_CoP_y = 0.0
|
||||||
|
base_x = cop_x
|
||||||
|
base_y = cop_y
|
||||||
|
|
||||||
if not contact_initialized:
|
if not contact_initialized:
|
||||||
first_contact_CoP_x = cop_x
|
cop_init_x_buf.append(cop_x)
|
||||||
first_contact_CoP_y = cop_y
|
cop_init_y_buf.append(cop_y)
|
||||||
contact_initialized = True
|
|
||||||
else:
|
|
||||||
delta_CoP_x = cop_x - first_contact_CoP_x
|
|
||||||
delta_CoP_y = cop_y - first_contact_CoP_y
|
|
||||||
|
|
||||||
return delta_CoP_x, delta_CoP_y
|
if len(cop_init_x_buf) >= COP_INIT_MEDIAN_FRAMES:
|
||||||
|
first_contact_CoP_x = float(np.median(cop_init_x_buf))
|
||||||
|
first_contact_CoP_y = float(np.median(cop_init_y_buf))
|
||||||
|
contact_initialized = True
|
||||||
|
cop_init_x_buf.clear()
|
||||||
|
cop_init_y_buf.clear()
|
||||||
|
if (abs(first_contact_CoP_x - SNAP_CENTER_X) <= SNAP_RANGE_X and
|
||||||
|
abs(first_contact_CoP_y - SNAP_CENTER_Y) <= SNAP_RANGE_Y):
|
||||||
|
first_contact_CoP_x = SNAP_CENTER_X
|
||||||
|
first_contact_CoP_y = SNAP_CENTER_Y
|
||||||
|
|
||||||
|
else:
|
||||||
|
post_init_frame_cnt += 1
|
||||||
|
if not post_refined_flag and post_init_frame_cnt <= POST_INIT_WINDOW_CNT:
|
||||||
|
if post_cand_x is not None:
|
||||||
|
dist_val = np.hypot(cop_x - post_cand_x, cop_y - post_cand_y)
|
||||||
|
if dist_val <= POST_INIT_STABLE_THRESH:
|
||||||
|
post_stable_cnt += 1
|
||||||
|
else:
|
||||||
|
post_cand_x = cop_x
|
||||||
|
post_cand_y = cop_y
|
||||||
|
post_stable_cnt = 1
|
||||||
|
else:
|
||||||
|
post_cand_x = cop_x
|
||||||
|
post_cand_y = cop_y
|
||||||
|
post_stable_cnt = 1
|
||||||
|
|
||||||
|
if post_stable_cnt >= POST_INIT_STABLE_CNT:
|
||||||
|
first_contact_CoP_x = post_cand_x
|
||||||
|
first_contact_CoP_y = post_cand_y
|
||||||
|
post_refined_flag = True
|
||||||
|
else:
|
||||||
|
post_refined_flag = True
|
||||||
|
|
||||||
|
delta_CoP_x = cop_x - first_contact_CoP_x
|
||||||
|
delta_CoP_y = first_contact_CoP_y - cop_y
|
||||||
|
base_x = first_contact_CoP_x
|
||||||
|
base_y = first_contact_CoP_y
|
||||||
|
|
||||||
|
magnitude = np.hypot(delta_CoP_x, delta_CoP_y)
|
||||||
|
if not contact_initialized:
|
||||||
|
state = 0
|
||||||
|
elif not post_refined_flag:
|
||||||
|
state = 1
|
||||||
|
else:
|
||||||
|
state = 2
|
||||||
|
|
||||||
|
return (cop_x, cop_y,
|
||||||
|
0, rows-1, 0, cols-1,
|
||||||
|
delta_CoP_x, delta_CoP_y,
|
||||||
|
base_x, base_y,
|
||||||
|
magnitude, state,
|
||||||
|
total_pressure, dynamic_thresh)
|
||||||
|
|
||||||
# ===================== 角度计算核心 =====================
|
# ===================== 角度计算核心 =====================
|
||||||
def compute_vector_angle(x: float, y: float) -> tuple[float, float]:
|
def _legacy_compute_vector_angle(x: float, y: float) -> tuple[float, float]:
|
||||||
epsilon = 1e-8
|
epsilon = 1e-8
|
||||||
mag = np.hypot(x, y)
|
mag = np.hypot(x, y)
|
||||||
angle = np.degrees(np.arctan2(y, x + epsilon))
|
angle = np.degrees(np.arctan2(y, x + epsilon))
|
||||||
@@ -439,25 +549,425 @@ def compute_vector_angle(x: float, y: float) -> tuple[float, float]:
|
|||||||
angle += 360
|
angle += 360
|
||||||
return angle, mag
|
return angle, mag
|
||||||
|
|
||||||
def compute_PZT_angle(Px: float, Py: float) -> tuple[float, float]:
|
def _legacy_compute_PZT_angle(Px: float, Py: float) -> tuple[float, float]:
|
||||||
return compute_vector_angle(Px, -Py)
|
return _legacy_compute_vector_angle(Px, Py)
|
||||||
|
|
||||||
# ===================== 核心入口函数 =====================
|
# ===================== 核心入口函数 =====================
|
||||||
def get_pzt_angle(adc_data):
|
def _legacy_get_pzt_angle(adc_data):
|
||||||
if len(adc_data) != 84:
|
if len(adc_data) != 84:
|
||||||
raise ValueError("ADC数据长度必须为84")
|
raise ValueError("ADC数据长度必须为84")
|
||||||
baseline_subtracted = subtract_baseline(adc_data)
|
result = _legacy_compute_pressure_direction(adc_data)
|
||||||
dx, dy = compute_pressure_direction(baseline_subtracted)
|
cop_x, cop_y = result[0], result[1]
|
||||||
pzt_angle, _ = compute_PZT_angle(dx, dy)
|
dx, dy = result[6], result[7]
|
||||||
|
base_x, base_y = result[8], result[9]
|
||||||
return pzt_angle
|
magnitude = result[10]
|
||||||
|
state = int(result[11])
|
||||||
|
total_press = result[12]
|
||||||
|
threshold = result[13]
|
||||||
|
pzt_angle, _ = _legacy_compute_PZT_angle(dx, dy)
|
||||||
|
return pzt_angle, magnitude, state, cop_x, cop_y, base_x, base_y, total_press, threshold
|
||||||
|
|
||||||
# ===================== 重置基线(校准用) =====================
|
# ===================== 重置基线(校准用) =====================
|
||||||
def reset_baseline():
|
def _legacy_reset_baseline():
|
||||||
global first_frame
|
global first_frame, noise_sum_buf, dynamic_thresh
|
||||||
with first_frame_lock:
|
with first_frame_lock:
|
||||||
first_frame = None
|
first_frame = None
|
||||||
reset_cop_state()
|
noise_sum_buf.clear()
|
||||||
|
dynamic_thresh = None
|
||||||
|
_legacy_reset_cop_state()
|
||||||
|
|
||||||
|
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from enum import IntEnum
|
||||||
|
from typing import Optional, Tuple
|
||||||
|
|
||||||
|
|
||||||
|
ADC_LEN = SENSOR_ROWS * SENSOR_COLS
|
||||||
|
|
||||||
|
|
||||||
|
class CoPState(IntEnum):
|
||||||
|
NO_CONTACT = 0
|
||||||
|
INIT_COLLECTING = 1
|
||||||
|
POST_REFINING = 2
|
||||||
|
READY = 3
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class CoPResult:
|
||||||
|
cop_x: float
|
||||||
|
cop_y: float
|
||||||
|
row_min: int
|
||||||
|
row_max: int
|
||||||
|
col_min: int
|
||||||
|
col_max: int
|
||||||
|
dx: float
|
||||||
|
dy: float
|
||||||
|
base_x: float
|
||||||
|
base_y: float
|
||||||
|
magnitude: float
|
||||||
|
state: int
|
||||||
|
total_pressure: float
|
||||||
|
threshold: Optional[float]
|
||||||
|
angle: float
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class CoPConfig:
|
||||||
|
rows: int = SENSOR_ROWS
|
||||||
|
cols: int = SENSOR_COLS
|
||||||
|
noise_collect_ms: float = 300.0
|
||||||
|
thresh_k: float = 5.0
|
||||||
|
min_threshold: float = 50.0
|
||||||
|
contact_confirm_ms: float = 20.0
|
||||||
|
release_confirm_ms: float = 50.0
|
||||||
|
init_collect_ms: float = 80.0
|
||||||
|
snap_enable: bool = True
|
||||||
|
snap_center_x: float = 3.0
|
||||||
|
snap_center_y: float = 5.5
|
||||||
|
snap_range_x: float = 0.25
|
||||||
|
snap_range_y: float = 0.25
|
||||||
|
post_refine_enable: bool = True
|
||||||
|
post_refine_window_ms: float = 800.0
|
||||||
|
post_stable_ms: float = 200.0
|
||||||
|
post_stable_thresh: float = 0.1
|
||||||
|
cop_lpf_alpha: float = 0.25
|
||||||
|
epsilon: float = 1e-8
|
||||||
|
|
||||||
|
|
||||||
|
class PressureDirectionEstimator:
|
||||||
|
def __init__(self, config: CoPConfig = CoPConfig()):
|
||||||
|
self.cfg = config
|
||||||
|
self.reset_all()
|
||||||
|
|
||||||
|
def reset_all(self):
|
||||||
|
self.dynamic_thresh: Optional[float] = None
|
||||||
|
self.noise_samples = []
|
||||||
|
self.noise_start_ms: Optional[float] = None
|
||||||
|
self.reset_contact_state()
|
||||||
|
|
||||||
|
def reset_contact_state(self):
|
||||||
|
self.first_contact_cop_x: Optional[float] = None
|
||||||
|
self.first_contact_cop_y: Optional[float] = None
|
||||||
|
self.state = CoPState.NO_CONTACT
|
||||||
|
self.init_x_buf = []
|
||||||
|
self.init_y_buf = []
|
||||||
|
self.init_start_ms: Optional[float] = None
|
||||||
|
self.post_start_ms: Optional[float] = None
|
||||||
|
self.post_stable_start_ms: Optional[float] = None
|
||||||
|
self.post_cand_x: Optional[float] = None
|
||||||
|
self.post_cand_y: Optional[float] = None
|
||||||
|
self.post_refined = False
|
||||||
|
self.contact_candidate_start_ms: Optional[float] = None
|
||||||
|
self.release_candidate_start_ms: Optional[float] = None
|
||||||
|
self.filtered_cop_x: Optional[float] = None
|
||||||
|
self.filtered_cop_y: Optional[float] = None
|
||||||
|
|
||||||
|
def update(self, adc_data, timestamp_ms: float) -> CoPResult:
|
||||||
|
frame2d = self._prepare_frame(adc_data)
|
||||||
|
total_pressure = float(np.sum(frame2d))
|
||||||
|
|
||||||
|
self._update_dynamic_threshold(total_pressure, timestamp_ms)
|
||||||
|
|
||||||
|
raw_contact = self._is_raw_contact(total_pressure)
|
||||||
|
contact_valid = self._debounce_contact(raw_contact, timestamp_ms)
|
||||||
|
|
||||||
|
if not contact_valid:
|
||||||
|
self._handle_no_contact()
|
||||||
|
return self._make_empty_result(total_pressure)
|
||||||
|
|
||||||
|
cop_x, cop_y = self._compute_cop(frame2d, total_pressure)
|
||||||
|
cop_x, cop_y = self._filter_cop(cop_x, cop_y)
|
||||||
|
|
||||||
|
self._update_state_machine(cop_x, cop_y, timestamp_ms)
|
||||||
|
|
||||||
|
if self.first_contact_cop_x is None or self.first_contact_cop_y is None:
|
||||||
|
dx = 0.0
|
||||||
|
dy = 0.0
|
||||||
|
base_x = cop_x
|
||||||
|
base_y = cop_y
|
||||||
|
else:
|
||||||
|
base_x = self.first_contact_cop_x
|
||||||
|
base_y = self.first_contact_cop_y
|
||||||
|
dx = cop_x - base_x
|
||||||
|
dy = base_y - cop_y
|
||||||
|
|
||||||
|
magnitude = float(np.hypot(dx, dy))
|
||||||
|
angle = self.compute_vector_angle(dx, dy)[0]
|
||||||
|
|
||||||
|
return CoPResult(
|
||||||
|
cop_x=float(cop_x),
|
||||||
|
cop_y=float(cop_y),
|
||||||
|
row_min=0,
|
||||||
|
row_max=self.cfg.rows - 1,
|
||||||
|
col_min=0,
|
||||||
|
col_max=self.cfg.cols - 1,
|
||||||
|
dx=float(dx),
|
||||||
|
dy=float(dy),
|
||||||
|
base_x=float(base_x),
|
||||||
|
base_y=float(base_y),
|
||||||
|
magnitude=magnitude,
|
||||||
|
state=int(self.state),
|
||||||
|
total_pressure=total_pressure,
|
||||||
|
threshold=self.dynamic_thresh,
|
||||||
|
angle=float(angle),
|
||||||
|
)
|
||||||
|
|
||||||
|
def _prepare_frame(self, adc_data) -> np.ndarray:
|
||||||
|
arr = np.asarray(adc_data, dtype=np.float32).flatten()
|
||||||
|
expected_len = self.cfg.rows * self.cfg.cols
|
||||||
|
|
||||||
|
if len(arr) != expected_len:
|
||||||
|
raise ValueError(f"ADC数据长度必须为{expected_len},当前为{len(arr)}")
|
||||||
|
|
||||||
|
arr = np.clip(arr, 0, None)
|
||||||
|
return arr.reshape(self.cfg.rows, self.cfg.cols)
|
||||||
|
|
||||||
|
def _update_dynamic_threshold(self, total_pressure: float, timestamp_ms: float):
|
||||||
|
if self.dynamic_thresh is not None:
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.noise_start_ms is None:
|
||||||
|
self.noise_start_ms = timestamp_ms
|
||||||
|
|
||||||
|
self.noise_samples.append(total_pressure)
|
||||||
|
|
||||||
|
if timestamp_ms - self.noise_start_ms >= self.cfg.noise_collect_ms:
|
||||||
|
samples = np.asarray(self.noise_samples, dtype=np.float32)
|
||||||
|
mean_val = float(np.mean(samples))
|
||||||
|
std_val = float(np.std(samples))
|
||||||
|
thresh = mean_val + self.cfg.thresh_k * std_val
|
||||||
|
self.dynamic_thresh = max(thresh, self.cfg.min_threshold)
|
||||||
|
|
||||||
|
def _is_raw_contact(self, total_pressure: float) -> bool:
|
||||||
|
if self.dynamic_thresh is None:
|
||||||
|
return False
|
||||||
|
return total_pressure >= self.dynamic_thresh
|
||||||
|
|
||||||
|
def _debounce_contact(self, raw_contact: bool, timestamp_ms: float) -> bool:
|
||||||
|
currently_in_contact = self.state != CoPState.NO_CONTACT
|
||||||
|
|
||||||
|
if raw_contact:
|
||||||
|
self.release_candidate_start_ms = None
|
||||||
|
|
||||||
|
if currently_in_contact:
|
||||||
|
return True
|
||||||
|
|
||||||
|
if self.contact_candidate_start_ms is None:
|
||||||
|
self.contact_candidate_start_ms = timestamp_ms
|
||||||
|
|
||||||
|
return timestamp_ms - self.contact_candidate_start_ms >= self.cfg.contact_confirm_ms
|
||||||
|
|
||||||
|
self.contact_candidate_start_ms = None
|
||||||
|
|
||||||
|
if not currently_in_contact:
|
||||||
|
return False
|
||||||
|
|
||||||
|
if self.release_candidate_start_ms is None:
|
||||||
|
self.release_candidate_start_ms = timestamp_ms
|
||||||
|
|
||||||
|
if timestamp_ms - self.release_candidate_start_ms >= self.cfg.release_confirm_ms:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _handle_no_contact(self):
|
||||||
|
if self.state != CoPState.NO_CONTACT:
|
||||||
|
self.reset_contact_state()
|
||||||
|
|
||||||
|
def _compute_cop(self, frame2d: np.ndarray, total_pressure: float) -> Tuple[float, float]:
|
||||||
|
rows, cols = self.cfg.rows, self.cfg.cols
|
||||||
|
x_grid = np.tile(np.arange(cols, dtype=np.float32), (rows, 1))
|
||||||
|
y_grid = np.repeat(np.arange(rows, dtype=np.float32), cols).reshape(rows, cols)
|
||||||
|
cop_x = float(np.sum(frame2d * x_grid) / total_pressure)
|
||||||
|
cop_y = float(np.sum(frame2d * y_grid) / total_pressure)
|
||||||
|
return cop_x, cop_y
|
||||||
|
|
||||||
|
def _filter_cop(self, cop_x: float, cop_y: float) -> Tuple[float, float]:
|
||||||
|
alpha = self.cfg.cop_lpf_alpha
|
||||||
|
|
||||||
|
if alpha <= 0.0:
|
||||||
|
return cop_x, cop_y
|
||||||
|
|
||||||
|
if self.filtered_cop_x is None or self.filtered_cop_y is None:
|
||||||
|
self.filtered_cop_x = cop_x
|
||||||
|
self.filtered_cop_y = cop_y
|
||||||
|
else:
|
||||||
|
self.filtered_cop_x = alpha * cop_x + (1.0 - alpha) * self.filtered_cop_x
|
||||||
|
self.filtered_cop_y = alpha * cop_y + (1.0 - alpha) * self.filtered_cop_y
|
||||||
|
|
||||||
|
return self.filtered_cop_x, self.filtered_cop_y
|
||||||
|
|
||||||
|
def _update_state_machine(self, cop_x: float, cop_y: float, timestamp_ms: float):
|
||||||
|
if self.state == CoPState.NO_CONTACT:
|
||||||
|
self.state = CoPState.INIT_COLLECTING
|
||||||
|
self.init_start_ms = timestamp_ms
|
||||||
|
self.init_x_buf.clear()
|
||||||
|
self.init_y_buf.clear()
|
||||||
|
|
||||||
|
if self.state == CoPState.INIT_COLLECTING:
|
||||||
|
self.init_x_buf.append(cop_x)
|
||||||
|
self.init_y_buf.append(cop_y)
|
||||||
|
|
||||||
|
if self.init_start_ms is None:
|
||||||
|
self.init_start_ms = timestamp_ms
|
||||||
|
|
||||||
|
if timestamp_ms - self.init_start_ms >= self.cfg.init_collect_ms:
|
||||||
|
base_x = float(np.median(self.init_x_buf))
|
||||||
|
base_y = float(np.median(self.init_y_buf))
|
||||||
|
base_x, base_y = self._apply_center_snap(base_x, base_y)
|
||||||
|
|
||||||
|
self.first_contact_cop_x = base_x
|
||||||
|
self.first_contact_cop_y = base_y
|
||||||
|
self.post_start_ms = timestamp_ms
|
||||||
|
self.post_cand_x = None
|
||||||
|
self.post_cand_y = None
|
||||||
|
self.post_stable_start_ms = None
|
||||||
|
|
||||||
|
if self.cfg.post_refine_enable:
|
||||||
|
self.state = CoPState.POST_REFINING
|
||||||
|
else:
|
||||||
|
self.post_refined = True
|
||||||
|
self.state = CoPState.READY
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.state == CoPState.POST_REFINING:
|
||||||
|
self._post_refine(cop_x, cop_y, timestamp_ms)
|
||||||
|
|
||||||
|
def _apply_center_snap(self, base_x: float, base_y: float) -> Tuple[float, float]:
|
||||||
|
if not self.cfg.snap_enable:
|
||||||
|
return base_x, base_y
|
||||||
|
|
||||||
|
if (
|
||||||
|
abs(base_x - self.cfg.snap_center_x) <= self.cfg.snap_range_x
|
||||||
|
and abs(base_y - self.cfg.snap_center_y) <= self.cfg.snap_range_y
|
||||||
|
):
|
||||||
|
return self.cfg.snap_center_x, self.cfg.snap_center_y
|
||||||
|
|
||||||
|
return base_x, base_y
|
||||||
|
|
||||||
|
def _post_refine(self, cop_x: float, cop_y: float, timestamp_ms: float):
|
||||||
|
if self.post_start_ms is None:
|
||||||
|
self.post_start_ms = timestamp_ms
|
||||||
|
|
||||||
|
if timestamp_ms - self.post_start_ms >= self.cfg.post_refine_window_ms:
|
||||||
|
self.post_refined = True
|
||||||
|
self.state = CoPState.READY
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.post_cand_x is None or self.post_cand_y is None:
|
||||||
|
self.post_cand_x = cop_x
|
||||||
|
self.post_cand_y = cop_y
|
||||||
|
self.post_stable_start_ms = timestamp_ms
|
||||||
|
return
|
||||||
|
|
||||||
|
dist = float(np.hypot(cop_x - self.post_cand_x, cop_y - self.post_cand_y))
|
||||||
|
|
||||||
|
if dist <= self.cfg.post_stable_thresh:
|
||||||
|
if self.post_stable_start_ms is None:
|
||||||
|
self.post_stable_start_ms = timestamp_ms
|
||||||
|
|
||||||
|
if timestamp_ms - self.post_stable_start_ms >= self.cfg.post_stable_ms:
|
||||||
|
refined_x, refined_y = self._apply_center_snap(self.post_cand_x, self.post_cand_y)
|
||||||
|
self.first_contact_cop_x = float(refined_x)
|
||||||
|
self.first_contact_cop_y = float(refined_y)
|
||||||
|
self.post_refined = True
|
||||||
|
self.state = CoPState.READY
|
||||||
|
else:
|
||||||
|
self.post_cand_x = cop_x
|
||||||
|
self.post_cand_y = cop_y
|
||||||
|
self.post_stable_start_ms = timestamp_ms
|
||||||
|
|
||||||
|
def _make_empty_result(self, total_pressure: float) -> CoPResult:
|
||||||
|
return CoPResult(
|
||||||
|
cop_x=0.0,
|
||||||
|
cop_y=0.0,
|
||||||
|
row_min=0,
|
||||||
|
row_max=self.cfg.rows - 1,
|
||||||
|
col_min=0,
|
||||||
|
col_max=self.cfg.cols - 1,
|
||||||
|
dx=0.0,
|
||||||
|
dy=0.0,
|
||||||
|
base_x=0.0,
|
||||||
|
base_y=0.0,
|
||||||
|
magnitude=0.0,
|
||||||
|
state=int(CoPState.NO_CONTACT),
|
||||||
|
total_pressure=float(total_pressure),
|
||||||
|
threshold=self.dynamic_thresh,
|
||||||
|
angle=0.0,
|
||||||
|
)
|
||||||
|
|
||||||
|
def compute_vector_angle(self, x: float, y: float) -> Tuple[float, float]:
|
||||||
|
mag = float(np.hypot(x, y))
|
||||||
|
angle = float(np.degrees(np.arctan2(y, x + self.cfg.epsilon)))
|
||||||
|
|
||||||
|
if angle < 0:
|
||||||
|
angle += 360.0
|
||||||
|
|
||||||
|
return angle, mag
|
||||||
|
|
||||||
|
|
||||||
|
_estimator = PressureDirectionEstimator()
|
||||||
|
|
||||||
|
|
||||||
|
def reset_cop_state():
|
||||||
|
_estimator.reset_contact_state()
|
||||||
|
|
||||||
|
|
||||||
|
def reset_all_state():
|
||||||
|
_estimator.reset_all()
|
||||||
|
|
||||||
|
|
||||||
|
def compute_pressure_direction(adc_data, timestamp_ms: float):
|
||||||
|
result = _estimator.update(adc_data, timestamp_ms)
|
||||||
|
|
||||||
|
return (
|
||||||
|
result.cop_x,
|
||||||
|
result.cop_y,
|
||||||
|
result.row_min,
|
||||||
|
result.row_max,
|
||||||
|
result.col_min,
|
||||||
|
result.col_max,
|
||||||
|
result.dx,
|
||||||
|
result.dy,
|
||||||
|
result.base_x,
|
||||||
|
result.base_y,
|
||||||
|
result.magnitude,
|
||||||
|
result.state,
|
||||||
|
result.total_pressure,
|
||||||
|
result.threshold,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def compute_vector_angle(x: float, y: float) -> Tuple[float, float]:
|
||||||
|
return _estimator.compute_vector_angle(x, y)
|
||||||
|
|
||||||
|
|
||||||
|
def compute_PZT_angle(Px: float, Py: float) -> Tuple[float, float]:
|
||||||
|
return compute_vector_angle(Px, Py)
|
||||||
|
|
||||||
|
|
||||||
|
def get_pzt_angle(adc_data, timestamp_ms: float):
|
||||||
|
if len(adc_data) != ADC_LEN:
|
||||||
|
raise ValueError(f"ADC数据长度必须为{ADC_LEN}")
|
||||||
|
|
||||||
|
result = _estimator.update(adc_data, timestamp_ms)
|
||||||
|
|
||||||
|
return (
|
||||||
|
result.angle,
|
||||||
|
result.magnitude,
|
||||||
|
result.state,
|
||||||
|
result.cop_x,
|
||||||
|
result.cop_y,
|
||||||
|
result.base_x,
|
||||||
|
result.base_y,
|
||||||
|
result.total_pressure,
|
||||||
|
result.threshold,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def reset_baseline():
|
||||||
|
reset_all_state()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ _sym_db = _symbol_database.Default()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x13sensor_stream.proto\x12\rsensor_stream\"\x85\x01\n\x0bSensorFrame\x12\x0b\n\x03seq\x18\x01 \x01(\x04\x12\x14\n\x0ctimestamp_ms\x18\x02 \x01(\x04\x12\x0c\n\x04rows\x18\x03 \x01(\r\x12\x0c\n\x04\x63ols\x18\x04 \x01(\r\x12\x0e\n\x06matrix\x18\x05 \x03(\r\x12\x17\n\x0fresultant_force\x18\x06 \x01(\x01\x12\x0e\n\x06\x64ts_ms\x18\x07 \x01(\r\"q\n\x10PztAngleResponse\x12\x0b\n\x03seq\x18\x01 \x01(\x04\x12\x14\n\x0ctimestamp_ms\x18\x02 \x01(\x04\x12\r\n\x05\x61ngle\x18\x03 \x01(\x02\x12\x0e\n\x06\x64ts_ms\x18\x04 \x01(\r\x12\n\n\x02ok\x18\x05 \x01(\x08\x12\x0f\n\x07message\x18\x06 \x01(\t\"8\n\x0eProcessRequest\x12\x10\n\x08\x63sv_path\x18\x01 \x01(\t\x12\x14\n\x0csave_as_xlsx\x18\x02 \x01(\x08\"\xa6\x01\n\x0fProcessResponse\x12\n\n\x02ok\x18\x01 \x01(\x08\x12\x13\n\x0boutput_path\x18\x02 \x01(\t\x12\x13\n\x0bgroups_used\x18\x03 \x01(\r\x12\x12\n\nmean_value\x18\x04 \x01(\x01\x12\x11\n\tthreshold\x18\x05 \x01(\x01\x12\x12\n\nrows_total\x18\x06 \x01(\r\x12\x11\n\trows_kept\x18\x07 \x01(\r\x12\x0f\n\x07message\x18\x08 \x01(\t2W\n\nSensorPush\x12I\n\x06Upload\x12\x1a.sensor_stream.SensorFrame\x1a\x1f.sensor_stream.PztAngleResponse(\x01\x30\x01\x32_\n\x0f\x45xportProcessor\x12L\n\x0bProcessFile\x12\x1d.sensor_stream.ProcessRequest\x1a\x1e.sensor_stream.ProcessResponseb\x06proto3')
|
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x13sensor_stream.proto\x12\rsensor_stream\"\x85\x01\n\x0bSensorFrame\x12\x0b\n\x03seq\x18\x01 \x01(\x04\x12\x14\n\x0ctimestamp_ms\x18\x02 \x01(\x04\x12\x0c\n\x04rows\x18\x03 \x01(\r\x12\x0c\n\x04\x63ols\x18\x04 \x01(\r\x12\x0e\n\x06matrix\x18\x05 \x03(\r\x12\x17\n\x0fresultant_force\x18\x06 \x01(\x01\x12\x0e\n\x06\x64ts_ms\x18\x07 \x01(\r\"\xf9\x01\n\x10PztAngleResponse\x12\x0b\n\x03seq\x18\x01 \x01(\x04\x12\x14\n\x0ctimestamp_ms\x18\x02 \x01(\x04\x12\r\n\x05\x61ngle\x18\x03 \x01(\x02\x12\x0e\n\x06\x64ts_ms\x18\x04 \x01(\r\x12\n\n\x02ok\x18\x05 \x01(\x08\x12\x0f\n\x07message\x18\x06 \x01(\t\x12\x11\n\tmagnitude\x18\x07 \x01(\x02\x12\r\n\x05state\x18\x08 \x01(\x05\x12\r\n\x05\x63op_x\x18\t \x01(\x02\x12\r\n\x05\x63op_y\x18\n \x01(\x02\x12\x0e\n\x06\x62\x61se_x\x18\x0b \x01(\x02\x12\x0e\n\x06\x62\x61se_y\x18\x0c \x01(\x02\x12\x13\n\x0btotal_press\x18\r \x01(\x02\x12\x11\n\tthreshold\x18\x0e \x01(\x02\"8\n\x0eProcessRequest\x12\x10\n\x08\x63sv_path\x18\x01 \x01(\t\x12\x14\n\x0csave_as_xlsx\x18\x02 \x01(\x08\"\xa6\x01\n\x0fProcessResponse\x12\n\n\x02ok\x18\x01 \x01(\x08\x12\x13\n\x0boutput_path\x18\x02 \x01(\t\x12\x13\n\x0bgroups_used\x18\x03 \x01(\r\x12\x12\n\nmean_value\x18\x04 \x01(\x01\x12\x11\n\tthreshold\x18\x05 \x01(\x01\x12\x12\n\nrows_total\x18\x06 \x01(\r\x12\x11\n\trows_kept\x18\x07 \x01(\r\x12\x0f\n\x07message\x18\x08 \x01(\t2W\n\nSensorPush\x12I\n\x06Upload\x12\x1a.sensor_stream.SensorFrame\x1a\x1f.sensor_stream.PztAngleResponse(\x01\x30\x01\x32_\n\x0f\x45xportProcessor\x12L\n\x0bProcessFile\x12\x1d.sensor_stream.ProcessRequest\x1a\x1e.sensor_stream.ProcessResponseb\x06proto3')
|
||||||
|
|
||||||
_globals = globals()
|
_globals = globals()
|
||||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
||||||
@@ -33,14 +33,14 @@ if not _descriptor._USE_C_DESCRIPTORS:
|
|||||||
DESCRIPTOR._loaded_options = None
|
DESCRIPTOR._loaded_options = None
|
||||||
_globals['_SENSORFRAME']._serialized_start=39
|
_globals['_SENSORFRAME']._serialized_start=39
|
||||||
_globals['_SENSORFRAME']._serialized_end=172
|
_globals['_SENSORFRAME']._serialized_end=172
|
||||||
_globals['_PZTANGLERESPONSE']._serialized_start=174
|
_globals['_PZTANGLERESPONSE']._serialized_start=175
|
||||||
_globals['_PZTANGLERESPONSE']._serialized_end=287
|
_globals['_PZTANGLERESPONSE']._serialized_end=424
|
||||||
_globals['_PROCESSREQUEST']._serialized_start=289
|
_globals['_PROCESSREQUEST']._serialized_start=426
|
||||||
_globals['_PROCESSREQUEST']._serialized_end=345
|
_globals['_PROCESSREQUEST']._serialized_end=482
|
||||||
_globals['_PROCESSRESPONSE']._serialized_start=348
|
_globals['_PROCESSRESPONSE']._serialized_start=485
|
||||||
_globals['_PROCESSRESPONSE']._serialized_end=514
|
_globals['_PROCESSRESPONSE']._serialized_end=651
|
||||||
_globals['_SENSORPUSH']._serialized_start=516
|
_globals['_SENSORPUSH']._serialized_start=653
|
||||||
_globals['_SENSORPUSH']._serialized_end=603
|
_globals['_SENSORPUSH']._serialized_end=740
|
||||||
_globals['_EXPORTPROCESSOR']._serialized_start=605
|
_globals['_EXPORTPROCESSOR']._serialized_start=742
|
||||||
_globals['_EXPORTPROCESSOR']._serialized_end=700
|
_globals['_EXPORTPROCESSOR']._serialized_end=837
|
||||||
# @@protoc_insertion_point(module_scope)
|
# @@protoc_insertion_point(module_scope)
|
||||||
|
|||||||
0
devkit/server-start.err.log
Normal file
0
devkit/server-start.err.log
Normal file
33231
devkit/server-start.out.log
Normal file
33231
devkit/server-start.out.log
Normal file
File diff suppressed because it is too large
Load Diff
2
package-lock.json
generated
2
package-lock.json
generated
@@ -6,7 +6,7 @@
|
|||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "JE-Skin",
|
"name": "JE-Skin",
|
||||||
"version": "0.3.0",
|
"version": "0.4.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tauri-apps/api": "^2",
|
"@tauri-apps/api": "^2",
|
||||||
|
|||||||
@@ -27,6 +27,14 @@ message PztAngleResponse {
|
|||||||
uint32 dts_ms = 4;
|
uint32 dts_ms = 4;
|
||||||
bool ok = 5;
|
bool ok = 5;
|
||||||
string message = 6;
|
string message = 6;
|
||||||
|
float magnitude = 7;
|
||||||
|
int32 state = 8;
|
||||||
|
float cop_x = 9;
|
||||||
|
float cop_y = 10;
|
||||||
|
float base_x = 11;
|
||||||
|
float base_y = 12;
|
||||||
|
float total_press = 13;
|
||||||
|
float threshold = 14;
|
||||||
}
|
}
|
||||||
|
|
||||||
message ProcessRequest {
|
message ProcessRequest {
|
||||||
|
|||||||
Binary file not shown.
@@ -2,11 +2,26 @@
|
|||||||
//!
|
//!
|
||||||
//! 仅在 `devkit` feature 启用时编译。
|
//! 仅在 `devkit` feature 启用时编译。
|
||||||
|
|
||||||
|
use serde::Serialize;
|
||||||
|
use std::sync::atomic::{AtomicU64, Ordering};
|
||||||
|
use std::time::{SystemTime, UNIX_EPOCH};
|
||||||
use tauri::State;
|
use tauri::State;
|
||||||
#[cfg(feature = "devkit")]
|
#[cfg(feature = "devkit")]
|
||||||
use tauri::AppHandle;
|
use tauri::AppHandle;
|
||||||
|
|
||||||
use crate::devkit::{DevKitConfig, DevKitState, DevKitStatusSnapshot, ExportProcessResult};
|
use crate::devkit::{
|
||||||
|
proto::SensorFrame, DevKitConfig, DevKitState, DevKitStatusSnapshot, ExportProcessResult,
|
||||||
|
};
|
||||||
|
|
||||||
|
static REPLAY_SEQ_COUNTER: AtomicU64 = AtomicU64::new(0);
|
||||||
|
|
||||||
|
#[derive(Serialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct DevKitReplayFramePushResult {
|
||||||
|
pub seq: u64,
|
||||||
|
pub timestamp_ms: u64,
|
||||||
|
pub dts_ms: u32,
|
||||||
|
}
|
||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
pub fn devkit_status(state: State<'_, DevKitState>) -> DevKitStatusSnapshot {
|
pub fn devkit_status(state: State<'_, DevKitState>) -> DevKitStatusSnapshot {
|
||||||
@@ -51,3 +66,55 @@ pub async fn devkit_process_export(
|
|||||||
let use_xlsx = save_as_xlsx.unwrap_or(config.save_as_xlsx);
|
let use_xlsx = save_as_xlsx.unwrap_or(config.save_as_xlsx);
|
||||||
state.process_export(&csv_path, use_xlsx).await
|
state.process_export(&csv_path, use_xlsx).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
pub fn devkit_push_replay_frame(
|
||||||
|
state: State<'_, DevKitState>,
|
||||||
|
values: Vec<i32>,
|
||||||
|
dts_ms: u32,
|
||||||
|
seq: Option<u64>,
|
||||||
|
) -> Result<DevKitReplayFramePushResult, String> {
|
||||||
|
if values.len() != 84 {
|
||||||
|
return Err(format!("InvalidReplayMatrixLength: {}", values.len()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if !state.running.load(Ordering::Relaxed) {
|
||||||
|
return Err("NotRunning".to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
let timestamp_ms = now_millis();
|
||||||
|
let seq = seq.unwrap_or_else(|| build_replay_seq(timestamp_ms));
|
||||||
|
let resultant_force = values.iter().copied().sum::<i32>().max(0) as f64;
|
||||||
|
let matrix = values
|
||||||
|
.into_iter()
|
||||||
|
.map(|value| value.max(0) as u32)
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
state.push_frame(SensorFrame {
|
||||||
|
seq,
|
||||||
|
timestamp_ms,
|
||||||
|
rows: 12,
|
||||||
|
cols: 7,
|
||||||
|
matrix,
|
||||||
|
resultant_force,
|
||||||
|
dts_ms,
|
||||||
|
});
|
||||||
|
|
||||||
|
Ok(DevKitReplayFramePushResult {
|
||||||
|
seq,
|
||||||
|
timestamp_ms,
|
||||||
|
dts_ms,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn now_millis() -> u64 {
|
||||||
|
SystemTime::now()
|
||||||
|
.duration_since(UNIX_EPOCH)
|
||||||
|
.map(|duration| duration.as_millis() as u64)
|
||||||
|
.unwrap_or_default()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn build_replay_seq(timestamp_ms: u64) -> u64 {
|
||||||
|
let counter = REPLAY_SEQ_COUNTER.fetch_add(1, Ordering::Relaxed) % 1000;
|
||||||
|
timestamp_ms.saturating_mul(1000).saturating_add(counter)
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
use crate::serial_core::codecs::tactile_a::{
|
use crate::serial_core::codecs::tactile_a::{
|
||||||
export_recording_csv, TactileACodec, TactileACsvImporter, TactileAHandler,
|
export_recording_csv, TactileACodec, TactileACsvImporter, TactileADataPacket, TactileAHandler,
|
||||||
};
|
};
|
||||||
use crate::serial_core::error::SerialError;
|
use crate::serial_core::error::SerialError;
|
||||||
|
use crate::serial_core::model::HudSpatialForce;
|
||||||
|
#[cfg(feature = "multi-dim")]
|
||||||
|
use crate::serial_core::multi_dim_force::PztProcessor;
|
||||||
use crate::serial_core::record::CsvImporter;
|
use crate::serial_core::record::CsvImporter;
|
||||||
use crate::serial_core::serial::{PollMode, TactileAPollRequester};
|
use crate::serial_core::serial::{PollMode, TactileAPollRequester};
|
||||||
use crate::serial_core::{serial, TactileARecording};
|
use crate::serial_core::{serial, TactileARecording};
|
||||||
@@ -44,6 +47,7 @@ pub struct SerialExportResponse {
|
|||||||
pub struct SerialImportFrame {
|
pub struct SerialImportFrame {
|
||||||
pub data: Vec<i32>,
|
pub data: Vec<i32>,
|
||||||
pub dts_ms: u64,
|
pub dts_ms: u64,
|
||||||
|
pub spatial_force: Option<HudSpatialForce>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
@@ -322,13 +326,7 @@ pub fn serial_import_csv(
|
|||||||
|
|
||||||
let channel_count = packets.first().map(|item| item.data.len()).unwrap_or(0);
|
let channel_count = packets.first().map(|item| item.data.len()).unwrap_or(0);
|
||||||
let frame_count = packets.len();
|
let frame_count = packets.len();
|
||||||
let frames = packets
|
let frames = build_import_frames(packets);
|
||||||
.into_iter()
|
|
||||||
.map(|packet| SerialImportFrame {
|
|
||||||
data: packet.data,
|
|
||||||
dts_ms: packet.dts_ms,
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
Ok(SerialImportResponse {
|
Ok(SerialImportResponse {
|
||||||
file_name,
|
file_name,
|
||||||
@@ -353,6 +351,44 @@ pub fn serial_import_csv_from_path(file_path: String) -> Result<SerialImportResp
|
|||||||
serial_import_csv(file_name, csv_content)
|
serial_import_csv(file_name, csv_content)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn build_import_frames(packets: Vec<TactileADataPacket>) -> Vec<SerialImportFrame> {
|
||||||
|
#[cfg(feature = "multi-dim")]
|
||||||
|
let mut pzt_processor = PztProcessor::new();
|
||||||
|
|
||||||
|
packets
|
||||||
|
.into_iter()
|
||||||
|
.map(|packet| {
|
||||||
|
#[cfg(feature = "multi-dim")]
|
||||||
|
let spatial_force = replay_spatial_force(&mut pzt_processor, &packet.data);
|
||||||
|
|
||||||
|
#[cfg(not(feature = "multi-dim"))]
|
||||||
|
let spatial_force = None;
|
||||||
|
|
||||||
|
SerialImportFrame {
|
||||||
|
data: packet.data,
|
||||||
|
dts_ms: packet.dts_ms,
|
||||||
|
spatial_force,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "multi-dim")]
|
||||||
|
fn replay_spatial_force(processor: &mut PztProcessor, values: &[i32]) -> Option<HudSpatialForce> {
|
||||||
|
let pzt_values = values.iter().map(|value| *value as f32).collect::<Vec<f32>>();
|
||||||
|
let analysis = processor.get_pzt_analysis(&pzt_values).ok()?;
|
||||||
|
|
||||||
|
if !PztProcessor::should_report(&analysis) {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(HudSpatialForce {
|
||||||
|
angle_deg: analysis.angle_deg,
|
||||||
|
magnitude: analysis.magnitude,
|
||||||
|
confidence: analysis.confidence,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
fn resolve_record_for_export(
|
fn resolve_record_for_export(
|
||||||
state: &State<'_, SerialConnectionState>,
|
state: &State<'_, SerialConnectionState>,
|
||||||
) -> Result<SharedTactileRecording, SerialError> {
|
) -> Result<SharedTactileRecording, SerialError> {
|
||||||
|
|||||||
@@ -24,6 +24,14 @@ struct DevKitPztAngleEvent {
|
|||||||
timestamp_ms: u64,
|
timestamp_ms: u64,
|
||||||
dts_ms: u32,
|
dts_ms: u32,
|
||||||
angle: f32,
|
angle: f32,
|
||||||
|
magnitude: f32,
|
||||||
|
state: i32,
|
||||||
|
cop_x: f32,
|
||||||
|
cop_y: f32,
|
||||||
|
base_x: f32,
|
||||||
|
base_y: f32,
|
||||||
|
total_press: f32,
|
||||||
|
threshold: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── DevKit 配置 ────────────────────────────────────────────────────
|
// ── DevKit 配置 ────────────────────────────────────────────────────
|
||||||
@@ -276,12 +284,28 @@ async fn run_grpc_upload(
|
|||||||
timestamp_ms: message.timestamp_ms,
|
timestamp_ms: message.timestamp_ms,
|
||||||
dts_ms: message.dts_ms,
|
dts_ms: message.dts_ms,
|
||||||
angle: message.angle,
|
angle: message.angle,
|
||||||
|
magnitude: message.magnitude,
|
||||||
|
state: message.state,
|
||||||
|
cop_x: message.cop_x,
|
||||||
|
cop_y: message.cop_y,
|
||||||
|
base_x: message.base_x,
|
||||||
|
base_y: message.base_y,
|
||||||
|
total_press: message.total_press,
|
||||||
|
threshold: message.threshold,
|
||||||
};
|
};
|
||||||
::log::debug!(
|
::log::debug!(
|
||||||
"python pzt angle: seq={} dts_ms={} angle={:.2}",
|
"python pzt angle: seq={} dts_ms={} angle={:.2} magnitude={:.2} state={} cop=({:.2},{:.2}) base=({:.2},{:.2}) total_press={:.2} threshold={:.2}",
|
||||||
message.seq,
|
message.seq,
|
||||||
message.dts_ms,
|
message.dts_ms,
|
||||||
message.angle
|
message.angle,
|
||||||
|
message.magnitude,
|
||||||
|
message.state,
|
||||||
|
message.cop_x,
|
||||||
|
message.cop_y,
|
||||||
|
message.base_x,
|
||||||
|
message.base_y,
|
||||||
|
message.total_press,
|
||||||
|
message.threshold
|
||||||
);
|
);
|
||||||
app.emit("devkit_pzt_angle", payload)?;
|
app.emit("devkit_pzt_angle", payload)?;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -154,7 +154,8 @@ pub fn run() {
|
|||||||
commands::devkit::devkit_stop,
|
commands::devkit::devkit_stop,
|
||||||
commands::devkit::devkit_get_config,
|
commands::devkit::devkit_get_config,
|
||||||
commands::devkit::devkit_set_config,
|
commands::devkit::devkit_set_config,
|
||||||
commands::devkit::devkit_process_export
|
commands::devkit::devkit_process_export,
|
||||||
|
commands::devkit::devkit_push_replay_frame
|
||||||
]);
|
]);
|
||||||
|
|
||||||
#[cfg(not(feature = "devkit"))]
|
#[cfg(not(feature = "devkit"))]
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ use fern::{
|
|||||||
Dispatch,
|
Dispatch,
|
||||||
};
|
};
|
||||||
use log::debug;
|
use log::debug;
|
||||||
use std::{path::{Path, PathBuf}, time::SystemTime};
|
use std::{path::PathBuf, time::SystemTime};
|
||||||
|
|
||||||
fn log_directory() -> PathBuf {
|
fn log_directory() -> PathBuf {
|
||||||
let base_dir = std::env::var_os("LOCALAPPDATA")
|
let base_dir = std::env::var_os("LOCALAPPDATA")
|
||||||
@@ -67,6 +67,7 @@ pub fn setup_logger() {
|
|||||||
|
|
||||||
Dispatch::new()
|
Dispatch::new()
|
||||||
.level(log::LevelFilter::Debug)
|
.level(log::LevelFilter::Debug)
|
||||||
|
.level_for("h2", log::LevelFilter::Info)
|
||||||
.chain(console_config)
|
.chain(console_config)
|
||||||
.chain(file_config)
|
.chain(file_config)
|
||||||
.apply()
|
.apply()
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ const ACTIVE_CELL_MIN_VALUE: f32 = 18.0;
|
|||||||
const ACTIVE_CELL_PEAK_RATIO: f32 = 0.14;
|
const ACTIVE_CELL_PEAK_RATIO: f32 = 0.14;
|
||||||
const MIN_ACTIVE_CELLS: usize = 3;
|
const MIN_ACTIVE_CELLS: usize = 3;
|
||||||
|
|
||||||
const ANCHOR_LERP_ALPHA: f32 = 0.018;
|
|
||||||
const VECTOR_SMOOTHING_ALPHA: f32 = 0.16;
|
const VECTOR_SMOOTHING_ALPHA: f32 = 0.16;
|
||||||
|
|
||||||
const REPORT_MAGNITUDE_ENTER: f32 = 0.12;
|
const REPORT_MAGNITUDE_ENTER: f32 = 0.12;
|
||||||
@@ -29,6 +28,12 @@ const REPORT_HOLD_FRAMES: usize = 10;
|
|||||||
const ASYMMETRY_WEIGHT: f32 = 1.1;
|
const ASYMMETRY_WEIGHT: f32 = 1.1;
|
||||||
const DRIFT_WEIGHT: f32 = 0.65;
|
const DRIFT_WEIGHT: f32 = 0.65;
|
||||||
const MOTION_WEIGHT: f32 = 0.25;
|
const MOTION_WEIGHT: f32 = 0.25;
|
||||||
|
const EDGE_ASYMMETRY_DAMPING: f32 = 0.35;
|
||||||
|
const EDGE_INWARD_ROLLING_BIAS: f32 = 0.55;
|
||||||
|
const EDGE_START_COP_THRESHOLD: f32 = 0.45;
|
||||||
|
const EDGE_START_BIAS_WEIGHT: f32 = 1.1;
|
||||||
|
const ROLLING_FRICTION_ALPHA: f32 = 0.68;
|
||||||
|
const ROLLING_FRICTION_MIN_MAGNITUDE: f32 = 0.05;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub struct PztSpatialAnalysis {
|
pub struct PztSpatialAnalysis {
|
||||||
@@ -50,6 +55,8 @@ pub struct PztProcessor {
|
|||||||
anchor_cop_y: Option<f32>,
|
anchor_cop_y: Option<f32>,
|
||||||
last_cop_x: Option<f32>,
|
last_cop_x: Option<f32>,
|
||||||
last_cop_y: Option<f32>,
|
last_cop_y: Option<f32>,
|
||||||
|
edge_start_bias_x: f32,
|
||||||
|
edge_start_bias_y: f32,
|
||||||
smoothed_x: f32,
|
smoothed_x: f32,
|
||||||
smoothed_y: f32,
|
smoothed_y: f32,
|
||||||
report_active: bool,
|
report_active: bool,
|
||||||
@@ -84,6 +91,8 @@ impl PztProcessor {
|
|||||||
anchor_cop_y: None,
|
anchor_cop_y: None,
|
||||||
last_cop_x: None,
|
last_cop_x: None,
|
||||||
last_cop_y: None,
|
last_cop_y: None,
|
||||||
|
edge_start_bias_x: 0.0,
|
||||||
|
edge_start_bias_y: 0.0,
|
||||||
smoothed_x: 0.0,
|
smoothed_x: 0.0,
|
||||||
smoothed_y: 0.0,
|
smoothed_y: 0.0,
|
||||||
report_active: false,
|
report_active: false,
|
||||||
@@ -100,6 +109,8 @@ impl PztProcessor {
|
|||||||
self.anchor_cop_y = None;
|
self.anchor_cop_y = None;
|
||||||
self.last_cop_x = None;
|
self.last_cop_x = None;
|
||||||
self.last_cop_y = None;
|
self.last_cop_y = None;
|
||||||
|
self.edge_start_bias_x = 0.0;
|
||||||
|
self.edge_start_bias_y = 0.0;
|
||||||
self.smoothed_x = 0.0;
|
self.smoothed_x = 0.0;
|
||||||
self.smoothed_y = 0.0;
|
self.smoothed_y = 0.0;
|
||||||
}
|
}
|
||||||
@@ -273,6 +284,112 @@ impl PztProcessor {
|
|||||||
(angle, magnitude)
|
(angle, magnitude)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn contact_touches_edge(stats: &ContactStats) -> bool {
|
||||||
|
stats.min_row == 0
|
||||||
|
|| stats.max_row == SENSOR_ROWS - 1
|
||||||
|
|| stats.min_col == 0
|
||||||
|
|| stats.max_col == SENSOR_COLS - 1
|
||||||
|
}
|
||||||
|
|
||||||
|
fn damp_edge_asymmetry(
|
||||||
|
stats: &ContactStats,
|
||||||
|
kinematic_x: f32,
|
||||||
|
kinematic_y: f32,
|
||||||
|
) -> (f32, f32) {
|
||||||
|
let mut asymmetry_x = stats.asymmetry_x * ASYMMETRY_WEIGHT;
|
||||||
|
let mut asymmetry_y = stats.asymmetry_y * ASYMMETRY_WEIGHT;
|
||||||
|
|
||||||
|
if stats.min_col == 0 && asymmetry_x < 0.0 {
|
||||||
|
asymmetry_x = -asymmetry_x * EDGE_INWARD_ROLLING_BIAS;
|
||||||
|
}
|
||||||
|
if stats.max_col == SENSOR_COLS - 1 && asymmetry_x > 0.0 {
|
||||||
|
asymmetry_x = -asymmetry_x * EDGE_INWARD_ROLLING_BIAS;
|
||||||
|
}
|
||||||
|
if stats.min_row == 0 && asymmetry_y < 0.0 {
|
||||||
|
asymmetry_y = -asymmetry_y * EDGE_INWARD_ROLLING_BIAS;
|
||||||
|
}
|
||||||
|
if stats.max_row == SENSOR_ROWS - 1 && asymmetry_y > 0.0 {
|
||||||
|
asymmetry_y = -asymmetry_y * EDGE_INWARD_ROLLING_BIAS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if Self::contact_touches_edge(stats) {
|
||||||
|
let opposing_dot = asymmetry_x * kinematic_x + asymmetry_y * kinematic_y;
|
||||||
|
let kinematic_mag = (kinematic_x * kinematic_x + kinematic_y * kinematic_y).sqrt();
|
||||||
|
if opposing_dot < 0.0 && kinematic_mag >= ROLLING_FRICTION_MIN_MAGNITUDE {
|
||||||
|
asymmetry_x *= EDGE_ASYMMETRY_DAMPING;
|
||||||
|
asymmetry_y *= EDGE_ASYMMETRY_DAMPING;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(asymmetry_x, asymmetry_y)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn edge_start_bias(stats: &ContactStats) -> (f32, f32) {
|
||||||
|
let center_x = (SENSOR_COLS - 1) as f32 * 0.5;
|
||||||
|
let center_y = (SENSOR_ROWS - 1) as f32 * 0.5;
|
||||||
|
let normalized_x = ((stats.cop_x - center_x) / center_x.max(1.0)).clamp(-1.0, 1.0);
|
||||||
|
let normalized_y = ((stats.cop_y - center_y) / center_y.max(1.0)).clamp(-1.0, 1.0);
|
||||||
|
|
||||||
|
let mut bias_x = 0.0;
|
||||||
|
let mut bias_y = 0.0;
|
||||||
|
|
||||||
|
if stats.min_col == 0 || stats.max_col == SENSOR_COLS - 1 {
|
||||||
|
bias_x = Self::edge_start_axis_bias(normalized_x);
|
||||||
|
}
|
||||||
|
if stats.min_row == 0 || stats.max_row == SENSOR_ROWS - 1 {
|
||||||
|
bias_y = Self::edge_start_axis_bias(normalized_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
(bias_x, bias_y)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn edge_start_axis_bias(normalized_axis: f32) -> f32 {
|
||||||
|
let distance = normalized_axis.abs();
|
||||||
|
if distance <= EDGE_START_COP_THRESHOLD {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
let strength = ((distance - EDGE_START_COP_THRESHOLD) / (1.0 - EDGE_START_COP_THRESHOLD))
|
||||||
|
.clamp(0.0, 1.0);
|
||||||
|
-normalized_axis.signum() * strength * EDGE_START_BIAS_WEIGHT
|
||||||
|
}
|
||||||
|
|
||||||
|
fn apply_rolling_friction(
|
||||||
|
previous_x: f32,
|
||||||
|
previous_y: f32,
|
||||||
|
current_x: f32,
|
||||||
|
current_y: f32,
|
||||||
|
) -> (f32, f32) {
|
||||||
|
let previous_mag = (previous_x * previous_x + previous_y * previous_y).sqrt();
|
||||||
|
let current_mag = (current_x * current_x + current_y * current_y).sqrt();
|
||||||
|
|
||||||
|
if previous_mag < ROLLING_FRICTION_MIN_MAGNITUDE
|
||||||
|
|| current_mag < ROLLING_FRICTION_MIN_MAGNITUDE
|
||||||
|
{
|
||||||
|
return (current_x, current_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
let dot = previous_x * current_x + previous_y * current_y;
|
||||||
|
if dot >= 0.0 {
|
||||||
|
return (current_x, current_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mixed_x = current_x * (1.0 - ROLLING_FRICTION_ALPHA)
|
||||||
|
+ previous_x * ROLLING_FRICTION_ALPHA;
|
||||||
|
let mixed_y = current_y * (1.0 - ROLLING_FRICTION_ALPHA)
|
||||||
|
+ previous_y * ROLLING_FRICTION_ALPHA;
|
||||||
|
|
||||||
|
if mixed_x * previous_x + mixed_y * previous_y >= 0.0 {
|
||||||
|
return (mixed_x, mixed_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
let keep_mag = previous_mag.min(current_mag) * 0.5;
|
||||||
|
(
|
||||||
|
previous_x / previous_mag * keep_mag,
|
||||||
|
previous_y / previous_mag * keep_mag,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fn update_contact_state(&mut self, raw_frame: &[f32], frame: &[f32]) -> bool {
|
fn update_contact_state(&mut self, raw_frame: &[f32], frame: &[f32]) -> bool {
|
||||||
if self.contact_active {
|
if self.contact_active {
|
||||||
if Self::is_contact_exit_frame(frame) {
|
if Self::is_contact_exit_frame(frame) {
|
||||||
@@ -376,6 +493,9 @@ impl PztProcessor {
|
|||||||
self.anchor_cop_y = Some(stats.cop_y);
|
self.anchor_cop_y = Some(stats.cop_y);
|
||||||
self.last_cop_x = Some(stats.cop_x);
|
self.last_cop_x = Some(stats.cop_x);
|
||||||
self.last_cop_y = Some(stats.cop_y);
|
self.last_cop_y = Some(stats.cop_y);
|
||||||
|
let (edge_start_bias_x, edge_start_bias_y) = Self::edge_start_bias(&stats);
|
||||||
|
self.edge_start_bias_x = edge_start_bias_x;
|
||||||
|
self.edge_start_bias_y = edge_start_bias_y;
|
||||||
|
|
||||||
return Ok(self.stabilize_report(Self::weak_contact_analysis()));
|
return Ok(self.stabilize_report(Self::weak_contact_analysis()));
|
||||||
};
|
};
|
||||||
@@ -388,18 +508,25 @@ impl PztProcessor {
|
|||||||
let motion_x = stats.cop_x - last_x;
|
let motion_x = stats.cop_x - last_x;
|
||||||
let motion_y = stats.cop_y - last_y;
|
let motion_y = stats.cop_y - last_y;
|
||||||
|
|
||||||
let combined_x = stats.asymmetry_x * ASYMMETRY_WEIGHT
|
let kinematic_x = drift_x * DRIFT_WEIGHT + motion_x * MOTION_WEIGHT;
|
||||||
+ drift_x * DRIFT_WEIGHT
|
let kinematic_y = drift_y * DRIFT_WEIGHT + motion_y * MOTION_WEIGHT;
|
||||||
+ motion_x * MOTION_WEIGHT;
|
let edge_bias_x = self.edge_start_bias_x;
|
||||||
let combined_y = stats.asymmetry_y * ASYMMETRY_WEIGHT
|
let edge_bias_y = self.edge_start_bias_y;
|
||||||
+ drift_y * DRIFT_WEIGHT
|
let (asymmetry_x, asymmetry_y) =
|
||||||
+ motion_y * MOTION_WEIGHT;
|
Self::damp_edge_asymmetry(&stats, kinematic_x + edge_bias_x, kinematic_y + edge_bias_y);
|
||||||
|
|
||||||
|
let combined_x = asymmetry_x + kinematic_x + edge_bias_x;
|
||||||
|
let combined_y = asymmetry_y + kinematic_y + edge_bias_y;
|
||||||
|
let (combined_x, combined_y) = Self::apply_rolling_friction(
|
||||||
|
self.smoothed_x,
|
||||||
|
self.smoothed_y,
|
||||||
|
combined_x,
|
||||||
|
combined_y,
|
||||||
|
);
|
||||||
|
|
||||||
self.smoothed_x += (combined_x - self.smoothed_x) * VECTOR_SMOOTHING_ALPHA;
|
self.smoothed_x += (combined_x - self.smoothed_x) * VECTOR_SMOOTHING_ALPHA;
|
||||||
self.smoothed_y += (combined_y - self.smoothed_y) * VECTOR_SMOOTHING_ALPHA;
|
self.smoothed_y += (combined_y - self.smoothed_y) * VECTOR_SMOOTHING_ALPHA;
|
||||||
|
|
||||||
self.anchor_cop_x = Some(anchor_x + drift_x * ANCHOR_LERP_ALPHA);
|
|
||||||
self.anchor_cop_y = Some(anchor_y + drift_y * ANCHOR_LERP_ALPHA);
|
|
||||||
self.last_cop_x = Some(stats.cop_x);
|
self.last_cop_x = Some(stats.cop_x);
|
||||||
self.last_cop_y = Some(stats.cop_y);
|
self.last_cop_y = Some(stats.cop_y);
|
||||||
|
|
||||||
@@ -446,7 +573,7 @@ impl PztProcessor {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::{PztProcessor, SENSOR_COLS, SENSOR_ROWS};
|
use super::{ContactStats, PztProcessor, SENSOR_COLS, SENSOR_ROWS};
|
||||||
|
|
||||||
fn index(row: usize, col: usize) -> usize {
|
fn index(row: usize, col: usize) -> usize {
|
||||||
row * SENSOR_COLS + col
|
row * SENSOR_COLS + col
|
||||||
@@ -460,6 +587,23 @@ mod tests {
|
|||||||
frame
|
frame
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn stats_touching_bottom_edge() -> ContactStats {
|
||||||
|
ContactStats {
|
||||||
|
total: 1000.0,
|
||||||
|
peak: 300.0,
|
||||||
|
active_total: 900.0,
|
||||||
|
active_cells: 6,
|
||||||
|
min_row: SENSOR_ROWS - 2,
|
||||||
|
max_row: SENSOR_ROWS - 1,
|
||||||
|
min_col: 2,
|
||||||
|
max_col: 4,
|
||||||
|
cop_x: 3.0,
|
||||||
|
cop_y: 10.5,
|
||||||
|
asymmetry_x: 0.0,
|
||||||
|
asymmetry_y: 1.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn idle_frame_does_not_report_contact() {
|
fn idle_frame_does_not_report_contact() {
|
||||||
let mut processor = PztProcessor::new();
|
let mut processor = PztProcessor::new();
|
||||||
@@ -524,4 +668,29 @@ mod tests {
|
|||||||
let analysis = processor.get_pzt_analysis(&weak).unwrap();
|
let analysis = processor.get_pzt_analysis(&weak).unwrap();
|
||||||
assert!(analysis.reportable);
|
assert!(analysis.reportable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bottom_edge_outward_gradient_is_turned_inward() {
|
||||||
|
let stats = stats_touching_bottom_edge();
|
||||||
|
let (_asymmetry_x, asymmetry_y) = PztProcessor::damp_edge_asymmetry(&stats, 0.0, -0.2);
|
||||||
|
|
||||||
|
assert!(asymmetry_y < 0.0);
|
||||||
|
assert!(asymmetry_y > -1.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bottom_edge_start_adds_fixed_upward_bias() {
|
||||||
|
let stats = stats_touching_bottom_edge();
|
||||||
|
let (_bias_x, bias_y) = PztProcessor::edge_start_bias(&stats);
|
||||||
|
|
||||||
|
assert!(bias_y < 0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rolling_friction_resists_one_frame_reversal() {
|
||||||
|
let (x, y) = PztProcessor::apply_rolling_friction(0.4, 0.0, -0.6, 0.0);
|
||||||
|
|
||||||
|
assert!(x > 0.0);
|
||||||
|
assert_eq!(y, 0.0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ use crate::serial_core::multi_dim_force::PztProcessor;
|
|||||||
use crate::serial_core::record::Recording;
|
use crate::serial_core::record::Recording;
|
||||||
use crate::serial_core::record::{FrameTiming, RecordedFrame};
|
use crate::serial_core::record::{FrameTiming, RecordedFrame};
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use log::debug;
|
|
||||||
use std::future::pending;
|
use std::future::pending;
|
||||||
#[cfg(feature = "devkit")]
|
#[cfg(feature = "devkit")]
|
||||||
use std::sync::atomic::Ordering;
|
use std::sync::atomic::Ordering;
|
||||||
@@ -311,15 +310,14 @@ where
|
|||||||
drop(record);
|
drop(record);
|
||||||
|
|
||||||
if let Some(vals) = decode_res {
|
if let Some(vals) = decode_res {
|
||||||
|
#[cfg(feature = "multi-dim")]
|
||||||
let mut spatial_force = None;
|
let mut spatial_force = None;
|
||||||
|
#[cfg(not(feature = "multi-dim"))]
|
||||||
|
let spatial_force = None;
|
||||||
#[cfg(feature = "multi-dim")]
|
#[cfg(feature = "multi-dim")]
|
||||||
{
|
{
|
||||||
let pzt_values = vals.iter().map(|value| *value as f32).collect::<Vec<f32>>();
|
let pzt_values = vals.iter().map(|value| *value as f32).collect::<Vec<f32>>();
|
||||||
if let Ok(analysis) = pzt_processor.get_pzt_analysis(&pzt_values) {
|
if let Ok(analysis) = pzt_processor.get_pzt_analysis(&pzt_values) {
|
||||||
debug!(
|
|
||||||
"spatial force: angle={:.2}°, magnitude={:.2}, dx={:.2}, dy={:.2}",
|
|
||||||
analysis.angle_deg, analysis.magnitude, analysis.planar_x, analysis.planar_y
|
|
||||||
);
|
|
||||||
if PztProcessor::should_report(&analysis) {
|
if PztProcessor::should_report(&analysis) {
|
||||||
spatial_force = Some(HudSpatialForce {
|
spatial_force = Some(HudSpatialForce {
|
||||||
angle_deg: analysis.angle_deg,
|
angle_deg: analysis.angle_deg,
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
import { createEventDispatcher } from "svelte";
|
import { createEventDispatcher } from "svelte";
|
||||||
import type {
|
import type {
|
||||||
ConnectionState,
|
ConnectionState,
|
||||||
HudConfigLink,
|
|
||||||
HudNoticeTone,
|
HudNoticeTone,
|
||||||
LocaleCode,
|
LocaleCode,
|
||||||
StageViewMode,
|
StageViewMode,
|
||||||
@@ -28,8 +27,6 @@
|
|||||||
export let serialPortValue = "";
|
export let serialPortValue = "";
|
||||||
export let serialPortOptions: string[] = [];
|
export let serialPortOptions: string[] = [];
|
||||||
export let refreshPortsLabel = "";
|
export let refreshPortsLabel = "";
|
||||||
export let configLinksLabel = "";
|
|
||||||
export let configLinks: HudConfigLink[] = [];
|
|
||||||
export let matrixViewLabel = "";
|
export let matrixViewLabel = "";
|
||||||
export let matrixViewDotsLabel = "";
|
export let matrixViewDotsLabel = "";
|
||||||
export let stageViewMode: StageViewMode = "webgl";
|
export let stageViewMode: StageViewMode = "webgl";
|
||||||
@@ -53,7 +50,6 @@
|
|||||||
const dispatch = createEventDispatcher<{
|
const dispatch = createEventDispatcher<{
|
||||||
windowcontrol: WindowControlAction;
|
windowcontrol: WindowControlAction;
|
||||||
localechange: LocaleCode;
|
localechange: LocaleCode;
|
||||||
configlink: string;
|
|
||||||
matrixdisplaytoggle: boolean;
|
matrixdisplaytoggle: boolean;
|
||||||
stagemodechange: StageViewMode;
|
stagemodechange: StageViewMode;
|
||||||
portchange: string;
|
portchange: string;
|
||||||
@@ -97,10 +93,6 @@
|
|||||||
dispatch("localechange", nextLocale);
|
dispatch("localechange", nextLocale);
|
||||||
}
|
}
|
||||||
|
|
||||||
function emitConfigLink(linkId: string): void {
|
|
||||||
dispatch("configlink", linkId);
|
|
||||||
}
|
|
||||||
|
|
||||||
function emitStageModeChange(nextMode: StageViewMode): void {
|
function emitStageModeChange(nextMode: StageViewMode): void {
|
||||||
dispatch("stagemodechange", nextMode);
|
dispatch("stagemodechange", nextMode);
|
||||||
}
|
}
|
||||||
@@ -185,20 +177,6 @@
|
|||||||
|
|
||||||
<div class="control-bar">
|
<div class="control-bar">
|
||||||
<div class="control-main-row">
|
<div class="control-main-row">
|
||||||
<section class="config-links" aria-label={configLinksLabel}>
|
|
||||||
{#each configLinks as link (link.id)}
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
class="config-link tone-{link.tone ?? 'neutral'}"
|
|
||||||
class:is-active={Boolean(link.active)}
|
|
||||||
on:click={() => emitConfigLink(link.id)}
|
|
||||||
>
|
|
||||||
<span class="config-indicator" aria-hidden="true"></span>
|
|
||||||
<span class="config-label">{link.label}</span>
|
|
||||||
</button>
|
|
||||||
{/each}
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section class="state-card" aria-label={connectionLabel}>
|
<section class="state-card" aria-label={connectionLabel}>
|
||||||
<span class="state-dot" class:ok={connectionTone === "ok"} class:warn={connectionTone === "warn"}></span>
|
<span class="state-dot" class:ok={connectionTone === "ok"} class:warn={connectionTone === "warn"}></span>
|
||||||
<span class="state-label">{connectionLabel}</span>
|
<span class="state-label">{connectionLabel}</span>
|
||||||
@@ -930,93 +908,6 @@
|
|||||||
background: rgb(10 16 20 / 0.7);
|
background: rgb(10 16 20 / 0.7);
|
||||||
}
|
}
|
||||||
|
|
||||||
.config-links {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.2rem;
|
|
||||||
min-block-size: 2rem;
|
|
||||||
border: 1px solid rgb(95 132 158 / 0.36);
|
|
||||||
border-radius: 999px;
|
|
||||||
padding: 0.17rem 0.2rem;
|
|
||||||
background: linear-gradient(180deg, rgb(9 15 19 / 0.9), rgb(4 8 12 / 0.86));
|
|
||||||
box-shadow: inset 0 0 0 1px rgb(140 184 210 / 0.06);
|
|
||||||
}
|
|
||||||
|
|
||||||
.config-link {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.34rem;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
border-radius: 999px;
|
|
||||||
padding: 0.26rem 0.64rem;
|
|
||||||
background: transparent;
|
|
||||||
color: rgb(164 188 208 / 0.9);
|
|
||||||
font-size: 0.81rem;
|
|
||||||
letter-spacing: 0.05em;
|
|
||||||
cursor: pointer;
|
|
||||||
transition:
|
|
||||||
color 180ms ease,
|
|
||||||
border-color 180ms ease,
|
|
||||||
background-color 180ms ease,
|
|
||||||
box-shadow 220ms ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.config-indicator {
|
|
||||||
inline-size: 0.34rem;
|
|
||||||
block-size: 0.34rem;
|
|
||||||
border-radius: 999px;
|
|
||||||
background: rgb(136 157 174 / 0.88);
|
|
||||||
box-shadow: 0 0 0 2px rgb(136 157 174 / 0.16);
|
|
||||||
transition:
|
|
||||||
background-color 180ms ease,
|
|
||||||
box-shadow 200ms ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.config-label {
|
|
||||||
line-height: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.config-link:hover {
|
|
||||||
color: #d7edfb;
|
|
||||||
border-color: rgb(62 232 255 / 0.26);
|
|
||||||
}
|
|
||||||
|
|
||||||
.config-link.is-active {
|
|
||||||
color: #f1fdff;
|
|
||||||
border-color: rgb(106 150 180 / 0.56);
|
|
||||||
background: rgb(18 27 35 / 0.9);
|
|
||||||
box-shadow:
|
|
||||||
inset 0 0 0 1px rgb(167 218 252 / 0.08),
|
|
||||||
0 0 10px rgb(62 232 255 / 0.12);
|
|
||||||
}
|
|
||||||
|
|
||||||
.config-link.tone-cyan.is-active {
|
|
||||||
border-color: rgb(62 232 255 / 0.48);
|
|
||||||
}
|
|
||||||
|
|
||||||
.config-link.tone-lime.is-active {
|
|
||||||
border-color: rgb(133 255 68 / 0.52);
|
|
||||||
}
|
|
||||||
|
|
||||||
.config-link.tone-orange.is-active {
|
|
||||||
border-color: rgb(255 91 63 / 0.52);
|
|
||||||
}
|
|
||||||
|
|
||||||
.config-link.tone-cyan.is-active .config-indicator {
|
|
||||||
background: var(--hud-cyan);
|
|
||||||
box-shadow: 0 0 0 2px rgb(62 232 255 / 0.17);
|
|
||||||
}
|
|
||||||
|
|
||||||
.config-link.tone-lime.is-active .config-indicator {
|
|
||||||
background: var(--hud-lime);
|
|
||||||
box-shadow: 0 0 0 2px rgb(133 255 68 / 0.17);
|
|
||||||
}
|
|
||||||
|
|
||||||
.config-link.tone-orange.is-active .config-indicator {
|
|
||||||
background: var(--hud-orange);
|
|
||||||
box-shadow: 0 0 0 2px rgb(255 91 63 / 0.18);
|
|
||||||
}
|
|
||||||
|
|
||||||
.locale-btn {
|
.locale-btn {
|
||||||
border: 1px solid transparent;
|
border: 1px solid transparent;
|
||||||
border-radius: 999px;
|
border-radius: 999px;
|
||||||
@@ -1043,21 +934,11 @@
|
|||||||
background: rgb(24 31 25 / 0.9);
|
background: rgb(24 31 25 / 0.9);
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 1080px) {
|
|
||||||
.config-links {
|
|
||||||
flex-wrap: wrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 820px) {
|
@media (max-width: 820px) {
|
||||||
.control-main-row {
|
.control-main-row {
|
||||||
gap: 0.44rem;
|
gap: 0.44rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.config-links {
|
|
||||||
flex-wrap: wrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.serial-select {
|
.serial-select {
|
||||||
padding-inline-start: 0.45rem;
|
padding-inline-start: 0.45rem;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
type ModelLoadState = "loading" | "ready" | "missing" | "error";
|
type ModelLoadState = "loading" | "ready" | "missing" | "error";
|
||||||
|
|
||||||
export let locale: LocaleCode = "zh-CN";
|
export let locale: LocaleCode = "zh-CN";
|
||||||
export let modelUrl = "/models/je-skin-model.glb";
|
export let modelUrl = "/models/je-skin-model.gltf";
|
||||||
|
|
||||||
let rootEl: HTMLDivElement | undefined;
|
let rootEl: HTMLDivElement | undefined;
|
||||||
let canvasEl: HTMLCanvasElement | undefined;
|
let canvasEl: HTMLCanvasElement | undefined;
|
||||||
|
|||||||
@@ -14,8 +14,6 @@ export type MatrixDisplayMode = "numeric" | "dots";
|
|||||||
|
|
||||||
export type SignalPanelSide = "left" | "right";
|
export type SignalPanelSide = "left" | "right";
|
||||||
|
|
||||||
export type HudConfigTone = "neutral" | "cyan" | "lime" | "orange";
|
|
||||||
|
|
||||||
export interface HudSignalSeries {
|
export interface HudSignalSeries {
|
||||||
id: string;
|
id: string;
|
||||||
tone: SignalTone;
|
tone: SignalTone;
|
||||||
@@ -64,13 +62,6 @@ export interface HudSummary {
|
|||||||
max: number | null;
|
max: number | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface HudConfigLink {
|
|
||||||
id: string;
|
|
||||||
label: string;
|
|
||||||
tone?: HudConfigTone;
|
|
||||||
active?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface HudColorMapOption {
|
export interface HudColorMapOption {
|
||||||
id: PressureColorMapPreset;
|
id: PressureColorMapPreset;
|
||||||
label: string;
|
label: string;
|
||||||
@@ -107,7 +98,6 @@ export interface HudCopy {
|
|||||||
deviceLabel: string;
|
deviceLabel: string;
|
||||||
sampleRateLabel: string;
|
sampleRateLabel: string;
|
||||||
channelsLabel: string;
|
channelsLabel: string;
|
||||||
configLinksLabel: string;
|
|
||||||
refreshPortsLabel: string;
|
refreshPortsLabel: string;
|
||||||
connectActionLabel: string;
|
connectActionLabel: string;
|
||||||
disconnectActionLabel: string;
|
disconnectActionLabel: string;
|
||||||
@@ -169,6 +159,7 @@ export interface SerialRecordStateResult {
|
|||||||
export interface SerialImportFrameResult {
|
export interface SerialImportFrameResult {
|
||||||
data: number[];
|
data: number[];
|
||||||
dtsMs: number;
|
dtsMs: number;
|
||||||
|
spatialForce: HudSpatialForce | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SerialImportResult {
|
export interface SerialImportResult {
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
FileExplorerRoot,
|
FileExplorerRoot,
|
||||||
HudColorMapOption,
|
HudColorMapOption,
|
||||||
HudCopy,
|
HudCopy,
|
||||||
HudConfigLink,
|
|
||||||
HudNoticeTone,
|
HudNoticeTone,
|
||||||
HudPacket,
|
HudPacket,
|
||||||
HudSpatialForce,
|
HudSpatialForce,
|
||||||
@@ -43,6 +42,7 @@
|
|||||||
interface ReplayFrame {
|
interface ReplayFrame {
|
||||||
values: number[];
|
values: number[];
|
||||||
dtsMs: number;
|
dtsMs: number;
|
||||||
|
spatialForce?: HudSpatialForce | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface DevKitPztAngleEvent {
|
interface DevKitPztAngleEvent {
|
||||||
@@ -50,6 +50,20 @@
|
|||||||
timestampMs: number;
|
timestampMs: number;
|
||||||
dtsMs: number;
|
dtsMs: number;
|
||||||
angle: number;
|
angle: number;
|
||||||
|
magnitude: number;
|
||||||
|
state: number;
|
||||||
|
copX: number;
|
||||||
|
copY: number;
|
||||||
|
baseX: number;
|
||||||
|
baseY: number;
|
||||||
|
totalPress: number;
|
||||||
|
threshold: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface DevKitReplayFramePushResult {
|
||||||
|
seq: number;
|
||||||
|
timestampMs: number;
|
||||||
|
dtsMs: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
const copyByLocale: Record<LocaleCode, HudCopy> = {
|
const copyByLocale: Record<LocaleCode, HudCopy> = {
|
||||||
@@ -83,7 +97,6 @@
|
|||||||
deviceLabel: "设备",
|
deviceLabel: "设备",
|
||||||
sampleRateLabel: "采样率",
|
sampleRateLabel: "采样率",
|
||||||
channelsLabel: "通道",
|
channelsLabel: "通道",
|
||||||
configLinksLabel: "配置链接",
|
|
||||||
refreshPortsLabel: "刷新",
|
refreshPortsLabel: "刷新",
|
||||||
connectActionLabel: "连接",
|
connectActionLabel: "连接",
|
||||||
disconnectActionLabel: "断开",
|
disconnectActionLabel: "断开",
|
||||||
@@ -145,7 +158,6 @@
|
|||||||
deviceLabel: "Device",
|
deviceLabel: "Device",
|
||||||
sampleRateLabel: "Sample Rate",
|
sampleRateLabel: "Sample Rate",
|
||||||
channelsLabel: "Channels",
|
channelsLabel: "Channels",
|
||||||
configLinksLabel: "Config Links",
|
|
||||||
refreshPortsLabel: "Refresh",
|
refreshPortsLabel: "Refresh",
|
||||||
connectActionLabel: "Connect",
|
connectActionLabel: "Connect",
|
||||||
disconnectActionLabel: "Disconnect",
|
disconnectActionLabel: "Disconnect",
|
||||||
@@ -228,8 +240,6 @@
|
|||||||
let sampleRateValue = "100Hz";
|
let sampleRateValue = "100Hz";
|
||||||
let channelsValue = "84";
|
let channelsValue = "84";
|
||||||
let isWindowMaximized = false;
|
let isWindowMaximized = false;
|
||||||
let activeConfigLinkId = "stream-on";
|
|
||||||
let isConfigPanelOpen = false;
|
|
||||||
let hasSignalData = false;
|
let hasSignalData = false;
|
||||||
let signalPanels: HudSignalPanel[] = buildInactivePanels();
|
let signalPanels: HudSignalPanel[] = buildInactivePanels();
|
||||||
let summary: HudSummary = buildEmptySummary();
|
let summary: HudSummary = buildEmptySummary();
|
||||||
@@ -250,6 +260,8 @@
|
|||||||
let replayProgress = 0;
|
let replayProgress = 0;
|
||||||
let replayFileName = "";
|
let replayFileName = "";
|
||||||
let replayTimerId: number | null = null;
|
let replayTimerId: number | null = null;
|
||||||
|
let replayPendingDevkitSeq: number | null = null;
|
||||||
|
let replayDevkitSeqCounter = 0;
|
||||||
let fileExplorerOpen = false;
|
let fileExplorerOpen = false;
|
||||||
let fileExplorerMode: FileExplorerMode = "open";
|
let fileExplorerMode: FileExplorerMode = "open";
|
||||||
let fileExplorerBusy = false;
|
let fileExplorerBusy = false;
|
||||||
@@ -279,13 +291,6 @@
|
|||||||
let sessionStartedAt: number = Date.now();
|
let sessionStartedAt: number = Date.now();
|
||||||
|
|
||||||
$: uiCopy = copyByLocale[locale];
|
$: uiCopy = copyByLocale[locale];
|
||||||
$: configLinks = buildConfigLinks(
|
|
||||||
locale,
|
|
||||||
activeConfigLinkId,
|
|
||||||
isConfigPanelOpen,
|
|
||||||
devkitEnabled,
|
|
||||||
isDevKitConfigOpen
|
|
||||||
);
|
|
||||||
$: leftSignalPanels = signalPanels.filter((panel) => panel.side === "left");
|
$: leftSignalPanels = signalPanels.filter((panel) => panel.side === "left");
|
||||||
$: rightSignalPanels = signalPanels.filter((panel) => panel.side === "right");
|
$: rightSignalPanels = signalPanels.filter((panel) => panel.side === "right");
|
||||||
$: rangeTicks = buildRangeTicks(rangeMin, rangeMax);
|
$: rangeTicks = buildRangeTicks(rangeMin, rangeMax);
|
||||||
@@ -679,7 +684,8 @@
|
|||||||
});
|
});
|
||||||
frames = result.frames.map((frame) => ({
|
frames = result.frames.map((frame) => ({
|
||||||
values: frame.data,
|
values: frame.data,
|
||||||
dtsMs: frame.dtsMs
|
dtsMs: frame.dtsMs,
|
||||||
|
spatialForce: frame.spatialForce
|
||||||
}));
|
}));
|
||||||
importedFrameCount = result.frameCount;
|
importedFrameCount = result.frameCount;
|
||||||
importedChannelCount = result.channelCount;
|
importedChannelCount = result.channelCount;
|
||||||
@@ -709,7 +715,8 @@
|
|||||||
|
|
||||||
const frames = result.frames.map((frame) => ({
|
const frames = result.frames.map((frame) => ({
|
||||||
values: frame.data,
|
values: frame.data,
|
||||||
dtsMs: frame.dtsMs
|
dtsMs: frame.dtsMs,
|
||||||
|
spatialForce: frame.spatialForce
|
||||||
}));
|
}));
|
||||||
|
|
||||||
applyImportedFrames(result.fileName, frames, result.frameCount, result.channelCount);
|
applyImportedFrames(result.fileName, frames, result.frameCount, result.channelCount);
|
||||||
@@ -730,6 +737,43 @@
|
|||||||
replayTimerId = null;
|
replayTimerId = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function buildReplayDevkitSeq(frameIndex: number): number {
|
||||||
|
replayDevkitSeqCounter = (replayDevkitSeqCounter + 1) % 1000;
|
||||||
|
return Date.now() * 1000 + replayDevkitSeqCounter + frameIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
function canPushReplayFrameToDevkit(frame: ReplayFrame): boolean {
|
||||||
|
return (
|
||||||
|
isTauriRuntime() &&
|
||||||
|
devkitEnabled &&
|
||||||
|
devkitRunning &&
|
||||||
|
frame.values.length === 84
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function pushReplayFrameToDevkit(frame: ReplayFrame, frameIndex: number): void {
|
||||||
|
if (!canPushReplayFrameToDevkit(frame)) {
|
||||||
|
replayPendingDevkitSeq = null;
|
||||||
|
clearDevkitSpatialForce();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const seq = buildReplayDevkitSeq(frameIndex);
|
||||||
|
replayPendingDevkitSeq = seq;
|
||||||
|
clearDevkitSpatialForce();
|
||||||
|
|
||||||
|
void invoke<DevKitReplayFramePushResult>("devkit_push_replay_frame", {
|
||||||
|
values: frame.values.map((value) => Math.max(0, Math.round(Number(value) || 0))),
|
||||||
|
dtsMs: clamp(Math.round(frame.dtsMs), 0, 4_294_967_295),
|
||||||
|
seq
|
||||||
|
}).catch((error) => {
|
||||||
|
if (replayPendingDevkitSeq === seq) {
|
||||||
|
replayPendingDevkitSeq = null;
|
||||||
|
}
|
||||||
|
console.error("Failed to push replay frame to DevKit:", error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function frameValuesToMatrix(values: number[]): number[] {
|
function frameValuesToMatrix(values: number[]): number[] {
|
||||||
const totalCells = Math.max(matrixRows * matrixCols, 1);
|
const totalCells = Math.max(matrixRows * matrixCols, 1);
|
||||||
const matrix = new Array<number>(totalCells).fill(0);
|
const matrix = new Array<number>(totalCells).fill(0);
|
||||||
@@ -750,6 +794,7 @@
|
|||||||
function resetReplayVisualState(): void {
|
function resetReplayVisualState(): void {
|
||||||
pressureMatrix = buildZeroMatrix();
|
pressureMatrix = buildZeroMatrix();
|
||||||
spatialForce = null;
|
spatialForce = null;
|
||||||
|
replayPendingDevkitSeq = null;
|
||||||
clearDevkitSpatialForce();
|
clearDevkitSpatialForce();
|
||||||
signalPanels = buildInactivePanels();
|
signalPanels = buildInactivePanels();
|
||||||
summary = buildEmptySummary();
|
summary = buildEmptySummary();
|
||||||
@@ -785,9 +830,10 @@
|
|||||||
replayCurrentIndex = safeIndex;
|
replayCurrentIndex = safeIndex;
|
||||||
replayHasDisplayedFrame = true;
|
replayHasDisplayedFrame = true;
|
||||||
replayProgress = replayFrames.length > 1 ? safeIndex / (replayFrames.length - 1) : 1;
|
replayProgress = replayFrames.length > 1 ? safeIndex / (replayFrames.length - 1) : 1;
|
||||||
pressureMatrix = frameValuesToMatrix(replayFrames[safeIndex].values);
|
const frame = replayFrames[safeIndex];
|
||||||
spatialForce = null;
|
pressureMatrix = frameValuesToMatrix(frame.values);
|
||||||
clearDevkitSpatialForce();
|
spatialForce = frame.spatialForce ?? null;
|
||||||
|
pushReplayFrameToDevkit(frame, safeIndex);
|
||||||
signalPanels = buildInactivePanels();
|
signalPanels = buildInactivePanels();
|
||||||
summary = buildReplaySummaryAt(safeIndex);
|
summary = buildReplaySummaryAt(safeIndex);
|
||||||
hasSignalData = true;
|
hasSignalData = true;
|
||||||
@@ -1081,52 +1127,6 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildConfigLinks(
|
|
||||||
currentLocale: LocaleCode,
|
|
||||||
activeId: string,
|
|
||||||
isSettingsOpen: boolean,
|
|
||||||
isDevKitEnabled: boolean,
|
|
||||||
isDevKitOpen: boolean
|
|
||||||
): HudConfigLink[] {
|
|
||||||
const labels =
|
|
||||||
currentLocale === "zh-CN"
|
|
||||||
? {
|
|
||||||
streamOn: "打开",
|
|
||||||
settings: "参数"
|
|
||||||
}
|
|
||||||
: {
|
|
||||||
streamOn: "Open",
|
|
||||||
settings: "Setup"
|
|
||||||
};
|
|
||||||
const devkitLabel = currentLocale === "zh-CN" ? "开发工具" : "DevKit";
|
|
||||||
|
|
||||||
const links: HudConfigLink[] = [
|
|
||||||
{
|
|
||||||
id: "stream-on",
|
|
||||||
label: labels.streamOn,
|
|
||||||
tone: "lime",
|
|
||||||
active: activeId === "stream-on"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "settings",
|
|
||||||
label: labels.settings,
|
|
||||||
tone: "neutral",
|
|
||||||
active: isSettingsOpen
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
if (isDevKitEnabled) {
|
|
||||||
links.push({
|
|
||||||
id: "devkit",
|
|
||||||
label: devkitLabel,
|
|
||||||
tone: "cyan",
|
|
||||||
active: isDevKitOpen
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return links;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function ensureDefaultWindowSize(): Promise<void> {
|
async function ensureDefaultWindowSize(): Promise<void> {
|
||||||
if (!isTauriRuntime()) {
|
if (!isTauriRuntime()) {
|
||||||
return;
|
return;
|
||||||
@@ -1676,26 +1676,6 @@
|
|||||||
resetReplayVisualState();
|
resetReplayVisualState();
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleConfigLink(event: CustomEvent<string>): void {
|
|
||||||
if (event.detail === "settings") {
|
|
||||||
stageViewMode = "webgl";
|
|
||||||
isConfigPanelOpen = !isConfigPanelOpen;
|
|
||||||
isDevKitConfigOpen = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event.detail === "devkit") {
|
|
||||||
isConfigPanelOpen = false;
|
|
||||||
isDevKitConfigOpen = !isDevKitConfigOpen;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
isConfigPanelOpen = false;
|
|
||||||
isDevKitConfigOpen = false;
|
|
||||||
activeConfigLinkId = event.detail;
|
|
||||||
console.info("[hud] config link clicked:", event.detail);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleWindowControl(event: CustomEvent<WindowControlAction>): Promise<void> {
|
async function handleWindowControl(event: CustomEvent<WindowControlAction>): Promise<void> {
|
||||||
if (!isTauriRuntime()) {
|
if (!isTauriRuntime()) {
|
||||||
return;
|
return;
|
||||||
@@ -1766,9 +1746,6 @@
|
|||||||
|
|
||||||
function handleStageModeChange(event: CustomEvent<StageViewMode>): void {
|
function handleStageModeChange(event: CustomEvent<StageViewMode>): void {
|
||||||
stageViewMode = event.detail;
|
stageViewMode = event.detail;
|
||||||
if (stageViewMode === "model3d") {
|
|
||||||
isConfigPanelOpen = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
@@ -1799,6 +1776,13 @@
|
|||||||
console.error("Failed to listen for hud_stream:", error);
|
console.error("Failed to listen for hud_stream:", error);
|
||||||
});
|
});
|
||||||
void listen<DevKitPztAngleEvent>("devkit_pzt_angle", (event) => {
|
void listen<DevKitPztAngleEvent>("devkit_pzt_angle", (event) => {
|
||||||
|
if (replayHasData) {
|
||||||
|
if (replayPendingDevkitSeq == null || event.payload.seq !== replayPendingDevkitSeq) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
replayPendingDevkitSeq = null;
|
||||||
|
}
|
||||||
|
|
||||||
const angleDeg = Number(event.payload.angle);
|
const angleDeg = Number(event.payload.angle);
|
||||||
if (!Number.isFinite(angleDeg)) {
|
if (!Number.isFinite(angleDeg)) {
|
||||||
clearDevkitSpatialForce();
|
clearDevkitSpatialForce();
|
||||||
@@ -1807,8 +1791,8 @@
|
|||||||
|
|
||||||
devkitSpatialForce = {
|
devkitSpatialForce = {
|
||||||
angleDeg,
|
angleDeg,
|
||||||
magnitude: 0,
|
magnitude: Number.isFinite(event.payload.magnitude) ? event.payload.magnitude : 0,
|
||||||
confidence: 0
|
confidence: event.payload.state
|
||||||
};
|
};
|
||||||
scheduleDevkitSpatialForceClear();
|
scheduleDevkitSpatialForceClear();
|
||||||
hasSignalData =
|
hasSignalData =
|
||||||
@@ -1874,7 +1858,6 @@
|
|||||||
sampleRateValue={sampleRateValue}
|
sampleRateValue={sampleRateValue}
|
||||||
channelsLabel={uiCopy.channelsLabel}
|
channelsLabel={uiCopy.channelsLabel}
|
||||||
channelsValue={channelsValue}
|
channelsValue={channelsValue}
|
||||||
configLinksLabel={uiCopy.configLinksLabel}
|
|
||||||
refreshPortsLabel={uiCopy.refreshPortsLabel}
|
refreshPortsLabel={uiCopy.refreshPortsLabel}
|
||||||
matrixViewLabel={uiCopy.matrixViewLabel}
|
matrixViewLabel={uiCopy.matrixViewLabel}
|
||||||
matrixViewDotsLabel={uiCopy.matrixViewDotsLabel}
|
matrixViewDotsLabel={uiCopy.matrixViewDotsLabel}
|
||||||
@@ -1890,7 +1873,6 @@
|
|||||||
noticeCancelLabel={locale === "zh-CN" ? "取消" : "Cancel"}
|
noticeCancelLabel={locale === "zh-CN" ? "取消" : "Cancel"}
|
||||||
noticeShowActions={updateNoticeVisible}
|
noticeShowActions={updateNoticeVisible}
|
||||||
noticeActionBusy={updateInstallBusy}
|
noticeActionBusy={updateInstallBusy}
|
||||||
{configLinks}
|
|
||||||
{isRefreshingPorts}
|
{isRefreshingPorts}
|
||||||
{isExporting}
|
{isExporting}
|
||||||
isConnectDisabled={!serialPortValue || connectionState === "connecting"}
|
isConnectDisabled={!serialPortValue || connectionState === "connecting"}
|
||||||
@@ -1899,7 +1881,6 @@
|
|||||||
on:windowcontrol={handleWindowControl}
|
on:windowcontrol={handleWindowControl}
|
||||||
on:localechange={handleLocaleChange}
|
on:localechange={handleLocaleChange}
|
||||||
on:portchange={handlePortChange}
|
on:portchange={handlePortChange}
|
||||||
on:configlink={handleConfigLink}
|
|
||||||
on:stagemodechange={handleStageModeChange}
|
on:stagemodechange={handleStageModeChange}
|
||||||
on:serialrefresh={handleSerialRefresh}
|
on:serialrefresh={handleSerialRefresh}
|
||||||
on:serialconnect={handleSerialConnect}
|
on:serialconnect={handleSerialConnect}
|
||||||
@@ -1949,14 +1930,13 @@
|
|||||||
{pressureMatrix}
|
{pressureMatrix}
|
||||||
{spatialForce}
|
{spatialForce}
|
||||||
{devkitSpatialForce}
|
{devkitSpatialForce}
|
||||||
showConfigPanel={isConfigPanelOpen}
|
showConfigPanel={false}
|
||||||
{summary}
|
{summary}
|
||||||
on:replaytoggle={handleReplayToggle}
|
on:replaytoggle={handleReplayToggle}
|
||||||
on:replaystop={handleReplayStop}
|
on:replaystop={handleReplayStop}
|
||||||
on:replayseek={handleReplaySeek}
|
on:replayseek={handleReplaySeek}
|
||||||
on:replayspeed={handleReplaySpeed}
|
on:replayspeed={handleReplaySpeed}
|
||||||
on:replayclose={handleReplayClose}
|
on:replayclose={handleReplayClose}
|
||||||
on:configclose={() => (isConfigPanelOpen = false)}
|
|
||||||
>
|
>
|
||||||
{#if stageViewMode === "webgl"}
|
{#if stageViewMode === "webgl"}
|
||||||
<section class="range-scale" aria-label="Signal Range">
|
<section class="range-scale" aria-label="Signal Range">
|
||||||
|
|||||||
BIN
static/models/je-skin-model.bin
Normal file
BIN
static/models/je-skin-model.bin
Normal file
Binary file not shown.
Binary file not shown.
1
static/models/je-skin-model.gltf
Normal file
1
static/models/je-skin-model.gltf
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user