update devkit server and model files

This commit is contained in:
lenn
2026-06-02 09:43:05 +08:00
parent 0812142359
commit 78c4445b93
40 changed files with 66301 additions and 316 deletions

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View 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')

View 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)

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -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)

File diff suppressed because it is too large Load Diff

BIN
devkit/dist/je-skin-devkit-server.exe vendored Normal file

Binary file not shown.

View File

@@ -5,8 +5,8 @@ a = Analysis(
['sensor_server.py'],
pathex=[],
binaries=[],
datas=[('sensor_stream_pb2.py', '.'), ('sensor_stream_pb2_grpc.py', '.')],
hiddenimports=['grpc', 'openpyxl', 'numpy'],
datas=[('sensor_stream_pb2*.py', '.')],
hiddenimports=['grpc', 'openpyxl'],
hookspath=[],
hooksconfig={},
runtime_hooks=[],

View File

@@ -235,25 +235,45 @@ class SensorPushServicer(sensor_stream_pb2_grpc.SensorPushServicer):
self.frame_count = 0
self.last_report_time = time.time()
self.last_angle = None
self.last_state = 0
self.last_magnitude = 0.0
def Upload(self, request_iterator, context):
print("[SensorPush] Client connected, waiting for frames...")
reset_baseline()
self.last_angle = None
self.last_state = 0
self.last_magnitude = 0.0
for frame in request_iterator:
self.frame_count += 1
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
message = "OK"
if len(frame.matrix) == SENSOR_ROWS * SENSOR_COLS:
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_state = state
self.last_magnitude = magnitude
if self.frame_count <= 10 or self.frame_count % 30 == 0:
print(
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:
ok = False
@@ -270,6 +290,14 @@ class SensorPushServicer(sensor_stream_pb2_grpc.SensorPushServicer):
dts_ms=frame.dts_ms,
ok=ok,
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:
@@ -286,6 +314,8 @@ class SensorPushServicer(sensor_stream_pb2_grpc.SensorPushServicer):
f"[SensorPush] Frame #{frame.seq} | "
f"{frame.rows}x{frame.cols} | "
f"angle={angle_text} | "
f"mag={self.last_magnitude:.2f} | "
f"state={self.last_state} | "
f"force={frame.resultant_force:.1f} | "
f"total={self.frame_count} | ~{fps:.1f} fps"
)
@@ -351,14 +381,24 @@ def serve(port: int):
import numpy as np
import threading
from collections import deque
# ===================== 算法参数=====================
TOTAL_PRESSURE_LOW_THRESHOLD = 500
COP_STABILITY_FRAMES_REQUIRED = 5
# ===================== 切向力算法参数 ======================
COP_INIT_MEDIAN_FRAMES = 1
NOISE_COLLECT_FRAMES = 20
THRESH_K = 5
SENSOR_ROWS = 12
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_lock = threading.Lock()
@@ -366,7 +406,17 @@ first_contact_CoP_x = None
first_contact_CoP_y = None
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):
@@ -381,36 +431,46 @@ def subtract_baseline(current_frame):
return np.clip(diff, 0, None)
# ===================== 重置CoP状态 =====================
def reset_cop_state():
def _legacy_reset_cop_state():
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_y = None
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 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
frame_flat = np.asarray(baseline_subtracted_frame, dtype=np.float32).flatten()
frame2d = frame_flat.reshape(rows, cols)
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:
reset_cop_state()
return 0.0, 0.0
if dynamic_thresh is None:
noise_sum_buf.append(total_pressure)
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:
return 0.0, 0.0
if total_pressure == 0 or (dynamic_thresh is not None and total_pressure < dynamic_thresh):
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))
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_y = 0.0
base_x = cop_x
base_y = cop_y
if not contact_initialized:
first_contact_CoP_x = cop_x
first_contact_CoP_y = cop_y
contact_initialized = True
else:
delta_CoP_x = cop_x - first_contact_CoP_x
delta_CoP_y = cop_y - first_contact_CoP_y
cop_init_x_buf.append(cop_x)
cop_init_y_buf.append(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
mag = np.hypot(x, y)
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
return angle, mag
def compute_PZT_angle(Px: float, Py: float) -> tuple[float, float]:
return compute_vector_angle(Px, -Py)
def _legacy_compute_PZT_angle(Px: float, Py: float) -> tuple[float, float]:
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:
raise ValueError("ADC数据长度必须为84")
baseline_subtracted = subtract_baseline(adc_data)
dx, dy = compute_pressure_direction(baseline_subtracted)
pzt_angle, _ = compute_PZT_angle(dx, dy)
return pzt_angle
result = _legacy_compute_pressure_direction(adc_data)
cop_x, cop_y = result[0], result[1]
dx, dy = result[6], result[7]
base_x, base_y = result[8], result[9]
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():
global first_frame
def _legacy_reset_baseline():
global first_frame, noise_sum_buf, dynamic_thresh
with first_frame_lock:
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__":

View File

@@ -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()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -33,14 +33,14 @@ if not _descriptor._USE_C_DESCRIPTORS:
DESCRIPTOR._loaded_options = None
_globals['_SENSORFRAME']._serialized_start=39
_globals['_SENSORFRAME']._serialized_end=172
_globals['_PZTANGLERESPONSE']._serialized_start=174
_globals['_PZTANGLERESPONSE']._serialized_end=287
_globals['_PROCESSREQUEST']._serialized_start=289
_globals['_PROCESSREQUEST']._serialized_end=345
_globals['_PROCESSRESPONSE']._serialized_start=348
_globals['_PROCESSRESPONSE']._serialized_end=514
_globals['_SENSORPUSH']._serialized_start=516
_globals['_SENSORPUSH']._serialized_end=603
_globals['_EXPORTPROCESSOR']._serialized_start=605
_globals['_EXPORTPROCESSOR']._serialized_end=700
_globals['_PZTANGLERESPONSE']._serialized_start=175
_globals['_PZTANGLERESPONSE']._serialized_end=424
_globals['_PROCESSREQUEST']._serialized_start=426
_globals['_PROCESSREQUEST']._serialized_end=482
_globals['_PROCESSRESPONSE']._serialized_start=485
_globals['_PROCESSRESPONSE']._serialized_end=651
_globals['_SENSORPUSH']._serialized_start=653
_globals['_SENSORPUSH']._serialized_end=740
_globals['_EXPORTPROCESSOR']._serialized_start=742
_globals['_EXPORTPROCESSOR']._serialized_end=837
# @@protoc_insertion_point(module_scope)

View File

33231
devkit/server-start.out.log Normal file

File diff suppressed because it is too large Load Diff

2
package-lock.json generated
View File

@@ -6,7 +6,7 @@
"packages": {
"": {
"name": "JE-Skin",
"version": "0.3.0",
"version": "0.4.0",
"license": "MIT",
"dependencies": {
"@tauri-apps/api": "^2",

View File

@@ -27,6 +27,14 @@ message PztAngleResponse {
uint32 dts_ms = 4;
bool ok = 5;
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 {

View File

@@ -2,11 +2,26 @@
//!
//! 仅在 `devkit` feature 启用时编译。
use serde::Serialize;
use std::sync::atomic::{AtomicU64, Ordering};
use std::time::{SystemTime, UNIX_EPOCH};
use tauri::State;
#[cfg(feature = "devkit")]
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]
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);
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)
}

View File

@@ -1,7 +1,10 @@
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::model::HudSpatialForce;
#[cfg(feature = "multi-dim")]
use crate::serial_core::multi_dim_force::PztProcessor;
use crate::serial_core::record::CsvImporter;
use crate::serial_core::serial::{PollMode, TactileAPollRequester};
use crate::serial_core::{serial, TactileARecording};
@@ -44,6 +47,7 @@ pub struct SerialExportResponse {
pub struct SerialImportFrame {
pub data: Vec<i32>,
pub dts_ms: u64,
pub spatial_force: Option<HudSpatialForce>,
}
#[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 frame_count = packets.len();
let frames = packets
.into_iter()
.map(|packet| SerialImportFrame {
data: packet.data,
dts_ms: packet.dts_ms,
})
.collect();
let frames = build_import_frames(packets);
Ok(SerialImportResponse {
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)
}
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(
state: &State<'_, SerialConnectionState>,
) -> Result<SharedTactileRecording, SerialError> {

View File

@@ -24,6 +24,14 @@ struct DevKitPztAngleEvent {
timestamp_ms: u64,
dts_ms: u32,
angle: f32,
magnitude: f32,
state: i32,
cop_x: f32,
cop_y: f32,
base_x: f32,
base_y: f32,
total_press: f32,
threshold: f32,
}
// ── DevKit 配置 ────────────────────────────────────────────────────
@@ -276,12 +284,28 @@ async fn run_grpc_upload(
timestamp_ms: message.timestamp_ms,
dts_ms: message.dts_ms,
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!(
"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.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)?;
} else {

View File

@@ -154,7 +154,8 @@ pub fn run() {
commands::devkit::devkit_stop,
commands::devkit::devkit_get_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"))]

View File

@@ -3,7 +3,7 @@ use fern::{
Dispatch,
};
use log::debug;
use std::{path::{Path, PathBuf}, time::SystemTime};
use std::{path::PathBuf, time::SystemTime};
fn log_directory() -> PathBuf {
let base_dir = std::env::var_os("LOCALAPPDATA")
@@ -67,6 +67,7 @@ pub fn setup_logger() {
Dispatch::new()
.level(log::LevelFilter::Debug)
.level_for("h2", log::LevelFilter::Info)
.chain(console_config)
.chain(file_config)
.apply()

View File

@@ -17,7 +17,6 @@ const ACTIVE_CELL_MIN_VALUE: f32 = 18.0;
const ACTIVE_CELL_PEAK_RATIO: f32 = 0.14;
const MIN_ACTIVE_CELLS: usize = 3;
const ANCHOR_LERP_ALPHA: f32 = 0.018;
const VECTOR_SMOOTHING_ALPHA: f32 = 0.16;
const REPORT_MAGNITUDE_ENTER: f32 = 0.12;
@@ -29,6 +28,12 @@ const REPORT_HOLD_FRAMES: usize = 10;
const ASYMMETRY_WEIGHT: f32 = 1.1;
const DRIFT_WEIGHT: f32 = 0.65;
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)]
pub struct PztSpatialAnalysis {
@@ -50,6 +55,8 @@ pub struct PztProcessor {
anchor_cop_y: Option<f32>,
last_cop_x: Option<f32>,
last_cop_y: Option<f32>,
edge_start_bias_x: f32,
edge_start_bias_y: f32,
smoothed_x: f32,
smoothed_y: f32,
report_active: bool,
@@ -84,6 +91,8 @@ impl PztProcessor {
anchor_cop_y: None,
last_cop_x: None,
last_cop_y: None,
edge_start_bias_x: 0.0,
edge_start_bias_y: 0.0,
smoothed_x: 0.0,
smoothed_y: 0.0,
report_active: false,
@@ -100,6 +109,8 @@ impl PztProcessor {
self.anchor_cop_y = None;
self.last_cop_x = 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_y = 0.0;
}
@@ -273,6 +284,112 @@ impl PztProcessor {
(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 {
if self.contact_active {
if Self::is_contact_exit_frame(frame) {
@@ -376,6 +493,9 @@ impl PztProcessor {
self.anchor_cop_y = Some(stats.cop_y);
self.last_cop_x = Some(stats.cop_x);
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()));
};
@@ -388,18 +508,25 @@ impl PztProcessor {
let motion_x = stats.cop_x - last_x;
let motion_y = stats.cop_y - last_y;
let combined_x = stats.asymmetry_x * ASYMMETRY_WEIGHT
+ drift_x * DRIFT_WEIGHT
+ motion_x * MOTION_WEIGHT;
let combined_y = stats.asymmetry_y * ASYMMETRY_WEIGHT
+ drift_y * DRIFT_WEIGHT
+ motion_y * MOTION_WEIGHT;
let kinematic_x = drift_x * DRIFT_WEIGHT + motion_x * MOTION_WEIGHT;
let kinematic_y = drift_y * DRIFT_WEIGHT + motion_y * MOTION_WEIGHT;
let edge_bias_x = self.edge_start_bias_x;
let edge_bias_y = self.edge_start_bias_y;
let (asymmetry_x, asymmetry_y) =
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_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_y = Some(stats.cop_y);
@@ -446,7 +573,7 @@ impl PztProcessor {
#[cfg(test)]
mod tests {
use super::{PztProcessor, SENSOR_COLS, SENSOR_ROWS};
use super::{ContactStats, PztProcessor, SENSOR_COLS, SENSOR_ROWS};
fn index(row: usize, col: usize) -> usize {
row * SENSOR_COLS + col
@@ -460,6 +587,23 @@ mod tests {
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]
fn idle_frame_does_not_report_contact() {
let mut processor = PztProcessor::new();
@@ -524,4 +668,29 @@ mod tests {
let analysis = processor.get_pzt_analysis(&weak).unwrap();
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);
}
}

View File

@@ -9,7 +9,6 @@ use crate::serial_core::multi_dim_force::PztProcessor;
use crate::serial_core::record::Recording;
use crate::serial_core::record::{FrameTiming, RecordedFrame};
use anyhow::Result;
use log::debug;
use std::future::pending;
#[cfg(feature = "devkit")]
use std::sync::atomic::Ordering;
@@ -311,15 +310,14 @@ where
drop(record);
if let Some(vals) = decode_res {
#[cfg(feature = "multi-dim")]
let mut spatial_force = None;
#[cfg(not(feature = "multi-dim"))]
let spatial_force = None;
#[cfg(feature = "multi-dim")]
{
let pzt_values = vals.iter().map(|value| *value as f32).collect::<Vec<f32>>();
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) {
spatial_force = Some(HudSpatialForce {
angle_deg: analysis.angle_deg,

View File

@@ -2,7 +2,6 @@
import { createEventDispatcher } from "svelte";
import type {
ConnectionState,
HudConfigLink,
HudNoticeTone,
LocaleCode,
StageViewMode,
@@ -28,8 +27,6 @@
export let serialPortValue = "";
export let serialPortOptions: string[] = [];
export let refreshPortsLabel = "";
export let configLinksLabel = "";
export let configLinks: HudConfigLink[] = [];
export let matrixViewLabel = "";
export let matrixViewDotsLabel = "";
export let stageViewMode: StageViewMode = "webgl";
@@ -53,7 +50,6 @@
const dispatch = createEventDispatcher<{
windowcontrol: WindowControlAction;
localechange: LocaleCode;
configlink: string;
matrixdisplaytoggle: boolean;
stagemodechange: StageViewMode;
portchange: string;
@@ -97,10 +93,6 @@
dispatch("localechange", nextLocale);
}
function emitConfigLink(linkId: string): void {
dispatch("configlink", linkId);
}
function emitStageModeChange(nextMode: StageViewMode): void {
dispatch("stagemodechange", nextMode);
}
@@ -185,20 +177,6 @@
<div class="control-bar">
<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}>
<span class="state-dot" class:ok={connectionTone === "ok"} class:warn={connectionTone === "warn"}></span>
<span class="state-label">{connectionLabel}</span>
@@ -930,93 +908,6 @@
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 {
border: 1px solid transparent;
border-radius: 999px;
@@ -1043,21 +934,11 @@
background: rgb(24 31 25 / 0.9);
}
@media (max-width: 1080px) {
.config-links {
flex-wrap: wrap;
}
}
@media (max-width: 820px) {
.control-main-row {
gap: 0.44rem;
}
.config-links {
flex-wrap: wrap;
}
.serial-select {
padding-inline-start: 0.45rem;
}

View File

@@ -9,7 +9,7 @@
type ModelLoadState = "loading" | "ready" | "missing" | "error";
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 canvasEl: HTMLCanvasElement | undefined;

View File

@@ -14,8 +14,6 @@ export type MatrixDisplayMode = "numeric" | "dots";
export type SignalPanelSide = "left" | "right";
export type HudConfigTone = "neutral" | "cyan" | "lime" | "orange";
export interface HudSignalSeries {
id: string;
tone: SignalTone;
@@ -64,13 +62,6 @@ export interface HudSummary {
max: number | null;
}
export interface HudConfigLink {
id: string;
label: string;
tone?: HudConfigTone;
active?: boolean;
}
export interface HudColorMapOption {
id: PressureColorMapPreset;
label: string;
@@ -107,7 +98,6 @@ export interface HudCopy {
deviceLabel: string;
sampleRateLabel: string;
channelsLabel: string;
configLinksLabel: string;
refreshPortsLabel: string;
connectActionLabel: string;
disconnectActionLabel: string;
@@ -169,6 +159,7 @@ export interface SerialRecordStateResult {
export interface SerialImportFrameResult {
data: number[];
dtsMs: number;
spatialForce: HudSpatialForce | null;
}
export interface SerialImportResult {

View File

@@ -19,7 +19,6 @@
FileExplorerRoot,
HudColorMapOption,
HudCopy,
HudConfigLink,
HudNoticeTone,
HudPacket,
HudSpatialForce,
@@ -43,6 +42,7 @@
interface ReplayFrame {
values: number[];
dtsMs: number;
spatialForce?: HudSpatialForce | null;
}
interface DevKitPztAngleEvent {
@@ -50,6 +50,20 @@
timestampMs: number;
dtsMs: 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> = {
@@ -83,7 +97,6 @@
deviceLabel: "设备",
sampleRateLabel: "采样率",
channelsLabel: "通道",
configLinksLabel: "配置链接",
refreshPortsLabel: "刷新",
connectActionLabel: "连接",
disconnectActionLabel: "断开",
@@ -145,7 +158,6 @@
deviceLabel: "Device",
sampleRateLabel: "Sample Rate",
channelsLabel: "Channels",
configLinksLabel: "Config Links",
refreshPortsLabel: "Refresh",
connectActionLabel: "Connect",
disconnectActionLabel: "Disconnect",
@@ -228,8 +240,6 @@
let sampleRateValue = "100Hz";
let channelsValue = "84";
let isWindowMaximized = false;
let activeConfigLinkId = "stream-on";
let isConfigPanelOpen = false;
let hasSignalData = false;
let signalPanels: HudSignalPanel[] = buildInactivePanels();
let summary: HudSummary = buildEmptySummary();
@@ -250,6 +260,8 @@
let replayProgress = 0;
let replayFileName = "";
let replayTimerId: number | null = null;
let replayPendingDevkitSeq: number | null = null;
let replayDevkitSeqCounter = 0;
let fileExplorerOpen = false;
let fileExplorerMode: FileExplorerMode = "open";
let fileExplorerBusy = false;
@@ -279,13 +291,6 @@
let sessionStartedAt: number = Date.now();
$: uiCopy = copyByLocale[locale];
$: configLinks = buildConfigLinks(
locale,
activeConfigLinkId,
isConfigPanelOpen,
devkitEnabled,
isDevKitConfigOpen
);
$: leftSignalPanels = signalPanels.filter((panel) => panel.side === "left");
$: rightSignalPanels = signalPanels.filter((panel) => panel.side === "right");
$: rangeTicks = buildRangeTicks(rangeMin, rangeMax);
@@ -679,7 +684,8 @@
});
frames = result.frames.map((frame) => ({
values: frame.data,
dtsMs: frame.dtsMs
dtsMs: frame.dtsMs,
spatialForce: frame.spatialForce
}));
importedFrameCount = result.frameCount;
importedChannelCount = result.channelCount;
@@ -709,7 +715,8 @@
const frames = result.frames.map((frame) => ({
values: frame.data,
dtsMs: frame.dtsMs
dtsMs: frame.dtsMs,
spatialForce: frame.spatialForce
}));
applyImportedFrames(result.fileName, frames, result.frameCount, result.channelCount);
@@ -730,6 +737,43 @@
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[] {
const totalCells = Math.max(matrixRows * matrixCols, 1);
const matrix = new Array<number>(totalCells).fill(0);
@@ -750,6 +794,7 @@
function resetReplayVisualState(): void {
pressureMatrix = buildZeroMatrix();
spatialForce = null;
replayPendingDevkitSeq = null;
clearDevkitSpatialForce();
signalPanels = buildInactivePanels();
summary = buildEmptySummary();
@@ -785,9 +830,10 @@
replayCurrentIndex = safeIndex;
replayHasDisplayedFrame = true;
replayProgress = replayFrames.length > 1 ? safeIndex / (replayFrames.length - 1) : 1;
pressureMatrix = frameValuesToMatrix(replayFrames[safeIndex].values);
spatialForce = null;
clearDevkitSpatialForce();
const frame = replayFrames[safeIndex];
pressureMatrix = frameValuesToMatrix(frame.values);
spatialForce = frame.spatialForce ?? null;
pushReplayFrameToDevkit(frame, safeIndex);
signalPanels = buildInactivePanels();
summary = buildReplaySummaryAt(safeIndex);
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> {
if (!isTauriRuntime()) {
return;
@@ -1676,26 +1676,6 @@
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> {
if (!isTauriRuntime()) {
return;
@@ -1766,9 +1746,6 @@
function handleStageModeChange(event: CustomEvent<StageViewMode>): void {
stageViewMode = event.detail;
if (stageViewMode === "model3d") {
isConfigPanelOpen = false;
}
}
onMount(() => {
@@ -1799,6 +1776,13 @@
console.error("Failed to listen for hud_stream:", error);
});
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);
if (!Number.isFinite(angleDeg)) {
clearDevkitSpatialForce();
@@ -1807,8 +1791,8 @@
devkitSpatialForce = {
angleDeg,
magnitude: 0,
confidence: 0
magnitude: Number.isFinite(event.payload.magnitude) ? event.payload.magnitude : 0,
confidence: event.payload.state
};
scheduleDevkitSpatialForceClear();
hasSignalData =
@@ -1874,7 +1858,6 @@
sampleRateValue={sampleRateValue}
channelsLabel={uiCopy.channelsLabel}
channelsValue={channelsValue}
configLinksLabel={uiCopy.configLinksLabel}
refreshPortsLabel={uiCopy.refreshPortsLabel}
matrixViewLabel={uiCopy.matrixViewLabel}
matrixViewDotsLabel={uiCopy.matrixViewDotsLabel}
@@ -1890,7 +1873,6 @@
noticeCancelLabel={locale === "zh-CN" ? "取消" : "Cancel"}
noticeShowActions={updateNoticeVisible}
noticeActionBusy={updateInstallBusy}
{configLinks}
{isRefreshingPorts}
{isExporting}
isConnectDisabled={!serialPortValue || connectionState === "connecting"}
@@ -1899,7 +1881,6 @@
on:windowcontrol={handleWindowControl}
on:localechange={handleLocaleChange}
on:portchange={handlePortChange}
on:configlink={handleConfigLink}
on:stagemodechange={handleStageModeChange}
on:serialrefresh={handleSerialRefresh}
on:serialconnect={handleSerialConnect}
@@ -1949,14 +1930,13 @@
{pressureMatrix}
{spatialForce}
{devkitSpatialForce}
showConfigPanel={isConfigPanelOpen}
showConfigPanel={false}
{summary}
on:replaytoggle={handleReplayToggle}
on:replaystop={handleReplayStop}
on:replayseek={handleReplaySeek}
on:replayspeed={handleReplaySpeed}
on:replayclose={handleReplayClose}
on:configclose={() => (isConfigPanelOpen = false)}
>
{#if stageViewMode === "webgl"}
<section class="range-scale" aria-label="Signal Range">

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long