diff --git a/lib_xua/lib_xua/src/core/buffer/ep/ep_buffer.xc b/lib_xua/lib_xua/src/core/buffer/ep/ep_buffer.xc index b18dd1e..8cfbdbd 100644 --- a/lib_xua/lib_xua/src/core/buffer/ep/ep_buffer.xc +++ b/lib_xua/lib_xua/src/core/buffer/ep/ep_buffer.xc @@ -24,6 +24,7 @@ unsigned char g_hidPassData[HID_PASS_REPORT_BYTES] = {HID_PASS_REPORT_ID, 0x0}; unsigned char g_hidData_Down[HID_MAX_OUT_BYTES] = {0U}; unsigned char last_hidData = 0; unsigned char last_hidPassData = 0; +extern void user_read_hidpass(unsigned char * unsafe hidPassData); #endif void GetADCCounts(unsigned samFreq, int &min, int &mid, int &max); @@ -1248,12 +1249,11 @@ void XUA_Buffer_Ep( } if (id == 1) { - int hidDataLength = (int) UserHIDGetData(id, g_hidPassData); - XUD_SetReady_In(ep_hid, g_hidPassData, hidDataLength); - // printf("hidDataLength: %d\n", hidDataLength); - - hidClearChangePending(id); - + unsafe { + user_read_hidpass(&g_hidPassData[1]); + } + XUD_SetReady_In(ep_hid, g_hidPassData, HID_PASS_REPORT_BYTES); + hidClearChangePending(id); } } } diff --git a/lib_xua/lib_xua/src/dfu/dfu.xc b/lib_xua/lib_xua/src/dfu/dfu.xc index e449a80..ea9d033 100644 --- a/lib_xua/lib_xua/src/dfu/dfu.xc +++ b/lib_xua/lib_xua/src/dfu/dfu.xc @@ -28,7 +28,7 @@ void SetDFUFlag(unsigned x) } /* Load flag from fixed address */ -static unsigned GetDFUFlag() +unsigned GetDFUFlag() { unsigned x; asm volatile("ldw %0, %1[0]" : "=r"(x) : "r"(FLAG_ADDRESS)); diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/CMakeLists.txt b/sw_usb_audio/app_usb_aud_fosi_c1/CMakeLists.txt new file mode 100644 index 0000000..0d7ac44 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/CMakeLists.txt @@ -0,0 +1,384 @@ +cmake_minimum_required(VERSION 3.21) +include($ENV{XMOS_CMAKE_PATH}/xcommon.cmake) +include(${CMAKE_CURRENT_LIST_DIR}/mode_cal.cmake) +project(phaten_module) + +set(APP_HW_TARGET xu316_qf60.xn) +include(${CMAKE_CURRENT_LIST_DIR}/../deps.cmake) +#set(APP_PCA_ENABLE ON) + +set(SW_USB_VERSION -DBCD_DEVICE_J=1 + -DBCD_DEVICE_M=0 + -DBCD_DEVICE_N=0) + +set(SW_FACT_VERSION -DBCD_DEVICE_J=5 + -DBCD_DEVICE_M=5 + -DBCD_DEVICE_N=7) + +set(SW_USB_AUDIO_FLAGS ${EXTRA_BUILD_FLAGS} ${SW_USB_VERSION} -O3 + -report + -lquadflash + -g + -lotp3 + -DUART_TX_VALUE=0x4 + -DUSB_TILE=tile[0] + -DADAT_TX_USE_SHARED_BUFF=1 + -DXUA_QUAD_SPI_FLASH=1) + + + +set(SW_FACT_AUDIO_FLAGS ${EXTRA_BUILD_FLAGS} ${SW_FACT_VERSION} + -O3 + -report + -lquadflash + -g + -lotp3 + -DUART_TX_VALUE=0x4 + -DUSB_TILE=tile[0] + -DADAT_TX_USE_SHARED_BUFF=1 + -DXUA_QUAD_SPI_FLASH=1) + + + +# Build config naming scheme: +# +# Audio Class: 1 or 2 +# Sync Mode A(sync) or S(ync) +# I2S M(aster) or S(lave) +# Input enabled: i (channelcount) +# Output enabled: o (channelcount) +# MIDI enabled: m, disabled: x +# SPDIF in enabled: s, disabled: x +# SPDIF out enabled: s, disabled: x +# ADAT in enabled: a, disabled: x +# ADAT out enabled: a, disabled: x +# DSD out enabled: d, disabled: x +# Resolution width enabled: w (width) +# Max sample rate enabled: r (rate xx khz) +# +# + +# Audio configuration options +# I2S Mode: 0 - Master, 1 - Slave +# Sync Mode: 0 - Async, 1 - Sync +# MIDI Enable: 0 - Disable, 1 - Enable +# SPDIF In Enable: 0 - Disable, 1 - Enable +# SPDIF Out Enable: 0 - Disable, 1 - Enable +# ADAT In Enable: 0 - Disable, 1 - Enable +# ADAT Out Enable: 0 - Disable, 1 - Enable +# DSD Out Enable: 0 - Disable, 1 - Enable + +# Audio Sample Rates: +# 0 - 44.1KHz, 1 - 48KHz, 2 - 88.2KHz, 3 - 96KHz, +# 4 - 176.4KHz, 5 - 192KHz, 6 - 352.8KHz, 7 - 384KHz, +# 8 - 705.6KHz, 9 - 768KHz, 10 - 1411.2KHz, 11 - 1536KHz + +# MQA Enable: 0 - Disable, 1 - Enable +# Audio Class: 0 - UAC 1.0, 1 - USB UAC 2.0 +# Audio Width: 0 - 16-bit, 1 - 24-bit, 2 - 32-bit + +# Input Channel Count: 0 - Disable, >0 - Channel count +# Output Channel Count: 0 - Disable, >0 - Channel count +# Other Config: Reserved for future configurations + +# Calculating BYTE0 to BYTE3 values based on the above configurations +# BYTE0: Contains I2S Mode, Sync Mode, MIDI Enable, SPDIF In/Out Enable, ADAT In/Out Enable, DSD Out Enable +# BYTE1: Contains Audio Sample Rate, MQA Enable, Audio Class, Audio Width +# BYTE2: Contains Input Channel Count, Output Channel Count, Other Config +# BYTE3: Reserved, currently set to 0 + +set(APP_COMPILER_FLAGS_factory ${SW_FACT_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 + -DNUM_USB_CHAN_IN=0 + -DXUA_DFU_EN=1 + -DBOOT_MODE=1 + -DFACT_MODE=1 + #-fxscope + #-DXSCOPE + -DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=32 + -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=24 + -DXUA_SPDIF_TX_EN=0 + -DMAX_FREQ=\(768000\) + -DMIN_FREQ=\(44100\) + -DDEFAULT_FREQ=\(48000\) + -DUART_DEBUG=0 + -DHID_CONTROLS=1 + -DEQ_EN=1 + -DHID_DFU_EN=1 + #-DDEBUG_MEMORY_LOG_ENABLED=0 + -DNUM_USB_CHAN_OUT=2 + -DI2S_CHANS_ADC=0) + +#set(APP_COMPILER_FLAGS_boot_0x1 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 +# -DNUM_USB_CHAN_IN=0 +# -DDSD_CHANS_DAC=2 +# -DHID_DFU_EN=1 +# -DI2S_DSD_SHARED=1 +# -DXUA_DFU_EN=1 +# -DBOOT_MODE=1 +# -DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=32 +# -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=24 +# -DMAX_FREQ=\(768000\) +# -DMIN_FREQ=\(44100\) +# -DDEFAULT_FREQ=\(44100\) +# -DHID_CONTROLS=1 +# #-DDEBUG_MEMORY_LOG_ENABLED=0 +# -DNUM_USB_CHAN_OUT=2 +# -DI2S_CHANS_ADC=0) +# +# +#set(MODE_2AMi0o2xxxxxxw16r768_VALUES I2S_MODE=0 +# SYNC_MODE=0 +# MIDI_ENABLE=0 +# SPDIF_IN_ENABLE=0 +# SPDIF_OUT_ENABLE=0 +# ADAT_IN_ENABLE=0 +# ADAT_OUT_ENABLE=0 +# DSD_OUT_ENABLE=0 +# AUDIO_SAMPLE_RATE=9 # 768KHz +# MQA_ENABLE=0 +# AUDIO_CLASS=1 # UAC 2.0 +# AUDIO_WIDTH=2 # 16bit +# INPUT_CHANNEL=0 # Disable +# OUTPUT_CHANNEL=2 # 2 channels +# OTHER_CFG=0) +# +# +#calculate_config_value(MODE_2AMi0o2xxxxxxw16r768_VALUES CONFIG_VALUE) +##set(VARIABLE_NAME "APP_COMPILER_FLAGS_${CONFIG_VALUE}") +# +# +#set(APP_COMPILER_FLAGS_2AMi0o2xxxxxxw32r768_${CONFIG_VALUE} ${SW_USB_AUDIO_FLAGS} +# -DI2S_CHANS_DAC=2 +# -DDSD_CHANS_DAC=2 +# -DI2S_DSD_SHARED=1 +# -DNUM_USB_CHAN_IN=0 +# -DNUM_USB_CHAN_OUT=2 +# -DXUA_DFU_EN=1 +# -DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=32 +# -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=24 +# -DMAX_FREQ=\(384000\) +# -DMIN_FREQ=\(44100\) +# -DDEFAULT_FREQ=\(44100\) +# -DHID_DFU_EN=1 +# #-fxscope +# #-DXSCOPE +# -DHID_CONTROLS=1 +# -DEQ_EN=1 +# #-DDEBUG_MEMORY_LOG_ENABLED=1 +# -DNO_LOG_TIMESTAPS=1 +# -DI2S_CHANS_ADC=0) +# +#set(MODE_2AMi0o0xsxxxxw24r192_VALUES I2S_MODE=0 +# SYNC_MODE=0 +# MIDI_ENABLE=0 +# SPDIF_IN_ENABLE=1 +# SPDIF_OUT_ENABLE=0 +# ADAT_IN_ENABLE=0 +# ADAT_OUT_ENABLE=0 +# DSD_OUT_ENABLE=0 +# AUDIO_SAMPLE_RATE=5 # 768KHz +# MQA_ENABLE=0 +# AUDIO_CLASS=1 # UAC 2.0 +# AUDIO_WIDTH=1 # 24bit +# INPUT_CHANNEL=0 # Disable +# OUTPUT_CHANNEL=2 # 2 channels +# OTHER_CFG=0) +# +# +#calculate_config_value(MODE_2AMi0o0xsxxxxw24r192_VALUES CONFIG_VALUE) +# +# +#set(APP_COMPILER_FLAGS_2AMi0o0xsxxxxw24r192_${CONFIG_VALUE} ${SW_USB_AUDIO_FLAGS} +# -DXUA_SPDIF_RX_EN=1 +# -DXUA_SPDIF_TX_EN=0 +# -DI2S_CHANS_DAC=2 +# -DSPDIF_RX_I2S_OUT=1 +# -DXUA_USB_EN=0 +# -DNUM_USB_CHAN_IN=0 +# -DNUM_USB_CHAN_OUT=0 +# -DXUA_USE_SW_PLL=1 +# -DOUT_VOLUME_IN_MIXER=0 +# -DXUA_DFU_EN=0 +# -DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=24 +# -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16 +# -DMCLK_441=\(512*44100\) +# -DMCLK_48=\(512*48000\) +# -DMAX_FREQ=\(192000\) +# -DMIN_FREQ=\(44100\) +# -DDEFAULT_FREQ=\(44100\) +# -DHID_CONTROLS=0 +# -DOPT=1 +# -DEQ_EN=1 +# -DSPDIF_RX_TILE=1 +# -DDEBUG_MEMORY_LOG_ENABLED=0 +# -DNO_LOG_TIMESTAPS=0 +# -DI2S_CHANS_ADC=0) +# +#set(MODE_2AMi0o0xsxxxxw24r192_VALUES I2S_MODE=0 +# SYNC_MODE=0 +# MIDI_ENABLE=0 +# SPDIF_IN_ENABLE=1 +# SPDIF_OUT_ENABLE=0 +# ADAT_IN_ENABLE=0 +# ADAT_OUT_ENABLE=0 +# DSD_OUT_ENABLE=0 +# AUDIO_SAMPLE_RATE=5 # 768KHz +# MQA_ENABLE=0 +# AUDIO_CLASS=1 # UAC 2.0 +# AUDIO_WIDTH=1 # 24bit +# INPUT_CHANNEL=0 # Disable +# OUTPUT_CHANNEL=2 # 2 channels +# OTHER_CFG=1) +# +# +# +#calculate_config_value(MODE_2AMi0o0xsxxxxw24r192_VALUES CONFIG_VALUE) +# +# +#set(APP_COMPILER_FLAGS_2AMi0o0xsxxxxw24r192_${CONFIG_VALUE} ${SW_USB_AUDIO_FLAGS} +# -DXUA_SPDIF_RX_EN=1 +# -DXUA_SPDIF_TX_EN=0 +# -DI2S_CHANS_DAC=2 +# -DSPDIF_RX_I2S_OUT=1 +# -DXUA_USB_EN=0 +# -DNUM_USB_CHAN_IN=0 +# -DNUM_USB_CHAN_OUT=0 +# -DXUA_USE_SW_PLL=1 +# -DOUT_VOLUME_IN_MIXER=0 +# -DXUA_DFU_EN=0 +# -DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=24 +# -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16 +# -DMCLK_441=\(512*44100\) +# -DMCLK_48=\(512*48000\) +# -DMAX_FREQ=\(192000\) +# -DMIN_FREQ=\(44100\) +# -DDEFAULT_FREQ=\(44100\) +# -DHID_CONTROLS=0 +# -DCOAX=1 +# -DEQ_EN=1 +# -DUART_DEBUG=0 +# -DSPDIF_RX_TILE=1 +# #-DDEBUG_MEMORY_LOG_ENABLED=0 +# -DNO_LOG_TIMESTAPS=0 +# -DI2S_CHANS_ADC=0) + +set(MODE_1AMi0o0xsxxxxw16r48_VALUES I2S_MODE=0 + SYNC_MODE=0 + MIDI_ENABLE=0 + SPDIF_IN_ENABLE=0 + SPDIF_OUT_ENABLE=0 + ADAT_IN_ENABLE=0 + ADAT_OUT_ENABLE=0 + DSD_OUT_ENABLE=0 + AUDIO_SAMPLE_RATE=1 # 768KHz + MQA_ENABLE=0 + AUDIO_CLASS=0 # UAC 2.0 + AUDIO_WIDTH=0 # 24bit + INPUT_CHANNEL=0 # Disable + OUTPUT_CHANNEL=2 # 2 channels + OTHER_CFG=0) + + +calculate_config_value(MODE_1AMi0o0xsxxxxw16r48_VALUES CONFIG_VALUE) + + +set(APP_COMPILER_FLAGS_1AMi0o0xsxxxxw16r48_${CONFIG_VALUE} ${SW_USB_AUDIO_FLAGS} + -DXUA_SPDIF_RX_EN=0 + -DXUA_SPDIF_TX_EN=0 + -DI2S_CHANS_DAC=2 + -DSPDIF_RX_I2S_OUT=0 + #-DAUDIO_CLASS=1 + -DXUA_USB_EN=1 + -DNUM_USB_CHAN_IN=2 + -DWINDOWS_OS_DESCRIPTOR_SUPPORT + -DNUM_USB_CHAN_IN_FS=2 + -DNUM_USB_CHAN_OUT=2 + -DNUM_USB_CHAN_OUT_FS=2 + -DXUA_USE_SW_PLL=0 + -DOUT_VOLUME_IN_MIXER=0 + #-fxscope + #-DXSCOPE + -DXUA_DFU_EN=0 + -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16 + -DOUTPUT_FORMAT_COUNT=1 + -DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=16 + -DINPUT_FORMAT_COUNT=1 + -DMCLK_441=\(1024*44100\) + -DMCLK_48=\(1024*48000\) + -DMAX_FREQ=\(48000\) + -DMIN_FREQ=\(48000\) + -DDEFAULT_FREQ=\(48000\) + -lxmos_fps + -DHID_CONTROLS_UAC1=1 + -DEQ_EN=1 + -DXMOS_FPS_EN=1 + -DUAC1=1 + -DHID_CONTROLS=1 + -DDNR_50MS=1 + -ldnr_50ms + -DDEBUG_MEMORY_LOG_ENABLED=1 + -DNO_LOG_TIMESTAPS=0 + -DI2S_CHANS_ADC=2) + +set(MODE_1AMi0o0xsxxxxw16r48_VALUES I2S_MODE=0 + SYNC_MODE=0 + MIDI_ENABLE=0 + SPDIF_IN_ENABLE=0 + SPDIF_OUT_ENABLE=0 + ADAT_IN_ENABLE=0 + ADAT_OUT_ENABLE=0 + DSD_OUT_ENABLE=0 + AUDIO_SAMPLE_RATE=1 # 768KHz + MQA_ENABLE=0 + AUDIO_CLASS=0 # UAC 2.0 + AUDIO_WIDTH=0 # 24bit + INPUT_CHANNEL=0 # Disable + OUTPUT_CHANNEL=2 # 2 channels + OTHER_CFG=1) + + +calculate_config_value(MODE_1AMi0o0xsxxxxw16r48_VALUES CONFIG_VALUE) + + +set(APP_COMPILER_FLAGS_1AMi0o0xsxxxxw16r48_${CONFIG_VALUE} ${SW_USB_AUDIO_FLAGS} + -DXUA_SPDIF_RX_EN=0 + -DXUA_SPDIF_TX_EN=0 + -DI2S_CHANS_DAC=2 + -DSPDIF_RX_I2S_OUT=0 + #-DAUDIO_CLASS=1 + -DXUA_USB_EN=1 + -DNUM_USB_CHAN_IN=2 + -DNUM_USB_CHAN_OUT=8 + -DNUM_USB_CHAN_OUT_FS=2 + -DXUA_USE_SW_PLL=0 + -DOUT_VOLUME_IN_MIXER=0 + #-fxscope + #-DXSCOPE + -DXUA_DFU_EN=0 + -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=32 + -DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=32 + -DMCLK_441=\(1024*44100\) + -DMCLK_48=\(1024*48000\) + -DMAX_FREQ=\(48000\) + -DMIN_FREQ=\(48000\) + -DDEFAULT_FREQ=\(48000\) + -DUAC1=1 + -DTHREE_AUDIO=1 + -lxmos_fps + -DHID_CONTROLS=1 + #-DBR_ALGO=1 + #-lbr + -DEQ_EN=1 + -DDNR_50MS=1 + -ldnr_50ms + -DDEBUG_MEMORY_LOG_ENABLED=1 + -DNO_LOG_TIMESTAPS=0 + -DI2S_CHANS_ADC=2) + + + +set(APP_INCLUDES src src/core src/extensions ../shared/) +set(XMOS_SANDBOX_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) +link_directories("${CMAKE_CURRENT_LIST_DIR}/src/extensions/dnr/") + +XMOS_REGISTER_APP() diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/flash.bat b/sw_usb_audio/app_usb_aud_fosi_c1/flash.bat new file mode 100644 index 0000000..0563c89 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/flash.bat @@ -0,0 +1 @@ +xflash --write-all %1 --target-file .\src\core\xu316_qf60.xn --spi-spec .\PY25Q32SH_QSPI.spec diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/gen_factory.bat b/sw_usb_audio/app_usb_aud_fosi_c1/gen_factory.bat new file mode 100644 index 0000000..4eaed09 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/gen_factory.bat @@ -0,0 +1 @@ +xflash bin/factory/phaten_module_factory.xe --loader loader.o --upgrade 2 bin/1AMi0o0xsxxxxw16r48_0x800100/phaten_module_1AMi0o0xsxxxxw16r48_0x800100.xe --upgrade 1 bin/1AMi0o0xsxxxxw16r48_0x10800100/phaten_module_1AMi0o0xsxxxxw16r48_0x10800100.xe -o %1 diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/gen_update.bat b/sw_usb_audio/app_usb_aud_fosi_c1/gen_update.bat new file mode 100644 index 0000000..86459e0 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/gen_update.bat @@ -0,0 +1 @@ +xflash --factory-version 15.3 --target-file src/core/xu316_qf60.xn --upgrade 2 bin/1AMi0o0xsxxxxw16r48_0x800100/phaten_module_1AMi0o0xsxxxxw16r48_0x800100.xe --upgrade 1 bin/1AMi0o0xsxxxxw16r48_0x10800100/phaten_module_1AMi0o0xsxxxxw16r48_0x10800100.xe -o %1 diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/loader.o b/sw_usb_audio/app_usb_aud_fosi_c1/loader.o new file mode 100644 index 0000000..b014a4b Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/loader.o differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/mode_cal.cmake b/sw_usb_audio/app_usb_aud_fosi_c1/mode_cal.cmake new file mode 100644 index 0000000..4c971e0 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/mode_cal.cmake @@ -0,0 +1,53 @@ +function(calculate_config_value VALUES_VAR CONFIG_VALUE_VAR) + set(BYTE0 0) + set(BYTE1 0) + set(BYTE2 0) + set(BYTE3 0) + + foreach(FLAG ${${VALUES_VAR}}) + string(REPLACE "=" ";" FLAG_LIST ${FLAG}) + list(GET FLAG_LIST 0 KEY) + list(GET FLAG_LIST 1 VALUE) + + if("${KEY}" STREQUAL "I2S_MODE") + math(EXPR BYTE0 "${BYTE0} | ${VALUE} << 7" OUTPUT_FORMAT HEXADECIMAL) + elseif("${KEY}" STREQUAL "SYNC_MODE") + math(EXPR BYTE0 "${BYTE0} | ${VALUE} << 6" OUTPUT_FORMAT HEXADECIMAL) + elseif("${KEY}" STREQUAL "MIDI_ENABLE") + math(EXPR BYTE0 "${BYTE0} | ${VALUE} << 5" OUTPUT_FORMAT HEXADECIMAL) + elseif("${KEY}" STREQUAL "SPDIF_IN_ENABLE") + math(EXPR BYTE0 "${BYTE0} | ${VALUE} << 4" OUTPUT_FORMAT HEXADECIMAL) + elseif("${KEY}" STREQUAL "SPDIF_OUT_ENABLE") + math(EXPR BYTE0 "${BYTE0} | ${VALUE} << 3" OUTPUT_FORMAT HEXADECIMAL) + elseif("${KEY}" STREQUAL "ADAT_IN_ENABLE") + math(EXPR BYTE0 "${BYTE0} | ${VALUE} << 2" OUTPUT_FORMAT HEXADECIMAL) + elseif("${KEY}" STREQUAL "ADAT_OUT_ENABLE") + math(EXPR BYTE0 "${BYTE0} | ${VALUE} << 1" OUTPUT_FORMAT HEXADECIMAL) + elseif("${KEY}" STREQUAL "DSD_OUT_ENABLE") + math(EXPR BYTE0 "${BYTE0} | ${VALUE}" OUTPUT_FORMAT HEXADECIMAL) + elseif("${KEY}" STREQUAL "AUDIO_SAMPLE_RATE") + math(EXPR BYTE1 "${BYTE1} | ${VALUE} & 0x0F" OUTPUT_FORMAT HEXADECIMAL) + elseif("${KEY}" STREQUAL "MQA_ENABLE") + math(EXPR BYTE1 "${BYTE1} | (${VALUE} << 4)" OUTPUT_FORMAT HEXADECIMAL) + elseif("${KEY}" STREQUAL "AUDIO_CLASS") + math(EXPR BYTE1 "${BYTE1} | (${VALUE} << 5)" OUTPUT_FORMAT HEXADECIMAL) + elseif("${KEY}" STREQUAL "AUDIO_WIDTH") + math(EXPR BYTE1 "${BYTE1} | (${VALUE} << 6)" OUTPUT_FORMAT HEXADECIMAL) + elseif("${KEY}" STREQUAL "INPUT_CHANNEL") + math(EXPR BYTE2 "${BYTE2} | ${VALUE} & 0x3F" OUTPUT_FORMAT HEXADECIMAL) + elseif("${KEY}" STREQUAL "OUTPUT_CHANNEL") + math(EXPR BYTE2 "${BYTE2} | (${VALUE} << 6) & 0xFC0" OUTPUT_FORMAT HEXADECIMAL) + elseif("${KEY}" STREQUAL "OTHER_CFG") + math(EXPR BYTE2 "${BYTE2} | (${VALUE} << 12) & 0xF000" OUTPUT_FORMAT HEXADECIMAL) + endif() + endforeach() + + # 打印每个字节的值 + #message(STATUS "BYTE0: 0x${BYTE0}") + #message(STATUS "BYTE1: 0x${BYTE1}") + #message(STATUS "BYTE2: 0x${BYTE2}") + #message(STATUS "BYTE3: 0x${BYTE3}") + math(EXPR CONFIG_VALUE "${BYTE3} << 24 | ${BYTE2} << 16 | ${BYTE1} << 8 | ${BYTE0}" OUTPUT_FORMAT HEXADECIMAL) + set(${CONFIG_VALUE_VAR} "${CONFIG_VALUE}" PARENT_SCOPE) +endfunction() + diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/core/xk-audio-316-mc.xn b/sw_usb_audio/app_usb_aud_fosi_c1/src/core/xk-audio-316-mc.xn new file mode 100644 index 0000000..19f2a6e --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/core/xk-audio-316-mc.xn @@ -0,0 +1,93 @@ + + + Board + xcore.ai MC Audio Board + + + tileref tile[2] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/core/xu316_qf60.xn b/sw_usb_audio/app_usb_aud_fosi_c1/src/core/xu316_qf60.xn new file mode 100644 index 0000000..88013e0 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/core/xu316_qf60.xn @@ -0,0 +1,83 @@ + + + Board + XS3 MC Audio + + tileref tile[2] + tileref usb_tile + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/core/xua_conf.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/core/xua_conf.h new file mode 100644 index 0000000..63dfdb3 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/core/xua_conf.h @@ -0,0 +1,503 @@ +/** + * @file xua_conf.h + * @brief Defines relating to device configuration and customisation. + * For xCORE.ai Audio MC Board + * @author Ross Owen, XMOS Limited + */ +#ifndef _XUA_CONF_H_ +#define _XUA_CONF_H_ + +#include "../../../shared/version.h" + +/* + * Device configuration option defines to override default defines found in lib_xua/api/xua_conf_default.h + * + * Build can be customised but changing and adding defines here + * + * Note, we check if they are already defined in Makefile + */ + +/*** Defines relating to basic functionality ***/ +/* Enable/Disable MIDI - Default is MIDI off */ +#ifndef MIDI +#define MIDI (0) +#endif + +/* Enable/Disable S/PDIF output - Default is S/PDIF off */ +#ifndef XUA_SPDIF_TX_EN +#define XUA_SPDIF_TX_EN (0) +#endif + +/* Enable/Disable S/PDIF input - Default is S/PDIF off */ +#ifndef XUA_SPDIF_RX_EN +#define XUA_SPDIF_RX_EN (0) +#endif + +/* Enable/Disable ADAT output - Default is ADAT off */ +#ifndef XUA_ADAT_TX_EN +#define XUA_ADAT_TX_EN (0) +#endif + +/* Enable/Disable ADAT input - Default is ADAT off */ +#ifndef XUA_ADAT_RX_EN +#define XUA_ADAT_RX_EN (0) +#endif + +/* Enable/Disable Mixing core(s) - Default is on */ +#ifndef MIXER +#define MIXER (0) +#endif + +#ifndef _XUA_BMAX_POWER +#define _XUA_BMAX_POWER (50) +#endif + +/* Set the number of mixes to perform - Default is 0 i.e mixing disabled */ +#ifndef MAX_MIX_COUNT +#define MAX_MIX_COUNT (0) +#endif + +/* Audio Class version - Default is 2.0 */ +#ifndef AUDIO_CLASS +#define AUDIO_CLASS (2) +#endif + +/*** Defines relating to channel counts ***/ +/* Number of I2S channels to DACs*/ +#ifndef I2S_CHANS_DAC +#define I2S_CHANS_DAC (8) +#endif + +/* Number of I2S channels from ADCs */ +#ifndef I2S_CHANS_ADC +#define I2S_CHANS_ADC (8) +#endif + +/* Number of USB streaming channels - by default calculate by counting audio interfaces */ +#ifndef NUM_USB_CHAN_IN +#define NUM_USB_CHAN_IN (I2S_CHANS_ADC + 2*XUA_SPDIF_RX_EN + 8*XUA_ADAT_RX_EN) /* Device to Host */ +#endif + +#ifndef NUM_USB_CHAN_OUT +#define NUM_USB_CHAN_OUT (I2S_CHANS_DAC + 2*XUA_SPDIF_TX_EN + 8*XUA_ADAT_TX_EN) /* Host to Device */ +#endif + +/*** Defines relating to channel arrangement/indices ***/ +/* Channel index of S/PDIF Tx channels: separate channels after analogue channels (if they fit) */ +#ifndef SPDIF_TX_INDEX + #if (I2S_CHANS_DAC + 2*XUA_SPDIF_TX_EN) <= NUM_USB_CHAN_OUT + #define SPDIF_TX_INDEX (I2S_CHANS_DAC) + #else + #define SPDIF_TX_INDEX (0) + #endif +#endif + +/* Channel index of S/PDIF Rx channels: separate channels after analogue channels */ +#ifndef SPDIF_RX_INDEX +#define SPDIF_RX_INDEX (I2S_CHANS_ADC) +#endif + +/* Channel index of ADAT Tx channels: separate channels after S/PDIF channels (if they fit) */ +#ifndef ADAT_TX_INDEX + #define ADAT_TX_INDEX (I2S_CHANS_DAC + 2*XUA_SPDIF_TX_EN) +#endif + +/* Channel index of ADAT Rx channels: separate channels after S/PDIF channels */ +#ifndef ADAT_RX_INDEX +#define ADAT_RX_INDEX (I2S_CHANS_ADC + 2*XUA_SPDIF_RX_EN) +#endif + +/*** Defines relating to audio frequencies ***/ +/* Master clock defines (in Hz) */ +#ifndef MCLK_441 +#define MCLK_441 (1024*44100) /* 44.1, 88.2 etc */ +#endif + +#ifndef MCLK_48 +#define MCLK_48 (1024*48000) /* 48, 96 etc */ +#endif + +/* Maximum frequency device runs at */ +#ifndef MAX_FREQ +#define MAX_FREQ (768000) +#endif + +#ifndef MIN_FREQ +#define MIN_FREQ (44100) +#endif + +#ifndef DEFAULT_FREQ +#define DEFAULT_FREQ (48000) +#endif + +/*** Defines relating to feature placement regarding tiles ***/ +#define XUD_TILE (0) +#define PLL_REF_TILE (0) + +#define AUDIO_IO_TILE (0) +#define MIDI_TILE (1) +#ifndef SPDIF_TX_TILE +#define SPDIF_TX_TILE (1) +#endif + +/*** Defines relating to USB descriptor strings and ID's ***/ + #define VENDOR_ID (0x152A) /* XMOS VID */ + #ifndef PID_AUDIO_2 + #if XMOS_FPS_EN==1 + #define PID_AUDIO_2 (0x889B) + #else + #define PID_AUDIO_2 (0x889C) + #endif + #endif + #ifndef PID_AUDIO_1 + #define PID_AUDIO_1 (0x889D) + #endif + #define PRODUCT_STR_A2 "Fosi Audio C1" + #define PRODUCT_STR_A1 "Fosi Audio C1" + + +#ifndef AUDIO_CLASS_FALLBACK +#define AUDIO_CLASS_FALLBACK (1) +#endif + +/* Board power source - Default is bus-powered */ +#ifndef XUA_POWERMODE +#define XUA_POWERMODE XUA_POWERMODE_SELF +#endif + +/* Enable/Disable example HID code - Default is off */ +#ifndef HID_CONTROLS +#define HID_CONTROLS (0) +#endif + +#ifndef OUTPUT_VOLUME_CONTROL +#define OUTPUT_VOLUME_CONTROL (0) +#endif + +#ifndef INPUT_VOLUME_CONTROL +#define INPUT_VOLUME_CONTROL (0) +#endif +#ifndef OUT_VOLUME_IN_MIXER +#define OUT_VOLUME_IN_MIXER (0) +#endif +#ifndef IN_VOLUME_IN_MIXER +#define IN_VOLUME_IN_MIXER (0) +#endif + +#define EXCLUDE_USB_AUDIO_MAIN (1) +/* + * New spispec for QF60 board + * */ + #define FL_QUADDEVICE_GD25Q32E \ +{ \ + 0, /* XT25F16F - Just specify 0 as flash_id */ \ + 256, /* page size */ \ + 16384, /* num pages */ \ + 3, /* address size */ \ + 4, /* log2 clock divider */ \ + 0x9F, /* QSPI_RDID */ \ + 0, /* id dummy bytes */ \ + 3, /* id size in bytes */ \ + 0xc84016, /* device id */ \ + 0x20, /* QSPI_SE */ \ + 4096, /* Sector erase is always 4KB */ \ + 0x06, /* QSPI_WREN */ \ + 0x04, /* QSPI_WRDI */ \ + PROT_TYPE_SR, /* Protection via SR */ \ + {{0x0,0x00},{0,0}}, /* QSPI_SP, QSPI_SU */ \ + 0x02, /* QSPI_PP */ \ + 0xEB, /* QSPI_READ_FAST */ \ + 1, /* 1 read dummy byte */ \ + SECTOR_LAYOUT_REGULAR, /* mad sectors */ \ + {4096,{0,{0}}}, /* regular sector sizes */ \ + 0x05, /* QSPI_RDSR */ \ + 0x01, /* QSPI_WRSR */ \ + 0x01, /* QSPI_WIP_BIT_MASK */ \ +} + #define FL_QUADDEVICE_ZB25VQ32D_2 \ +{ \ + 0, /* XT25F16F - Just specify 0 as flash_id */ \ + 256, /* page size */ \ + 16384, /* num pages */ \ + 3, /* address size */ \ + 4, /* log2 clock divider */ \ + 0x9F, /* QSPI_RDID */ \ + 0, /* id dummy bytes */ \ + 3, /* id size in bytes */ \ + 0x5E6016, /* device id */ \ + 0x20, /* QSPI_SE */ \ + 4096, /* Sector erase is always 4KB */ \ + 0x06, /* QSPI_WREN */ \ + 0x04, /* QSPI_WRDI */ \ + PROT_TYPE_SR, /* Protection via SR */ \ + {{0x0,0x00},{0,0}}, /* QSPI_SP, QSPI_SU */ \ + 0x02, /* QSPI_PP */ \ + 0xEB, /* QSPI_READ_FAST */ \ + 1, /* 1 read dummy byte */ \ + SECTOR_LAYOUT_REGULAR, /* mad sectors */ \ + {4096,{0,{0}}}, /* regular sector sizes */ \ + 0x05, /* QSPI_RDSR */ \ + 0x01, /* QSPI_WRSR */ \ + 0x01, /* QSPI_WIP_BIT_MASK */ \ +} + + #define FL_QUADDEVICE_ZB25VQ32D \ +{ \ + 0, /* XT25F16F - Just specify 0 as flash_id */ \ + 256, /* page size */ \ + 16384, /* num pages */ \ + 3, /* address size */ \ + 4, /* log2 clock divider */ \ + 0x9F, /* QSPI_RDID */ \ + 0, /* id dummy bytes */ \ + 3, /* id size in bytes */ \ + 0x5E4016, /* device id */ \ + 0x20, /* QSPI_SE */ \ + 4096, /* Sector erase is always 4KB */ \ + 0x06, /* QSPI_WREN */ \ + 0x04, /* QSPI_WRDI */ \ + PROT_TYPE_SR, /* Protection via SR */ \ + {{0x0,0x00},{0,0}}, /* QSPI_SP, QSPI_SU */ \ + 0x02, /* QSPI_PP */ \ + 0xEB, /* QSPI_READ_FAST */ \ + 1, /* 1 read dummy byte */ \ + SECTOR_LAYOUT_REGULAR, /* mad sectors */ \ + {4096,{0,{0}}}, /* regular sector sizes */ \ + 0x05, /* QSPI_RDSR */ \ + 0x01, /* QSPI_WRSR */ \ + 0x01, /* QSPI_WIP_BIT_MASK */ \ +} + + #define FL_QUADDEVICE_PY25Q32SH \ +{ \ + 0, /* XT25F16F - Just specify 0 as flash_id */ \ + 256, /* page size */ \ + 16384, /* num pages */ \ + 3, /* address size */ \ + 4, /* log2 clock divider */ \ + 0x9F, /* QSPI_RDID */ \ + 0, /* id dummy bytes */ \ + 3, /* id size in bytes */ \ + 0x856016, /* device id */ \ + 0x20, /* QSPI_SE */ \ + 4096, /* Sector erase is always 4KB */ \ + 0x06, /* QSPI_WREN */ \ + 0x04, /* QSPI_WRDI */ \ + PROT_TYPE_SR, /* Protection via SR */ \ + {{0x0,0x00},{0,0}}, /* QSPI_SP, QSPI_SU */ \ + 0x02, /* QSPI_PP */ \ + 0xEB, /* QSPI_READ_FAST */ \ + 1, /* 1 read dummy byte */ \ + SECTOR_LAYOUT_REGULAR, /* mad sectors */ \ + {4096,{0,{0}}}, /* regular sector sizes */ \ + 0x05, /* QSPI_RDSR */ \ + 0x01, /* QSPI_WRSR */ \ + 0x01, /* QSPI_WIP_BIT_MASK */ \ +} + + #define FL_QUADDEVICE_PY25Q32H \ +{ \ + 0, /* XT25F16F - Just specify 0 as flash_id */ \ + 256, /* page size */ \ + 16384, /* num pages */ \ + 3, /* address size */ \ + 4, /* log2 clock divider */ \ + 0x9F, /* QSPI_RDID */ \ + 0, /* id dummy bytes */ \ + 3, /* id size in bytes */ \ + 0x852016, /* device id */ \ + 0x20, /* QSPI_SE */ \ + 4096, /* Sector erase is always 4KB */ \ + 0x06, /* QSPI_WREN */ \ + 0x04, /* QSPI_WRDI */ \ + PROT_TYPE_SR, /* Protection via SR */ \ + {{0x0,0x00},{0,0}}, /* QSPI_SP, QSPI_SU */ \ + 0x02, /* QSPI_PP */ \ + 0xEB, /* QSPI_READ_FAST */ \ + 1, /* 1 read dummy byte */ \ + SECTOR_LAYOUT_REGULAR, /* mad sectors */ \ + {4096,{0,{0}}}, /* regular sector sizes */ \ + 0x05, /* QSPI_RDSR */ \ + 0x01, /* QSPI_WRSR */ \ + 0x01, /* QSPI_WIP_BIT_MASK */ \ +} + +#define FL_QUADDEVICE_XT25F16F \ +{ \ + 0, /* XT25F16F - Just specify 0 as flash_id */ \ + 256, /* page size */ \ + 8192, /* num pages */ \ + 3, /* address size */ \ + 4, /* log2 clock divider */ \ + 0x9F, /* QSPI_RDID */ \ + 0, /* id dummy bytes */ \ + 3, /* id size in bytes */ \ + 0x0B4015, /* device id */ \ + 0x20, /* QSPI_SE */ \ + 4096, /* Sector erase is always 4KB */ \ + 0x06, /* QSPI_WREN */ \ + 0x04, /* QSPI_WRDI */ \ + PROT_TYPE_SR, /* Protection via SR */ \ + {{0x0,0x00},{0,0}}, /* QSPI_SP, QSPI_SU */ \ + 0x02, /* QSPI_PP */ \ + 0xEB, /* QSPI_READ_FAST */ \ + 1, /* 1 read dummy byte */ \ + SECTOR_LAYOUT_REGULAR, /* mad sectors */ \ + {4096,{0,{0}}}, /* regular sector sizes */ \ + 0x05, /* QSPI_RDSR */ \ + 0x01, /* QSPI_WRSR */ \ + 0x01, /* QSPI_WIP_BIT_MASK */ \ +} + +#define FL_QUADDEVICE_WINBOND_W25Q16JW \ +{ \ + 0, /* W25Q16JW - Just specify 0 as flash_id */ \ + 256, /* page size */ \ + 8192, /* num pages */ \ + 3, /* address size */ \ + 4, /* log2 clock divider */ \ + 0x9F, /* QSPI_RDID */ \ + 0, /* id dummy bytes */ \ + 3, /* id size in bytes */ \ + 0xEF4015, /* device id */ \ + 0x20, /* QSPI_SE */ \ + 4096, /* Sector erase is always 4KB */ \ + 0x06, /* QSPI_WREN */ \ + 0x04, /* QSPI_WRDI */ \ + PROT_TYPE_SR, /* Protection via SR */ \ + {{0x3C,0x00},{0,0}}, /* QSPI_SP, QSPI_SU */ \ + 0x02, /* QSPI_PP */ \ + 0xEB, /* QSPI_READ_FAST */ \ + 1, /* 1 read dummy byte */ \ + SECTOR_LAYOUT_REGULAR, /* mad sectors */ \ + {4096,{0,{0}}}, /* regular sector sizes */ \ + 0x05, /* QSPI_RDSR */ \ + 0x01, /* QSPI_WRSR */ \ + 0x01, /* QSPI_WIP_BIT_MASK */ \ +} + +#define FL_QUADDEVICE_UC25HQ16B \ +{ \ + 0, /* W25Q16JW - Just specify 0 as flash_id */ \ + 256, /* page size */ \ + 8192, /* num pages */ \ + 3, /* address size */ \ + 4, /* log2 clock divider */ \ + 0x9F, /* QSPI_RDID */ \ + 0, /* id dummy bytes */ \ + 3, /* id size in bytes */ \ + 0xB36015, /* device id */ \ + 0x20, /* QSPI_SE */ \ + 4096, /* Sector erase is always 4KB */ \ + 0x06, /* QSPI_WREN */ \ + 0x04, /* QSPI_WRDI */ \ + PROT_TYPE_SR, /* Protection via SR */ \ + {{0x3C,0x00},{0,0}}, /* QSPI_SP, QSPI_SU */ \ + 0x02, /* QSPI_PP */ \ + 0xEB, /* QSPI_READ_FAST */ \ + 1, /* 1 read dummy byte */ \ + SECTOR_LAYOUT_REGULAR, /* mad sectors */ \ + {4096,{0,{0}}}, /* regular sector sizes */ \ + 0x05, /* QSPI_RDSR */ \ + 0x01, /* QSPI_WRSR */ \ + 0x01, /* QSPI_WIP_BIT_MASK */ \ +} + +/* + * New spispec for QF60 3V3 board + * */ + +#define FL_QUADDEVICE_WINBOND_W25Q32JVxxxM \ +{ \ + 0, /* W25Q32JV - Just specify 0 as flash_id */ \ + 256, /* page size */ \ + 16384, /* num pages */ \ + 3, /* address size */ \ + 4, /* log2 clock divider */ \ + 0x9F, /* QSPI_RDID */ \ + 0, /* id dummy bytes */ \ + 3, /* id size in bytes */ \ + 0xEF4016, /* device id */ \ + 0x20, /* QSPI_SE */ \ + 4096, /* Sector erase is always 4KB */ \ + 0x06, /* QSPI_WREN */ \ + 0x04, /* QSPI_WRDI */ \ + PROT_TYPE_SR, /* Protection via SR */ \ + {{0x3C,0x00},{0,0}}, /* QSPI_SP, QSPI_SU */ \ + 0x02, /* QSPI_PP */ \ + 0xEB, /* QSPI_READ_FAST */ \ + 1, /* 1 read dummy byte */ \ + SECTOR_LAYOUT_REGULAR, /* mad sectors */ \ + {4096,{0,{0}}}, /* regular sector sizes */ \ + 0x05, /* QSPI_RDSR */ \ + 0x01, /* QSPI_WRSR */ \ + 0x01, /* QSPI_WIP_BIT_MASK */ \ +} + +/* + * New spispec for xcore-AI explorer board + * */ +#define FL_QUADDEVICE_MX25R3235 \ +{ \ + 0, /* MX25R3235 - Just specify 0 as flash_id */ \ + 256, /* page size */ \ + 16384, /* num pages */ \ + 3, /* address size */ \ + 3, /* log2 clock divider */ \ + 0x9F, /* QSPI_RDID */ \ + 0, /* id dummy bytes */ \ + 3, /* id size in bytes */ \ + 0xC22816, /* device id */ \ + 0x20, /* QSPI_SE */ \ + 4096, /* Sector erase is always 4KB */ \ + 0x06, /* QSPI_WREN */ \ + 0x04, /* QSPI_WRDI */ \ + PROT_TYPE_SR, /* Protection via SR */ \ + {{0x3C,0x00},{0,0}}, /* QSPI_SP, QSPI_SU */ \ + 0x02, /* QSPI_PP */ \ + 0xEB, /* QSPI_READ_FAST */ \ + 1, /* 1 read dummy byte */ \ + SECTOR_LAYOUT_REGULAR, /* mad sectors */ \ + {4096,{0,{0}}}, /* regular sector sizes */ \ + 0x05, /* QSPI_RDSR */ \ + 0x01, /* QSPI_WRSR */ \ + 0x01, /* QSPI_WIP_BIT_MASK */ \ +} + +#define FL_QUADDEVICE_MX25L160E \ +{ \ + 0, /* MX25R3235 - Just specify 0 as flash_id */ \ + 256, /* page size */ \ + 8192, /* num pages */ \ + 3, /* address size */ \ + 3, /* log2 clock divider */ \ + 0x9F, /* QSPI_RDID */ \ + 0, /* id dummy bytes */ \ + 3, /* id size in bytes */ \ + 0xC22017, /* device id */ \ + 0x20, /* QSPI_SE */ \ + 4096, /* Sector erase is always 4KB */ \ + 0x06, /* QSPI_WREN */ \ + 0x04, /* QSPI_WRDI */ \ + PROT_TYPE_SR, /* Protection via SR */ \ + {{0x3C,0x00},{0,0}}, /* QSPI_SP, QSPI_SU */ \ + 0x02, /* QSPI_PP */ \ + 0xEB, /* QSPI_READ_FAST */ \ + 1, /* 1 read dummy byte */ \ + SECTOR_LAYOUT_REGULAR, /* mad sectors */ \ + {4096,{0,{0}}}, /* regular sector sizes */ \ + 0x05, /* QSPI_RDSR */ \ + 0x01, /* QSPI_WRSR */ \ + 0x01, /* QSPI_WIP_BIT_MASK */ \ +} + + +// DFU_FLASH_DEVICE is a comma-separated list of flash spec structures +// This define is used in lib_xua/lib_xua/src/dfu/flashlib_user.c +#define DFU_FLASH_DEVICE FL_QUADDEVICE_GD25Q32E, FL_QUADDEVICE_ZB25VQ32D, FL_QUADDEVICE_ZB25VQ32D_2, FL_QUADDEVICE_PY25Q32SH, FL_QUADDEVICE_PY25Q32H, FL_QUADDEVICE_XT25F16F, FL_QUADDEVICE_WINBOND_W25Q16JW, FL_QUADDEVICE_UC25HQ16B, FL_QUADDEVICE_WINBOND_W25Q32JVxxxM, FL_QUADDEVICE_MX25R3235, FL_QUADDEVICE_MX25L160E +//: + + +#include "user_main.h" + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/XUD_HAL.xc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/XUD_HAL.xc new file mode 100644 index 0000000..1bafd7b --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/XUD_HAL.xc @@ -0,0 +1,12 @@ +#include +#include "xua.h" + +on tile[XUD_TILE]: in port p_vbus = XS1_PORT_4C; + +unsigned int XUD_HAL_GetVBusState(void) +{ + unsigned vBus; + p_vbus :> vBus; + return !vBus; +} + diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/__pycache__/filter_utils.cpython-310.pyc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/__pycache__/filter_utils.cpython-310.pyc new file mode 100644 index 0000000..e7bbb5a Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/__pycache__/filter_utils.cpython-310.pyc differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/__pycache__/filter_utils.cpython-312.pyc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/__pycache__/filter_utils.cpython-312.pyc new file mode 100644 index 0000000..943f368 Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/__pycache__/filter_utils.cpython-312.pyc differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/app_dsp.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/app_dsp.h new file mode 100644 index 0000000..40d73b2 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/app_dsp.h @@ -0,0 +1,25 @@ +// Copyright 2024 XMOS LIMITED. +// This Software is subject to the terms of the XMOS Public Licence: Version 1. + + +#pragma once +#include +#include + + +// control inputs, from control thread to DSP +typedef struct { + uint8_t msg[24]; + uint8_t pcm_dsd; +} app_dsp_input_control_t; + + +// control outputs, from DSP to control thread. +typedef struct { + uint8_t msg[24]; +} app_dsp_output_control_t; + +typedef interface dsp_control_if { + app_dsp_output_control_t do_control(app_dsp_input_control_t input); +} dsp_control_if; + diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiohw.xc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiohw.xc new file mode 100644 index 0000000..c030e3d --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiohw.xc @@ -0,0 +1,1693 @@ +#if UART_DEBUG || DEBUG_MEMORY_LOG_ENABLED +#define DEBUG_PRINT_ENABLE 1 +#endif + +#include +#include +#include +#include "xassert.h" +#include "i2c.h" +#include "xua.h" +#include "gpio_access.h" +#include "xc_ptr.h" +#include +#include "debug_print.h" +#include "user_uart.h" +#include "module_security.h" +#include "eq_flash_storage.h" +#include "lfs_io.h" +#include "app_dsp.h" +#include "roleswitchflag.h" +#include "xua_hid_report.h" +#include "nau88c21.h" +#if MQA_EN +#include "MQA_XMOS.h" +#endif + +extern "C" { + #include "sw_pll.h" + #include "dfu_upgrade.h" +} + +#define TIMER_PERIOD 2000000 + + +audio_sampling g_new_playback_format, g_playback_format; +audio_type g_new_audio_type, g_audio_type = 0; +unsigned g_mute_enable = 0; +unsigned g_unmute_dac_state, g_unmute_time, g_format_time; +unsigned g_volume_level = 60, g_saved_volume_level = 60; +unsigned g_request_volume_set = 0; +unsigned g_dac_vol = 0xB8; +unsigned g_adc_vol = 0x25; +unsigned g_adc_loop = 0; +unsigned g_mute_switch = 0; // 改动原因:与g_adc_loop一致,记录MCU回传的静音开关状态并用于HID变化上报(k6 UART在tile0可直接设置) +unsigned g_led_enable = 0; +unsigned g_dnr_enable = 1; +unsigned g_3d_enable = 1; +unsigned g_led_mode = 0; +unsigned g_fps_enable = 0; +uint32_t get_reference_time(); +unsigned g_dac_mode = 10; +unsigned g_new_dac_mode = 0; +unsigned g_samfreq = DEFAULT_FREQ; +unsigned g_old_audio_type = 0; +// 改动原因:添加DSD模式全局变量,用于HID命令读取采样率和格式信息(已去掉DAC采样分辨率) +unsigned g_dsd_mode = 0; // DSD模式:0=PCM, >0=DSD +unsigned g_gain_mode = 0; // 0: 低阻, 1: 高阻 +// 改动原因:支持8种滤波器模式(0-7),与g_filter_map[8]数组定义一致 +unsigned g_filter_mode = 0; // 0-7: 对应8种滤波器模式 +// 改动原因:添加增益模式和滤波器模式的请求变量,用于HID命令设置模式 +unsigned g_request_gain_mode = -1; // -1表示无请求,0=低阻,1=高阻 +// 改动原因:支持8种滤波器模式(0-7),与g_filter_map[8]数组定义一致 +unsigned g_request_filter_mode = -1; // -1表示无请求,0-7=滤波器模式 +unsigned g_request_game_mode = -1; +// 改动原因:新增C1模式全局变量,按需求定义0=蓝灯、1=绿灯;默认值为0并在开机时用Flash中的持久化值覆盖。 +unsigned g_c1_mode_value = 0; +#if EQ_EN +extern unsigned g_request_eq_mode, g_new_eq_mode; +#endif +unsigned g_update_led = 0x0; + +// CODEC I2C lines +on tile[0]: port p_scl = PORT_I2C_SCL; +on tile[0]: port p_sda = PORT_I2C_SDA; +on tile[0]: in port p_button = XS1_PORT_8D; //bit 4: mode button, bit 5: volume down button, bit 6: mic mute button, bit 7: volume up button + +on tile[1]: out port p_mode_led_red = XS1_PORT_1F; +on tile[1]: out port p_leds = XS1_PORT_4D; //bit 0: mode led green, bit 1: mode led blue, bit 2: mic mute led red, bit 3: volume up led green +on tile[1]: out port p_mic_mute_led_blue = XS1_PORT_1G; + +timer tm; +#define SE_DELAY (2000000000) //20s delay +#define BOOT_TIMEOUT (1000000000) //5s delay +#define MUTE_ENABLE_DELAY (100000000) //1s delay +#define UMUTE_DELAY (15000000) //150ms delay +#define FORMAT_DELAY (30000000) //300ms delay +#define EQ_MODE_DELAY (100000000) //100ms delay +#define EQ_SYNC_DELAY (50000000) //500ms delay for EQ parameter sync + +// 改动原因:C1四个实体按键全部接在XS1_PORT_8D的bit4-bit7,统一定义位掩码,避免在按键状态机中直接使用魔数。 +#define C1_KEY_MODE_MASK 0x10 +#define C1_KEY_VOL_DOWN_MASK 0x20 +#define C1_KEY_MIC_MUTE_MASK 0x40 +#define C1_KEY_VOL_UP_MASK 0x80 + +// 改动原因:g_dac_vol在C1中按NAU88C22 DAC音量寄存器值保存,限制在现有dac_volume注释对应的-66dB~0dB范围内。 +#define C1_DAC_VOL_MIN 0x4B +#define C1_DAC_VOL_MAX 0xCF +#define C1_DAC_MUTE 0x00 +// 改动原因:DAC寄存器按2个码值对应1dB,按键每次调节步进固定为2,确保与硬件音量刻度一致。 +#define C1_DAC_VOL_STEP 0x02 + +// 改动原因:C1的TIMER_PERIOD为20ms,按DS1同类短按/长按模型换算阈值;长按1s后每100ms连续调节音量。 +#define C1_KEY_SHORT_TICKS 1 +#define C1_KEY_LONG_TICKS 50 +#define C1_KEY_REPEAT_TICKS 5 +// 改动原因:新增C1模式持久化文件路径,使用LittleFS保存mode按键状态,保证断电重启后可恢复。 +#define C1_MODE_VALUE_PATH "c1_mode_value" + +// 改动原因:新增mode默认值与有效范围常量,集中定义便于维护并确保Flash异常时能回退到安全默认值。 +#define C1_MODE_VALUE_DEFAULT 0 +#define C1_MODE_VALUE_MIN 0 +#define C1_MODE_VALUE_MAX 1 + +// 改动原因:mode值与面板LED颜色索引不是同一编码,封装转换避免业务代码散落魔数映射关系。 +static inline unsigned c1_mode_to_led_color_idx(unsigned mode_value) +{ + // 改动原因:需求定义0=蓝灯、1=绿灯;现有LED接口约定2=蓝灯、1=绿灯,因此做显式转换。 + return (mode_value == 0) ? 2 : 1; +} + +#define NAU88L21_PGA_GAIN_REG_MIN_USED_VALUE 0x0 // 0x1=1, 0dB (0x0, -1dB which is not used in this design) +#define NAU88L21_PGA_GAIN_REG_MAX_VALUE 0x25+1 // 0x25=37, 36dB. +1 is for extra 1.5dB digital gain +#define NAU88L21_PGA_GAIN_REG_DEFAULT_VALUE (NAU88L21_PGA_GAIN_REG_MAX_VALUE) + +// CODEC reset line +on tile[0]: out port p_mclk_sel = XS1_PORT_4E; +on tile[0]: out port p_gpio = XS1_PORT_4F; + +#define LED_OFF 0x7F // 修改:清除最高位,只保留低7位 +#define LED_RED 0b01011111 // 修改:清除最高位,只保留低7位 +#define LED_GREEN 0b01101111 // 修改:清除最高位,只保留低7am +#define LED_BLUE 0b00111111 // 修改:清除最高位,只保留低7位 +#define LED_YELLOW (LED_RED & LED_GREEN) +#define LED_CYAN (LED_GREEN & LED_BLUE) +#define LED_PURPLE (LED_RED & LED_BLUE) +#define LED_WHITE (LED_RED & LED_GREEN & LED_BLUE) +unsigned g_led_color = LED_OFF; +unsigned g_led_blink_count = 0; +unsigned g_led_blink_is_white = 0; + +// 改动原因:创建全局数组用于存储音量和LED状态变化的HID上报数据(63字节,不包括Report ID) +// 参考UserReadHIDLog方式,使用全局数组存储HID数据 +extern unsigned char g_hid_pass_data[64]; +static unsigned g_last_dac_vol = 0xFF; // 改动原因:改为检测g_dac_vol的变化,初始化为0xFF表示未初始化 +static unsigned g_last_mute_switch = 0xFF; // 改动原因:检测静音开关变化并上报0xB2,0xFF=未初始化 +static unsigned g_last_adc_loop = 0xFF; // 改动原因:检测监听开关(g_adc_loop)变化并上报0xB4,0xFF=未初始化 +static unsigned g_last_audio_type = 0xFF; // 改动原因:上次检测到的音频类型,初始化为0xFF表示未初始化,用于LED颜色判断 +static unsigned g_last_led_status = 0xFF; // 上次检测到的LED状态,初始化为0xFF表示未初始化 +// 改动原因:添加采样率和格式监控变量,用于检测变化并上报HID(已去掉DAC采样分辨率) +unsigned g_last_samfreq = 0xFFFFFFFF; // 上次检测到的采样率,初始化为0xFFFFFFFF表示未初始化 +unsigned g_last_dsd_mode = 0xFF; // 上次检测到的DSD模式,初始化为0xFF表示未初始化 +// 改动原因:添加增益模式、滤波器模式和游戏模式监控变量,用于检测变化并上报HID +static unsigned g_last_gain_mode = 0xFF; // 上次检测到的增益模式,初始化为0xFF表示未初始化 +static unsigned g_last_filter_mode = 0xFF; // 上次检测到的滤波器模式,初始化为0xFF表示未初始化 +static unsigned g_last_game_mode = 0xFF; // 上次检测到的游戏模式,初始化为0xFF表示未初始化 +#if UAC1 +unsigned g_uac_mode = 1; // 2 for UAC2.0, 1 for UAC1.0 +#else +unsigned g_uac_mode = 2; // 2 for UAC2.0, 1 for UAC1.0 +#endif + +// 改动原因:XS1_PORT_8D现在作为C1四个实体按键端口p_button使用;旧p_8ch_in只在#if 0代码块中引用,继续声明会造成重复端口映射错误。 +// on tile[0]: in port p_8ch_in = XS1_PORT_8D; + + +void device_reboot(void); + +unsafe streaming chanend uc_audiohw; +/* 改动原因:添加 uc_dfu 全局 streaming chanend,用于从 EP0 HID 处理 + * (process_send_params) 向 uart_handler 转发固件升级命令。 + * sender 端在此处赋值(AudioHwRemote par 分支),receiver 端传给 uart_handler。 */ +unsafe streaming chanend uc_dfu; + +typedef enum +{ + AUDIOHW_CMD_REGWR, + AUDIOHW_CMD_REGRD +} audioHwCmd_t; + +void unmute_dac(void); +void mute_dac(void); + +// 新增函数声明 +void pcm_to_dsd_switch(unsigned targetFreq); +void dsd_to_pcm_switch(unsigned targetFreq); + +void CODEC_REGWRITE(unsigned device, unsigned reg, unsigned val) +{ + unsafe + { + uc_audiohw <: (unsigned) AUDIOHW_CMD_REGWR; + uc_audiohw <: device; + uc_audiohw <: reg; + uc_audiohw <: val; + } +} + +/* 改动原因:实现 DFU channel 转发函数,将 HID 收到的 63 字节固件升级命令 + * 打包为 16 个 unsigned word 通过 streaming channel 发送到 uart_handler。 + * 该函数从 eq.c 的 process_send_params 中调用(代替原来直接调用 handle_* 函数)。 */ +void dfu_chan_forward(unsigned char data[], unsigned len) +{ + unsafe + { + for (int i = 0; i < 16; i++) { + unsigned word = 0; + for (int j = 0; j < 4; j++) { + int idx = i * 4 + j; + if (idx < 63) { + word |= ((unsigned)data[idx]) << (j * 8); + } + } + uc_dfu <: word; + } + } +} + + +static inline void CODEC_REGREAD(unsigned device, unsigned reg, unsigned &val) +{ + unsafe + { + uc_audiohw <: (unsigned) AUDIOHW_CMD_REGRD; + uc_audiohw <: device; + uc_audiohw <: reg; + uc_audiohw :> val; + } +} + +#define NAU88_I2C_DEVICE_ADDR 0x1B + +static inline void NAU88C22_REGREAD(unsigned reg, unsigned &val, client interface i2c_master_if i2c) +{ + i2c_regop_res_t result; + val = i2c.read_reg16(NAU88_I2C_DEVICE_ADDR, reg, result); +} + +static inline i2c_regop_res_t NAU88C22_REGWRITE(unsigned reg, unsigned val, client interface i2c_master_if i2c) +{ + i2c_regop_res_t result = i2c.write_reg16(NAU88_I2C_DEVICE_ADDR, reg, val); + + if(result != I2C_REGOP_SUCCESS) + { + debug_printf("I2C write failed: reg="); + printhex(reg); + debug_printf(", val="); + printhex(val); + debug_printf("\n"); + } + else + { + debug_printf("write reg [0x%02X] [0x%02X]\n", reg, val); + } + + return result; +} + +static inline void HT5943_REGREAD(unsigned device, unsigned reg, unsigned &val, client interface i2c_master_if i2c) +{ + i2c_regop_res_t result; + val = i2c.read_reg(device, reg, result); + // debug_printf("HT5943_REGREAD: device = 0x%02X, reg = 0x%02X, val = 0x%02X\n", device, reg, val); +} + +static inline void HT5943_REGWRITE(unsigned device, unsigned reg, unsigned val, client interface i2c_master_if i2c) +{ + // debug_printf("HT5943_REGWRITE: device = 0x%02X, reg = 0x%02X, val = 0x%02X\n", device, reg, val); + i2c.write_reg(device, reg, val); +} + + +extern unsigned GetKeyFlag(); +extern unsigned g_force_eq_mode_change; +extern unsigned g_focce_request_eq_mode_change; + +#if HID_DFU_EN +extern void firmware_upgrade_init(void); +#endif + +uint8_t samp_support(unsigned samFreq) +{ + switch (samFreq) + { + case 44100: + case 48000: + case 88200: + case 96000: + case 176400: + case 192000: + case 352800: + case 384000: + case 705600: + case 768000: + case 2822400: + case 5644800: + case 11289600: + case 22579200: + return 1; + default: + return 0; + } +} + +void codec_init(void) +{ + /* + * Setup CODEC + */ + uint16_t addr = 0, val; + for (int i = 0; i < sizeof(nau88c22_registers) / sizeof(nau88c22_registers[0]); i++) { + addr = nau88c22_registers[i][1]; + val = (nau88c22_registers[i][2] << 8) | nau88c22_registers[i][3]; + CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, addr, val); + } + + // ADCL PGA default setting + if(NAU88L21_PGA_GAIN_REG_DEFAULT_VALUE == NAU88L21_PGA_GAIN_REG_MAX_VALUE) + CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x007E, (NAU88L21_PGA_GAIN_REG_MAX_VALUE-1) << 8); + else + CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x007E, NAU88L21_PGA_GAIN_REG_DEFAULT_VALUE << 8); + + debug_printf("Codec init finished\n"); +} + + +void dac_volume(signed level, client interface i2c_master_if i2c) +{ + // 1dB/步: level 范围 -28 ~ 0,对应寄存器 0xcf-28=0xb3 ~ 0xcf + unsigned tmp = 0xcf + level; + unsafe {NAU88C22_REGWRITE(0x0034, (tmp<<8|tmp), i2c);} +} + +void mic_volume(unsigned level, client interface i2c_master_if i2c) +{ + if (level == 0 || level == 1) + { + // mute: 关闭PGA和输出放大器 + unsafe {NAU88C22_REGWRITE(0x007E, 0, i2c);} + unsafe {NAU88C22_REGWRITE(0x0035, 0, i2c);} + } + else if(level == NAU88L21_PGA_GAIN_REG_MAX_VALUE) + { + // 内部最大值 (reg=38, +1.5dB数字增益,仅firmware使用) + // PGA设到最大(37=0x25),数字增益额外+1.5dB + unsafe {NAU88C22_REGWRITE(0x007E, (NAU88L21_PGA_GAIN_REG_MAX_VALUE-1) << 8, i2c);} + unsafe {NAU88C22_REGWRITE(0x0035, (0xd2d2), i2c);} + } + else + { + // 1-37: 0dB ~ 36dB,1dB/步 + debug_printf("mic_volume write reg=%d\n", level); + unsafe {NAU88C22_REGWRITE(0x007E, (level << 8), i2c);} + unsafe {NAU88C22_REGWRITE(0x0035, (0xcfcf), i2c);} + } +} + +void save_value(unsigned char * unsafe path, unsigned char value); +unsigned char load_value(unsigned char * unsafe path); +#define C1_MODE_INFO_PATH "c1_mode" +/* 改动原因:c_dfu 仅接收 FIRMWARE_UPGRADE_START,在此线程执行 handle_firmware_upgrade_start */ +void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, client interface c1_led_ctrl_if i_c1_led_ctrl, chanend c_erase, streaming chanend c_dfu) +{ + unsigned cmd; + int value; + unsigned time = 0; + unsigned eq_mode_time = 0; + unsigned se_time = 0; + unsigned se_count = 0; + timer tmr, se_tmr, eq_mode_timer, eq_sync_timer, button_tmr; + unsigned eq_sync_time = 0; + unsigned old_format = 14; + unsigned unmute_dac_state; + unsigned old_dac_vol = 0; + unsigned old_adc_vol = 0; + unsigned old_dac_mode = 0; + // 改动原因:按DS1按键状态机思路保存每个按键的持续时间,用于区分短按和长按连续动作。 + unsigned mode_press_ticks = 0; + unsigned vol_down_press_ticks = 0; + unsigned mic_mute_press_ticks = 0; + unsigned vol_up_press_ticks = 0; + // 改动原因:mic mute红灯通过interface下发到tile1,仅在状态变化时发送,减少无意义跨tile调用。 + unsigned last_mute_switch_for_led = 0xFFFFFFFF; + // 改动原因:长按音量键已经连续触发后,释放时不能再执行一次短按动作。 + unsigned vol_down_long_action = 0; + unsigned vol_up_long_action = 0; + tmr :> time; /* Input time */ + time += TIMER_PERIOD; /* Add time */ + se_tmr :> se_time; + se_time += SE_DELAY; + eq_mode_timer :> eq_mode_time; + eq_mode_time += EQ_MODE_DELAY; + eq_sync_timer :> eq_sync_time; + eq_sync_time += EQ_SYNC_DELAY; + unsigned c1_mode = load_value(C1_MODE_INFO_PATH); + +#if HID_DFU_EN + firmware_upgrade_init(); +#endif + + if (c1_mode > 1) + { + c1_mode = 0; + save_value(C1_MODE_INFO_PATH, c1_mode); + } + + // 改动原因:开机后立即按Flash恢复的mode值设置面板灯色,避免首次按键前灯态与保存状态不一致。 + i_c1_led_ctrl.set_mode_led_color(c1_mode_to_led_color_idx(c1_mode)); + + while(1) + { + select + { + case c :> cmd: + if(cmd == AUDIOHW_CMD_REGRD) + { + unsigned device; + unsigned regAddr; + unsigned regVal; + c :> device; + c :> regAddr; + if (device == NAU88_I2C_DEVICE_ADDR) + { + NAU88C22_REGREAD(regAddr, regVal, i2c); + } + c <: regVal; + } + else + { + unsigned device, regAddr, regValue; + c :> device; + c :> regAddr; + c :> regValue; + if (device == NAU88_I2C_DEVICE_ADDR) + { + NAU88C22_REGWRITE(regAddr, regValue, i2c); + } + } + break; + + case tmr when timerafter(time) :> void : + uint32_t now, old_time; + time += TIMER_PERIOD; + unsigned dac_vol, adc_vol, dac_mode, new_dac_mode; + + now = get_reference_time(); + + GET_SHARED_GLOBAL(unmute_dac_state, g_unmute_dac_state); + if (unmute_dac_state == 1) + { + GET_SHARED_GLOBAL(old_time, g_unmute_time); + if (timeafter(now, old_time + UMUTE_DELAY)) + { + unsigned t; + GET_SHARED_GLOBAL(t, g_samfreq); + if (samp_support(t) == 1) + { + debug_printf("unmute_dac from different freq\n"); + unmute_dac(); + SET_SHARED_GLOBAL(g_unmute_dac_state, 0); + } + else + { + mute_dac(); + SET_SHARED_GLOBAL(g_unmute_dac_state, 0); + } + } + } + + unsigned audio_type; + unsigned old_type; + GET_SHARED_GLOBAL(old_type, g_old_audio_type); + GET_SHARED_GLOBAL(audio_type, g_new_audio_type); + GET_SHARED_GLOBAL(old_time, g_format_time); + #if !OPT && !COAX + if (timeafter(now, old_time + FORMAT_DELAY)) + #endif + { + unsigned tmp_format; + GET_SHARED_GLOBAL(tmp_format, g_new_playback_format); + if ((tmp_format != AUDIO_PCM_1536000) && (tmp_format != AUDIO_PCM_1441200)) + { + unsigned update_led; + unsigned led_mode; + GET_SHARED_GLOBAL(led_mode, g_led_mode); + GET_SHARED_GLOBAL(update_led, g_update_led); + #if OPT || COAX + if (timeafter(now, old_time + FORMAT_DELAY)) + #endif + { + SET_SHARED_GLOBAL(g_playback_format, tmp_format); + SET_SHARED_GLOBAL(g_audio_type, audio_type); + } + } + } + GET_SHARED_GLOBAL(dac_vol, g_dac_vol); + GET_SHARED_GLOBAL(adc_vol, g_adc_vol); + unsigned mute_switch; + GET_SHARED_GLOBAL(mute_switch, g_mute_switch); + if (last_mute_switch_for_led != mute_switch) + { + // 改动原因:需求规定mic mute=0亮红灯,否则灭灯;LED端口在tile1,因此在tile0检测状态变化后用interface同步。 + i_c1_led_ctrl.set_mic_mute_state(mute_switch); + last_mute_switch_for_led = mute_switch; + } + // 改动原因:静音时(g_mute_switch==1) ADC 音量写 0,未静音时写 g_adc_vol;g_mute_switch 变化时也需更新 + unsigned effective_adc_vol = (mute_switch != 0) ? 0 : adc_vol; + + if (old_dac_vol != dac_vol || old_type != audio_type) + { + old_dac_vol = dac_vol; + // 改动原因:实体按键、HID和UART都会更新g_dac_vol;这里统一把寄存器值写入codec,保证状态变化真正生效。 + NAU88C22_REGWRITE(0x0034, ((dac_vol & 0xff) << 8) | (dac_vol & 0xff), i2c); + SET_SHARED_GLOBAL(g_old_audio_type, audio_type); + debug_printf("set old_dac_vol %d audio_type %d \n", old_dac_vol, audio_type); + } + + if (old_adc_vol != effective_adc_vol) + { + if ((effective_adc_vol <= 0xff) && (effective_adc_vol >= 0)) + { + old_adc_vol = effective_adc_vol; + // 改动原因:mic mute按键会改变g_mute_switch并影响effective_adc_vol;这里复用现有mic_volume接口让静音立即作用到ADC通路。 + mic_volume(effective_adc_vol, i2c); + } + } + + GET_SHARED_GLOBAL(dac_mode, g_dac_mode); + GET_SHARED_GLOBAL(new_dac_mode, g_new_dac_mode); + + // --- C1实体按键逻辑处理 --- + // 改动原因:参考DS1按键处理模型,在主定时循环中读取端口、按低电平有效判断按下,并用计数器区分短按/长按。 + { + unsigned button_state; + unsigned mode_pressed; + unsigned vol_down_pressed; + unsigned mic_mute_pressed; + unsigned vol_up_pressed; + unsigned pressed_count; + + p_button :> button_state; + mode_pressed = ((button_state & C1_KEY_MODE_MASK) == 0); + vol_down_pressed = ((button_state & C1_KEY_VOL_DOWN_MASK) == 0); + mic_mute_pressed = ((button_state & C1_KEY_MIC_MUTE_MASK) == 0); + vol_up_pressed = ((button_state & C1_KEY_VOL_UP_MASK) == 0); + pressed_count = mode_pressed + vol_down_pressed + mic_mute_pressed + vol_up_pressed; + + if (pressed_count == 1) + { + if (mode_pressed) + { + mode_press_ticks++; + // 改动原因:同一时刻只允许一个实体键生效,切到mode键时清除其它键计时,避免滑键后释放误触发。 + vol_down_press_ticks = 0; + mic_mute_press_ticks = 0; + vol_up_press_ticks = 0; + vol_down_long_action = 0; + vol_up_long_action = 0; + } + else if (vol_down_pressed) + { + vol_down_press_ticks++; + // 改动原因:同一时刻只允许音量-键生效,清除其它键状态以匹配DS1单键状态机处理方式。 + mode_press_ticks = 0; + mic_mute_press_ticks = 0; + vol_up_press_ticks = 0; + vol_up_long_action = 0; + // 改动原因:音量-长按沿用DS1连续调节体验,达到阈值后每100ms递减一次寄存器音量。 + if ((vol_down_press_ticks >= C1_KEY_LONG_TICKS) && ((vol_down_press_ticks % C1_KEY_REPEAT_TICKS) == 0)) + { + unsigned current_dac_vol; + GET_SHARED_GLOBAL(current_dac_vol, g_dac_vol); + // 改动原因:当音量在最小可听值0x4B时再次按减音量,直接进入mute(0x00);满足“最小再按一下直接静音”需求。 + if (current_dac_vol == C1_DAC_VOL_MIN) + { + current_dac_vol = C1_DAC_MUTE; + SET_SHARED_GLOBAL(g_dac_vol, current_dac_vol); + vol_down_long_action = 1; + debug_printf("C1 key volume down long to mute: %d\n", current_dac_vol); + } + // 改动原因:按键每次减2(1dB);并在接近最小值时钳位到0x4B,避免落入无定义区间。 + else if (current_dac_vol > C1_DAC_VOL_MIN) + { + if (current_dac_vol <= (C1_DAC_VOL_MIN + C1_DAC_VOL_STEP)) + current_dac_vol = C1_DAC_VOL_MIN; + else + current_dac_vol -= C1_DAC_VOL_STEP; + SET_SHARED_GLOBAL(g_dac_vol, current_dac_vol); + vol_down_long_action = 1; + debug_printf("C1 key volume down long: %d\n", current_dac_vol); + } + } + } + else if (mic_mute_pressed) + { + mic_mute_press_ticks++; + // 改动原因:同一时刻只允许mic mute键生效,清除其它键状态,避免释放时误执行音量或mode短按。 + mode_press_ticks = 0; + vol_down_press_ticks = 0; + vol_up_press_ticks = 0; + vol_down_long_action = 0; + vol_up_long_action = 0; + } + else if (vol_up_pressed) + { + vol_up_press_ticks++; + // 改动原因:同一时刻只允许音量+键生效,清除其它键状态以匹配DS1单键状态机处理方式。 + mode_press_ticks = 0; + vol_down_press_ticks = 0; + mic_mute_press_ticks = 0; + vol_down_long_action = 0; + // 改动原因:音量+长按沿用DS1连续调节体验,达到阈值后每100ms递增一次寄存器音量。 + if ((vol_up_press_ticks >= C1_KEY_LONG_TICKS) && ((vol_up_press_ticks % C1_KEY_REPEAT_TICKS) == 0)) + { + unsigned current_dac_vol; + GET_SHARED_GLOBAL(current_dac_vol, g_dac_vol); + // 改动原因:从mute恢复时先跳到最小可听值0x4B,再按步进2上调,避免出现0x02/0x04等非法过渡值。 + if (current_dac_vol < C1_DAC_VOL_MIN) + { + current_dac_vol = C1_DAC_VOL_MIN; + SET_SHARED_GLOBAL(g_dac_vol, current_dac_vol); + vol_up_long_action = 1; + debug_printf("C1 key volume up long from mute: %d\n", current_dac_vol); + } + // 改动原因:按键每次加2(1dB);在接近最大值时钳位到0xCF,避免超过允许范围。 + else if (current_dac_vol < C1_DAC_VOL_MAX) + { + if (current_dac_vol >= (C1_DAC_VOL_MAX - C1_DAC_VOL_STEP)) + current_dac_vol = C1_DAC_VOL_MAX; + else + current_dac_vol += C1_DAC_VOL_STEP; + SET_SHARED_GLOBAL(g_dac_vol, current_dac_vol); + vol_up_long_action = 1; + debug_printf("C1 key volume up long: %d\n", current_dac_vol); + } + } + } + } + else + { + if (pressed_count == 0) + { + // 改动原因:mode短按改为0/1切换并持久化到Flash,满足0=蓝灯、1=绿灯以及重启恢复需求。 + if ((mode_press_ticks >= C1_KEY_SHORT_TICKS) && (mode_press_ticks < C1_KEY_LONG_TICKS)) + { + unsigned flag; + c1_mode = (c1_mode == 0) ? 1 : 0; + save_value(C1_MODE_INFO_PATH, c1_mode); + flag = c1_mode == 1 ? USB_IN_FLAG : COAX_IN_FLAG; + SetRoleSwitchFlag(flag); + + delay_milliseconds(1); + device_reboot(); + while(1); + } + + // 改动原因:音量短按只调节一步;若同一次按压已进入长按连续调节,则释放时不再重复调节。 + if ((vol_down_press_ticks >= C1_KEY_SHORT_TICKS) && (vol_down_press_ticks < C1_KEY_LONG_TICKS) && (vol_down_long_action == 0)) + { + unsigned current_dac_vol; + GET_SHARED_GLOBAL(current_dac_vol, g_dac_vol); + // 改动原因:短按也执行“最小值再按一次直达mute(0x00)”规则,与长按路径保持一致行为。 + if (current_dac_vol == C1_DAC_VOL_MIN) + { + current_dac_vol = C1_DAC_MUTE; + SET_SHARED_GLOBAL(g_dac_vol, current_dac_vol); + debug_printf("C1 key volume down short to mute: %d\n", current_dac_vol); + } + // 改动原因:短按按步进2减小(1dB);并钳位到0x4B,避免进入最小值以下的无效区间。 + else if (current_dac_vol > C1_DAC_VOL_MIN) + { + if (current_dac_vol <= (C1_DAC_VOL_MIN + C1_DAC_VOL_STEP)) + current_dac_vol = C1_DAC_VOL_MIN; + else + current_dac_vol -= C1_DAC_VOL_STEP; + SET_SHARED_GLOBAL(g_dac_vol, current_dac_vol); + debug_printf("C1 key volume down short: %d\n", current_dac_vol); + } + } + + // 改动原因:mic mute短按直接切换g_mute_switch,复用现有HID变化上报和effective_adc_vol静音路径。 + if ((mic_mute_press_ticks >= C1_KEY_SHORT_TICKS) && (mic_mute_press_ticks < C1_KEY_LONG_TICKS)) + { + unsigned current_mute_switch; + unsigned effective_adc_vol; + GET_SHARED_GLOBAL(effective_adc_vol, g_adc_vol); + GET_SHARED_GLOBAL(current_mute_switch, g_mute_switch); + current_mute_switch = (current_mute_switch == 0) ? 1 : 0; + + if (current_mute_switch == 0) + { + mic_volume(0, i2c); + } + else + { + mic_volume(effective_adc_vol, i2c); + } + SET_SHARED_GLOBAL(g_mute_switch, current_mute_switch); + // 改动原因:按键切换mic mute后立即通知tile1刷新红灯,避免等待下一轮状态同步出现可见延迟。 + i_c1_led_ctrl.set_mic_mute_state(current_mute_switch); + last_mute_switch_for_led = current_mute_switch; + debug_printf("C1 key mic mute toggle: %d\n", current_mute_switch); + } + + // 改动原因:音量短按只调节一步;若同一次按压已进入长按连续调节,则释放时不再重复调节。 + if ((vol_up_press_ticks >= C1_KEY_SHORT_TICKS) && (vol_up_press_ticks < C1_KEY_LONG_TICKS) && (vol_up_long_action == 0)) + { + unsigned current_dac_vol; + GET_SHARED_GLOBAL(current_dac_vol, g_dac_vol); + // 改动原因:短按从mute恢复时先到0x4B,保证UI和听感从可听最小档开始。 + if (current_dac_vol < C1_DAC_VOL_MIN) + { + current_dac_vol = C1_DAC_VOL_MIN; + SET_SHARED_GLOBAL(g_dac_vol, current_dac_vol); + debug_printf("C1 key volume up short from mute: %d\n", current_dac_vol); + } + // 改动原因:短按按步进2增加(1dB);并钳位到0xCF,不越界。 + else if (current_dac_vol < C1_DAC_VOL_MAX) + { + if (current_dac_vol >= (C1_DAC_VOL_MAX - C1_DAC_VOL_STEP)) + current_dac_vol = C1_DAC_VOL_MAX; + else + current_dac_vol += C1_DAC_VOL_STEP; + SET_SHARED_GLOBAL(g_dac_vol, current_dac_vol); + debug_printf("C1 key volume up short: %d\n", current_dac_vol); + } + } + } + + // 改动原因:多键同时按下不映射功能,立即清除本轮计时,避免组合键抖动误触发单键动作。 + mode_press_ticks = 0; + vol_down_press_ticks = 0; + mic_mute_press_ticks = 0; + vol_up_press_ticks = 0; + vol_down_long_action = 0; + vol_up_long_action = 0; + } + } + +#if 0// UAC1 + unsigned p_8ch_in_val; + p_8ch_in :> p_8ch_in_val; + if ((p_8ch_in_val & 0x40) == 0x40) + { + g_dnr_enable = 0; + } + else + { + g_dnr_enable = 1; + } + + if ((p_8ch_in_val & 0xa0) == 0xa0) + { + g_fps_enable = 1; + g_3d_enable = 0; + } + else if ((p_8ch_in_val & 0xa0) == 0x20) + { + g_3d_enable = 1; + g_fps_enable = 0; + } + else + { + g_3d_enable = 0; + g_fps_enable = 0; + } +#endif + +#if ((HID_CONTROLS == 1) && (EQ_EN == 1)) + + // 改动原因:检测增益模式变化请求,当g_request_gain_mode != -1且与当前模式不同时应用 + { + unsigned request_gain_mode, gain_mode; + GET_SHARED_GLOBAL(request_gain_mode, g_request_gain_mode); + GET_SHARED_GLOBAL(gain_mode, g_gain_mode); + if (request_gain_mode != -1 && request_gain_mode != gain_mode) + { + debug_printf("Gain mode changing: %d -> %d\n", gain_mode, request_gain_mode); + SET_SHARED_GLOBAL(g_gain_mode, request_gain_mode); + + // 更新音量以应用新的增益模式 + unsigned volume_level; + GET_SHARED_GLOBAL(volume_level, g_volume_level); + //update_volume(request_gain_mode, volume_level, i2c); + + // 清除请求标志 + SET_SHARED_GLOBAL(g_request_gain_mode, -1); + debug_printf("Gain mode switched to: %d\n", request_gain_mode); + } + } + + // 改动原因:检测滤波器模式变化请求,当g_request_filter_mode != -1且与当前模式不同时应用 + { + unsigned request_filter_mode, filter_mode; + GET_SHARED_GLOBAL(filter_mode, g_filter_mode); + GET_SHARED_GLOBAL(request_filter_mode, g_request_filter_mode); + if (request_filter_mode != -1 && request_filter_mode != filter_mode) + { + debug_printf("Filter mode changing: %d -> %d\n", filter_mode, request_filter_mode); + SET_SHARED_GLOBAL(g_filter_mode, request_filter_mode); + + // 清除请求标志 + SET_SHARED_GLOBAL(g_request_filter_mode, -1); + } + } + + // 改动原因:检测g_dac_vol的变化,如果变化则通过HID上报 + // 参考hid_ret_process和UserReadHIDLog方式,使用指针访问全局数组 + { + // 改动原因:检测g_dac_vol的变化,而不是g_volume_level + unsigned current_dac_vol; + GET_SHARED_GLOBAL(current_dac_vol, g_dac_vol); + + // 如果g_dac_vol发生变化,构建0x94 GET_VOLUME响应数据包并上报 + if (g_last_dac_vol != current_dac_vol && g_last_dac_vol != 0xFF) + { + unsafe + { + unsigned char * unsafe reportPtr = g_hid_pass_data; + + // 构建0x94 GET_VOLUME响应数据包格式(参考eq_hid_protocol.md) + // 字节位置 | 长度 | 内容 | 描述 + // 0 | 1 | 0x77 | 同步头1 + // 1 | 1 | 0x94 | 同步头2 + // 2 | 1 | uint8 | 当前音量级别 (0-255) + // 3-62 | 60 | 0x00 | 保留字节 + reportPtr[0] = 0x77; // 同步头1 + reportPtr[1] = 0x94; // 同步头2(GET_VOLUME命令) + reportPtr[2] = (unsigned char)current_dac_vol; // 当前音量级别(0-255) + + // 其余字节填充为0 + for (int i = 3; i < 63; i++) + { + reportPtr[i] = 0x00; + } + + // 通知HID系统有数据变化 + hidSetChangePending(0x1); + + debug_printf("DAC volume changed: %d -> %d, HID report prepared\n", + g_last_dac_vol, current_dac_vol); + } + } + + g_last_dac_vol = current_dac_vol; + + // 改动原因:检测静音开关状态变化,如果变化则通过HID上报0xB2(格式参考eq_hid_protocol.md),与g_adc_loop一致直接读g_mute_switch + { + unsigned current_mute; + GET_SHARED_GLOBAL(current_mute, g_mute_switch); + if (g_last_mute_switch != current_mute && g_last_mute_switch != 0xFF) + { + unsafe + { + unsigned char * unsafe reportPtr = g_hid_pass_data; + reportPtr[0] = 0x77; + reportPtr[1] = 0xB2; // GET_MUTE_SWITCH + reportPtr[2] = (unsigned char)current_mute; + for (int i = 3; i < 63; i++) reportPtr[i] = 0x00; + hidSetChangePending(0x1); + } + debug_printf("Mute switch changed: %d -> %d, HID 0xB2 report prepared\n", g_last_mute_switch, current_mute); + } + g_last_mute_switch = current_mute; + } + + // 改动原因:检测监听开关(g_adc_loop)状态变化,如果变化则通过HID上报0xB4(格式参考eq_hid_protocol.md) + { + unsigned current_adc_loop; + GET_SHARED_GLOBAL(current_adc_loop, g_adc_loop); + if (g_last_adc_loop != current_adc_loop && g_last_adc_loop != 0xFF) + { + unsafe + { + unsigned char * unsafe reportPtr = g_hid_pass_data; + reportPtr[0] = 0x77; + reportPtr[1] = 0xB4; // GET_LISTEN_SWITCH + reportPtr[2] = (unsigned char)(current_adc_loop & 0xFF); + for (int i = 3; i < 63; i++) reportPtr[i] = 0x00; + hidSetChangePending(0x1); + } + debug_printf("Listen switch (g_adc_loop) changed: %d -> %d, HID 0xB4 report prepared\n", g_last_adc_loop, current_adc_loop); + } + g_last_adc_loop = current_adc_loop; + } + + // 改动原因:检测LED状态变化,根据音频格式判断颜色:PCM=绿灯,DOP/DSD=蓝灯 + // 读取音频类型和LED模式 + unsigned current_audio_type = g_audio_type; + unsigned led_mode; + GET_SHARED_GLOBAL(led_mode, g_led_mode); + + // 根据音频格式计算LED颜色RGB值 + // PCM (audio_type=0): 绿灯 RGB(0, 255, 0) + // DOP (audio_type=1): 蓝灯 RGB(0, 0, 255) + // DSD (audio_type=5): 蓝灯 RGB(0, 0, 255) + unsigned current_r = 0, current_g = 0, current_b = 0; + if (current_audio_type == 0) { + // PCM: 绿灯 + current_g = 255; + current_b = 0; + } else if (current_audio_type == 1 || current_audio_type == 5) { + // DOP (1) 或 DSD (5): 蓝灯 + current_g = 0; + current_b = 255; + } else { + // 其他格式:默认关闭 + current_g = 255; + current_b = 0; + } + + // 计算当前LED状态:根据g_led_mode,0=关闭,1=开启(常亮) + unsigned calculated_led_status = (led_mode == 0) ? 0 : 1; // 0=LED_STATUS_OFF, 1=LED_STATUS_SOLID + + // 如果LED颜色或状态发生变化,构建0x98 GET_LED_STATUS响应数据包并上报 + // 改动原因:检测audio_type和led_mode的变化,而不是g_led_color + if ((g_last_audio_type != current_audio_type || g_last_led_status != calculated_led_status) + && g_last_audio_type != 0xFF) + { + unsafe + { + unsigned char * unsafe reportPtr = g_hid_pass_data; + + // 构建0x98 GET_LED_STATUS响应数据包格式(参考eq_hid_protocol.md) + // 字节位置 | 长度 | 内容 | 描述 + // 0 | 1 | 0x77 | 同步头1 + // 1 | 1 | 0x98 | 同步头2 + // 2 | 1 | uint8 | LED索引 (0-7) + // 3 | 1 | uint8 | R颜色值 (0-255) + // 4 | 1 | uint8 | G颜色值 (0-255) + // 5 | 1 | uint8 | B颜色值 (0-255) + // 6 | 1 | uint8 | LED状态 (0=熄灭, 1=常亮, 2=慢闪, 3=快闪, 4=呼吸) + // 7-62 | 56 | 0x00 | 保留字节 + reportPtr[0] = 0x77; // 同步头1 + reportPtr[1] = 0x98; // 同步头2(GET_LED_STATUS命令) + reportPtr[2] = 0; // LED索引(当前设备只有1个LED,索引为0) + + // 改动原因:根据音频格式判断LED颜色,PCM=绿灯,DOP/DSD=蓝灯 + reportPtr[3] = (unsigned char)current_r; // R颜色值 + reportPtr[4] = (unsigned char)current_g; // G颜色值 + reportPtr[5] = (unsigned char)current_b; // B颜色值 + reportPtr[6] = (unsigned char)calculated_led_status; // LED状态 + + // 其余字节填充为0 + for (int i = 7; i < 63; i++) + { + reportPtr[i] = 0x00; + } + + // 通知HID系统有数据变化 + hidSetChangePending(0x1); + } + + debug_printf("LED status changed: audio_type %d -> %d, RGB (%d,%d,%d), status %d -> %d, HID report prepared\n", + g_last_audio_type, current_audio_type, current_r, current_g, current_b, g_last_led_status, calculated_led_status); + } + + g_last_audio_type = current_audio_type; + g_last_led_status = calculated_led_status; + + // 改动原因:检测采样率和DSD模式变化,如果变化则通过HID上报0x9F命令(已去掉DAC采样分辨率) + unsigned current_samfreq; + unsigned current_dsd_mode; + unsigned last_samfreq; + unsigned last_dsd_mode; + GET_SHARED_GLOBAL(last_samfreq, g_last_samfreq); + GET_SHARED_GLOBAL(last_dsd_mode, g_last_dsd_mode); + GET_SHARED_GLOBAL(current_samfreq, g_samfreq); + GET_SHARED_GLOBAL(current_dsd_mode, g_dsd_mode); + + // 改动原因:修复上报逻辑,只要采样率或DSD模式发生变化就上报,且只在初始化完成后才检查变化 + // 如果采样率或DSD模式发生变化,构建0x9F GET_SAMPLE_FORMAT响应数据包并上报 + if (last_samfreq != 0xFFFFFFFF && last_dsd_mode != 0xFF) + { + // 初始化完成后,检查是否有变化 + if (last_samfreq != current_samfreq || last_dsd_mode != current_dsd_mode) + { + unsafe + { + unsigned char * unsafe reportPtr = g_hid_pass_data; + + // 构建0x9F GET_SAMPLE_FORMAT响应数据包格式 + // 字节位置 | 长度 | 内容 | 描述 + // 0 | 1 | 0x77 | 同步头1 + // 1 | 1 | 0x9F | 同步头2(GET_SAMPLE_FORMAT命令) + // 2-5 | 4 | uint32 | 采样率 (samFreq) + // 6 | 1 | uint8 | DSD模式 (dsdMode: 0=PCM, >0=DSD) + // 7-62 | 56 | 0x00 | 保留字节 + reportPtr[0] = 0x77; // 同步头1 + reportPtr[1] = 0x9F; // 同步头2(GET_SAMPLE_FORMAT命令) + + // 采样率(32位,小端序) + reportPtr[2] = (unsigned char)(current_samfreq & 0xFF); + reportPtr[3] = (unsigned char)((current_samfreq >> 8) & 0xFF); + reportPtr[4] = (unsigned char)((current_samfreq >> 16) & 0xFF); + reportPtr[5] = (unsigned char)((current_samfreq >> 24) & 0xFF); + + // DSD模式 + reportPtr[6] = (unsigned char)current_dsd_mode; + + debug_printf("Sample format changed: samFreq %d -> %d, dsdMode %d -> %d\n", + last_samfreq, current_samfreq, last_dsd_mode, current_dsd_mode); + + // 其余字节填充为0 + for (int i = 7; i < 63; i++) + { + reportPtr[i] = 0x00; + } + + // 改动原因:更新全局变量,使用SHARED_GLOBAL宏确保线程安全 + SET_SHARED_GLOBAL(g_last_samfreq, current_samfreq); + SET_SHARED_GLOBAL(g_last_dsd_mode, current_dsd_mode); + + // 通知HID系统有数据变化 + hidSetChangePending(0x1); + + debug_printf("Sample format changed, HID report prepared\n"); + } + } + } + else + { + // 改动原因:首次初始化时,直接设置last值,不触发上报,等待下次变化时再上报 + SET_SHARED_GLOBAL(g_last_samfreq, current_samfreq); + SET_SHARED_GLOBAL(g_last_dsd_mode, current_dsd_mode); + debug_printf("Sample format initialized: samFreq %d, dsdMode %d\n", current_samfreq, current_dsd_mode); + } + + // 改动原因:检测增益模式变化,如果变化则通过HID上报0xA1 GET_GAIN_MODE命令 + unsigned current_gain_mode; + GET_SHARED_GLOBAL(current_gain_mode, g_gain_mode); + + // 如果增益模式发生变化,构建0xA1 GET_GAIN_MODE响应数据包并上报 + if (g_last_gain_mode != current_gain_mode && g_last_gain_mode != 0xFF) + { + unsafe + { + unsigned char * unsafe reportPtr = g_hid_pass_data; + + // 构建0xA1 GET_GAIN_MODE响应数据包格式(参考eq_hid_protocol.md) + // 字节位置 | 长度 | 内容 | 描述 + // 0 | 1 | 0x77 | 同步头1 + // 1 | 1 | 0xA1 | 同步头2(GET_GAIN_MODE命令) + // 2 | 1 | uint8 | 当前增益模式 (0=低阻, 1=高阻) + // 3-62 | 60 | 0x00 | 保留字节 + reportPtr[0] = 0x77; // 同步头1 + reportPtr[1] = 0xA1; // 同步头2(GET_GAIN_MODE命令) + reportPtr[2] = (unsigned char)current_gain_mode; // 当前增益模式 + + // 其余字节填充为0 + for (int i = 3; i < 63; i++) + { + reportPtr[i] = 0x00; + } + + // 通知HID系统有数据变化 + hidSetChangePending(0x1); + + debug_printf("Gain mode changed: %d -> %d, HID report prepared\n", + g_last_gain_mode, current_gain_mode); + } + } + + g_last_gain_mode = current_gain_mode; + + // 改动原因:检测滤波器模式变化,如果变化则通过HID上报0xA3 GET_FILTER_MODE命令 + unsigned current_filter_mode; + GET_SHARED_GLOBAL(current_filter_mode, g_filter_mode); + + // 如果滤波器模式发生变化,构建0xA3 GET_FILTER_MODE响应数据包并上报 + if ((g_last_filter_mode != current_filter_mode) && (g_last_filter_mode != 0xFF)) + { + unsafe + { + unsigned char * unsafe reportPtr = g_hid_pass_data; + + // 构建0xA3 GET_FILTER_MODE响应数据包格式(参考eq_hid_protocol.md) + // 字节位置 | 长度 | 内容 | 描述 + // 0 | 1 | 0x77 | 同步头1 + // 1 | 1 | 0xA3 | 同步头2(GET_FILTER_MODE命令) + // 2 | 1 | uint8 | 当前滤波器模式 (0-6) + // 3-62 | 60 | 0x00 | 保留字节 + reportPtr[0] = 0x77; // 同步头1 + reportPtr[1] = 0xA3; // 同步头2(GET_FILTER_MODE命令) + reportPtr[2] = (unsigned char)current_filter_mode; // 当前滤波器模式 + + // 其余字节填充为0 + for (int i = 3; i < 63; i++) + { + reportPtr[i] = 0x00; + } + + // 通知HID系统有数据变化 + hidSetChangePending(0x1); + + debug_printf("Filter mode changed: %d -> %d, HID report prepared\n", + g_last_filter_mode, current_filter_mode); + } + } + + g_last_filter_mode = current_filter_mode; + + // 改动原因:检测游戏模式变化,如果变化则通过HID上报0xA5 GET_GAME_MODE命令 + unsigned current_game_mode; + GET_SHARED_GLOBAL(current_game_mode, g_3d_fps); + + // 如果游戏模式发生变化,构建0xA5 GET_GAME_MODE响应数据包并上报 + if ((g_last_game_mode != current_game_mode) && (g_last_game_mode != 0xFF)) + { + unsafe + { + unsigned char * unsafe reportPtr = g_hid_pass_data; + + // 构建0xA5 GET_GAME_MODE响应数据包格式(参考eq_hid_protocol.md) + // 字节位置 | 长度 | 内容 | 描述 + // 0 | 1 | 0x77 | 同步头1 + // 1 | 1 | 0xA5 | 同步头2(GET_GAME_MODE命令) + // 2 | 1 | uint8 | 当前游戏模式 (0=无音效, 1=FPS, 2=虚拟7.1) + // 3-62 | 60 | 0x00 | 保留字节 + reportPtr[0] = 0x77; // 同步头1 + reportPtr[1] = 0xA5; // 同步头2(GET_GAME_MODE命令) + reportPtr[2] = (unsigned char)current_game_mode; // 当前游戏模式 + + // 其余字节填充为0 + for (int i = 3; i < 63; i++) + { + reportPtr[i] = 0x00; + } + + // 通知HID系统有数据变化 + hidSetChangePending(0x1); + + debug_printf("Game mode changed: %d -> %d, HID report prepared\n", + g_last_game_mode, current_game_mode); + } + } + + g_last_game_mode = current_game_mode; + + } +#endif + + break; + case se_tmr when timerafter(se_time) :> void : + se_time += SE_DELAY; + se_count ++; + if ((se_count % 90) == 0) + { + + unsigned key = GetKeyFlag(); + if (key != 0x20241224) + { + debug_printf("se reboot\n"); + device_reboot(); + while(1); + } + else + debug_printf("no se reboot\n"); + } + break; +#if HID_DFU_EN + case c_dfu :> unsigned first_word: + { + unsigned dfu_words[16]; + dfu_words[0] = first_word; + for (int i = 1; i < 16; i++) + c_dfu :> dfu_words[i]; + unsigned char cmd_buf[63]; + for (int i = 0; i < 63; i++) + cmd_buf[i] = (dfu_words[i / 4] >> ((i % 4) * 8)) & 0xFF; + if (cmd_buf[1] == FIRMWARE_UPGRADE_START) + handle_firmware_upgrade_start(cmd_buf, 63); + } + break; +#endif +#if EQ_EN + case eq_mode_timer when timerafter(eq_mode_time) :> void : + eq_mode_time += EQ_MODE_DELAY; + unsigned request_eq_mode, new_eq_mode; + unsigned force_request_mode_change; + GET_SHARED_GLOBAL(request_eq_mode, g_request_eq_mode); + GET_SHARED_GLOBAL(new_eq_mode, g_new_eq_mode); + GET_SHARED_GLOBAL(force_request_mode_change, g_force_request_eq_mode_change); + if (new_eq_mode != request_eq_mode) + { + SET_SHARED_GLOBAL(g_new_eq_mode, request_eq_mode); + } + + if (force_request_mode_change == 1) + { + debug_printf("force request mode change\n"); + SET_SHARED_GLOBAL(g_force_eq_mode_change, 1); + SET_SHARED_GLOBAL(g_force_request_eq_mode_change, 0); + } + break; + + case eq_sync_timer when timerafter(eq_sync_time) :> void : + eq_sync_time += EQ_SYNC_DELAY; + + // 使用单参数存储系统保存脏参数(独立保存EQ参数) + if (eq_save_dirty_params() == 0) { + // debug_printf("Single EQ parameters synced to Flash successfully\n"); + } else { + //debug_printf("Failed to sync single EQ parameters to Flash\n"); + } + + // 独立保存脏的增益 + if (eq_save_dirty_gain() == 0) { + // debug_printf("Gain synced to Flash successfully\n"); + } else { + //debug_printf("Failed to sync gain to Flash\n"); + } + + // 独立保存脏的模式名称 + if (eq_save_dirty_names() == 0) { + // debug_printf("Mode names synced to Flash successfully\n"); + } else { + //debug_printf("Failed to sync mode names to Flash\n"); + } + break; +#endif + } + + } +} + +extern void SetKeyFlag(unsigned x); +void flag_handler() +{ + delay_milliseconds(10); + + int ret = module_security_bootup_check(); + if (ret == 0) + { + debug_printf("reboot invalid\n"); + } + else + { + SetKeyFlag(0x20241224); + debug_printf("boot normally\n"); + } +} + + +void AudioHwRemote(streaming chanend c, client interface c1_led_ctrl_if i_c1_led_ctrl, chanend c_erase, streaming chanend c_dfu) +{ + i2c_master_if i2c[1]; + + par + { + i2c_master(i2c, 1, p_scl, p_sda, 100); + AudioHwRemote2(c, i2c[0], i_c1_led_ctrl, c_erase, c_dfu); + } +} + +/* Note this is called from tile[0] but the I2C lines to the CODEC are on tile[0] + * use a channel to communicate CODEC reg read/writes to a remote core */ +void AudioHwInit() +{ + debug_printf("AudioHwInit\n"); + delay_milliseconds(100); + p_mclk_sel <: 0xf; + + if((XUA_SYNCMODE == XUA_SYNCMODE_SYNC || XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) && XUA_USE_SW_PLL) + { + /* Do nothing - SW_PLL configures AppPLL */ + } + else + { + if (DEFAULT_FREQ % 22050 == 0) + { + sw_pll_fixed_clock(MCLK_441); + //p_mclk_sel <: 0x8; + } + else + { + sw_pll_fixed_clock(MCLK_48); + //p_mclk_sel <: 0x4; + } + } + + set_gpio(P_GPIO_MUTE, MUTE); + debug_printf("mute_dac ======== \n"); + + delay_milliseconds(10); + + codec_init(); + + debug_printf("AudioHwInit completed\n"); + + CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x0003, 0x0053); + CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002B, 0x4002); + CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002C, 0x0082); +} + +void unmute_dac(void) +{ + unsigned samFreq; + GET_SHARED_GLOBAL(samFreq, g_samfreq); + set_gpio(P_GPIO_MUTE, UNMUTE); + debug_printf("unmute_dac ======== \n"); +} + +void unmute_spdif_led(void) +{ + unsigned led_mode; + GET_SHARED_GLOBAL(led_mode, g_led_mode); + if (led_mode == 1) + { + SET_SHARED_GLOBAL(g_update_led, 1); + } +} + +void mute_dac(void) +{ + unsigned samFreq; + GET_SHARED_GLOBAL(samFreq, g_samfreq); +#if UAC1 + unsigned adc_loop; + GET_SHARED_GLOBAL(adc_loop, g_adc_loop); + + set_gpio(P_GPIO_MUTE, MUTE); + debug_printf("mute_dac %d======== \n", samFreq); +#if 0 + if (adc_loop == 0) + { + set_gpio(P_GPIO_MUTE, MUTE); + debug_printf("mute_dac %d======== \n", samFreq); + } + else + { + set_gpio(P_GPIO_MUTE, UNMUTE); + debug_printf("mute_dac %d======== \n", samFreq); + } +#endif +#else + set_gpio(P_GPIO_MUTE, MUTE); + debug_printf("mute_dac %d======== \n", samFreq); +#endif +} + + +void update_play_rate(unsigned samFreq, unsigned audiotype, unsigned sample_code) +{ + unsigned time = get_reference_time(); + audio_sampling format; + + if (samFreq > 0) + { + switch (samFreq) + { + case 32000: + format = AUDIO_PCM_32000; + break; + case 64000: + format = AUDIO_PCM_64000; + break; + case 128000: + format = AUDIO_PCM_128000; + break; + case 256000: + format = AUDIO_PCM_256000; + break; + case 512000: + format = AUDIO_PCM_512000; + break; + case 44100: + format = AUDIO_PCM_44100; + break; + case 48000: + format = AUDIO_PCM_48000; + break; + case 88200: + format = AUDIO_PCM_88200; + break; + case 96000: + format = AUDIO_PCM_96000; + break; + case 176400: + format = AUDIO_PCM_176400; + break; + case 192000: + format = AUDIO_PCM_192000; + break; + case 352800: + format = AUDIO_PCM_352800; + break; + case 384000: + format = AUDIO_PCM_384000; + break; + case 705600: + format = AUDIO_PCM_705600; + break; + case 768000: + format = AUDIO_PCM_768000; + break; + case 1411200: + format = AUDIO_PCM_1441200; + break; + case 1536000: + format = AUDIO_PCM_1536000; + break; + case 2822400: + format = AUDIO_DSD_64; + break; + case 5644800: + format = AUDIO_DSD_128; + break; + case 11289600: + format = AUDIO_DSD_256; + break; + case 22579200: + format = AUDIO_DSD_512; + break; + default: + format = AUDIO_PCM_44100; + break; + } + + } + else + { + if (audiotype == 0) + { + if (sample_code < 8) + format = sample_code * 2; + else if (sample_code > 15) + format = sample_code - 5; + else if (sample_code < 15) + format = (sample_code - 8) * 2 + 1; + } +#if MQA_EN + if ((audiotype >= 2) && (audiotype <= 4)) + { + switch (sample_code) + { + case MQAFS44100 : + format = AUDIO_PCM_44100; + break; + case MQAFS88200 : + format = AUDIO_PCM_88200; + break; + case MQAFS176400 : + format = AUDIO_PCM_176400; + break; + case MQAFS352800 : + format = AUDIO_PCM_352800; + break; + case MQAFS705600 : + format = AUDIO_PCM_705600; + break; + case MQAFS1411200: + format = AUDIO_PCM_1441200; + break; + case MQAFS1536000: + format = AUDIO_PCM_1536000; + break; + case MQAFS48000 : + format = AUDIO_PCM_48000; + break; + case MQAFS96000 : + format = AUDIO_PCM_96000; + break; + case MQAFS192000 : + format = AUDIO_PCM_192000; + break; + case MQAFS384000 : + format = AUDIO_PCM_384000; + break; + case MQAFS768000 : + format = AUDIO_PCM_768000; + break; + + case MQAFS64000 : + format = AUDIO_PCM_64000; + break; + case MQAFS128000 : + format = AUDIO_PCM_128000; + break; + case MQAFS256000 : + format = AUDIO_PCM_256000; + break; + case MQAFS512000 : + format = AUDIO_PCM_512000; + break; + default: + format = AUDIO_PCM_44100; + break; + } + + } +#endif + if (audiotype == 1 || audiotype == 5) + { + format = sample_code + AUDIO_DSD_64; + } + } + +// if (sample_code != 0) +// debug_printf("samFreq %d, audiotype %d code %d format %d\n", samFreq, audiotype, sample_code, format); + + SET_SHARED_GLOBAL(g_new_playback_format, format); + SET_SHARED_GLOBAL(g_new_audio_type, audiotype); + //debug_printf("audiotype %d code %d \n", audiotype, sample_code); + SET_SHARED_GLOBAL(g_format_time, time); +} + +/* Configures the external audio hardware for the required sample frequency. + * See gpio.h for I2C helper functions and gpio access + */ +void AudioHwConfig(unsigned samFreq, unsigned mClk, unsigned dsdMode, + unsigned sampRes_DAC, unsigned sampRes_ADC) +{ + debug_printf(" samFreq %d, mClk %d dsdMode %d\n", samFreq, mClk, dsdMode); + + static unsigned current_sample_rate = DEFAULT_FREQ; + static unsigned led_count = 0; + SET_SHARED_GLOBAL(g_samfreq, samFreq); + SET_SHARED_GLOBAL(g_dsd_mode, dsdMode); + + set_gpio(P_GPIO_MUTE, MUTE); + debug_printf("mute_dac %d======== \n", samFreq); + delay_milliseconds(1); + + if((XUA_SYNCMODE == XUA_SYNCMODE_SYNC || XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) && XUA_USE_SW_PLL) + { + /* Do nothing - the SW_PLL configures the AppPLL */ + } + else + { + if (samFreq % 22050 == 0) + { + sw_pll_fixed_clock(MCLK_441); + //p_mclk_sel <: 0x8; + } + else + { + sw_pll_fixed_clock(MCLK_48); + //p_mclk_sel <: 0x4; + } + } + + switch (samFreq) + { + case 192000: + case 176400: + CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x0003, 0x00D0); + CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002B, 0x4000); + CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002C, 0x0082); + break; + case 96000: + case 88200: + CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x0003, 0x0092); + CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002B, 0x4001); + CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002C, 0x0082); + break; + case 44100: + case 48000: + default: + CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x0003, 0x0053); + CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002B, 0x4002); + CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002C, 0x0082); + break; + } + + if (led_count == 0) + { + led_count = 1; + } + else if (led_count == 1) + { + led_count = 2; + // SET_SHARED_GLOBAL(g_update_led, 1); + } +} + +void AudioHwConfig_UnMute(void) +{ + static unsigned count = 1; + if (count++ > 0) + { + unsigned long time = get_reference_time(); + debug_printf(" AudioHwConfig_UnMute %d\n", time); + SET_SHARED_GLOBAL(g_unmute_dac_state, 1); + SET_SHARED_GLOBAL(g_unmute_time, time); + } + else + { + debug_printf("don't unmute at boot\n"); + } +} + +unsafe chanend uc_eq_data; + +extern unsigned char process_eq_send_params(uint32_t eq_data[]); + +extern unsigned char process_eq_read_params(uint32_t response[]); + +void get_read_params(uint8_t response[]) +{ + unsafe { + uc_eq_data <: 0x55; + for (int i = 0; i < 16; i++) + { + unsigned temp; + uc_eq_data :> temp; + response[i * 4] = temp & 0xff; + response[i * 4 + 1] = (temp >> 8) & 0xff; + response[i * 4 + 2] = (temp >> 16) & 0xff; + response[i * 4 + 3] = (temp >> 24) & 0xff; + } + } +} + +void send_eq_data(uint8_t data[]) +{ + unsafe { + uc_eq_data <: 0x11; + for (int i = 0; i < 16; i++) + { + unsigned temp = data[i * 4 ] | data[i * 4 + 1] << 8 | data[i * 4 + 2] << 16 | data[i * 4 + 3] << 24; + uc_eq_data <: temp; + } + } +} + +// 改动原因:封装tile1前面板LED刷新,统一执行mode灯R/G/B轮转与mic mute红灯显示策略,避免多处直接写端口造成覆盖。 +static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic_mute_switch, unsigned &led_shadow) +{ + unsigned mode_red = 0; + unsigned mode_green = 0; + unsigned mode_blue = 0; + unsigned mic_red = (mic_mute_switch == 1) ? 1 : 0; + + if (mode_led_color_idx == 0) { + mode_red = 1; + } else if (mode_led_color_idx == 1) { + mode_green = 1; + } else if (mode_led_color_idx == 2) { + mode_blue = 1; + } + + // 改动原因:硬件LED为低电平点亮(1灭/0亮),因此把逻辑亮灭状态反相后再写端口。 + p_mode_led_red <: (mode_red ? 0 : 1); + led_shadow &= ~0x7; + led_shadow |= (mode_green ? 0x0 : 0x1); + led_shadow |= (mode_blue ? 0x0 : 0x2); + led_shadow |= (mic_red ? 0x0 : 0x4); + led_shadow |= 0x8; + p_leds <: led_shadow; + // 改动原因:该蓝灯当前不参与功能,保持熄灭(低电平有效下输出1表示灭)。 + p_mic_mute_led_blue <: 1; +} + +void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl, chanend c_eq_data) +{ + // 改动原因:LED端口在tile1,统一用shadow变量管理输出位,避免不同逻辑直接写端口互相覆盖。 + // 改动原因:低电平点亮,初始化全灭应写1;bit0/1/2默认置1表示G/B/红灯都灭。 + unsigned led_shadow = 0x7; + unsigned mode_led_color_idx = 0xFFFFFFFF; // 0=R,1=G,2=B, 0xFFFFFFFF=未点亮 + unsigned mic_mute_switch = 1; // 0=静音(亮红),1=非静音(灭红) + p_mode_led_red <: 0; + p_mic_mute_led_blue <: 1; + p_leds <: led_shadow; + + apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, led_shadow); + unsigned eq_mode_time = 0; + timer eq_mode_timer; + eq_mode_timer :> eq_mode_time; + eq_mode_time += EQ_MODE_DELAY; + + + + delay_milliseconds(100); + + uint32_t eq_data[16]; + + while(1) + { + unsafe { + select{ + case i_c1_led_ctrl.set_mode_led_color(unsigned color_idx): + mode_led_color_idx = color_idx % 3; + apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, led_shadow); + break; + case i_c1_led_ctrl.set_mic_mute_state(unsigned mute_state): + mic_mute_switch = (mute_state != 0) ? 1 : 0; + apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, led_shadow); + break; + } + } + } +} diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiostream.xc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiostream.xc new file mode 100644 index 0000000..eb09535 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiostream.xc @@ -0,0 +1,27 @@ +#if UART_DEBUG || DEBUG_MEMORY_LOG_ENABLED +#define DEBUG_PRINT_ENABLE 1 +#endif +#include +#include "gpio_access.h" +#include "xc_ptr.h" +#include "debug_print.h" + +extern unsigned g_mute_enable, g_unmute_time; +extern unsigned g_unmute_dac_state; +unsigned long get_reference_time(); +void UserAudioStreamStart(void) +{ + unsigned long time = get_reference_time(); + SET_SHARED_GLOBAL(g_unmute_dac_state, 1); + SET_SHARED_GLOBAL(g_unmute_time, time); + debug_printf("UserAudioStreamStart\n"); +} + +void UserAudioStreamStop(void) +{ + unsigned enable_mute; + debug_printf("UserAudioStreamStop\n"); + //SET_SHARED_GLOBAL(g_unmute_dac_state, 0); + //set_gpio(P_GPIO_MUTE, MUTE); + delay_milliseconds(10); +} diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/biquad_standalone.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/biquad_standalone.c new file mode 100644 index 0000000..e5ccd22 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/biquad_standalone.c @@ -0,0 +1,547 @@ +#include "biquad_standalone.h" +#include +#include + +// 常量定义 +#define Q_factor 30 +#define BOOST_BSHIFT 2 + +// 如果没有定义M_PI,则手动定义 +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +static const float pi = (float)M_PI; +static const float log_2 = 0.69314718055f; +static const float db_2 = 6.02059991328f; // 20*log10(2) + +// 辅助函数实现 +static inline int32_t _float2fixed(float x, int32_t q) { + if (x < 0.0f) return (((float)(1u << q)) * x - 0.5f); + if (x > 0.0f) return (((float)((1u << q) - 1)) * x + 0.5f); + return 0; +} + +static inline int32_t _float2fixed_assert(float x, int32_t q) { + float max_val = (float)(1 << (31 - q)); + // 简单的断言检查,如果超出范围则返回边界值 + if (x > max_val) x = max_val; + if (x < -max_val) x = -max_val; + return _float2fixed(x, q); +} + +// 简单的三角函数实现,使用标准库 - 重命名以避免冲突 +static inline float biquad_sin(float x) { + return sinf(x); +} + +static inline float biquad_cos(float x) { + return cosf(x); +} + +// 双曲正弦函数 - 重命名以避免冲突 +static inline float biquad_sinhf(float x) { + return (expf(x) - expf(-x)) / 2.0f; +} + +static inline float _check_fc(float fc, float fs) { + float fc_sat = fc; + // saturate if > fs/2 + if (fc_sat >= fs / 2.0f) { + fc_sat = fs / 2.0f; + } + return fc_sat; +} + +static inline float _check_gain(float gain, float max_gain) { + float gain_sat = gain; + // saturate if > max_gain + if (gain_sat >= max_gain) { + gain_sat = max_gain; + } + return gain_sat; +} + +void eq_biquad_bypass(q2_30 coeffs[5]) { + coeffs[0] = 1 << Q_factor; + coeffs[1] = 0; + coeffs[2] = 0; + coeffs[3] = 0; + coeffs[4] = 0; +} + +void eq_biquad_mute(q2_30 coeffs[5]) { + coeffs[0] = 0; + coeffs[1] = 0; + coeffs[2] = 0; + coeffs[3] = 0; + coeffs[4] = 0; +} + +left_shift_t eq_biquad_gain(q2_30 coeffs[5], const float gain_db) { + float A = powf(10.0f, (gain_db * (1.0f / 20.0f))); + + coeffs[0] = _float2fixed_assert(A, Q_factor - BOOST_BSHIFT); + coeffs[1] = 0; + coeffs[2] = 0; + coeffs[3] = 0; + coeffs[4] = 0; + + return BOOST_BSHIFT; +} + +void eq_biquad_lowpass(q2_30 coeffs[5], const float fc, const float fs, const float filter_Q) { + float fc_sat = _check_fc(fc, fs); + + // Compute common factors + float K = tanf(pi * fc_sat / fs); + float KK = K * K; + float KQ = K / filter_Q; + float norm = 1.0f / (1.0f + KQ + KK); + + // Compute coeffs + float b0 = KK * norm; + float b1 = 2.0f * b0; + float b2 = b0; + float a1 = 2.0f * (KK - 1.0f) * norm; + float a2 = (1.0f - KQ + KK) * norm; + + //DPRINTF("b0: %f \n b1: %f \n b2: %f \n a1: %f \n a2: %f\n", b0, b1, b2, a1, a2); + // Store as fixed-point values + coeffs[0] = _float2fixed_assert(b0, Q_factor); + coeffs[1] = _float2fixed_assert(b1, Q_factor); + coeffs[2] = _float2fixed_assert(b2, Q_factor); + coeffs[3] = _float2fixed_assert(-a1, Q_factor); + coeffs[4] = _float2fixed_assert(-a2, Q_factor); +} + +void eq_biquad_highpass(q2_30 coeffs[5], const float fc, const float fs, const float filter_Q) { + float fc_sat = _check_fc(fc, fs); + + // Compute common factors + float K = tanf(pi * fc_sat / fs); + float KK = K * K; + float KQ = K / filter_Q; + float norm = 1.0f / (1.0f + KQ + KK); + + // Compute coeffs + float b0 = norm; + float b1 = -2.0f * b0; + float b2 = b0; + float a1 = 2.0f * (KK - 1.0f) * norm; + float a2 = (1.0f - KQ + KK) * norm; + + //DPRINTF("b0: %f \n b1: %f \n b2: %f \n a1: %f \n a2: %f\n", b0, b1, b2, a1, a2); + + // Store as fixed-point values + coeffs[0] = _float2fixed_assert(b0, Q_factor); + coeffs[1] = _float2fixed_assert(b1, Q_factor); + coeffs[2] = _float2fixed_assert(b2, Q_factor); + coeffs[3] = _float2fixed_assert(-a1, Q_factor); + coeffs[4] = _float2fixed_assert(-a2, Q_factor); +} + +void eq_biquad_bandpass(q2_30 coeffs[5], const float fc, const float fs, const float bandwidth) { + float fc_sat = _check_fc(fc, fs); + + // 使用lib_audio_dsp中biquad.c的算法,但添加参数保护 + float w0 = 2.0f * pi * fc_sat / fs; + float sin_w0 = biquad_sin(w0); + + // 限制bandwidth参数范围,避免sinh溢出 + float bw_sat = bandwidth; + if (bw_sat > 100.0f) bw_sat = 100.0f; // 限制最大bandwidth + if (bw_sat < 0.01f) bw_sat = 0.01f; // 限制最小bandwidth + + float sinh_arg = log_2 / 2.0f * bw_sat * w0 / sin_w0; + // 限制sinh参数范围,避免溢出 + if (sinh_arg > 10.0f) sinh_arg = 10.0f; + if (sinh_arg < -10.0f) sinh_arg = -10.0f; + + float alpha = sin_w0 * biquad_sinhf(sinh_arg); + + // Compute coeffs - 与lib_audio_dsp完全一致 + float b0 = alpha; + float b1 = 0.0f; + float b2 = -alpha; + float a0 = 1.0f + alpha; + float a1 = -2.0f * biquad_cos(w0); + float a2 = 1.0f - alpha; + + + float inv_a0 = 1.0f / a0; + + //DPRINTF("b0: %f \n b1: %f \n b2: %f \n a1: %f \n a2: %f\n", b0 * inv_a0, b1 * inv_a0, b2 * inv_a0, a1 * inv_a0, a2 * inv_a0); + // Store as fixed-point values + coeffs[0] = _float2fixed_assert(b0 * inv_a0, Q_factor); + coeffs[1] = _float2fixed_assert(b1 * inv_a0, Q_factor); + coeffs[2] = _float2fixed_assert(b2 * inv_a0, Q_factor); + coeffs[3] = _float2fixed_assert(-a1 * inv_a0, Q_factor); + coeffs[4] = _float2fixed_assert(-a2 * inv_a0, Q_factor); +} + +void eq_biquad_bandstop(q2_30 coeffs[5], const float fc, const float fs, const float bandwidth) { + float fc_sat = _check_fc(fc, fs); + + // 使用lib_audio_dsp中biquad.c的算法,但添加参数保护 + float w0 = 2.0f * pi * fc_sat / fs; + float sin_w0 = biquad_sin(w0); + + // 限制bandwidth参数范围,避免sinh溢出 + float bw_sat = bandwidth; + if (bw_sat > 100.0f) bw_sat = 100.0f; // 限制最大bandwidth + if (bw_sat < 0.01f) bw_sat = 0.01f; // 限制最小bandwidth + + float sinh_arg = log_2 / 2.0f * bw_sat * w0 / sin_w0; + // 限制sinh参数范围,避免溢出 + if (sinh_arg > 10.0f) sinh_arg = 10.0f; + if (sinh_arg < -10.0f) sinh_arg = -10.0f; + + float alpha = sin_w0 * biquad_sinhf(sinh_arg); + + // Compute coeffs - 与lib_audio_dsp完全一致 + float b0 = 1.0f; + float b1 = -2.0f * biquad_cos(w0); + float b2 = 1.0f; + float a0 = 1.0f + alpha; + float a1 = b1; + float a2 = 1.0f - alpha; + + float inv_a0 = 1.0f / a0; + + //DPRINTF("b0: %f \n b1: %f \n b2: %f \n a1: %f \n a2: %f\n", b0 * inv_a0, b1 * inv_a0, b2 * inv_a0, a1 * inv_a0, a2 * inv_a0); + + // Store as fixed-point values + coeffs[0] = _float2fixed_assert(b0 * inv_a0, Q_factor); + coeffs[1] = _float2fixed_assert(b1 * inv_a0, Q_factor); + coeffs[2] = _float2fixed_assert(b2 * inv_a0, Q_factor); + coeffs[3] = _float2fixed_assert(-a1 * inv_a0, Q_factor); + coeffs[4] = _float2fixed_assert(-a2 * inv_a0, Q_factor); +} + +void eq_biquad_notch(q2_30 coeffs[5], const float fc, const float fs, const float filter_Q) { + float fc_sat = _check_fc(fc, fs); + + // 使用与Python端BiquadFilterCalculator.calculate("notch")完全一致的算法 + float K = tanf(pi * fc_sat / fs); // 与Python端一致:K = tan(π * Fc / Fs) + float norm = 1.0f / (1.0f + K / filter_Q + K * K); // 与Python端一致 + + // Compute coeffs - 与Python端完全一致 + float b0 = (1.0f + K * K) * norm; + float b1 = 2.0f * (K * K - 1.0f) * norm; + float b2 = b0; + float a1 = b1; + float a2 = (1.0f - K / filter_Q + K * K) * norm; + + //DPRINTF("b0: %f \n b1: %f \n b2: %f \n a1: %f \n a2: %f\n", b0, b1, b2, a1, a2); + // Store as fixed-point values + coeffs[0] = _float2fixed_assert(b0, Q_factor); + coeffs[1] = _float2fixed_assert(b1, Q_factor); + coeffs[2] = _float2fixed_assert(b2, Q_factor); + coeffs[3] = _float2fixed_assert(-a1, Q_factor); + coeffs[4] = _float2fixed_assert(-a2, Q_factor); +} + +void eq_biquad_allpass(q2_30 coeffs[5], const float fc, const float fs, const float filter_Q) { + float fc_sat = _check_fc(fc, fs); + + // 使用与Python端BiquadFilterCalculator.calculate("allpass")完全一致的算法 + // 注意:Python端没有allpass类型,但我们可以使用类似的算法 + float K = tanf(pi * fc_sat / fs); // 与Python端一致:K = tan(π * Fc / Fs) + float norm = 1.0f / (1.0f + K / filter_Q + K * K); // 与Python端一致 + + // Compute coeffs - 全通滤波器的标准算法 + float b0 = (1.0f - K / filter_Q + K * K) * norm; + float b1 = 2.0f * (K * K - 1.0f) * norm; + float b2 = 1.0f; + float a1 = b1; + float a2 = b0; + + //DPRINTF("b0: %f \n b1: %f \n b2: %f \n a1: %f \n a2: %f\n", b0, b1, b2, a1, a2); + + // Store as fixed-point values + coeffs[0] = _float2fixed_assert(b0, Q_factor); + coeffs[1] = _float2fixed_assert(b1, Q_factor); + coeffs[2] = _float2fixed_assert(b2, Q_factor); + coeffs[3] = _float2fixed_assert(-a1, Q_factor); + coeffs[4] = _float2fixed_assert(-a2, Q_factor); +} + +// 动态计算bshift的函数,与Python端calculate_bshift算法一致 +static left_shift_t calculate_bshift(float b0, float b1, float b2) { + float max_b = fabsf(b0); + if (fabsf(b1) > max_b) max_b = fabsf(b1); + if (fabsf(b2) > max_b) max_b = fabsf(b2); + + if (max_b == 0.0f) return 0; + + // 计算bshift = floor(log2(max_b)) + int bshift = 0; + if (max_b >= 1.0f) { + float temp = max_b; + while (temp >= 2.0f) { + temp /= 2.0f; + bshift++; + } + } else { + float temp = max_b; + while (temp < 1.0f) { + temp *= 2.0f; + bshift--; + } + bshift--; // 调整到正确的值 + } + + // 确保bshift >= 0 + return (bshift >= 0) ? bshift : 0; +} + +left_shift_t eq_biquad_peaking(q2_30 coeffs[5], const float fc, const float fs, const float filter_Q, const float gain_db) { + float gain_db_sat = _check_gain(gain_db, 20.0f * db_2); // 增加最大增益限制 + float fc_sat = _check_fc(fc, fs); + + // 使用与Python端BiquadFilterCalculator.calculate("peak")完全一致的算法 + float V = powf(10.0f, fabsf(gain_db_sat) / 20.0f); // 与Python端一致 + float K = tanf(pi * fc_sat / fs); // 与Python端一致:K = tan(π * Fc / Fs) + float norm = 0.0f; + + // 根据增益正负选择不同的计算方式,与Python端完全一致 + if (gain_db_sat >= 0) { + norm = 1.0f / (1.0f + 1.0f/filter_Q * K + K * K); + float b0 = (1.0f + V/filter_Q * K + K * K) * norm; + float b1 = 2.0f * (K * K - 1.0f) * norm; + float b2 = (1.0f - V/filter_Q * K + K * K) * norm; + float a1 = b1; // 与Python端一致 + float a2 = (1.0f - 1.0f/filter_Q * K + K * K) * norm; + + // DPRINTF("b0: %f \n b1: %f \n b2: %f \n a1: %f \n a2: %f\n", b0, b1, b2, a1, a2); + + // 动态计算bshift + left_shift_t bshift = calculate_bshift(b0, b1, b2); + //DPRINTF("Calculated bshift: %d\n", bshift); + + // Store as fixed-point values + coeffs[0] = _float2fixed_assert(b0, Q_factor - bshift); + coeffs[1] = _float2fixed_assert(b1, Q_factor - bshift); + coeffs[2] = _float2fixed_assert(b2, Q_factor - bshift); + coeffs[3] = _float2fixed_assert(-a1, Q_factor); + coeffs[4] = _float2fixed_assert(-a2, Q_factor); + + return bshift; + } else { + norm = 1.0f / (1.0f + V/filter_Q * K + K * K); + float b0 = (1.0f + 1.0f/filter_Q * K + K * K) * norm; + float b1 = 2.0f * (K * K - 1.0f) * norm; + float b2 = (1.0f - 1.0f/filter_Q * K + K * K) * norm; + float a1 = b1; // 与Python端一致 + float a2 = (1.0f - V/filter_Q * K + K * K) * norm; + + // DPRINTF("b0: %f \n b1: %f \n b2: %f \n a1: %f \n a2: %f\n", b0, b1, b2, a1, a2); + + // 动态计算bshift + left_shift_t bshift = calculate_bshift(b0, b1, b2); + //DPRINTF("Calculated bshift: %d\n", bshift); + + // Store as fixed-point values + coeffs[0] = _float2fixed_assert(b0, Q_factor - bshift); + coeffs[1] = _float2fixed_assert(b1, Q_factor - bshift); + coeffs[2] = _float2fixed_assert(b2, Q_factor - bshift); + coeffs[3] = _float2fixed_assert(-a1, Q_factor); + coeffs[4] = _float2fixed_assert(-a2, Q_factor); + + return bshift; + } +} + +left_shift_t eq_biquad_const_q(q2_30 coeffs[5], const float fc, const float fs, const float filter_Q, const float gain_db) { + float gain_db_sat = _check_gain(gain_db, 20.0f * db_2); + float fc_sat = _check_fc(fc, fs); + + // Compute common factors + float V = powf(10.0f, (gain_db_sat * (1.0f / 20.0f))); + // w0 is only needed for calculating K + float K = tanf(pi * fc_sat / fs); + + float factor_a = K / filter_Q; + float factor_b = 0; + float K_pow2 = K * K; + if (gain_db_sat > 0) { + factor_b = V * factor_a; + } else { + factor_b = factor_a; + factor_a = factor_b / V; + } + + // Compute coeffs + float b0 = 1.0f + factor_b + K_pow2; + float b1 = 2.0f * (K_pow2 - 1.0f); + float b2 = 1.0f - factor_b + K_pow2; + float a0 = 1.0f + factor_a + K_pow2; + float a1 = b1; + float a2 = 1.0f - factor_a + K_pow2; + + float inv_a0 = 1.0f / a0; + + // 动态计算bshift + left_shift_t bshift = calculate_bshift(b0 * inv_a0, b1 * inv_a0, b2 * inv_a0); + + // Store as fixed-point values + coeffs[0] = _float2fixed_assert(b0 * inv_a0, Q_factor - bshift); + coeffs[1] = _float2fixed_assert(b1 * inv_a0, Q_factor - bshift); + coeffs[2] = _float2fixed_assert(b2 * inv_a0, Q_factor - bshift); + coeffs[3] = _float2fixed_assert(-a1 * inv_a0, Q_factor); + coeffs[4] = _float2fixed_assert(-a2 * inv_a0, Q_factor); + + return bshift; +} + +left_shift_t eq_biquad_lowshelf(q2_30 coeffs[5], const float fc, const float fs, const float filter_Q, const float gain_db) { + float gain_db_sat = _check_gain(gain_db, 20.0f * db_2); + float fc_sat = _check_fc(fc, fs); + + // 使用与Python端BiquadFilterCalculator.calculate("lowshelf")完全一致的算法 + float V = powf(10.0f, fabsf(gain_db_sat) / 20.0f); // 与Python端一致 + float K = tanf(pi * fc_sat / fs); // 与Python端一致:K = tan(π * Fc / Fs) + float norm = 0.0f; + + // 根据增益正负选择不同的计算方式,与Python端完全一致 + if (gain_db_sat >= 0) { + norm = 1.0f / (1.0f + sqrtf(2.0f) * K + K * K); + float b0 = (1.0f + sqrtf(2.0f * V) * K + V * K * K) * norm; + float b1 = 2.0f * (V * K * K - 1.0f) * norm; + float b2 = (1.0f - sqrtf(2.0f * V) * K + V * K * K) * norm; + float a1 = 2.0f * (K * K - 1.0f) * norm; + float a2 = (1.0f - sqrtf(2.0f) * K + K * K) * norm; + + // DPRINTF("b0: %f \n b1: %f \n b2: %f \n a1: %f \n a2: %f\n", b0, b1, b2, a1, a2); + + // 动态计算bshift + left_shift_t bshift = calculate_bshift(b0, b1, b2); + + // Store as fixed-point values + coeffs[0] = _float2fixed_assert(b0, Q_factor - bshift); + coeffs[1] = _float2fixed_assert(b1, Q_factor - bshift); + coeffs[2] = _float2fixed_assert(b2, Q_factor - bshift); + coeffs[3] = _float2fixed_assert(-a1, Q_factor); + coeffs[4] = _float2fixed_assert(-a2, Q_factor); + + return bshift; + } else { + norm = 1.0f / (1.0f + sqrtf(2.0f * V) * K + V * K * K); + float b0 = (1.0f + sqrtf(2.0f) * K + K * K) * norm; + float b1 = 2.0f * (K * K - 1.0f) * norm; + float b2 = (1.0f - sqrtf(2.0f) * K + K * K) * norm; + float a1 = 2.0f * (V * K * K - 1.0f) * norm; + float a2 = (1.0f - sqrtf(2.0f * V) * K + V * K * K) * norm; + + // DPRINTF("b0: %f \n b1: %f \n b2: %f \n a1: %f \n a2: %f\n", b0, b1, b2, a1, a2); + + // 动态计算bshift + left_shift_t bshift = calculate_bshift(b0, b1, b2); + + // Store as fixed-point values + coeffs[0] = _float2fixed_assert(b0, Q_factor - bshift); + coeffs[1] = _float2fixed_assert(b1, Q_factor - bshift); + coeffs[2] = _float2fixed_assert(b2, Q_factor - bshift); + coeffs[3] = _float2fixed_assert(-a1, Q_factor); + coeffs[4] = _float2fixed_assert(-a2, Q_factor); + + return bshift; + } +} + +left_shift_t eq_biquad_highshelf(q2_30 coeffs[5], const float fc, const float fs, const float filter_Q, const float gain_db) { + float gain_db_sat = _check_gain(gain_db, 20.0f * db_2); + float fc_sat = _check_fc(fc, fs); + + // 使用与Python端BiquadFilterCalculator.calculate("highshelf")完全一致的算法 + float V = powf(10.0f, fabsf(gain_db_sat) / 20.0f); // 与Python端一致 + float K = tanf(pi * fc_sat / fs); // 与Python端一致:K = tan(π * Fc / Fs) + float norm = 0.0f; + + // 根据增益正负选择不同的计算方式,与Python端完全一致 + if (gain_db_sat >= 0) { + norm = 1.0f / (1.0f + sqrtf(2.0f) * K + K * K); + float b0 = (V + sqrtf(2.0f * V) * K + K * K) * norm; + float b1 = 2.0f * (K * K - V) * norm; + float b2 = (V - sqrtf(2.0f * V) * K + K * K) * norm; + float a1 = 2.0f * (K * K - 1.0f) * norm; + float a2 = (1.0f - sqrtf(2.0f) * K + K * K) * norm; + + // DPRINTF("b0: %f \n b1: %f \n b2: %f \n a1: %f \n a2: %f\n", b0, b1, b2, a1, a2); + + // 动态计算bshift + left_shift_t bshift = calculate_bshift(b0, b1, b2); + + // Store as fixed-point values + coeffs[0] = _float2fixed_assert(b0, Q_factor - bshift); + coeffs[1] = _float2fixed_assert(b1, Q_factor - bshift); + coeffs[2] = _float2fixed_assert(b2, Q_factor - bshift); + coeffs[3] = _float2fixed_assert(-a1, Q_factor); + coeffs[4] = _float2fixed_assert(-a2, Q_factor); + + return bshift; + } else { + norm = 1.0f / (V + sqrtf(2.0f * V) * K + K * K); + float b0 = (1.0f + sqrtf(2.0f) * K + K * K) * norm; + float b1 = 2.0f * (K * K - 1.0f) * norm; + float b2 = (1.0f - sqrtf(2.0f) * K + K * K) * norm; + float a1 = 2.0f * (K * K - V) * norm; + float a2 = (V - sqrtf(2.0f * V) * K + K * K) * norm; + + // DPRINTF("b0: %f \n b1: %f \n b2: %f \n a1: %f \n a2: %f\n", b0, b1, b2, a1, a2); + + // 动态计算bshift + left_shift_t bshift = calculate_bshift(b0, b1, b2); + + // Store as fixed-point values + coeffs[0] = _float2fixed_assert(b0, Q_factor - bshift); + coeffs[1] = _float2fixed_assert(b1, Q_factor - bshift); + coeffs[2] = _float2fixed_assert(b2, Q_factor - bshift); + coeffs[3] = _float2fixed_assert(-a1, Q_factor); + coeffs[4] = _float2fixed_assert(-a2, Q_factor); + + return bshift; + } +} + +void eq_biquad_linkwitz(q2_30 coeffs[5], const float f0, const float fs, const float q0, const float fp, const float qp) { + float f0_sat = _check_fc(f0, fs); + float fp_sat = _check_fc(fp, fs); + + // Compute common factors + float fc = (f0_sat + fp_sat) / 2.0f; + + float w_f0 = 2.0f * pi * f0_sat; + float half_w_fc = pi * fc; + float w_fp = 2.0f * pi * fp_sat; + + float w_f0_pow2 = w_f0 * w_f0; + float d1i = w_f0 / q0; + + float w_fp_pow2 = w_fp * w_fp; + float c1i = w_fp / qp; + + float gn = 2.0f * half_w_fc * (1.0f / (tanf(half_w_fc / fs))); + float gn_pow2 = gn * gn; + + float factor_b = gn * d1i; + float factor_a = gn * c1i; + + // Compute coeffs + float a0 = w_fp_pow2 + factor_a + gn_pow2; + float a1 = 2.0f * (w_fp_pow2 - gn_pow2); + float a2 = w_fp_pow2 - factor_a + gn_pow2; + float b0 = w_f0_pow2 + factor_b + gn_pow2; + float b1 = 2.0f * (w_f0_pow2 - gn_pow2); + float b2 = w_f0_pow2 - factor_b + gn_pow2; + + float inv_a0 = 1.0f / a0; + + // Store as fixed-point values + coeffs[0] = _float2fixed_assert(b0 * inv_a0, Q_factor); + coeffs[1] = _float2fixed_assert(b1 * inv_a0, Q_factor); + coeffs[2] = _float2fixed_assert(b2 * inv_a0, Q_factor); + coeffs[3] = _float2fixed_assert(-a1 * inv_a0, Q_factor); + coeffs[4] = _float2fixed_assert(-a2 * inv_a0, Q_factor); +} diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/biquad_standalone.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/biquad_standalone.h new file mode 100644 index 0000000..61e2bbd --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/biquad_standalone.h @@ -0,0 +1,32 @@ +#ifndef BIQUAD_STANDALONE_H +#define BIQUAD_STANDALONE_H + +#include +#include "xmath/types.h" // 包含 lib_xcore_math 的类型定义 + +// 注意:q2_30, left_shift_t, right_shift_t 已在 lib_xcore_math 中定义,不需要重复定义 + +// 函数声明 +void eq_biquad_bypass(q2_30 coeffs[5]); +void eq_biquad_mute(q2_30 coeffs[5]); +left_shift_t eq_biquad_gain(q2_30 coeffs[5], const float gain_db); +void eq_biquad_lowpass(q2_30 coeffs[5], const float fc, const float fs, const float filter_Q); +void eq_biquad_highpass(q2_30 coeffs[5], const float fc, const float fs, const float filter_Q); +void eq_biquad_bandpass(q2_30 coeffs[5], const float fc, const float fs, const float bandwidth); +void eq_biquad_bandstop(q2_30 coeffs[5], const float fc, const float fs, const float bandwidth); +void eq_biquad_notch(q2_30 coeffs[5], const float fc, const float fs, const float filter_Q); +void eq_biquad_allpass(q2_30 coeffs[5], const float fc, const float fs, const float filter_Q); +left_shift_t eq_biquad_peaking(q2_30 coeffs[5], const float fc, const float fs, const float filter_Q, const float gain_db); +left_shift_t eq_biquad_const_q(q2_30 coeffs[5], const float fc, const float fs, const float filter_Q, const float gain_db); +left_shift_t eq_biquad_lowshelf(q2_30 coeffs[5], const float fc, const float fs, const float filter_Q, const float gain_db); +left_shift_t eq_biquad_highshelf(q2_30 coeffs[5], const float fc, const float fs, const float filter_Q, const float gain_db); +void eq_biquad_linkwitz(q2_30 coeffs[5], const float f0, const float fs, const float q0, const float fp, const float qp); + +// 辅助函数声明 - 重命名以避免与系统库冲突 +static inline int32_t _float2fixed(float x, int32_t q); +static inline int32_t _float2fixed_assert(float x, int32_t q); +static inline float biquad_sin(float x); // 重命名为 biquad_sin +static inline float biquad_cos(float x); // 重命名为 biquad_cos +static inline float biquad_sinhf(float x); // 重命名为 biquad_sinhf + +#endif // BIQUAD_STANDALONE_H diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/br.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/br.h new file mode 100644 index 0000000..d468914 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/br.h @@ -0,0 +1,38 @@ +/* +验证函数,函数里从flash里获取uuid,和hex_string做验证, +验证通过后br_get_validate_status返回1,失败位0 +- c_validate: tile之间通讯用的chanend +- 返回值:0为验证失败,1为验证成功 +*/ +int br_validate(chanend_t c_validate, char *hex_string); + +/* +初始化函数 +- c_validate: tile之间通讯用的chanend +*/ +void br_init(chanend_t c_validate); + +/* +每一帧调用,帧长256 +- in为256x8的数据,8声道交织一起 +- out为256x2的数据,2声道交织一起 +- on为算法开关,1为开,0为关 +*/ +void br_apply(short *in, short *out, int on); + +/* +当前声道格式返回函数(每一次调用br_apply都会计算声道格式) +- 0: 静音 +- 1: 单声道 +- 2: 双声道 +- 3: 5.1格式 +- 4: 7.1格式 +*/ +int br_get_channel_flag(); + +/* +算法生效验证状态返回函数 +- 0: 验证失败 +- 1: 验证成功 +*/ +int br_get_validate_status(); \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/br_wrapper.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/br_wrapper.c new file mode 100644 index 0000000..e1d9b5f --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/br_wrapper.c @@ -0,0 +1,158 @@ +// Copyright 2024 XMOS LIMITED. +// This Software is subject to the terms of the XMOS Public Licence: Version 1. +#if UART_DEBUG || DEBUG_MEMORY_LOG_ENABLED +#define DEBUG_PRINT_ENABLE 1 +#endif +#include +#include +#include +#include +#include +#include +#include +#include "br.h" +#include "xc_ptr.h" +#include "flash_interface.h" +#include "debug_print.h" + +#include "xua_conf.h" + + +unsigned long get_reference_time(); +void buffer_exchange(chanend_t c_data, unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[], int num_chan){ +#if XMOS_FPS_EN + chan_out_buf_word (c_data, sampsFromUsbToAudio, 2) ; + chan_in_buf_word (c_data , sampsFromUsbToAudio, 2); +#else +#if BR_ALGO || EQ_EN + unsigned ch[1] = {2}; + if (num_chan == NUM_USB_CHAN_OUT) + { + ch[0] = NUM_USB_CHAN_OUT; + } + else if (num_chan == 2) + { + ch[0] = 2; + } + + chan_out_buf_word (c_data, ch, 1) ; + chan_out_buf_word (c_data, sampsFromUsbToAudio, ch[0]) ; + chan_in_buf_word (c_data , sampsFromUsbToAudio, 2); +#endif +#endif +} + +#define BR_SLOT_NUM 2 +#define BR_FRAME_SIZE 256 +#define BR_NUM_OUT 2 +short __attribute__((aligned (4))) dsp_br_input_buf[BR_SLOT_NUM][BR_FRAME_SIZE * NUM_USB_CHAN_OUT]; +short __attribute__((aligned (4))) dsp_br_out_buf[BR_SLOT_NUM][BR_FRAME_SIZE * I2S_CHANS_DAC]; +unsigned buf_ready = 0; +int pos = 0; + +void dsp_main (chanend_t c_data , chanend_t cc_br_eof) { + +#if BR_ALGO || EQ_EN + int input[NUM_USB_CHAN_OUT]; + int output[I2S_CHANS_DAC]; + int count = 0; + unsigned ch[1] = {2}; + while (1) { + + chan_in_buf_word (c_data , ch, 1) ; + chan_in_buf_word (c_data , input, ch[0]) ; + chan_out_buf_word (c_data , output, I2S_CHANS_DAC); + if (ch[0] == 2) { + write_to_ring_buffer(0, input[0]); + write_to_ring_buffer(1, input[1]); + output[0] = read_from_ring_buffer(2); + output[1] = read_from_ring_buffer(3); + count = 0; + } + else if (ch[0] == NUM_USB_CHAN_OUT) { + for (int i = 0; i < NUM_USB_CHAN_OUT; i++) + { + dsp_br_input_buf[pos][count * NUM_USB_CHAN_OUT + i] = (short)(input[i] >> 16); + } + + for (int i = 0; i < I2S_CHANS_DAC; i++) + { + if (i < BR_NUM_OUT) { + output[i] = (int)(dsp_br_out_buf[pos][count * BR_NUM_OUT + i]) << 16; + } else { + output[i] = 0; + } + } + + if (count != (BR_FRAME_SIZE - 1)) + { + count ++; + } + else + { + count = 0; + pos = pos == 0 ? 1 : 0; + int eof = 1; + chan_out_buf_word (cc_br_eof, &eof, 1); + } + } + } +#endif +} + +extern uint8_t opt_key_read(uint8_t key[], unsigned offset); +extern unsigned dnr_init_flag; +void validate_algo(chanend_t c_validate) +{ +#if BR_ALGO + uint8_t uid[20] = {0}; + char hex_string[41] = {0}; + while (!dnr_init_flag) { + delay_milliseconds(1); + } + opt_key_read(uid, 2); + delay_milliseconds(10); + for (int i = 0; i < 20; i++) { + sprintf(hex_string + i * 2, "%02x", uid[i]); + } + hex_string[40] = '\0'; + flash_cmd_init(); + int res = br_validate(c_validate, hex_string); + flash_cmd_deinit(); + debug_printf("Validate status: %d\n", res); // check validate status +#endif +} + +extern void set_core_high_priority_on(void); +void br_dsp_proc_task(chanend_t c_validate, chanend_t cc_br_eof) +{ +#if BR_ALGO + set_core_high_priority_on(); + int channel_flag = 4; + int is_br_on = 1; + + int cnt = 0; + + br_init(c_validate); + int validate = br_get_validate_status(); + debug_printf("After Validate status: %d\n", validate); // check validate status + + + while (1) + { + int tmp; + int cur_pos; + chan_in_buf_word (cc_br_eof, &tmp, 1); + cur_pos = pos == 0 ? 1 : 0; + + if (channel_flag <= 2) { + is_br_on = 0; + } + else { + is_br_on = 1; + } + br_apply(dsp_br_input_buf[cur_pos], dsp_br_out_buf[cur_pos], is_br_on); + channel_flag = br_get_channel_flag(); + } +#endif +} diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/Analysis-00.toc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/Analysis-00.toc new file mode 100644 index 0000000..1aad587 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/Analysis-00.toc @@ -0,0 +1,4297 @@ +(['D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\eq_designer_new.py'], + ['D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions'], + [], + [('C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\numpy\\_pyinstaller', + 0), + ('C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\_pyinstaller_hooks_contrib\\stdhooks', + -1000), + ('C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\_pyinstaller_hooks_contrib', + -1000)], + {}, + [], + [], + False, + {}, + 0, + [], + [], + '3.10.17 | packaged by conda-forge | (main, Apr 10 2025, 22:06:35) [MSC ' + 'v.1943 64 bit (AMD64)]', + [('pyi_rth_inspect', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py', + 'PYSOURCE'), + ('pyi_rth_pkgutil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py', + 'PYSOURCE'), + ('pyi_rth_multiprocessing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py', + 'PYSOURCE'), + ('pyi_rth_pkgres', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgres.py', + 'PYSOURCE'), + ('pyi_rth_setuptools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_setuptools.py', + 'PYSOURCE'), + ('pyi_rth_pyside6', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pyside6.py', + 'PYSOURCE'), + ('pyi_rth_mplconfig', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_mplconfig.py', + 'PYSOURCE'), + ('eq_designer_new', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\eq_designer_new.py', + 'PYSOURCE')], + [('_pyi_rth_utils.tempfile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PyInstaller\\fake-modules\\_pyi_rth_utils\\tempfile.py', + 'PYMODULE'), + ('_pyi_rth_utils._win32', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PyInstaller\\fake-modules\\_pyi_rth_utils\\_win32.py', + 'PYMODULE'), + ('ctypes.wintypes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\ctypes\\wintypes.py', + 'PYMODULE'), + ('ctypes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\ctypes\\__init__.py', + 'PYMODULE'), + ('ctypes._endian', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\ctypes\\_endian.py', + 'PYMODULE'), + ('_pyi_rth_utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PyInstaller\\fake-modules\\_pyi_rth_utils\\__init__.py', + 'PYMODULE'), + ('_pyi_rth_utils.qt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PyInstaller\\fake-modules\\_pyi_rth_utils\\qt.py', + 'PYMODULE'), + ('importlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\__init__.py', + 'PYMODULE'), + ('importlib._common', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\_common.py', + 'PYMODULE'), + ('importlib._adapters', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\_adapters.py', + 'PYMODULE'), + ('typing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\typing.py', + 'PYMODULE'), + ('contextlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\contextlib.py', + 'PYMODULE'), + ('importlib.abc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\abc.py', + 'PYMODULE'), + ('importlib._abc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\_abc.py', + 'PYMODULE'), + ('importlib.machinery', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\machinery.py', + 'PYMODULE'), + ('importlib._bootstrap_external', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\_bootstrap_external.py', + 'PYMODULE'), + ('importlib.metadata', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\metadata\\__init__.py', + 'PYMODULE'), + ('importlib.metadata._itertools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\metadata\\_itertools.py', + 'PYMODULE'), + ('importlib.metadata._functools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\metadata\\_functools.py', + 'PYMODULE'), + ('importlib.metadata._collections', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\metadata\\_collections.py', + 'PYMODULE'), + ('importlib.metadata._meta', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\metadata\\_meta.py', + 'PYMODULE'), + ('importlib.metadata._adapters', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\metadata\\_adapters.py', + 'PYMODULE'), + ('importlib.metadata._text', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\metadata\\_text.py', + 'PYMODULE'), + ('email.message', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\message.py', + 'PYMODULE'), + ('email.policy', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\policy.py', + 'PYMODULE'), + ('email.contentmanager', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\contentmanager.py', + 'PYMODULE'), + ('email.quoprimime', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\quoprimime.py', + 'PYMODULE'), + ('string', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\string.py', + 'PYMODULE'), + ('email.headerregistry', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\headerregistry.py', + 'PYMODULE'), + ('email._header_value_parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\_header_value_parser.py', + 'PYMODULE'), + ('urllib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\urllib\\__init__.py', + 'PYMODULE'), + ('email.iterators', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\iterators.py', + 'PYMODULE'), + ('email.generator', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\generator.py', + 'PYMODULE'), + ('copy', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\copy.py', 'PYMODULE'), + ('random', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\random.py', + 'PYMODULE'), + ('statistics', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\statistics.py', + 'PYMODULE'), + ('decimal', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\decimal.py', + 'PYMODULE'), + ('_pydecimal', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_pydecimal.py', + 'PYMODULE'), + ('contextvars', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\contextvars.py', + 'PYMODULE'), + ('fractions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\fractions.py', + 'PYMODULE'), + ('numbers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\numbers.py', + 'PYMODULE'), + ('hashlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\hashlib.py', + 'PYMODULE'), + ('bisect', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\bisect.py', + 'PYMODULE'), + ('email._encoded_words', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\_encoded_words.py', + 'PYMODULE'), + ('base64', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\base64.py', + 'PYMODULE'), + ('getopt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\getopt.py', + 'PYMODULE'), + ('gettext', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\gettext.py', + 'PYMODULE'), + ('email.charset', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\charset.py', + 'PYMODULE'), + ('email.encoders', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\encoders.py', + 'PYMODULE'), + ('email.base64mime', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\base64mime.py', + 'PYMODULE'), + ('email._policybase', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\_policybase.py', + 'PYMODULE'), + ('email.header', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\header.py', + 'PYMODULE'), + ('email.errors', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\errors.py', + 'PYMODULE'), + ('email.utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\utils.py', + 'PYMODULE'), + ('email._parseaddr', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\_parseaddr.py', + 'PYMODULE'), + ('calendar', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\calendar.py', + 'PYMODULE'), + ('argparse', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\argparse.py', + 'PYMODULE'), + ('urllib.parse', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\urllib\\parse.py', + 'PYMODULE'), + ('ipaddress', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\ipaddress.py', + 'PYMODULE'), + ('datetime', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\datetime.py', + 'PYMODULE'), + ('_strptime', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_strptime.py', + 'PYMODULE'), + ('socket', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\socket.py', + 'PYMODULE'), + ('selectors', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\selectors.py', + 'PYMODULE'), + ('quopri', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\quopri.py', + 'PYMODULE'), + ('uu', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\uu.py', 'PYMODULE'), + ('optparse', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\optparse.py', + 'PYMODULE'), + ('textwrap', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\textwrap.py', + 'PYMODULE'), + ('zipfile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\zipfile.py', + 'PYMODULE'), + ('py_compile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\py_compile.py', + 'PYMODULE'), + ('lzma', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\lzma.py', 'PYMODULE'), + ('_compression', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_compression.py', + 'PYMODULE'), + ('bz2', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\bz2.py', 'PYMODULE'), + ('threading', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\threading.py', + 'PYMODULE'), + ('_threading_local', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_threading_local.py', + 'PYMODULE'), + ('importlib.util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\util.py', + 'PYMODULE'), + ('email', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\__init__.py', + 'PYMODULE'), + ('email.parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\parser.py', + 'PYMODULE'), + ('email.feedparser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\feedparser.py', + 'PYMODULE'), + ('csv', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\csv.py', 'PYMODULE'), + ('importlib.readers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\readers.py', + 'PYMODULE'), + ('tokenize', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\tokenize.py', + 'PYMODULE'), + ('token', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\token.py', + 'PYMODULE'), + ('importlib._bootstrap', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\_bootstrap.py', + 'PYMODULE'), + ('tempfile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\tempfile.py', + 'PYMODULE'), + ('shutil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\shutil.py', + 'PYMODULE'), + ('tarfile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\tarfile.py', + 'PYMODULE'), + ('gzip', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\gzip.py', 'PYMODULE'), + ('fnmatch', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\fnmatch.py', + 'PYMODULE'), + ('_distutils_hack', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\_distutils_hack\\__init__.py', + 'PYMODULE'), + ('setuptools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\__init__.py', + 'PYMODULE'), + ('setuptools._distutils.zosccompiler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\zosccompiler.py', + 'PYMODULE'), + ('setuptools._distutils.compilers.C.zos', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compilers\\C\\zos.py', + 'PYMODULE'), + ('setuptools._distutils.compilers.C.errors', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compilers\\C\\errors.py', + 'PYMODULE'), + ('setuptools._distutils.compilers.C.unix', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compilers\\C\\unix.py', + 'PYMODULE'), + ('distutils.util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\util.py', + 'PYMODULE'), + ('distutils.filelist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\filelist.py', + 'PYMODULE'), + ('distutils.debug', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\debug.py', + 'PYMODULE'), + ('distutils.file_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\file_util.py', + 'PYMODULE'), + ('distutils.dir_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\dir_util.py', + 'PYMODULE'), + ('subprocess', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\subprocess.py', + 'PYMODULE'), + ('signal', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\signal.py', + 'PYMODULE'), + ('distutils.sysconfig', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\sysconfig.py', + 'PYMODULE'), + ('distutils.text_file', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\text_file.py', + 'PYMODULE'), + ('sysconfig', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\sysconfig.py', + 'PYMODULE'), + ('pprint', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\pprint.py', + 'PYMODULE'), + ('dataclasses', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\dataclasses.py', + 'PYMODULE'), + ('inspect', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\inspect.py', + 'PYMODULE'), + ('dis', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\dis.py', 'PYMODULE'), + ('opcode', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\opcode.py', + 'PYMODULE'), + ('ast', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\ast.py', 'PYMODULE'), + ('_osx_support', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_osx_support.py', + 'PYMODULE'), + ('_aix_support', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_aix_support.py', + 'PYMODULE'), + ('_bootsubprocess', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_bootsubprocess.py', + 'PYMODULE'), + ('distutils.log', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\log.py', + 'PYMODULE'), + ('distutils.spawn', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\spawn.py', + 'PYMODULE'), + ('distutils.dep_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\dep_util.py', + 'PYMODULE'), + ('distutils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\__init__.py', + 'PYMODULE'), + ('distutils.archive_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\archive_util.py', + 'PYMODULE'), + ('setuptools._distutils.compilers.C.base', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compilers\\C\\base.py', + 'PYMODULE'), + ('distutils.fancy_getopt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\fancy_getopt.py', + 'PYMODULE'), + ('typing_extensions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\typing_extensions.py', + 'PYMODULE'), + ('setuptools._vendor.more_itertools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\more_itertools\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor', '-', 'PYMODULE'), + ('setuptools._vendor.more_itertools.recipes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\more_itertools\\recipes.py', + 'PYMODULE'), + ('setuptools._vendor.more_itertools.more', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\more_itertools\\more.py', + 'PYMODULE'), + ('queue', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\queue.py', + 'PYMODULE'), + ('shlex', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\shlex.py', + 'PYMODULE'), + ('setuptools._distutils.compilers.C', '-', 'PYMODULE'), + ('setuptools._distutils.compilers.C.cygwin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compilers\\C\\cygwin.py', + 'PYMODULE'), + ('setuptools._distutils.compilers.C.msvc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compilers\\C\\msvc.py', + 'PYMODULE'), + ('unittest.mock', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\mock.py', + 'PYMODULE'), + ('unittest', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\__init__.py', + 'PYMODULE'), + ('unittest.async_case', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\async_case.py', + 'PYMODULE'), + ('unittest.signals', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\signals.py', + 'PYMODULE'), + ('unittest.main', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\main.py', + 'PYMODULE'), + ('unittest.runner', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\runner.py', + 'PYMODULE'), + ('unittest.loader', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\loader.py', + 'PYMODULE'), + ('unittest.suite', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\suite.py', + 'PYMODULE'), + ('unittest.case', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\case.py', + 'PYMODULE'), + ('unittest._log', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\_log.py', + 'PYMODULE'), + ('difflib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\difflib.py', + 'PYMODULE'), + ('unittest.result', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\result.py', + 'PYMODULE'), + ('unittest.util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\util.py', + 'PYMODULE'), + ('asyncio', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\__init__.py', + 'PYMODULE'), + ('asyncio.unix_events', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\unix_events.py', + 'PYMODULE'), + ('asyncio.log', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\log.py', + 'PYMODULE'), + ('asyncio.windows_events', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\windows_events.py', + 'PYMODULE'), + ('asyncio.windows_utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\windows_utils.py', + 'PYMODULE'), + ('asyncio.selector_events', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\selector_events.py', + 'PYMODULE'), + ('ssl', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\ssl.py', 'PYMODULE'), + ('asyncio.proactor_events', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\proactor_events.py', + 'PYMODULE'), + ('asyncio.base_subprocess', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\base_subprocess.py', + 'PYMODULE'), + ('asyncio.threads', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\threads.py', + 'PYMODULE'), + ('asyncio.subprocess', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\subprocess.py', + 'PYMODULE'), + ('asyncio.streams', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\streams.py', + 'PYMODULE'), + ('asyncio.queues', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\queues.py', + 'PYMODULE'), + ('asyncio.runners', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\runners.py', + 'PYMODULE'), + ('asyncio.base_events', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\base_events.py', + 'PYMODULE'), + ('concurrent.futures', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\concurrent\\futures\\__init__.py', + 'PYMODULE'), + ('concurrent.futures.thread', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\concurrent\\futures\\thread.py', + 'PYMODULE'), + ('concurrent.futures.process', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\concurrent\\futures\\process.py', + 'PYMODULE'), + ('multiprocessing.synchronize', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\synchronize.py', + 'PYMODULE'), + ('multiprocessing.heap', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\heap.py', + 'PYMODULE'), + ('multiprocessing.resource_tracker', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\resource_tracker.py', + 'PYMODULE'), + ('multiprocessing.spawn', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\spawn.py', + 'PYMODULE'), + ('runpy', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\runpy.py', + 'PYMODULE'), + ('pkgutil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\pkgutil.py', + 'PYMODULE'), + ('zipimport', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\zipimport.py', + 'PYMODULE'), + ('multiprocessing.util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\util.py', + 'PYMODULE'), + ('multiprocessing.forkserver', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\forkserver.py', + 'PYMODULE'), + ('multiprocessing.process', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\process.py', + 'PYMODULE'), + ('multiprocessing.context', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\context.py', + 'PYMODULE'), + ('multiprocessing.popen_spawn_win32', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\popen_spawn_win32.py', + 'PYMODULE'), + ('multiprocessing.popen_forkserver', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\popen_forkserver.py', + 'PYMODULE'), + ('multiprocessing.popen_spawn_posix', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\popen_spawn_posix.py', + 'PYMODULE'), + ('multiprocessing.popen_fork', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\popen_fork.py', + 'PYMODULE'), + ('multiprocessing.sharedctypes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\sharedctypes.py', + 'PYMODULE'), + ('multiprocessing.pool', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\pool.py', + 'PYMODULE'), + ('multiprocessing.dummy', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\dummy\\__init__.py', + 'PYMODULE'), + ('multiprocessing.dummy.connection', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\dummy\\connection.py', + 'PYMODULE'), + ('multiprocessing.managers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\managers.py', + 'PYMODULE'), + ('multiprocessing.shared_memory', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\shared_memory.py', + 'PYMODULE'), + ('secrets', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\secrets.py', + 'PYMODULE'), + ('hmac', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\hmac.py', 'PYMODULE'), + ('multiprocessing.reduction', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\reduction.py', + 'PYMODULE'), + ('multiprocessing.resource_sharer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\resource_sharer.py', + 'PYMODULE'), + ('pickle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\pickle.py', + 'PYMODULE'), + ('_compat_pickle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_compat_pickle.py', + 'PYMODULE'), + ('multiprocessing.queues', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\queues.py', + 'PYMODULE'), + ('multiprocessing.connection', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\connection.py', + 'PYMODULE'), + ('xmlrpc.client', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xmlrpc\\client.py', + 'PYMODULE'), + ('xmlrpc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xmlrpc\\__init__.py', + 'PYMODULE'), + ('xmlrpc.server', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xmlrpc\\server.py', + 'PYMODULE'), + ('pydoc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\pydoc.py', + 'PYMODULE'), + ('webbrowser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\webbrowser.py', + 'PYMODULE'), + ('glob', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\glob.py', 'PYMODULE'), + ('pydoc_data.topics', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\pydoc_data\\topics.py', + 'PYMODULE'), + ('pydoc_data', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\pydoc_data\\__init__.py', + 'PYMODULE'), + ('tty', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\tty.py', 'PYMODULE'), + ('platform', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\platform.py', + 'PYMODULE'), + ('socketserver', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\socketserver.py', + 'PYMODULE'), + ('html', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\html\\__init__.py', + 'PYMODULE'), + ('html.entities', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\html\\entities.py', + 'PYMODULE'), + ('http.server', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\http\\server.py', + 'PYMODULE'), + ('http', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\http\\__init__.py', + 'PYMODULE'), + ('mimetypes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\mimetypes.py', + 'PYMODULE'), + ('xml.parsers.expat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\parsers\\expat.py', + 'PYMODULE'), + ('xml.parsers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\parsers\\__init__.py', + 'PYMODULE'), + ('xml', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\__init__.py', + 'PYMODULE'), + ('xml.sax.expatreader', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\sax\\expatreader.py', + 'PYMODULE'), + ('xml.sax.saxutils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\sax\\saxutils.py', + 'PYMODULE'), + ('urllib.request', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\urllib\\request.py', + 'PYMODULE'), + ('getpass', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\getpass.py', + 'PYMODULE'), + ('nturl2path', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\nturl2path.py', + 'PYMODULE'), + ('ftplib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\ftplib.py', + 'PYMODULE'), + ('netrc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\netrc.py', + 'PYMODULE'), + ('http.cookiejar', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\http\\cookiejar.py', + 'PYMODULE'), + ('urllib.response', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\urllib\\response.py', + 'PYMODULE'), + ('urllib.error', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\urllib\\error.py', + 'PYMODULE'), + ('xml.sax', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\sax\\__init__.py', + 'PYMODULE'), + ('xml.sax.handler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\sax\\handler.py', + 'PYMODULE'), + ('xml.sax._exceptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\sax\\_exceptions.py', + 'PYMODULE'), + ('xml.sax.xmlreader', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\sax\\xmlreader.py', + 'PYMODULE'), + ('http.client', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\http\\client.py', + 'PYMODULE'), + ('multiprocessing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\__init__.py', + 'PYMODULE'), + ('concurrent.futures._base', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\concurrent\\futures\\_base.py', + 'PYMODULE'), + ('concurrent', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\concurrent\\__init__.py', + 'PYMODULE'), + ('asyncio.trsock', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\trsock.py', + 'PYMODULE'), + ('asyncio.staggered', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\staggered.py', + 'PYMODULE'), + ('asyncio.tasks', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\tasks.py', + 'PYMODULE'), + ('asyncio.locks', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\locks.py', + 'PYMODULE'), + ('asyncio.base_tasks', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\base_tasks.py', + 'PYMODULE'), + ('asyncio.mixins', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\mixins.py', + 'PYMODULE'), + ('asyncio.sslproto', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\sslproto.py', + 'PYMODULE'), + ('asyncio.transports', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\transports.py', + 'PYMODULE'), + ('asyncio.protocols', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\protocols.py', + 'PYMODULE'), + ('asyncio.futures', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\futures.py', + 'PYMODULE'), + ('asyncio.exceptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\exceptions.py', + 'PYMODULE'), + ('asyncio.events', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\events.py', + 'PYMODULE'), + ('asyncio.coroutines', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\coroutines.py', + 'PYMODULE'), + ('asyncio.base_futures', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\base_futures.py', + 'PYMODULE'), + ('asyncio.format_helpers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\format_helpers.py', + 'PYMODULE'), + ('asyncio.constants', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\constants.py', + 'PYMODULE'), + ('setuptools._distutils.compilers', '-', 'PYMODULE'), + ('setuptools._distutils.versionpredicate', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\versionpredicate.py', + 'PYMODULE'), + ('setuptools._distutils.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\version.py', + 'PYMODULE'), + ('setuptools._distutils.util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\util.py', + 'PYMODULE'), + ('jaraco', '-', 'PYMODULE'), + ('setuptools._vendor.jaraco.functools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\jaraco\\functools\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.jaraco', '-', 'PYMODULE'), + ('setuptools._distutils.unixccompiler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\unixccompiler.py', + 'PYMODULE'), + ('setuptools._distutils.text_file', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\text_file.py', + 'PYMODULE'), + ('setuptools._distutils.sysconfig', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\sysconfig.py', + 'PYMODULE'), + ('setuptools._distutils.spawn', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\spawn.py', + 'PYMODULE'), + ('setuptools._distutils.log', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\log.py', + 'PYMODULE'), + ('setuptools._distutils.filelist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\filelist.py', + 'PYMODULE'), + ('setuptools._distutils.file_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\file_util.py', + 'PYMODULE'), + ('setuptools._distutils.fancy_getopt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\fancy_getopt.py', + 'PYMODULE'), + ('setuptools._distutils.extension', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\extension.py', + 'PYMODULE'), + ('setuptools._distutils.errors', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\errors.py', + 'PYMODULE'), + ('setuptools._distutils.dist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\dist.py', + 'PYMODULE'), + ('distutils.versionpredicate', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\versionpredicate.py', + 'PYMODULE'), + ('distutils.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\version.py', + 'PYMODULE'), + ('distutils.command', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\command\\__init__.py', + 'PYMODULE'), + ('distutils.cmd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\cmd.py', + 'PYMODULE'), + ('distutils.dist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\dist.py', + 'PYMODULE'), + ('configparser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\configparser.py', + 'PYMODULE'), + ('packaging.utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\utils.py', + 'PYMODULE'), + ('packaging', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\__init__.py', + 'PYMODULE'), + ('pkg_resources', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pkg_resources\\__init__.py', + 'PYMODULE'), + ('packaging.metadata', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\metadata.py', + 'PYMODULE'), + ('packaging.licenses._spdx', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\licenses\\_spdx.py', + 'PYMODULE'), + ('packaging.licenses', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\licenses\\__init__.py', + 'PYMODULE'), + ('packaging._tokenizer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\_tokenizer.py', + 'PYMODULE'), + ('packaging._structures', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\_structures.py', + 'PYMODULE'), + ('packaging._parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\_parser.py', + 'PYMODULE'), + ('packaging._elffile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\_elffile.py', + 'PYMODULE'), + ('platformdirs', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\platformdirs\\__init__.py', + 'PYMODULE'), + ('platformdirs.android', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\platformdirs\\android.py', + 'PYMODULE'), + ('platformdirs.unix', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\platformdirs\\unix.py', + 'PYMODULE'), + ('platformdirs.macos', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\platformdirs\\macos.py', + 'PYMODULE'), + ('platformdirs.windows', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\platformdirs\\windows.py', + 'PYMODULE'), + ('platformdirs.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\platformdirs\\version.py', + 'PYMODULE'), + ('platformdirs.api', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\platformdirs\\api.py', + 'PYMODULE'), + ('setuptools._vendor.jaraco.text', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\jaraco\\text\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.jaraco.context', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\jaraco\\context.py', + 'PYMODULE'), + ('setuptools._vendor.backports.tarfile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\backports\\tarfile\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.backports', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\backports\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.backports.tarfile.compat.py38', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\backports\\tarfile\\compat\\py38.py', + 'PYMODULE'), + ('setuptools._vendor.backports.tarfile.compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\backports\\tarfile\\compat\\__init__.py', + 'PYMODULE'), + ('backports', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\backports\\__init__.py', + 'PYMODULE'), + ('importlib.resources', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\resources.py', + 'PYMODULE'), + ('packaging.specifiers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\specifiers.py', + 'PYMODULE'), + ('packaging.requirements', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\requirements.py', + 'PYMODULE'), + ('packaging.markers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\markers.py', + 'PYMODULE'), + ('plistlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\plistlib.py', + 'PYMODULE'), + ('packaging._musllinux', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\_musllinux.py', + 'PYMODULE'), + ('packaging._manylinux', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\_manylinux.py', + 'PYMODULE'), + ('packaging.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\version.py', + 'PYMODULE'), + ('packaging.tags', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\tags.py', + 'PYMODULE'), + ('setuptools._distutils.dir_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\dir_util.py', + 'PYMODULE'), + ('setuptools._distutils.dep_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\dep_util.py', + 'PYMODULE'), + ('setuptools._distutils.debug', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\debug.py', + 'PYMODULE'), + ('setuptools._distutils.cygwinccompiler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\cygwinccompiler.py', + 'PYMODULE'), + ('setuptools._distutils.core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\core.py', + 'PYMODULE'), + ('setuptools._distutils.compat.py39', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compat\\py39.py', + 'PYMODULE'), + ('setuptools._distutils.compat.numpy', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compat\\numpy.py', + 'PYMODULE'), + ('setuptools._distutils.compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compat\\__init__.py', + 'PYMODULE'), + ('setuptools._distutils.command.sdist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\sdist.py', + 'PYMODULE'), + ('setuptools._distutils.command.install_scripts', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\install_scripts.py', + 'PYMODULE'), + ('setuptools._distutils.command.install_lib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\install_lib.py', + 'PYMODULE'), + ('setuptools._distutils.command.install_headers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\install_headers.py', + 'PYMODULE'), + ('setuptools._distutils.command.install_egg_info', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\install_egg_info.py', + 'PYMODULE'), + ('setuptools._distutils.command.install_data', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\install_data.py', + 'PYMODULE'), + ('setuptools._distutils.command.install', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\install.py', + 'PYMODULE'), + ('site', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site.py', 'PYMODULE'), + ('rlcompleter', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\rlcompleter.py', + 'PYMODULE'), + ('_sitebuiltins', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_sitebuiltins.py', + 'PYMODULE'), + ('setuptools._distutils.command.config', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\config.py', + 'PYMODULE'), + ('setuptools._distutils.command.clean', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\clean.py', + 'PYMODULE'), + ('setuptools._distutils.command.check', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\check.py', + 'PYMODULE'), + ('setuptools._distutils.command.build_scripts', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\build_scripts.py', + 'PYMODULE'), + ('setuptools._distutils.command.build_py', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\build_py.py', + 'PYMODULE'), + ('setuptools._distutils.command.build_ext', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\build_ext.py', + 'PYMODULE'), + ('setuptools._distutils.command.build_clib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\build_clib.py', + 'PYMODULE'), + ('setuptools._distutils.command.build', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\build.py', + 'PYMODULE'), + ('setuptools._distutils.command.bdist_rpm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\bdist_rpm.py', + 'PYMODULE'), + ('setuptools._distutils.command.bdist_dumb', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\bdist_dumb.py', + 'PYMODULE'), + ('setuptools._distutils.command.bdist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\bdist.py', + 'PYMODULE'), + ('setuptools._distutils.command._framework_compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\_framework_compat.py', + 'PYMODULE'), + ('setuptools._distutils.command', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\__init__.py', + 'PYMODULE'), + ('setuptools._distutils.cmd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\cmd.py', + 'PYMODULE'), + ('setuptools._distutils.ccompiler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\ccompiler.py', + 'PYMODULE'), + ('setuptools._distutils.archive_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\archive_util.py', + 'PYMODULE'), + ('setuptools._distutils._msvccompiler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\_msvccompiler.py', + 'PYMODULE'), + ('setuptools._distutils._modified', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\_modified.py', + 'PYMODULE'), + ('setuptools._distutils._macos_compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\_macos_compat.py', + 'PYMODULE'), + ('setuptools._distutils._log', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\_log.py', + 'PYMODULE'), + ('setuptools._distutils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\__init__.py', + 'PYMODULE'), + ('setuptools.msvc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\msvc.py', + 'PYMODULE'), + ('distutils.command.build_ext', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\command\\build_ext.py', + 'PYMODULE'), + ('distutils._msvccompiler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\_msvccompiler.py', + 'PYMODULE'), + ('distutils.ccompiler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\ccompiler.py', + 'PYMODULE'), + ('distutils.extension', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\extension.py', + 'PYMODULE'), + ('distutils.errors', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\errors.py', + 'PYMODULE'), + ('distutils.core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\core.py', + 'PYMODULE'), + ('distutils.config', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\config.py', + 'PYMODULE'), + ('cgi', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\cgi.py', 'PYMODULE'), + ('setuptools.warnings', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\warnings.py', + 'PYMODULE'), + ('setuptools.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\version.py', + 'PYMODULE'), + ('setuptools._importlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_importlib.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata._adapters', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\_adapters.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata._text', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\_text.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata._itertools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\_itertools.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata._functools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\_functools.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata._compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\_compat.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata._collections', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\_collections.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata.compat.py311', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\compat\\py311.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata.compat.py39', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\compat\\py39.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata.compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\compat\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata._meta', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\_meta.py', + 'PYMODULE'), + ('setuptools._vendor.zipp', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\zipp\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.zipp.glob', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\zipp\\glob.py', + 'PYMODULE'), + ('setuptools._vendor.zipp.compat.py310', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\zipp\\compat\\py310.py', + 'PYMODULE'), + ('setuptools._vendor.zipp.compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\zipp\\compat\\__init__.py', + 'PYMODULE'), + ('setuptools.extension', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\extension.py', + 'PYMODULE'), + ('setuptools._path', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_path.py', + 'PYMODULE'), + ('setuptools.dist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\dist.py', + 'PYMODULE'), + ('setuptools.command.bdist_wheel', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\command\\bdist_wheel.py', + 'PYMODULE'), + ('wheel.macosx_libfile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\macosx_libfile.py', + 'PYMODULE'), + ('wheel', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\__init__.py', + 'PYMODULE'), + ('setuptools.command.egg_info', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\command\\egg_info.py', + 'PYMODULE'), + ('setuptools.command._requirestxt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\command\\_requirestxt.py', + 'PYMODULE'), + ('setuptools.glob', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\glob.py', + 'PYMODULE'), + ('setuptools.command.setopt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\command\\setopt.py', + 'PYMODULE'), + ('setuptools.command.sdist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\command\\sdist.py', + 'PYMODULE'), + ('distutils.command.sdist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\command\\sdist.py', + 'PYMODULE'), + ('setuptools.command.build', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\command\\build.py', + 'PYMODULE'), + ('distutils.command.build', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\command\\build.py', + 'PYMODULE'), + ('setuptools.command.bdist_egg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\command\\bdist_egg.py', + 'PYMODULE'), + ('setuptools.unicode_utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\unicode_utils.py', + 'PYMODULE'), + ('setuptools.compat.py39', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\compat\\py39.py', + 'PYMODULE'), + ('setuptools.compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\compat\\__init__.py', + 'PYMODULE'), + ('setuptools.compat.py311', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\compat\\py311.py', + 'PYMODULE'), + ('wheel.wheelfile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\wheelfile.py', + 'PYMODULE'), + ('wheel.util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\util.py', + 'PYMODULE'), + ('wheel.cli', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\cli\\__init__.py', + 'PYMODULE'), + ('wheel.cli.tags', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\cli\\tags.py', + 'PYMODULE'), + ('wheel.cli.convert', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\cli\\convert.py', + 'PYMODULE'), + ('wheel.vendored.packaging.tags', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\tags.py', + 'PYMODULE'), + ('wheel.vendored.packaging._musllinux', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\_musllinux.py', + 'PYMODULE'), + ('wheel.vendored.packaging._elffile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\_elffile.py', + 'PYMODULE'), + ('wheel.vendored.packaging._manylinux', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\_manylinux.py', + 'PYMODULE'), + ('wheel.vendored.packaging', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\__init__.py', + 'PYMODULE'), + ('wheel.vendored', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\__init__.py', + 'PYMODULE'), + ('wheel.metadata', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\metadata.py', + 'PYMODULE'), + ('wheel.vendored.packaging.requirements', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\requirements.py', + 'PYMODULE'), + ('wheel.vendored.packaging.utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\utils.py', + 'PYMODULE'), + ('wheel.vendored.packaging.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\version.py', + 'PYMODULE'), + ('wheel.vendored.packaging._structures', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\_structures.py', + 'PYMODULE'), + ('wheel.vendored.packaging.specifiers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\specifiers.py', + 'PYMODULE'), + ('wheel.vendored.packaging.markers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\markers.py', + 'PYMODULE'), + ('wheel.vendored.packaging._tokenizer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\_tokenizer.py', + 'PYMODULE'), + ('wheel.vendored.packaging._parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\_parser.py', + 'PYMODULE'), + ('wheel.cli.pack', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\cli\\pack.py', + 'PYMODULE'), + ('wheel.cli.unpack', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\cli\\unpack.py', + 'PYMODULE'), + ('setuptools.installer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\installer.py', + 'PYMODULE'), + ('setuptools.wheel', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\wheel.py', + 'PYMODULE'), + ('setuptools.archive_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\archive_util.py', + 'PYMODULE'), + ('setuptools.errors', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\errors.py', + 'PYMODULE'), + ('setuptools.config.setupcfg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\setupcfg.py', + 'PYMODULE'), + ('setuptools.config.expand', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\expand.py', + 'PYMODULE'), + ('setuptools.config.pyprojecttoml', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\pyprojecttoml.py', + 'PYMODULE'), + ('setuptools.config._validate_pyproject', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\_validate_pyproject\\__init__.py', + 'PYMODULE'), + ('setuptools.config._validate_pyproject.fastjsonschema_validations', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\_validate_pyproject\\fastjsonschema_validations.py', + 'PYMODULE'), + ('setuptools.config._validate_pyproject.fastjsonschema_exceptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\_validate_pyproject\\fastjsonschema_exceptions.py', + 'PYMODULE'), + ('setuptools.config._validate_pyproject.extra_validations', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\_validate_pyproject\\extra_validations.py', + 'PYMODULE'), + ('setuptools.config._validate_pyproject.error_reporting', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\_validate_pyproject\\error_reporting.py', + 'PYMODULE'), + ('setuptools.config._validate_pyproject.formats', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\_validate_pyproject\\formats.py', + 'PYMODULE'), + ('setuptools._vendor.packaging.requirements', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\requirements.py', + 'PYMODULE'), + ('setuptools._vendor.packaging.utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\utils.py', + 'PYMODULE'), + ('setuptools._vendor.packaging.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\version.py', + 'PYMODULE'), + ('setuptools._vendor.packaging._structures', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\_structures.py', + 'PYMODULE'), + ('setuptools._vendor.packaging.tags', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\tags.py', + 'PYMODULE'), + ('setuptools._vendor.packaging._musllinux', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\_musllinux.py', + 'PYMODULE'), + ('setuptools._vendor.packaging._elffile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\_elffile.py', + 'PYMODULE'), + ('setuptools._vendor.packaging._manylinux', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\_manylinux.py', + 'PYMODULE'), + ('setuptools._vendor.packaging.specifiers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\specifiers.py', + 'PYMODULE'), + ('setuptools._vendor.packaging.markers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\markers.py', + 'PYMODULE'), + ('setuptools._vendor.packaging._tokenizer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\_tokenizer.py', + 'PYMODULE'), + ('setuptools._vendor.packaging._parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\_parser.py', + 'PYMODULE'), + ('setuptools._vendor.packaging', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\__init__.py', + 'PYMODULE'), + ('setuptools.compat.py310', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\compat\\py310.py', + 'PYMODULE'), + ('tomli', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tomli\\__init__.py', + 'PYMODULE'), + ('tomli._parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tomli\\_parser.py', + 'PYMODULE'), + ('tomli._types', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tomli\\_types.py', + 'PYMODULE'), + ('tomli._re', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tomli\\_re.py', + 'PYMODULE'), + ('setuptools.config._apply_pyprojecttoml', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\_apply_pyprojecttoml.py', + 'PYMODULE'), + ('setuptools.config', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\__init__.py', + 'PYMODULE'), + ('setuptools._static', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_static.py', + 'PYMODULE'), + ('setuptools._shutil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_shutil.py', + 'PYMODULE'), + ('setuptools.windows_support', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\windows_support.py', + 'PYMODULE'), + ('setuptools.command', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\command\\__init__.py', + 'PYMODULE'), + ('distutils.command.bdist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\command\\bdist.py', + 'PYMODULE'), + ('setuptools._entry_points', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_entry_points.py', + 'PYMODULE'), + ('setuptools._itertools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_itertools.py', + 'PYMODULE'), + ('setuptools.discovery', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\discovery.py', + 'PYMODULE'), + ('setuptools.depends', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\depends.py', + 'PYMODULE'), + ('setuptools._imp', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_imp.py', + 'PYMODULE'), + ('setuptools.logging', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\logging.py', + 'PYMODULE'), + ('setuptools.monkey', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\monkey.py', + 'PYMODULE'), + ('setuptools._core_metadata', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_core_metadata.py', + 'PYMODULE'), + ('setuptools._reqs', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_reqs.py', + 'PYMODULE'), + ('setuptools._normalization', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_normalization.py', + 'PYMODULE'), + ('_distutils_hack.override', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\_distutils_hack\\override.py', + 'PYMODULE'), + ('__future__', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\__future__.py', + 'PYMODULE'), + ('_py_abc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_py_abc.py', + 'PYMODULE'), + ('tracemalloc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\tracemalloc.py', + 'PYMODULE'), + ('stringprep', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\stringprep.py', + 'PYMODULE'), + ('filter_utils', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\filter_utils.py', + 'PYMODULE'), + ('struct', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\struct.py', + 'PYMODULE'), + ('logging', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\logging\\__init__.py', + 'PYMODULE'), + ('pathlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\pathlib.py', + 'PYMODULE'), + ('json', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\json\\__init__.py', + 'PYMODULE'), + ('json.encoder', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\json\\encoder.py', + 'PYMODULE'), + ('json.decoder', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\json\\decoder.py', + 'PYMODULE'), + ('json.scanner', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\json\\scanner.py', + 'PYMODULE'), + ('matplotlib.figure', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\figure.py', + 'PYMODULE'), + ('matplotlib._pylab_helpers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_pylab_helpers.py', + 'PYMODULE'), + ('matplotlib.backends.backend_webagg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\backend_webagg.py', + 'PYMODULE'), + ('tornado.template', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\template.py', + 'PYMODULE'), + ('tornado.util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\util.py', + 'PYMODULE'), + ('doctest', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\doctest.py', + 'PYMODULE'), + ('pdb', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\pdb.py', 'PYMODULE'), + ('code', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\code.py', 'PYMODULE'), + ('codeop', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\codeop.py', + 'PYMODULE'), + ('bdb', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\bdb.py', 'PYMODULE'), + ('cmd', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\cmd.py', 'PYMODULE'), + ('tornado.log', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\log.py', + 'PYMODULE'), + ('tornado.options', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\options.py', + 'PYMODULE'), + ('curses', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\curses\\__init__.py', + 'PYMODULE'), + ('curses.has_key', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\curses\\has_key.py', + 'PYMODULE'), + ('colorama', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\colorama\\__init__.py', + 'PYMODULE'), + ('colorama.ansitowin32', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\colorama\\ansitowin32.py', + 'PYMODULE'), + ('colorama.winterm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\colorama\\winterm.py', + 'PYMODULE'), + ('colorama.ansi', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\colorama\\ansi.py', + 'PYMODULE'), + ('colorama.initialise', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\colorama\\initialise.py', + 'PYMODULE'), + ('colorama.win32', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\colorama\\win32.py', + 'PYMODULE'), + ('logging.handlers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\logging\\handlers.py', + 'PYMODULE'), + ('win32evtlogutil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\win32\\lib\\win32evtlogutil.py', + 'PYMODULE'), + ('winerror', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\win32\\lib\\winerror.py', + 'PYMODULE'), + ('win32con', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\win32\\lib\\win32con.py', + 'PYMODULE'), + ('smtplib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\smtplib.py', + 'PYMODULE'), + ('tornado.escape', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\escape.py', + 'PYMODULE'), + ('matplotlib.backends.backend_webagg_core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\backend_webagg_core.py', + 'PYMODULE'), + ('matplotlib.backends.backend_agg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py', + 'PYMODULE'), + ('matplotlib.path', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\path.py', + 'PYMODULE'), + ('matplotlib.hatch', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\hatch.py', + 'PYMODULE'), + ('matplotlib.bezier', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\bezier.py', + 'PYMODULE'), + ('matplotlib.mathtext', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mathtext.py', + 'PYMODULE'), + ('matplotlib._mathtext', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_mathtext.py', + 'PYMODULE'), + ('matplotlib._mathtext_data', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_mathtext_data.py', + 'PYMODULE'), + ('pyparsing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\__init__.py', + 'PYMODULE'), + ('pyparsing.common', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\common.py', + 'PYMODULE'), + ('pyparsing.testing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\testing.py', + 'PYMODULE'), + ('pyparsing.unicode', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\unicode.py', + 'PYMODULE'), + ('pyparsing.helpers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\helpers.py', + 'PYMODULE'), + ('pyparsing.results', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\results.py', + 'PYMODULE'), + ('pyparsing.core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\core.py', + 'PYMODULE'), + ('pyparsing.diagram', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\diagram\\__init__.py', + 'PYMODULE'), + ('jinja2', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\__init__.py', + 'PYMODULE'), + ('jinja2.ext', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\ext.py', + 'PYMODULE'), + ('jinja2.parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\parser.py', + 'PYMODULE'), + ('jinja2.lexer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\lexer.py', + 'PYMODULE'), + ('jinja2._identifier', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\_identifier.py', + 'PYMODULE'), + ('jinja2.defaults', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\defaults.py', + 'PYMODULE'), + ('jinja2.tests', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\tests.py', + 'PYMODULE'), + ('jinja2.filters', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\filters.py', + 'PYMODULE'), + ('jinja2.sandbox', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\sandbox.py', + 'PYMODULE'), + ('jinja2.async_utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\async_utils.py', + 'PYMODULE'), + ('markupsafe', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\markupsafe\\__init__.py', + 'PYMODULE'), + ('markupsafe._native', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\markupsafe\\_native.py', + 'PYMODULE'), + ('jinja2.utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\utils.py', + 'PYMODULE'), + ('jinja2.constants', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\constants.py', + 'PYMODULE'), + ('jinja2.runtime', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\runtime.py', + 'PYMODULE'), + ('jinja2.loaders', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\loaders.py', + 'PYMODULE'), + ('jinja2.exceptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\exceptions.py', + 'PYMODULE'), + ('jinja2.environment', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\environment.py', + 'PYMODULE'), + ('jinja2.debug', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\debug.py', + 'PYMODULE'), + ('jinja2.compiler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\compiler.py', + 'PYMODULE'), + ('jinja2.visitor', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\visitor.py', + 'PYMODULE'), + ('jinja2.optimizer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\optimizer.py', + 'PYMODULE'), + ('jinja2.idtracking', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\idtracking.py', + 'PYMODULE'), + ('jinja2.bccache', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\bccache.py', + 'PYMODULE'), + ('jinja2.nodes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\nodes.py', + 'PYMODULE'), + ('pyparsing.actions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\actions.py', + 'PYMODULE'), + ('pyparsing.exceptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\exceptions.py', + 'PYMODULE'), + ('pyparsing.util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\util.py', + 'PYMODULE'), + ('numpy.typing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\typing\\__init__.py', + 'PYMODULE'), + ('numpy._pytesttester', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_pytesttester.py', + 'PYMODULE'), + ('numpy.testing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\testing\\__init__.py', + 'PYMODULE'), + ('numpy.testing.overrides', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\testing\\overrides.py', + 'PYMODULE'), + ('numpy.lib.recfunctions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\recfunctions.py', + 'PYMODULE'), + ('numpy.lib._iotools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_iotools.py', + 'PYMODULE'), + ('numpy._utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_utils\\__init__.py', + 'PYMODULE'), + ('numpy._utils._convertions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_utils\\_convertions.py', + 'PYMODULE'), + ('numpy._core.numeric', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\numeric.py', + 'PYMODULE'), + ('numpy._core._asarray', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_asarray.py', + 'PYMODULE'), + ('numpy._core.arrayprint', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\arrayprint.py', + 'PYMODULE'), + ('numpy._core.printoptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\printoptions.py', + 'PYMODULE'), + ('numpy._core.fromnumeric', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\fromnumeric.py', + 'PYMODULE'), + ('numpy._core._methods', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_methods.py', + 'PYMODULE'), + ('numpy.lib._stride_tricks_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_stride_tricks_impl.py', + 'PYMODULE'), + ('numpy._globals', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_globals.py', + 'PYMODULE'), + ('numpy._core._exceptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_exceptions.py', + 'PYMODULE'), + ('numpy._core._ufunc_config', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_ufunc_config.py', + 'PYMODULE'), + ('numpy.exceptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\exceptions.py', + 'PYMODULE'), + ('numpy._core.shape_base', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\shape_base.py', + 'PYMODULE'), + ('numpy._core.numerictypes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\numerictypes.py', + 'PYMODULE'), + ('numpy._core._dtype', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_dtype.py', + 'PYMODULE'), + ('numpy._core._type_aliases', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_type_aliases.py', + 'PYMODULE'), + ('numpy._core._string_helpers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_string_helpers.py', + 'PYMODULE'), + ('numpy._core.multiarray', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\multiarray.py', + 'PYMODULE'), + ('numpy._core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\__init__.py', + 'PYMODULE'), + ('numpy._core._internal', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_internal.py', + 'PYMODULE'), + ('numpy._core._dtype_ctypes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_dtype_ctypes.py', + 'PYMODULE'), + ('numpy._core._add_newdocs_scalars', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_add_newdocs_scalars.py', + 'PYMODULE'), + ('numpy._core._add_newdocs', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_add_newdocs.py', + 'PYMODULE'), + ('numpy._core.einsumfunc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\einsumfunc.py', + 'PYMODULE'), + ('numpy._core._machar', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_machar.py', + 'PYMODULE'), + ('numpy._core.function_base', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\function_base.py', + 'PYMODULE'), + ('numpy._core.memmap', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\memmap.py', + 'PYMODULE'), + ('numpy._core.getlimits', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\getlimits.py', + 'PYMODULE'), + ('numpy.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\version.py', + 'PYMODULE'), + ('numpy._core.records', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\records.py', + 'PYMODULE'), + ('numpy.ma.mrecords', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\ma\\mrecords.py', + 'PYMODULE'), + ('numpy.ma', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\ma\\__init__.py', + 'PYMODULE'), + ('numpy.ma.extras', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\ma\\extras.py', + 'PYMODULE'), + ('numpy.lib._index_tricks_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_index_tricks_impl.py', + 'PYMODULE'), + ('numpy.lib.stride_tricks', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\stride_tricks.py', + 'PYMODULE'), + ('numpy.matrixlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\matrixlib\\__init__.py', + 'PYMODULE'), + ('numpy.matrixlib.defmatrix', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\matrixlib\\defmatrix.py', + 'PYMODULE'), + ('numpy.linalg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\linalg\\__init__.py', + 'PYMODULE'), + ('numpy.linalg.linalg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\linalg\\linalg.py', + 'PYMODULE'), + ('numpy.linalg._linalg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\linalg\\_linalg.py', + 'PYMODULE'), + ('numpy.lib._twodim_base_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_twodim_base_impl.py', + 'PYMODULE'), + ('numpy.lib._function_base_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_function_base_impl.py', + 'PYMODULE'), + ('numpy.lib._histograms_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_histograms_impl.py', + 'PYMODULE'), + ('numpy.lib.array_utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\array_utils.py', + 'PYMODULE'), + ('numpy.lib._array_utils_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_array_utils_impl.py', + 'PYMODULE'), + ('numpy.ma.core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\ma\\core.py', + 'PYMODULE'), + ('numpy._utils._inspect', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_utils\\_inspect.py', + 'PYMODULE'), + ('numpy.lib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\__init__.py', + 'PYMODULE'), + ('numpy.lib._version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_version.py', + 'PYMODULE'), + ('numpy.lib._arraypad_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_arraypad_impl.py', + 'PYMODULE'), + ('numpy.lib._arrayterator_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_arrayterator_impl.py', + 'PYMODULE'), + ('numpy.lib._npyio_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_npyio_impl.py', + 'PYMODULE'), + ('numpy.lib._datasource', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_datasource.py', + 'PYMODULE'), + ('numpy.lib._polynomial_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_polynomial_impl.py', + 'PYMODULE'), + ('numpy.lib._arraysetops_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_arraysetops_impl.py', + 'PYMODULE'), + ('numpy.lib._utils_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_utils_impl.py', + 'PYMODULE'), + ('numpy.lib._ufunclike_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_ufunclike_impl.py', + 'PYMODULE'), + ('numpy.lib._shape_base_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_shape_base_impl.py', + 'PYMODULE'), + ('numpy.lib._nanfunctions_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_nanfunctions_impl.py', + 'PYMODULE'), + ('numpy.lib._type_check_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_type_check_impl.py', + 'PYMODULE'), + ('numpy.lib.scimath', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\scimath.py', + 'PYMODULE'), + ('numpy.lib._scimath_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_scimath_impl.py', + 'PYMODULE'), + ('numpy.lib.npyio', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\npyio.py', + 'PYMODULE'), + ('numpy.lib.format', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\format.py', + 'PYMODULE'), + ('numpy.lib.mixins', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\mixins.py', + 'PYMODULE'), + ('numpy.lib.introspect', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\introspect.py', + 'PYMODULE'), + ('numpy._core.umath', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\umath.py', + 'PYMODULE'), + ('numpy._core.overrides', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\overrides.py', + 'PYMODULE'), + ('numpy.testing._private.extbuild', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\testing\\_private\\extbuild.py', + 'PYMODULE'), + ('numpy.testing._private.utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\testing\\_private\\utils.py', + 'PYMODULE'), + ('psutil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\psutil\\__init__.py', + 'PYMODULE'), + ('psutil._pswindows', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\psutil\\_pswindows.py', + 'PYMODULE'), + ('psutil._common', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\psutil\\_common.py', + 'PYMODULE'), + ('numpy.testing._private', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\testing\\_private\\__init__.py', + 'PYMODULE'), + ('numpy._typing._add_docstring', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\_add_docstring.py', + 'PYMODULE'), + ('numpy._typing._array_like', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\_array_like.py', + 'PYMODULE'), + ('numpy._typing._nested_sequence', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\_nested_sequence.py', + 'PYMODULE'), + ('numpy._typing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\__init__.py', + 'PYMODULE'), + ('numpy._typing._dtype_like', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\_dtype_like.py', + 'PYMODULE'), + ('numpy._typing._shape', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\_shape.py', + 'PYMODULE'), + ('numpy._typing._scalars', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\_scalars.py', + 'PYMODULE'), + ('numpy._typing._char_codes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\_char_codes.py', + 'PYMODULE'), + ('numpy._typing._nbit', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\_nbit.py', + 'PYMODULE'), + ('matplotlib.font_manager', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\font_manager.py', + 'PYMODULE'), + ('matplotlib.rcsetup', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\rcsetup.py', + 'PYMODULE'), + ('cycler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\cycler\\__init__.py', + 'PYMODULE'), + ('matplotlib._enums', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_enums.py', + 'PYMODULE'), + ('matplotlib.colors', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\colors.py', + 'PYMODULE'), + ('matplotlib._color_data', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_color_data.py', + 'PYMODULE'), + ('matplotlib.scale', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\scale.py', + 'PYMODULE'), + ('matplotlib.ticker', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\ticker.py', + 'PYMODULE'), + ('matplotlib._cm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_cm.py', + 'PYMODULE'), + ('PIL.PngImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PngImagePlugin.py', + 'PYMODULE'), + ('PIL._binary', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_binary.py', + 'PYMODULE'), + ('PIL.ImageSequence', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageSequence.py', + 'PYMODULE'), + ('PIL.ImagePalette', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImagePalette.py', + 'PYMODULE'), + ('PIL.PaletteFile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PaletteFile.py', + 'PYMODULE'), + ('PIL.ImageColor', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageColor.py', + 'PYMODULE'), + ('colorsys', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\colorsys.py', + 'PYMODULE'), + ('PIL.GimpPaletteFile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\GimpPaletteFile.py', + 'PYMODULE'), + ('PIL.GimpGradientFile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\GimpGradientFile.py', + 'PYMODULE'), + ('PIL.ImageFile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageFile.py', + 'PYMODULE'), + ('PIL._typing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_typing.py', + 'PYMODULE'), + ('PIL._util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_util.py', + 'PYMODULE'), + ('PIL._deprecate', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_deprecate.py', + 'PYMODULE'), + ('PIL.ImageChops', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageChops.py', + 'PYMODULE'), + ('matplotlib._fontconfig_pattern', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_fontconfig_pattern.py', + 'PYMODULE'), + ('matplotlib._afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_afm.py', + 'PYMODULE'), + ('matplotlib.backend_tools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backend_tools.py', + 'PYMODULE'), + ('uuid', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\uuid.py', 'PYMODULE'), + ('PIL.Image', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\Image.py', + 'PYMODULE'), + ('PIL.XpmImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\XpmImagePlugin.py', + 'PYMODULE'), + ('PIL.XbmImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\XbmImagePlugin.py', + 'PYMODULE'), + ('PIL.XVThumbImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\XVThumbImagePlugin.py', + 'PYMODULE'), + ('PIL.WmfImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\WmfImagePlugin.py', + 'PYMODULE'), + ('PIL.WebPImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\WebPImagePlugin.py', + 'PYMODULE'), + ('PIL.TgaImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\TgaImagePlugin.py', + 'PYMODULE'), + ('PIL.SunImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\SunImagePlugin.py', + 'PYMODULE'), + ('PIL.SpiderImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\SpiderImagePlugin.py', + 'PYMODULE'), + ('PIL.ImageTk', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageTk.py', + 'PYMODULE'), + ('PIL.SgiImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\SgiImagePlugin.py', + 'PYMODULE'), + ('PIL.QoiImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\QoiImagePlugin.py', + 'PYMODULE'), + ('PIL.PsdImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PsdImagePlugin.py', + 'PYMODULE'), + ('PIL.PixarImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PixarImagePlugin.py', + 'PYMODULE'), + ('PIL.PdfImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PdfImagePlugin.py', + 'PYMODULE'), + ('PIL.features', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\features.py', + 'PYMODULE'), + ('PIL.PdfParser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PdfParser.py', + 'PYMODULE'), + ('PIL.PcxImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PcxImagePlugin.py', + 'PYMODULE'), + ('PIL.PcdImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PcdImagePlugin.py', + 'PYMODULE'), + ('PIL.PalmImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PalmImagePlugin.py', + 'PYMODULE'), + ('PIL.MspImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\MspImagePlugin.py', + 'PYMODULE'), + ('PIL.MpoImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\MpoImagePlugin.py', + 'PYMODULE'), + ('PIL.MpegImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\MpegImagePlugin.py', + 'PYMODULE'), + ('PIL.MicImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\MicImagePlugin.py', + 'PYMODULE'), + ('PIL.McIdasImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\McIdasImagePlugin.py', + 'PYMODULE'), + ('PIL.Jpeg2KImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\Jpeg2KImagePlugin.py', + 'PYMODULE'), + ('PIL.IptcImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\IptcImagePlugin.py', + 'PYMODULE'), + ('PIL.ImtImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImtImagePlugin.py', + 'PYMODULE'), + ('PIL.ImImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImImagePlugin.py', + 'PYMODULE'), + ('PIL.IcoImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\IcoImagePlugin.py', + 'PYMODULE'), + ('PIL.IcnsImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\IcnsImagePlugin.py', + 'PYMODULE'), + ('PIL.Hdf5StubImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\Hdf5StubImagePlugin.py', + 'PYMODULE'), + ('PIL.GribStubImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\GribStubImagePlugin.py', + 'PYMODULE'), + ('PIL.GbrImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\GbrImagePlugin.py', + 'PYMODULE'), + ('PIL.FtexImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\FtexImagePlugin.py', + 'PYMODULE'), + ('PIL.FpxImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\FpxImagePlugin.py', + 'PYMODULE'), + ('PIL.FliImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\FliImagePlugin.py', + 'PYMODULE'), + ('PIL.FitsImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\FitsImagePlugin.py', + 'PYMODULE'), + ('PIL.EpsImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\EpsImagePlugin.py', + 'PYMODULE'), + ('PIL.DdsImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\DdsImagePlugin.py', + 'PYMODULE'), + ('PIL.DcxImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\DcxImagePlugin.py', + 'PYMODULE'), + ('PIL.CurImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\CurImagePlugin.py', + 'PYMODULE'), + ('PIL.BufrStubImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\BufrStubImagePlugin.py', + 'PYMODULE'), + ('PIL.BlpImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\BlpImagePlugin.py', + 'PYMODULE'), + ('PIL.ImageShow', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageShow.py', + 'PYMODULE'), + ('PIL.ImageCms', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageCms.py', + 'PYMODULE'), + ('PIL.ImageWin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageWin.py', + 'PYMODULE'), + ('PIL.PpmImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PpmImagePlugin.py', + 'PYMODULE'), + ('PIL.JpegImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\JpegImagePlugin.py', + 'PYMODULE'), + ('PIL.JpegPresets', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\JpegPresets.py', + 'PYMODULE'), + ('PIL.GifImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\GifImagePlugin.py', + 'PYMODULE'), + ('PIL.ImageOps', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageOps.py', + 'PYMODULE'), + ('PIL.ImageMath', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageMath.py', + 'PYMODULE'), + ('PIL.BmpImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\BmpImagePlugin.py', + 'PYMODULE'), + ('PIL.TiffImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\TiffImagePlugin.py', + 'PYMODULE'), + ('PIL.ImageQt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageQt.py', + 'PYMODULE'), + ('PIL.ImageFilter', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageFilter.py', + 'PYMODULE'), + ('xml.etree.ElementTree', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\etree\\ElementTree.py', + 'PYMODULE'), + ('xml.etree.cElementTree', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\etree\\cElementTree.py', + 'PYMODULE'), + ('xml.etree.ElementInclude', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\etree\\ElementInclude.py', + 'PYMODULE'), + ('xml.etree.ElementPath', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\etree\\ElementPath.py', + 'PYMODULE'), + ('xml.etree', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\etree\\__init__.py', + 'PYMODULE'), + ('defusedxml.ElementTree', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\ElementTree.py', + 'PYMODULE'), + ('defusedxml.common', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\common.py', + 'PYMODULE'), + ('defusedxml', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\__init__.py', + 'PYMODULE'), + ('defusedxml.xmlrpc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\xmlrpc.py', + 'PYMODULE'), + ('defusedxml.sax', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\sax.py', + 'PYMODULE'), + ('defusedxml.minidom', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\minidom.py', + 'PYMODULE'), + ('xml.dom.minidom', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\dom\\minidom.py', + 'PYMODULE'), + ('xml.dom.pulldom', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\dom\\pulldom.py', + 'PYMODULE'), + ('xml.dom.expatbuilder', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\dom\\expatbuilder.py', + 'PYMODULE'), + ('xml.dom.NodeFilter', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\dom\\NodeFilter.py', + 'PYMODULE'), + ('xml.dom.xmlbuilder', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\dom\\xmlbuilder.py', + 'PYMODULE'), + ('xml.dom.minicompat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\dom\\minicompat.py', + 'PYMODULE'), + ('xml.dom.domreg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\dom\\domreg.py', + 'PYMODULE'), + ('xml.dom', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\dom\\__init__.py', + 'PYMODULE'), + ('defusedxml.pulldom', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\pulldom.py', + 'PYMODULE'), + ('defusedxml.expatreader', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\expatreader.py', + 'PYMODULE'), + ('defusedxml.expatbuilder', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\expatbuilder.py', + 'PYMODULE'), + ('defusedxml.cElementTree', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\cElementTree.py', + 'PYMODULE'), + ('PIL.TiffTags', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\TiffTags.py', + 'PYMODULE'), + ('PIL.ImageMode', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageMode.py', + 'PYMODULE'), + ('PIL.ExifTags', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ExifTags.py', + 'PYMODULE'), + ('PIL', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\__init__.py', + 'PYMODULE'), + ('PIL._version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_version.py', + 'PYMODULE'), + ('tornado.websocket', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\websocket.py', + 'PYMODULE'), + ('tornado.tcpclient', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\tcpclient.py', + 'PYMODULE'), + ('tornado.queues', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\queues.py', + 'PYMODULE'), + ('tornado.locks', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\locks.py', + 'PYMODULE'), + ('tornado.simple_httpclient', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\simple_httpclient.py', + 'PYMODULE'), + ('tornado.http1connection', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\http1connection.py', + 'PYMODULE'), + ('tornado.netutil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\netutil.py', + 'PYMODULE'), + ('tornado.iostream', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\iostream.py', + 'PYMODULE'), + ('tornado.httputil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\httputil.py', + 'PYMODULE'), + ('http.cookies', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\http\\cookies.py', + 'PYMODULE'), + ('tornado.httpclient', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\httpclient.py', + 'PYMODULE'), + ('tornado.gen', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\gen.py', + 'PYMODULE'), + ('tornado.concurrent', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\concurrent.py', + 'PYMODULE'), + ('tornado.ioloop', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\ioloop.py', + 'PYMODULE'), + ('tornado.process', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\process.py', + 'PYMODULE'), + ('tornado.platform.asyncio', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\platform\\asyncio.py', + 'PYMODULE'), + ('tornado.platform', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\platform\\__init__.py', + 'PYMODULE'), + ('tornado.web', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\web.py', + 'PYMODULE'), + ('tornado.autoreload', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\autoreload.py', + 'PYMODULE'), + ('tornado.routing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\routing.py', + 'PYMODULE'), + ('tornado.locale', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\locale.py', + 'PYMODULE'), + ('tornado._locale_data', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\_locale_data.py', + 'PYMODULE'), + ('tornado.httpserver', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\httpserver.py', + 'PYMODULE'), + ('tornado.tcpserver', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\tcpserver.py', + 'PYMODULE'), + ('tornado', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\__init__.py', + 'PYMODULE'), + ('matplotlib.backends', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\__init__.py', + 'PYMODULE'), + ('matplotlib.backends.backend_qtagg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\backend_qtagg.py', + 'PYMODULE'), + ('matplotlib.backends.backend_qt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\backend_qt.py', + 'PYMODULE'), + ('matplotlib.backends.qt_editor.figureoptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\qt_editor\\figureoptions.py', + 'PYMODULE'), + ('matplotlib.dates', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\dates.py', + 'PYMODULE'), + ('matplotlib.units', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\units.py', + 'PYMODULE'), + ('dateutil.tz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\tz\\__init__.py', + 'PYMODULE'), + ('dateutil.tz.tz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\tz\\tz.py', + 'PYMODULE'), + ('dateutil.zoneinfo', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\zoneinfo\\__init__.py', + 'PYMODULE'), + ('dateutil.parser._parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\parser\\_parser.py', + 'PYMODULE'), + ('dateutil.tz.win', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\tz\\win.py', + 'PYMODULE'), + ('dateutil.tz._factories', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\tz\\_factories.py', + 'PYMODULE'), + ('dateutil.tz._common', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\tz\\_common.py', + 'PYMODULE'), + ('six', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\six.py', + 'PYMODULE'), + ('dateutil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\__init__.py', + 'PYMODULE'), + ('dateutil.easter', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\easter.py', + 'PYMODULE'), + ('dateutil._version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\_version.py', + 'PYMODULE'), + ('dateutil.parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\parser\\__init__.py', + 'PYMODULE'), + ('dateutil.parser.isoparser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\parser\\isoparser.py', + 'PYMODULE'), + ('dateutil.relativedelta', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\relativedelta.py', + 'PYMODULE'), + ('dateutil._common', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\_common.py', + 'PYMODULE'), + ('dateutil.rrule', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\rrule.py', + 'PYMODULE'), + ('matplotlib.backends.qt_editor._formlayout', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\qt_editor\\_formlayout.py', + 'PYMODULE'), + ('matplotlib.backends.qt_editor', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\qt_editor\\__init__.py', + 'PYMODULE'), + ('matplotlib.markers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\markers.py', + 'PYMODULE'), + ('matplotlib.cm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\cm.py', + 'PYMODULE'), + ('matplotlib._cm_listed', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_cm_listed.py', + 'PYMODULE'), + ('matplotlib.backends.qt_compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\qt_compat.py', + 'PYMODULE'), + ('shiboken6', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\shiboken6\\__init__.py', + 'PYMODULE'), + ('PySide6', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\__init__.py', + 'PYMODULE'), + ('PySide6.support.deprecated', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\support\\deprecated.py', + 'PYMODULE'), + ('PySide6.support', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\support\\__init__.py', + 'PYMODULE'), + ('matplotlib.backends.registry', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\registry.py', + 'PYMODULE'), + ('matplotlib.transforms', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\transforms.py', + 'PYMODULE'), + ('matplotlib.text', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\text.py', + 'PYMODULE'), + ('matplotlib.offsetbox', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\offsetbox.py', + 'PYMODULE'), + ('matplotlib.patheffects', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\patheffects.py', + 'PYMODULE'), + ('matplotlib.textpath', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\textpath.py', + 'PYMODULE'), + ('matplotlib.texmanager', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\texmanager.py', + 'PYMODULE'), + ('matplotlib.dviread', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\dviread.py', + 'PYMODULE'), + ('matplotlib._text_helpers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_text_helpers.py', + 'PYMODULE'), + ('matplotlib.patches', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\patches.py', + 'PYMODULE'), + ('matplotlib.lines', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\lines.py', + 'PYMODULE'), + ('matplotlib.legend', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\legend.py', + 'PYMODULE'), + ('matplotlib.legend_handler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\legend_handler.py', + 'PYMODULE'), + ('matplotlib.container', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\container.py', + 'PYMODULE'), + ('matplotlib.collections', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\collections.py', + 'PYMODULE'), + ('matplotlib.layout_engine', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\layout_engine.py', + 'PYMODULE'), + ('matplotlib._tight_layout', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_tight_layout.py', + 'PYMODULE'), + ('matplotlib._constrained_layout', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_constrained_layout.py', + 'PYMODULE'), + ('matplotlib._layoutgrid', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_layoutgrid.py', + 'PYMODULE'), + ('kiwisolver', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\kiwisolver\\__init__.py', + 'PYMODULE'), + ('kiwisolver.exceptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\kiwisolver\\exceptions.py', + 'PYMODULE'), + ('matplotlib.gridspec', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\gridspec.py', + 'PYMODULE'), + ('matplotlib.axes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\axes\\__init__.py', + 'PYMODULE'), + ('matplotlib.axes._axes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\axes\\_axes.py', + 'PYMODULE'), + ('matplotlib.axes._secondary_axes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\axes\\_secondary_axes.py', + 'PYMODULE'), + ('matplotlib.axis', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\axis.py', + 'PYMODULE'), + ('matplotlib.tri', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\__init__.py', + 'PYMODULE'), + ('matplotlib.tri._tritools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\_tritools.py', + 'PYMODULE'), + ('matplotlib.tri._trirefine', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\_trirefine.py', + 'PYMODULE'), + ('matplotlib.tri._triplot', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\_triplot.py', + 'PYMODULE'), + ('matplotlib.tri._tripcolor', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\_tripcolor.py', + 'PYMODULE'), + ('matplotlib.tri._triinterpolate', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\_triinterpolate.py', + 'PYMODULE'), + ('matplotlib.tri._trifinder', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\_trifinder.py', + 'PYMODULE'), + ('matplotlib.tri._tricontour', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\_tricontour.py', + 'PYMODULE'), + ('matplotlib.tri._triangulation', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\_triangulation.py', + 'PYMODULE'), + ('matplotlib.table', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\table.py', + 'PYMODULE'), + ('matplotlib.streamplot', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\streamplot.py', + 'PYMODULE'), + ('matplotlib.stackplot', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\stackplot.py', + 'PYMODULE'), + ('matplotlib.quiver', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\quiver.py', + 'PYMODULE'), + ('matplotlib.mlab', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mlab.py', + 'PYMODULE'), + ('matplotlib.contour', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\contour.py', + 'PYMODULE'), + ('contourpy', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\__init__.py', + 'PYMODULE'), + ('contourpy.enum_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\enum_util.py', + 'PYMODULE'), + ('contourpy.dechunk', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\dechunk.py', + 'PYMODULE'), + ('contourpy.typecheck', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\typecheck.py', + 'PYMODULE'), + ('contourpy.types', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\types.py', + 'PYMODULE'), + ('contourpy.array', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\array.py', + 'PYMODULE'), + ('contourpy.convert', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\convert.py', + 'PYMODULE'), + ('contourpy.chunk', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\chunk.py', + 'PYMODULE'), + ('contourpy._version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\_version.py', + 'PYMODULE'), + ('matplotlib.category', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\category.py', + 'PYMODULE'), + ('matplotlib.axes._base', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\axes\\_base.py', + 'PYMODULE'), + ('matplotlib.spines', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\spines.py', + 'PYMODULE'), + ('matplotlib.image', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\image.py', + 'PYMODULE'), + ('matplotlib.colorbar', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\colorbar.py', + 'PYMODULE'), + ('matplotlib.cbook', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\cbook.py', + 'PYMODULE'), + ('matplotlib._api', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_api\\__init__.py', + 'PYMODULE'), + ('matplotlib._api.deprecation', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_api\\deprecation.py', + 'PYMODULE'), + ('matplotlib.artist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\artist.py', + 'PYMODULE'), + ('matplotlib.projections', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\projections\\__init__.py', + 'PYMODULE'), + ('mpl_toolkits.mplot3d', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\mpl_toolkits\\mplot3d\\__init__.py', + 'PYMODULE'), + ('mpl_toolkits', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\mpl_toolkits\\__init__.py', + 'PYMODULE'), + ('mpl_toolkits.mplot3d.axes3d', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\mpl_toolkits\\mplot3d\\axes3d.py', + 'PYMODULE'), + ('mpl_toolkits.mplot3d.axis3d', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\mpl_toolkits\\mplot3d\\axis3d.py', + 'PYMODULE'), + ('mpl_toolkits.mplot3d.art3d', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\mpl_toolkits\\mplot3d\\art3d.py', + 'PYMODULE'), + ('mpl_toolkits.mplot3d.proj3d', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\mpl_toolkits\\mplot3d\\proj3d.py', + 'PYMODULE'), + ('matplotlib.projections.polar', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\projections\\polar.py', + 'PYMODULE'), + ('matplotlib.projections.geo', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\projections\\geo.py', + 'PYMODULE'), + ('matplotlib._docstring', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_docstring.py', + 'PYMODULE'), + ('matplotlib.backend_bases', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backend_bases.py', + 'PYMODULE'), + ('matplotlib.backend_managers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backend_managers.py', + 'PYMODULE'), + ('matplotlib.widgets', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\widgets.py', + 'PYMODULE'), + ('matplotlib._tight_bbox', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_tight_bbox.py', + 'PYMODULE'), + ('matplotlib._blocking_input', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_blocking_input.py', + 'PYMODULE'), + ('matplotlib.backends.backend_qt5agg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\backend_qt5agg.py', + 'PYMODULE'), + ('matplotlib.pyplot', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\pyplot.py', + 'PYMODULE'), + ('matplotlib.typing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\typing.py', + 'PYMODULE'), + ('matplotlib.style', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\style\\__init__.py', + 'PYMODULE'), + ('matplotlib.style.core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\style\\core.py', + 'PYMODULE'), + ('matplotlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\__init__.py', + 'PYMODULE'), + ('certifi', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\certifi\\__init__.py', + 'PYMODULE'), + ('certifi.core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\certifi\\core.py', + 'PYMODULE'), + ('matplotlib._version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_version.py', + 'PYMODULE'), + ('numpy', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\__init__.py', + 'PYMODULE'), + ('numpy.strings', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\strings\\__init__.py', + 'PYMODULE'), + ('numpy._core.strings', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\strings.py', + 'PYMODULE'), + ('numpy.core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\core\\__init__.py', + 'PYMODULE'), + ('numpy.core._utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\core\\_utils.py', + 'PYMODULE'), + ('numpy.char', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\char\\__init__.py', + 'PYMODULE'), + ('numpy._core.defchararray', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\defchararray.py', + 'PYMODULE'), + ('numpy.rec', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\rec\\__init__.py', + 'PYMODULE'), + ('numpy.f2py', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\__init__.py', + 'PYMODULE'), + ('numpy.f2py.diagnose', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\diagnose.py', + 'PYMODULE'), + ('numpy.f2py.f2py2e', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\f2py2e.py', + 'PYMODULE'), + ('numpy.f2py._backends', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\_backends\\__init__.py', + 'PYMODULE'), + ('numpy.f2py._backends._distutils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\_backends\\_distutils.py', + 'PYMODULE'), + ('numpy.f2py._backends._backend', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\_backends\\_backend.py', + 'PYMODULE'), + ('numpy.f2py._backends._meson', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\_backends\\_meson.py', + 'PYMODULE'), + ('numpy.f2py.auxfuncs', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\auxfuncs.py', + 'PYMODULE'), + ('numpy.f2py.f90mod_rules', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\f90mod_rules.py', + 'PYMODULE'), + ('numpy.f2py.rules', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\rules.py', + 'PYMODULE'), + ('numpy.f2py.use_rules', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\use_rules.py', + 'PYMODULE'), + ('numpy.f2py.common_rules', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\common_rules.py', + 'PYMODULE'), + ('numpy.f2py.func2subr', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\func2subr.py', + 'PYMODULE'), + ('numpy.f2py._isocbind', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\_isocbind.py', + 'PYMODULE'), + ('numpy.f2py.crackfortran', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\crackfortran.py', + 'PYMODULE'), + ('charset_normalizer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\__init__.py', + 'PYMODULE'), + ('charset_normalizer.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\version.py', + 'PYMODULE'), + ('charset_normalizer.utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\utils.py', + 'PYMODULE'), + ('charset_normalizer.constant', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\constant.py', + 'PYMODULE'), + ('charset_normalizer.models', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\models.py', + 'PYMODULE'), + ('charset_normalizer.cd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\cd.py', + 'PYMODULE'), + ('charset_normalizer.legacy', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\legacy.py', + 'PYMODULE'), + ('charset_normalizer.api', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\api.py', + 'PYMODULE'), + ('fileinput', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\fileinput.py', + 'PYMODULE'), + ('numpy.f2py.symbolic', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\symbolic.py', + 'PYMODULE'), + ('numpy.f2py.cb_rules', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\cb_rules.py', + 'PYMODULE'), + ('numpy.f2py.capi_maps', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\capi_maps.py', + 'PYMODULE'), + ('numpy.f2py.cfuncs', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\cfuncs.py', + 'PYMODULE'), + ('numpy.f2py.__version__', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\__version__.py', + 'PYMODULE'), + ('numpy.matlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\matlib.py', + 'PYMODULE'), + ('numpy.ctypeslib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\ctypeslib.py', + 'PYMODULE'), + ('numpy.polynomial', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\__init__.py', + 'PYMODULE'), + ('numpy.polynomial._polybase', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\_polybase.py', + 'PYMODULE'), + ('numpy.polynomial.laguerre', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\laguerre.py', + 'PYMODULE'), + ('numpy.polynomial.hermite_e', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\hermite_e.py', + 'PYMODULE'), + ('numpy.polynomial.hermite', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\hermite.py', + 'PYMODULE'), + ('numpy.polynomial.legendre', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\legendre.py', + 'PYMODULE'), + ('numpy.polynomial.chebyshev', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\chebyshev.py', + 'PYMODULE'), + ('numpy.polynomial.polynomial', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\polynomial.py', + 'PYMODULE'), + ('numpy.polynomial.polyutils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\polyutils.py', + 'PYMODULE'), + ('numpy.random', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\__init__.py', + 'PYMODULE'), + ('numpy.random._pickle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_pickle.py', + 'PYMODULE'), + ('numpy.dtypes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\dtypes.py', + 'PYMODULE'), + ('numpy.fft', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\fft\\__init__.py', + 'PYMODULE'), + ('numpy.fft.helper', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\fft\\helper.py', + 'PYMODULE'), + ('numpy.fft._helper', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\fft\\_helper.py', + 'PYMODULE'), + ('numpy.fft._pocketfft', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\fft\\_pocketfft.py', + 'PYMODULE'), + ('numpy._array_api_info', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_array_api_info.py', + 'PYMODULE'), + ('numpy.__config__', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\__config__.py', + 'PYMODULE'), + ('yaml', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\__init__.py', + 'PYMODULE'), + ('yaml.cyaml', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\cyaml.py', + 'PYMODULE'), + ('yaml.resolver', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\resolver.py', + 'PYMODULE'), + ('yaml.representer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\representer.py', + 'PYMODULE'), + ('yaml.serializer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\serializer.py', + 'PYMODULE'), + ('yaml.constructor', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\constructor.py', + 'PYMODULE'), + ('yaml.dumper', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\dumper.py', + 'PYMODULE'), + ('yaml.emitter', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\emitter.py', + 'PYMODULE'), + ('yaml.loader', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\loader.py', + 'PYMODULE'), + ('yaml.composer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\composer.py', + 'PYMODULE'), + ('yaml.parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\parser.py', + 'PYMODULE'), + ('yaml.scanner', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\scanner.py', + 'PYMODULE'), + ('yaml.reader', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\reader.py', + 'PYMODULE'), + ('yaml.nodes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\nodes.py', + 'PYMODULE'), + ('yaml.events', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\events.py', + 'PYMODULE'), + ('yaml.tokens', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\tokens.py', + 'PYMODULE'), + ('yaml.error', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\error.py', + 'PYMODULE'), + ('numpy._distributor_init', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_distributor_init.py', + 'PYMODULE'), + ('numpy._expired_attrs_2_0', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_expired_attrs_2_0.py', + 'PYMODULE')], + [('python310.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\python310.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qgif.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qgif.dll', + 'BINARY'), + ('PySide6\\plugins\\platforms\\qwindows.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\platforms\\qwindows.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qwbmp.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qwbmp.dll', + 'BINARY'), + ('PySide6\\plugins\\platforminputcontexts\\qtvirtualkeyboardplugin.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\platforminputcontexts\\qtvirtualkeyboardplugin.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qico.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qico.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qtga.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qtga.dll', + 'BINARY'), + ('PySide6\\plugins\\platforms\\qoffscreen.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\platforms\\qoffscreen.dll', + 'BINARY'), + ('PySide6\\plugins\\iconengines\\qsvgicon.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\iconengines\\qsvgicon.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qsvg.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qsvg.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qtiff.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qtiff.dll', + 'BINARY'), + ('PySide6\\plugins\\generic\\qtuiotouchplugin.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\generic\\qtuiotouchplugin.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qicns.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qicns.dll', + 'BINARY'), + ('PySide6\\plugins\\platforms\\qdirect2d.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\platforms\\qdirect2d.dll', + 'BINARY'), + ('PySide6\\plugins\\platforms\\qminimal.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\platforms\\qminimal.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qjpeg.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qjpeg.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qpdf.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qpdf.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qwebp.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qwebp.dll', + 'BINARY'), + ('PySide6\\opengl32sw.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\opengl32sw.dll', + 'BINARY'), + ('PySide6\\plugins\\networkinformation\\qnetworklistmanager.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\networkinformation\\qnetworklistmanager.dll', + 'BINARY'), + ('PySide6\\plugins\\tls\\qschannelbackend.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\tls\\qschannelbackend.dll', + 'BINARY'), + ('libssl-3-x64.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\libssl-3-x64.dll', + 'BINARY'), + ('libcrypto-3-x64.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\libcrypto-3-x64.dll', + 'BINARY'), + ('PySide6\\plugins\\tls\\qcertonlybackend.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\tls\\qcertonlybackend.dll', + 'BINARY'), + ('PySide6\\plugins\\tls\\qopensslbackend.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\tls\\qopensslbackend.dll', + 'BINARY'), + ('matplotlib.libs\\msvcp140-6547a4e8b7053d61be063c313b1addd0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib.libs\\msvcp140-6547a4e8b7053d61be063c313b1addd0.dll', + 'BINARY'), + ('numpy.libs\\msvcp140-d64049c6e3865410a7dda6a7e9f0c575.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy.libs\\msvcp140-d64049c6e3865410a7dda6a7e9f0c575.dll', + 'BINARY'), + ('numpy.libs\\libscipy_openblas64_-c16e4918366c6bc1f1cd71e28ca36fc0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy.libs\\libscipy_openblas64_-c16e4918366c6bc1f1cd71e28ca36fc0.dll', + 'BINARY'), + ('PySide6\\plugins\\styles\\qmodernwindowsstyle.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\styles\\qmodernwindowsstyle.dll', + 'BINARY'), + ('_ctypes.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_ctypes.pyd', + 'EXTENSION'), + ('_decimal.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_decimal.pyd', + 'EXTENSION'), + ('_hashlib.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_hashlib.pyd', + 'EXTENSION'), + ('unicodedata.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\unicodedata.pyd', + 'EXTENSION'), + ('select.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\select.pyd', + 'EXTENSION'), + ('_socket.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_socket.pyd', + 'EXTENSION'), + ('_lzma.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_lzma.pyd', + 'EXTENSION'), + ('_bz2.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_bz2.pyd', + 'EXTENSION'), + ('_queue.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_queue.pyd', + 'EXTENSION'), + ('_overlapped.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_overlapped.pyd', + 'EXTENSION'), + ('_ssl.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_ssl.pyd', + 'EXTENSION'), + ('_multiprocessing.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_multiprocessing.pyd', + 'EXTENSION'), + ('pyexpat.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\pyexpat.pyd', + 'EXTENSION'), + ('_asyncio.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_asyncio.pyd', + 'EXTENSION'), + ('hid.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\hid.cp310-win_amd64.pyd', + 'EXTENSION'), + ('tornado\\speedups.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\speedups.pyd', + 'EXTENSION'), + ('win32\\win32evtlog.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\win32\\win32evtlog.pyd', + 'EXTENSION'), + ('win32\\win32api.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\win32\\win32api.pyd', + 'EXTENSION'), + ('matplotlib\\backends\\_backend_agg.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\_backend_agg.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\_path.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_path.cp310-win_amd64.pyd', + 'EXTENSION'), + ('markupsafe\\_speedups.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\markupsafe\\_speedups.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\ft2font.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\ft2font.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\_core\\_multiarray_umath.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_multiarray_umath.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\linalg\\_umath_linalg.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\linalg\\_umath_linalg.cp310-win_amd64.pyd', + 'EXTENSION'), + ('psutil\\_psutil_windows.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\psutil\\_psutil_windows.pyd', + 'EXTENSION'), + ('win32\\win32pdh.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\win32\\win32pdh.pyd', + 'EXTENSION'), + ('PIL\\_imaging.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_imaging.cp310-win_amd64.pyd', + 'EXTENSION'), + ('_uuid.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_uuid.pyd', + 'EXTENSION'), + ('PIL\\_webp.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_webp.cp310-win_amd64.pyd', + 'EXTENSION'), + ('PIL\\_imagingtk.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_imagingtk.cp310-win_amd64.pyd', + 'EXTENSION'), + ('PIL\\_imagingcms.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_imagingcms.cp310-win_amd64.pyd', + 'EXTENSION'), + ('PIL\\_imagingmath.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_imagingmath.cp310-win_amd64.pyd', + 'EXTENSION'), + ('_elementtree.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_elementtree.pyd', + 'EXTENSION'), + ('shiboken6\\Shiboken.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\shiboken6\\Shiboken.pyd', + 'EXTENSION'), + ('PySide6\\QtGui.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\QtGui.pyd', + 'EXTENSION'), + ('PySide6\\QtNetwork.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\QtNetwork.pyd', + 'EXTENSION'), + ('kiwisolver\\_cext.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\kiwisolver\\_cext.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\_tri.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_tri.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\_qhull.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_qhull.cp310-win_amd64.pyd', + 'EXTENSION'), + ('contourpy\\_contourpy.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\_contourpy.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\_image.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_image.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\_c_internal_utils.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_c_internal_utils.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\_core\\_multiarray_tests.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_multiarray_tests.cp310-win_amd64.pyd', + 'EXTENSION'), + ('charset_normalizer\\md__mypyc.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\md__mypyc.cp310-win_amd64.pyd', + 'EXTENSION'), + ('charset_normalizer\\md.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\md.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\mtrand.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\mtrand.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_sfc64.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_sfc64.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_philox.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_philox.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_pcg64.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_pcg64.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_mt19937.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_mt19937.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\bit_generator.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\bit_generator.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_generator.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_generator.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_bounded_integers.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_bounded_integers.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_common.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_common.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\fft\\_pocketfft_umath.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\fft\\_pocketfft_umath.cp310-win_amd64.pyd', + 'EXTENSION'), + ('yaml\\_yaml.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\_yaml.cp310-win_amd64.pyd', + 'EXTENSION'), + ('PySide6\\QtCore.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\QtCore.pyd', + 'EXTENSION'), + ('PySide6\\QtWidgets.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\QtWidgets.pyd', + 'EXTENSION'), + ('zlib.dll', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\zlib.dll', 'BINARY'), + ('api-ms-win-crt-environment-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-environment-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-stdio-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-stdio-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-locale-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-locale-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-process-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-process-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-conio-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-conio-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-math-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-math-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-string-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-string-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-runtime-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-runtime-l1-1-0.dll', + 'BINARY'), + ('VCRUNTIME140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\VCRUNTIME140.dll', + 'BINARY'), + ('api-ms-win-crt-heap-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-heap-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-filesystem-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-filesystem-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-convert-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-convert-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-time-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-time-l1-1-0.dll', + 'BINARY'), + ('PySide6\\Qt6Gui.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Gui.dll', + 'BINARY'), + ('PySide6\\Qt6Core.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Core.dll', + 'BINARY'), + ('MSVCP140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\MSVCP140.dll', + 'BINARY'), + ('VCRUNTIME140_1.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\VCRUNTIME140_1.dll', + 'BINARY'), + ('PySide6\\Qt6VirtualKeyboard.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6VirtualKeyboard.dll', + 'BINARY'), + ('PySide6\\Qt6Svg.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Svg.dll', + 'BINARY'), + ('api-ms-win-crt-utility-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-utility-l1-1-0.dll', + 'BINARY'), + ('PySide6\\Qt6Network.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Network.dll', + 'BINARY'), + ('PySide6\\Qt6Pdf.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Pdf.dll', + 'BINARY'), + ('api-ms-win-crt-private-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-private-l1-1-0.dll', + 'BINARY'), + ('PySide6\\Qt6Widgets.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Widgets.dll', + 'BINARY'), + ('ffi-8.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\ffi-8.dll', + 'BINARY'), + ('liblzma.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\liblzma.dll', + 'BINARY'), + ('libbz2.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\libbz2.dll', + 'BINARY'), + ('libexpat.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\libexpat.dll', + 'BINARY'), + ('python3.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\python3.dll', + 'BINARY'), + ('pywin32_system32\\pywintypes310.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pywin32_system32\\pywintypes310.dll', + 'BINARY'), + ('shiboken6\\shiboken6.abi3.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\shiboken6\\shiboken6.abi3.dll', + 'BINARY'), + ('shiboken6\\VCRUNTIME140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\shiboken6\\VCRUNTIME140.dll', + 'BINARY'), + ('shiboken6\\VCRUNTIME140_1.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\shiboken6\\VCRUNTIME140_1.dll', + 'BINARY'), + ('PySide6\\MSVCP140_2.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\MSVCP140_2.dll', + 'BINARY'), + ('PySide6\\VCRUNTIME140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\VCRUNTIME140.dll', + 'BINARY'), + ('PySide6\\MSVCP140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\MSVCP140.dll', + 'BINARY'), + ('PySide6\\VCRUNTIME140_1.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\VCRUNTIME140_1.dll', + 'BINARY'), + ('PySide6\\pyside6.abi3.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\pyside6.abi3.dll', + 'BINARY'), + ('ucrtbase.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\ucrtbase.dll', + 'BINARY'), + ('PySide6\\MSVCP140_1.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\MSVCP140_1.dll', + 'BINARY'), + ('api-ms-win-core-synch-l1-2-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-synch-l1-2-0.dll', + 'BINARY'), + ('PySide6\\Qt6Qml.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Qml.dll', + 'BINARY'), + ('PySide6\\Qt6Quick.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Quick.dll', + 'BINARY'), + ('shiboken6\\MSVCP140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\shiboken6\\MSVCP140.dll', + 'BINARY'), + ('api-ms-win-core-heap-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-heap-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-handle-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-handle-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-string-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-string-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-file-l2-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-file-l2-1-0.dll', + 'BINARY'), + ('api-ms-win-core-errorhandling-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-errorhandling-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-file-l1-2-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-file-l1-2-0.dll', + 'BINARY'), + ('api-ms-win-core-interlocked-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-interlocked-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-timezone-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-timezone-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-processenvironment-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-processenvironment-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-memory-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-memory-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-libraryloader-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-libraryloader-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-datetime-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-datetime-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-synch-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-synch-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-profile-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-profile-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-console-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-console-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-processthreads-l1-1-1.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-processthreads-l1-1-1.dll', + 'BINARY'), + ('api-ms-win-core-util-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-util-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-fibers-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-fibers-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-namedpipe-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-namedpipe-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-processthreads-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-processthreads-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-rtlsupport-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-rtlsupport-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-file-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-file-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-sysinfo-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-sysinfo-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-debug-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-debug-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-localization-l1-2-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-localization-l1-2-0.dll', + 'BINARY'), + ('PySide6\\Qt6QmlModels.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6QmlModels.dll', + 'BINARY'), + ('PySide6\\Qt6QmlMeta.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6QmlMeta.dll', + 'BINARY'), + ('PySide6\\Qt6OpenGL.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6OpenGL.dll', + 'BINARY'), + ('PySide6\\Qt6QmlWorkerScript.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6QmlWorkerScript.dll', + 'BINARY')], + [], + [], + [('setuptools\\_vendor\\jaraco\\text\\Lorem ipsum.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\jaraco\\text\\Lorem ' + 'ipsum.txt', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\LICENSE', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\LICENSE', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\RECORD', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\RECORD', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\METADATA', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\METADATA', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\REQUESTED', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\REQUESTED', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\WHEEL', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\WHEEL', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\INSTALLER', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\INSTALLER', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\top_level.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\top_level.txt', + 'DATA'), + ('dateutil\\zoneinfo\\dateutil-zoneinfo.tar.gz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\zoneinfo\\dateutil-zoneinfo.tar.gz', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\putri8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\putri8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizOneSymReg.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizOneSymReg.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pbkd8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pbkd8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmb10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmb10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizOneSymBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizOneSymBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\fivethirtyeight.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\fivethirtyeight.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-pastel.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-pastel.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\logo2.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\logo2.png', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-talk.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-talk.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvr8an.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvr8an.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFiveSymReg.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFiveSymReg.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralItalic.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralItalic.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\home.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\home.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\cmr10.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\cmr10.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvl8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvl8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-BoldOblique.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-BoldOblique.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\zoom_to_rect.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\zoom_to_rect.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniBolIta.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniBolIta.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\zoom_to_rect.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\zoom_to_rect.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\filesave.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\filesave.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-Bold.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-Bold.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\putr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\putr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pagdo8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pagdo8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pagk8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pagk8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-Oblique.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-Oblique.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\filesave.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\filesave.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmr10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmr10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\forward.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\forward.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-BoldOblique.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-BoldOblique.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\move_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\move_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-BoldItalic.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-BoldItalic.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\home.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\home.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\grace_hopper.jpg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\grace_hopper.jpg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\ptmb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\ptmb8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\help.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\help.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pplb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pplb8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-Bold.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-Bold.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pzdr.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pzdr.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-BoldOblique.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-BoldOblique.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\classic.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\classic.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\back-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\back-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pplr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pplr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-poster.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-poster.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\tableau-colorblind10.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\tableau-colorblind10.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvbo8an.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvbo8an.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pplbi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pplbi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-Oblique.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-Oblique.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\forward.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\forward.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmss10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmss10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\msft.csv', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\msft.csv', + 'DATA'), + ('matplotlib\\mpl-data\\images\\hand.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\hand.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvro8an.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvro8an.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Symbol.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Symbol.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmtt10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmtt10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\home_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\home_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\images\\matplotlib_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\matplotlib_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\images\\qt4_editor_options.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\qt4_editor_options.png', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-dark-palette.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-dark-palette.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\README.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\README.txt', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-muted.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-muted.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\help-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\help-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pbkli8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pbkli8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\psyr.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\psyr.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\cmex10.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\cmex10.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\fast.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\fast.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pncb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pncb8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\qt4_editor_options_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\qt4_editor_options_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\putbi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\putbi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\subplots.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\subplots.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmsy10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmsy10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\topobathy.npz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\topobathy.npz', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\jacksboro_fault_dem.npz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\jacksboro_fault_dem.npz', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pncbi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pncbi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\subplots_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\subplots_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\kpsewhich.lua', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\kpsewhich.lua', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pbkl8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pbkl8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\subplots-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\subplots-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pbkdi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pbkdi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Italic.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Italic.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-Bold.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-Bold.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\back_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\back_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\LICENSE_STIX', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\LICENSE_STIX', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-Italic.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-Italic.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\membrane.dat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\membrane.dat', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\readme.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\readme.txt', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\zoom_to_rect-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\zoom_to_rect-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvro8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvro8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\ZapfDingbats.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\ZapfDingbats.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-Oblique.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-Oblique.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\home.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\home.png', + 'DATA'), + ('matplotlib\\mpl-data\\images\\forward_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\forward_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pcrb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pcrb8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\hand.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\hand.png', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\dark_background.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\dark_background.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\plot_directive\\plot_directive.css', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\plot_directive\\plot_directive.css', + 'DATA'), + ('matplotlib\\mpl-data\\matplotlibrc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc', + 'DATA'), + ('matplotlib\\mpl-data\\images\\filesave.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\filesave.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-ticks.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-ticks.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\_mpl-gallery.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\_mpl-gallery.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\subplots.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\subplots.png', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\Stocks.csv', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\Stocks.csv', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-Oblique.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-Oblique.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\filesave-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\filesave-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\grayscale.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\grayscale.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\cmtt10.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\cmtt10.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-BoldItalic.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-BoldItalic.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pagko8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pagko8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizThreeSymReg.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizThreeSymReg.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvlo8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvlo8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\move.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\move.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\move.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\move.svg', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\_mpl-gallery-nogrid.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\_mpl-gallery-nogrid.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\ptmr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\ptmr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\eeg.dat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\eeg.dat', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-deep.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-deep.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\back.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\back.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-Bold.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-Bold.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFourSymBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFourSymBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\axes_grid\\bivariate_normal.npy', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\axes_grid\\bivariate_normal.npy', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pncr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pncr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\help.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\help.png', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\Minduka_Present_Blue_Pack.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\Minduka_Present_Blue_Pack.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pncri8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pncri8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizTwoSymReg.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizTwoSymReg.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-Bold.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-Bold.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\forward-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\forward-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pzcmi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pzcmi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvbo8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvbo8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\ptmri8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\ptmri8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\move.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\move.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\embedding_in_wx3.xrc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\embedding_in_wx3.xrc', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\goog.npz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\goog.npz', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFourSymReg.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFourSymReg.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\zoom_to_rect.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\zoom_to_rect.png', + 'DATA'), + ('matplotlib\\mpl-data\\images\\help_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\help_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansDisplay.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansDisplay.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-dark.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-dark.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\matplotlib.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\matplotlib.svg', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-white.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-white.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\forward.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\forward.svg', + 'DATA'), + ('matplotlib\\mpl-data\\images\\move-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\move-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-bright.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-bright.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmex10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmex10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\ggplot.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\ggplot.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizThreeSymBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizThreeSymBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmmi10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmmi10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\bmh.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\bmh.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\s1045.ima.gz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\s1045.ima.gz', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Bold.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Bold.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\matplotlib.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\matplotlib.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\ptmbi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\ptmbi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-whitegrid.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-whitegrid.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pcrro8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pcrro8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\qt4_editor_options.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\qt4_editor_options.svg', + 'DATA'), + ('matplotlib\\mpl-data\\images\\matplotlib.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\matplotlib.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-colorblind.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-colorblind.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\home-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\home-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizTwoSymBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizTwoSymBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\_classic_test_patch.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\_classic_test_patch.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-BoldOblique.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-BoldOblique.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\qt4_editor_options.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\qt4_editor_options.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\subplots.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\subplots.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pagd8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pagd8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\back.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\back.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\data_x_x2_x3.csv', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\data_x_x2_x3.csv', + 'DATA'), + ('matplotlib\\mpl-data\\images\\filesave_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\filesave_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Roman.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Roman.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\cmsy10.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\cmsy10.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\LICENSE_DEJAVU', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\LICENSE_DEJAVU', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvb8an.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvb8an.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-paper.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-paper.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralBolIta.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralBolIta.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerifDisplay.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerifDisplay.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pcrr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pcrr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneral.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneral.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\help.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\help.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\Solarize_Light2.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\Solarize_Light2.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pcrbo8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pcrbo8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-darkgrid.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-darkgrid.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\back.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\back.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUni.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUni.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\hand.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\hand.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pplri8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pplri8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-notebook.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-notebook.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\cmmi10.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\cmmi10.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniIta.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniIta.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\zoom_to_rect_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\zoom_to_rect_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvb8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\putb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\putb8a.afm', + 'DATA'), + ('certifi\\py.typed', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\certifi\\py.typed', + 'DATA'), + ('certifi\\cacert.pem', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\certifi\\cacert.pem', + 'DATA'), + ('PySide6\\translations\\qt_help_it.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_it.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_gd.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_gd.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_fi.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_fi.qm', + 'DATA'), + ('PySide6\\translations\\qt_fr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_fr.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ka.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ka.qm', + 'DATA'), + ('PySide6\\translations\\qt_ka.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ka.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_bg.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_bg.qm', + 'DATA'), + ('PySide6\\translations\\qt_ko.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ko.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_es.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_es.qm', + 'DATA'), + ('PySide6\\translations\\qt_gl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_gl.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ko.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ko.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ru.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ru.qm', + 'DATA'), + ('PySide6\\translations\\qt_nn.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_nn.qm', + 'DATA'), + ('PySide6\\translations\\qt_he.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_he.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_tr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_tr.qm', + 'DATA'), + ('PySide6\\translations\\qt_it.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_it.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_sk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_sk.qm', + 'DATA'), + ('PySide6\\translations\\qt_hr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_hr.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ar.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ar.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_fr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_fr.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_en.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_en.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_cs.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_cs.qm', + 'DATA'), + ('PySide6\\translations\\qt_hu.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_hu.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_sk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_sk.qm', + 'DATA'), + ('PySide6\\translations\\qt_sv.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_sv.qm', + 'DATA'), + ('PySide6\\translations\\qt_zh_CN.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_zh_CN.qm', + 'DATA'), + ('PySide6\\translations\\qt_pl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_pl.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_it.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_it.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ru.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ru.qm', + 'DATA'), + ('PySide6\\translations\\qt_ar.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ar.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ko.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ko.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ja.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ja.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_tr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_tr.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_zh_CN.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_zh_CN.qm', + 'DATA'), + ('PySide6\\translations\\qt_en.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_en.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_fa.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_fa.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_nl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_nl.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_de.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_de.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_es.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_es.qm', + 'DATA'), + ('PySide6\\translations\\qt_sl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_sl.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_da.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_da.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_he.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_he.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ca.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ca.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_nl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_nl.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_cs.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_cs.qm', + 'DATA'), + ('PySide6\\translations\\qt_sk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_sk.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_pl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_pl.qm', + 'DATA'), + ('PySide6\\translations\\qt_ca.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ca.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_hu.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_hu.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_uk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_uk.qm', + 'DATA'), + ('PySide6\\translations\\qt_lv.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_lv.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ja.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ja.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_gl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_gl.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_hr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_hr.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ka.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ka.qm', + 'DATA'), + ('PySide6\\translations\\qt_es.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_es.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_hu.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_hu.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_hr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_hr.qm', + 'DATA'), + ('PySide6\\translations\\qt_fa.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_fa.qm', + 'DATA'), + ('PySide6\\translations\\qt_da.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_da.qm', + 'DATA'), + ('PySide6\\translations\\qt_nl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_nl.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_uk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_uk.qm', + 'DATA'), + ('PySide6\\translations\\qt_fi.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_fi.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_pl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_pl.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_zh_TW.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_zh_TW.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_sl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_sl.qm', + 'DATA'), + ('PySide6\\translations\\qt_pt_PT.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_pt_PT.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_da.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_da.qm', + 'DATA'), + ('PySide6\\translations\\qt_pt_BR.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_pt_BR.qm', + 'DATA'), + ('PySide6\\translations\\qt_ja.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ja.qm', + 'DATA'), + ('PySide6\\translations\\qt_zh_TW.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_zh_TW.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_en.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_en.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_zh_CN.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_zh_CN.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_bg.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_bg.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_fr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_fr.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_pt_BR.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_pt_BR.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_de.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_de.qm', + 'DATA'), + ('PySide6\\translations\\qt_tr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_tr.qm', + 'DATA'), + ('PySide6\\translations\\qt_ru.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ru.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_nn.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_nn.qm', + 'DATA'), + ('PySide6\\translations\\qt_gd.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_gd.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_pt_BR.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_pt_BR.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_nn.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_nn.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_zh_TW.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_zh_TW.qm', + 'DATA'), + ('PySide6\\translations\\qt_bg.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_bg.qm', + 'DATA'), + ('PySide6\\translations\\qt_cs.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_cs.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_lv.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_lv.qm', + 'DATA'), + ('PySide6\\translations\\qt_uk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_uk.qm', + 'DATA'), + ('PySide6\\translations\\qt_de.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_de.qm', + 'DATA'), + ('PySide6\\translations\\qt_lt.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_lt.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ca.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ca.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ar.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ar.qm', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\RECORD', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\RECORD', + 'DATA'), + ('wheel-0.45.1.dist-info\\METADATA', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel-0.45.1.dist-info\\METADATA', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\REQUESTED', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\REQUESTED', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\WHEEL', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\WHEEL', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\top_level.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\top_level.txt', + 'DATA'), + ('wheel-0.45.1.dist-info\\RECORD', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel-0.45.1.dist-info\\RECORD', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\METADATA', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\METADATA', + 'DATA'), + ('wheel-0.45.1.dist-info\\LICENSE.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel-0.45.1.dist-info\\LICENSE.txt', + 'DATA'), + ('wheel-0.45.1.dist-info\\WHEEL', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel-0.45.1.dist-info\\WHEEL', + 'DATA'), + ('wheel-0.45.1.dist-info\\entry_points.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel-0.45.1.dist-info\\entry_points.txt', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\INSTALLER', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\INSTALLER', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\LICENSE.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\LICENSE.txt', + 'DATA'), + ('base_library.zip', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\base_library.zip', + 'DATA')]) diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/EXE-00.toc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/EXE-00.toc new file mode 100644 index 0000000..dbdbc80 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/EXE-00.toc @@ -0,0 +1,1520 @@ +('D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\dist\\eq_designer_new.exe', + True, + False, + False, + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PyInstaller\\bootloader\\images\\icon-console.ico', + None, + False, + False, + b'\n\n \n \n \n \n \n \n \n ' + b'\n <' + b'application>\n \n \n ' + b' \n \n \n \n <' + b'/compatibility>\n ' + b'\n \n true\n \n \n \n \n \n \n \n', + True, + False, + None, + None, + None, + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\eq_designer_new.pkg', + [('pyi-contents-directory _internal', '', 'OPTION'), + ('PYZ-00.pyz', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\PYZ-00.pyz', + 'PYZ'), + ('struct', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\localpycs\\struct.pyc', + 'PYMODULE'), + ('pyimod01_archive', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\localpycs\\pyimod01_archive.pyc', + 'PYMODULE'), + ('pyimod02_importers', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\localpycs\\pyimod02_importers.pyc', + 'PYMODULE'), + ('pyimod03_ctypes', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\localpycs\\pyimod03_ctypes.pyc', + 'PYMODULE'), + ('pyimod04_pywin32', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\localpycs\\pyimod04_pywin32.pyc', + 'PYMODULE'), + ('pyiboot01_bootstrap', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py', + 'PYSOURCE'), + ('pyi_rth_inspect', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py', + 'PYSOURCE'), + ('pyi_rth_pkgutil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py', + 'PYSOURCE'), + ('pyi_rth_multiprocessing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py', + 'PYSOURCE'), + ('pyi_rth_pkgres', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgres.py', + 'PYSOURCE'), + ('pyi_rth_setuptools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_setuptools.py', + 'PYSOURCE'), + ('pyi_rth_pyside6', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pyside6.py', + 'PYSOURCE'), + ('pyi_rth_mplconfig', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_mplconfig.py', + 'PYSOURCE'), + ('eq_designer_new', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\eq_designer_new.py', + 'PYSOURCE'), + ('python310.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\python310.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qgif.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qgif.dll', + 'BINARY'), + ('PySide6\\plugins\\platforms\\qwindows.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\platforms\\qwindows.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qwbmp.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qwbmp.dll', + 'BINARY'), + ('PySide6\\plugins\\platforminputcontexts\\qtvirtualkeyboardplugin.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\platforminputcontexts\\qtvirtualkeyboardplugin.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qico.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qico.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qtga.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qtga.dll', + 'BINARY'), + ('PySide6\\plugins\\platforms\\qoffscreen.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\platforms\\qoffscreen.dll', + 'BINARY'), + ('PySide6\\plugins\\iconengines\\qsvgicon.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\iconengines\\qsvgicon.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qsvg.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qsvg.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qtiff.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qtiff.dll', + 'BINARY'), + ('PySide6\\plugins\\generic\\qtuiotouchplugin.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\generic\\qtuiotouchplugin.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qicns.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qicns.dll', + 'BINARY'), + ('PySide6\\plugins\\platforms\\qdirect2d.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\platforms\\qdirect2d.dll', + 'BINARY'), + ('PySide6\\plugins\\platforms\\qminimal.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\platforms\\qminimal.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qjpeg.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qjpeg.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qpdf.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qpdf.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qwebp.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qwebp.dll', + 'BINARY'), + ('PySide6\\opengl32sw.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\opengl32sw.dll', + 'BINARY'), + ('PySide6\\plugins\\networkinformation\\qnetworklistmanager.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\networkinformation\\qnetworklistmanager.dll', + 'BINARY'), + ('PySide6\\plugins\\tls\\qschannelbackend.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\tls\\qschannelbackend.dll', + 'BINARY'), + ('libssl-3-x64.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\libssl-3-x64.dll', + 'BINARY'), + ('libcrypto-3-x64.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\libcrypto-3-x64.dll', + 'BINARY'), + ('PySide6\\plugins\\tls\\qcertonlybackend.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\tls\\qcertonlybackend.dll', + 'BINARY'), + ('PySide6\\plugins\\tls\\qopensslbackend.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\tls\\qopensslbackend.dll', + 'BINARY'), + ('matplotlib.libs\\msvcp140-6547a4e8b7053d61be063c313b1addd0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib.libs\\msvcp140-6547a4e8b7053d61be063c313b1addd0.dll', + 'BINARY'), + ('numpy.libs\\msvcp140-d64049c6e3865410a7dda6a7e9f0c575.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy.libs\\msvcp140-d64049c6e3865410a7dda6a7e9f0c575.dll', + 'BINARY'), + ('numpy.libs\\libscipy_openblas64_-c16e4918366c6bc1f1cd71e28ca36fc0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy.libs\\libscipy_openblas64_-c16e4918366c6bc1f1cd71e28ca36fc0.dll', + 'BINARY'), + ('PySide6\\plugins\\styles\\qmodernwindowsstyle.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\styles\\qmodernwindowsstyle.dll', + 'BINARY'), + ('_ctypes.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_ctypes.pyd', + 'EXTENSION'), + ('_decimal.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_decimal.pyd', + 'EXTENSION'), + ('_hashlib.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_hashlib.pyd', + 'EXTENSION'), + ('unicodedata.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\unicodedata.pyd', + 'EXTENSION'), + ('select.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\select.pyd', + 'EXTENSION'), + ('_socket.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_socket.pyd', + 'EXTENSION'), + ('_lzma.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_lzma.pyd', + 'EXTENSION'), + ('_bz2.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_bz2.pyd', + 'EXTENSION'), + ('_queue.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_queue.pyd', + 'EXTENSION'), + ('_overlapped.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_overlapped.pyd', + 'EXTENSION'), + ('_ssl.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_ssl.pyd', + 'EXTENSION'), + ('_multiprocessing.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_multiprocessing.pyd', + 'EXTENSION'), + ('pyexpat.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\pyexpat.pyd', + 'EXTENSION'), + ('_asyncio.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_asyncio.pyd', + 'EXTENSION'), + ('hid.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\hid.cp310-win_amd64.pyd', + 'EXTENSION'), + ('tornado\\speedups.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\speedups.pyd', + 'EXTENSION'), + ('win32\\win32evtlog.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\win32\\win32evtlog.pyd', + 'EXTENSION'), + ('win32\\win32api.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\win32\\win32api.pyd', + 'EXTENSION'), + ('matplotlib\\backends\\_backend_agg.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\_backend_agg.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\_path.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_path.cp310-win_amd64.pyd', + 'EXTENSION'), + ('markupsafe\\_speedups.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\markupsafe\\_speedups.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\ft2font.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\ft2font.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\_core\\_multiarray_umath.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_multiarray_umath.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\linalg\\_umath_linalg.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\linalg\\_umath_linalg.cp310-win_amd64.pyd', + 'EXTENSION'), + ('psutil\\_psutil_windows.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\psutil\\_psutil_windows.pyd', + 'EXTENSION'), + ('win32\\win32pdh.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\win32\\win32pdh.pyd', + 'EXTENSION'), + ('PIL\\_imaging.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_imaging.cp310-win_amd64.pyd', + 'EXTENSION'), + ('_uuid.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_uuid.pyd', + 'EXTENSION'), + ('PIL\\_webp.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_webp.cp310-win_amd64.pyd', + 'EXTENSION'), + ('PIL\\_imagingtk.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_imagingtk.cp310-win_amd64.pyd', + 'EXTENSION'), + ('PIL\\_imagingcms.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_imagingcms.cp310-win_amd64.pyd', + 'EXTENSION'), + ('PIL\\_imagingmath.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_imagingmath.cp310-win_amd64.pyd', + 'EXTENSION'), + ('_elementtree.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_elementtree.pyd', + 'EXTENSION'), + ('shiboken6\\Shiboken.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\shiboken6\\Shiboken.pyd', + 'EXTENSION'), + ('PySide6\\QtGui.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\QtGui.pyd', + 'EXTENSION'), + ('PySide6\\QtNetwork.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\QtNetwork.pyd', + 'EXTENSION'), + ('kiwisolver\\_cext.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\kiwisolver\\_cext.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\_tri.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_tri.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\_qhull.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_qhull.cp310-win_amd64.pyd', + 'EXTENSION'), + ('contourpy\\_contourpy.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\_contourpy.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\_image.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_image.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\_c_internal_utils.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_c_internal_utils.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\_core\\_multiarray_tests.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_multiarray_tests.cp310-win_amd64.pyd', + 'EXTENSION'), + ('charset_normalizer\\md__mypyc.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\md__mypyc.cp310-win_amd64.pyd', + 'EXTENSION'), + ('charset_normalizer\\md.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\md.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\mtrand.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\mtrand.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_sfc64.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_sfc64.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_philox.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_philox.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_pcg64.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_pcg64.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_mt19937.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_mt19937.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\bit_generator.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\bit_generator.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_generator.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_generator.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_bounded_integers.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_bounded_integers.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_common.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_common.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\fft\\_pocketfft_umath.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\fft\\_pocketfft_umath.cp310-win_amd64.pyd', + 'EXTENSION'), + ('yaml\\_yaml.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\_yaml.cp310-win_amd64.pyd', + 'EXTENSION'), + ('PySide6\\QtCore.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\QtCore.pyd', + 'EXTENSION'), + ('PySide6\\QtWidgets.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\QtWidgets.pyd', + 'EXTENSION'), + ('zlib.dll', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\zlib.dll', 'BINARY'), + ('api-ms-win-crt-environment-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-environment-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-stdio-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-stdio-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-locale-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-locale-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-process-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-process-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-conio-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-conio-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-math-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-math-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-string-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-string-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-runtime-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-runtime-l1-1-0.dll', + 'BINARY'), + ('VCRUNTIME140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\VCRUNTIME140.dll', + 'BINARY'), + ('api-ms-win-crt-heap-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-heap-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-filesystem-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-filesystem-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-convert-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-convert-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-time-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-time-l1-1-0.dll', + 'BINARY'), + ('PySide6\\Qt6Gui.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Gui.dll', + 'BINARY'), + ('PySide6\\Qt6Core.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Core.dll', + 'BINARY'), + ('MSVCP140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\MSVCP140.dll', + 'BINARY'), + ('VCRUNTIME140_1.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\VCRUNTIME140_1.dll', + 'BINARY'), + ('PySide6\\Qt6VirtualKeyboard.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6VirtualKeyboard.dll', + 'BINARY'), + ('PySide6\\Qt6Svg.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Svg.dll', + 'BINARY'), + ('api-ms-win-crt-utility-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-utility-l1-1-0.dll', + 'BINARY'), + ('PySide6\\Qt6Network.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Network.dll', + 'BINARY'), + ('PySide6\\Qt6Pdf.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Pdf.dll', + 'BINARY'), + ('api-ms-win-crt-private-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-private-l1-1-0.dll', + 'BINARY'), + ('PySide6\\Qt6Widgets.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Widgets.dll', + 'BINARY'), + ('ffi-8.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\ffi-8.dll', + 'BINARY'), + ('liblzma.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\liblzma.dll', + 'BINARY'), + ('libbz2.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\libbz2.dll', + 'BINARY'), + ('libexpat.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\libexpat.dll', + 'BINARY'), + ('python3.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\python3.dll', + 'BINARY'), + ('pywin32_system32\\pywintypes310.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pywin32_system32\\pywintypes310.dll', + 'BINARY'), + ('shiboken6\\shiboken6.abi3.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\shiboken6\\shiboken6.abi3.dll', + 'BINARY'), + ('shiboken6\\VCRUNTIME140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\shiboken6\\VCRUNTIME140.dll', + 'BINARY'), + ('shiboken6\\VCRUNTIME140_1.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\shiboken6\\VCRUNTIME140_1.dll', + 'BINARY'), + ('PySide6\\MSVCP140_2.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\MSVCP140_2.dll', + 'BINARY'), + ('PySide6\\VCRUNTIME140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\VCRUNTIME140.dll', + 'BINARY'), + ('PySide6\\MSVCP140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\MSVCP140.dll', + 'BINARY'), + ('PySide6\\VCRUNTIME140_1.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\VCRUNTIME140_1.dll', + 'BINARY'), + ('PySide6\\pyside6.abi3.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\pyside6.abi3.dll', + 'BINARY'), + ('ucrtbase.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\ucrtbase.dll', + 'BINARY'), + ('PySide6\\MSVCP140_1.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\MSVCP140_1.dll', + 'BINARY'), + ('api-ms-win-core-synch-l1-2-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-synch-l1-2-0.dll', + 'BINARY'), + ('PySide6\\Qt6Qml.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Qml.dll', + 'BINARY'), + ('PySide6\\Qt6Quick.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Quick.dll', + 'BINARY'), + ('shiboken6\\MSVCP140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\shiboken6\\MSVCP140.dll', + 'BINARY'), + ('api-ms-win-core-heap-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-heap-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-handle-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-handle-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-string-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-string-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-file-l2-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-file-l2-1-0.dll', + 'BINARY'), + ('api-ms-win-core-errorhandling-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-errorhandling-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-file-l1-2-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-file-l1-2-0.dll', + 'BINARY'), + ('api-ms-win-core-interlocked-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-interlocked-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-timezone-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-timezone-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-processenvironment-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-processenvironment-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-memory-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-memory-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-libraryloader-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-libraryloader-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-datetime-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-datetime-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-synch-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-synch-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-profile-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-profile-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-console-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-console-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-processthreads-l1-1-1.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-processthreads-l1-1-1.dll', + 'BINARY'), + ('api-ms-win-core-util-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-util-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-fibers-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-fibers-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-namedpipe-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-namedpipe-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-processthreads-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-processthreads-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-rtlsupport-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-rtlsupport-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-file-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-file-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-sysinfo-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-sysinfo-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-debug-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-debug-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-localization-l1-2-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-localization-l1-2-0.dll', + 'BINARY'), + ('PySide6\\Qt6QmlModels.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6QmlModels.dll', + 'BINARY'), + ('PySide6\\Qt6QmlMeta.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6QmlMeta.dll', + 'BINARY'), + ('PySide6\\Qt6OpenGL.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6OpenGL.dll', + 'BINARY'), + ('PySide6\\Qt6QmlWorkerScript.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6QmlWorkerScript.dll', + 'BINARY'), + ('setuptools\\_vendor\\jaraco\\text\\Lorem ipsum.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\jaraco\\text\\Lorem ' + 'ipsum.txt', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\LICENSE', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\LICENSE', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\RECORD', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\RECORD', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\METADATA', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\METADATA', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\REQUESTED', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\REQUESTED', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\WHEEL', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\WHEEL', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\INSTALLER', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\INSTALLER', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\top_level.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\top_level.txt', + 'DATA'), + ('dateutil\\zoneinfo\\dateutil-zoneinfo.tar.gz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\zoneinfo\\dateutil-zoneinfo.tar.gz', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\putri8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\putri8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizOneSymReg.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizOneSymReg.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pbkd8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pbkd8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmb10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmb10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizOneSymBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizOneSymBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\fivethirtyeight.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\fivethirtyeight.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-pastel.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-pastel.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\logo2.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\logo2.png', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-talk.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-talk.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvr8an.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvr8an.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFiveSymReg.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFiveSymReg.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralItalic.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralItalic.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\home.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\home.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\cmr10.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\cmr10.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvl8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvl8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-BoldOblique.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-BoldOblique.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\zoom_to_rect.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\zoom_to_rect.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniBolIta.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniBolIta.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\zoom_to_rect.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\zoom_to_rect.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\filesave.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\filesave.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-Bold.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-Bold.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\putr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\putr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pagdo8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pagdo8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pagk8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pagk8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-Oblique.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-Oblique.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\filesave.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\filesave.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmr10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmr10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\forward.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\forward.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-BoldOblique.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-BoldOblique.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\move_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\move_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-BoldItalic.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-BoldItalic.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\home.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\home.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\grace_hopper.jpg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\grace_hopper.jpg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\ptmb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\ptmb8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\help.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\help.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pplb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pplb8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-Bold.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-Bold.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pzdr.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pzdr.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-BoldOblique.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-BoldOblique.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\classic.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\classic.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\back-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\back-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pplr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pplr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-poster.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-poster.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\tableau-colorblind10.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\tableau-colorblind10.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvbo8an.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvbo8an.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pplbi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pplbi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-Oblique.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-Oblique.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\forward.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\forward.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmss10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmss10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\msft.csv', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\msft.csv', + 'DATA'), + ('matplotlib\\mpl-data\\images\\hand.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\hand.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvro8an.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvro8an.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Symbol.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Symbol.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmtt10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmtt10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\home_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\home_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\images\\matplotlib_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\matplotlib_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\images\\qt4_editor_options.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\qt4_editor_options.png', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-dark-palette.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-dark-palette.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\README.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\README.txt', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-muted.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-muted.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\help-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\help-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pbkli8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pbkli8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\psyr.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\psyr.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\cmex10.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\cmex10.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\fast.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\fast.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pncb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pncb8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\qt4_editor_options_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\qt4_editor_options_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\putbi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\putbi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\subplots.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\subplots.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmsy10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmsy10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\topobathy.npz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\topobathy.npz', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\jacksboro_fault_dem.npz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\jacksboro_fault_dem.npz', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pncbi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pncbi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\subplots_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\subplots_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\kpsewhich.lua', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\kpsewhich.lua', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pbkl8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pbkl8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\subplots-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\subplots-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pbkdi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pbkdi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Italic.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Italic.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-Bold.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-Bold.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\back_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\back_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\LICENSE_STIX', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\LICENSE_STIX', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-Italic.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-Italic.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\membrane.dat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\membrane.dat', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\readme.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\readme.txt', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\zoom_to_rect-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\zoom_to_rect-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvro8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvro8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\ZapfDingbats.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\ZapfDingbats.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-Oblique.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-Oblique.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\home.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\home.png', + 'DATA'), + ('matplotlib\\mpl-data\\images\\forward_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\forward_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pcrb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pcrb8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\hand.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\hand.png', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\dark_background.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\dark_background.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\plot_directive\\plot_directive.css', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\plot_directive\\plot_directive.css', + 'DATA'), + ('matplotlib\\mpl-data\\matplotlibrc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc', + 'DATA'), + ('matplotlib\\mpl-data\\images\\filesave.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\filesave.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-ticks.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-ticks.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\_mpl-gallery.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\_mpl-gallery.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\subplots.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\subplots.png', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\Stocks.csv', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\Stocks.csv', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-Oblique.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-Oblique.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\filesave-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\filesave-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\grayscale.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\grayscale.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\cmtt10.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\cmtt10.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-BoldItalic.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-BoldItalic.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pagko8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pagko8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizThreeSymReg.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizThreeSymReg.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvlo8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvlo8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\move.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\move.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\move.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\move.svg', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\_mpl-gallery-nogrid.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\_mpl-gallery-nogrid.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\ptmr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\ptmr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\eeg.dat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\eeg.dat', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-deep.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-deep.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\back.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\back.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-Bold.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-Bold.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFourSymBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFourSymBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\axes_grid\\bivariate_normal.npy', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\axes_grid\\bivariate_normal.npy', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pncr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pncr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\help.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\help.png', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\Minduka_Present_Blue_Pack.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\Minduka_Present_Blue_Pack.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pncri8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pncri8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizTwoSymReg.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizTwoSymReg.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-Bold.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-Bold.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\forward-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\forward-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pzcmi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pzcmi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvbo8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvbo8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\ptmri8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\ptmri8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\move.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\move.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\embedding_in_wx3.xrc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\embedding_in_wx3.xrc', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\goog.npz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\goog.npz', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFourSymReg.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFourSymReg.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\zoom_to_rect.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\zoom_to_rect.png', + 'DATA'), + ('matplotlib\\mpl-data\\images\\help_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\help_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansDisplay.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansDisplay.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-dark.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-dark.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\matplotlib.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\matplotlib.svg', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-white.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-white.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\forward.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\forward.svg', + 'DATA'), + ('matplotlib\\mpl-data\\images\\move-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\move-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-bright.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-bright.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmex10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmex10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\ggplot.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\ggplot.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizThreeSymBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizThreeSymBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmmi10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmmi10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\bmh.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\bmh.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\s1045.ima.gz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\s1045.ima.gz', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Bold.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Bold.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\matplotlib.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\matplotlib.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\ptmbi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\ptmbi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-whitegrid.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-whitegrid.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pcrro8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pcrro8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\qt4_editor_options.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\qt4_editor_options.svg', + 'DATA'), + ('matplotlib\\mpl-data\\images\\matplotlib.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\matplotlib.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-colorblind.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-colorblind.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\home-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\home-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizTwoSymBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizTwoSymBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\_classic_test_patch.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\_classic_test_patch.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-BoldOblique.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-BoldOblique.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\qt4_editor_options.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\qt4_editor_options.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\subplots.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\subplots.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pagd8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pagd8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\back.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\back.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\data_x_x2_x3.csv', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\data_x_x2_x3.csv', + 'DATA'), + ('matplotlib\\mpl-data\\images\\filesave_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\filesave_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Roman.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Roman.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\cmsy10.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\cmsy10.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\LICENSE_DEJAVU', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\LICENSE_DEJAVU', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvb8an.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvb8an.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-paper.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-paper.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralBolIta.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralBolIta.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerifDisplay.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerifDisplay.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pcrr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pcrr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneral.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneral.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\help.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\help.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\Solarize_Light2.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\Solarize_Light2.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pcrbo8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pcrbo8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-darkgrid.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-darkgrid.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\back.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\back.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUni.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUni.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\hand.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\hand.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pplri8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pplri8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-notebook.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-notebook.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\cmmi10.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\cmmi10.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniIta.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniIta.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\zoom_to_rect_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\zoom_to_rect_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvb8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\putb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\putb8a.afm', + 'DATA'), + ('certifi\\py.typed', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\certifi\\py.typed', + 'DATA'), + ('certifi\\cacert.pem', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\certifi\\cacert.pem', + 'DATA'), + ('PySide6\\translations\\qt_help_it.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_it.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_gd.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_gd.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_fi.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_fi.qm', + 'DATA'), + ('PySide6\\translations\\qt_fr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_fr.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ka.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ka.qm', + 'DATA'), + ('PySide6\\translations\\qt_ka.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ka.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_bg.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_bg.qm', + 'DATA'), + ('PySide6\\translations\\qt_ko.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ko.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_es.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_es.qm', + 'DATA'), + ('PySide6\\translations\\qt_gl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_gl.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ko.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ko.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ru.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ru.qm', + 'DATA'), + ('PySide6\\translations\\qt_nn.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_nn.qm', + 'DATA'), + ('PySide6\\translations\\qt_he.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_he.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_tr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_tr.qm', + 'DATA'), + ('PySide6\\translations\\qt_it.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_it.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_sk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_sk.qm', + 'DATA'), + ('PySide6\\translations\\qt_hr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_hr.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ar.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ar.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_fr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_fr.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_en.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_en.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_cs.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_cs.qm', + 'DATA'), + ('PySide6\\translations\\qt_hu.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_hu.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_sk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_sk.qm', + 'DATA'), + ('PySide6\\translations\\qt_sv.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_sv.qm', + 'DATA'), + ('PySide6\\translations\\qt_zh_CN.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_zh_CN.qm', + 'DATA'), + ('PySide6\\translations\\qt_pl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_pl.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_it.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_it.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ru.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ru.qm', + 'DATA'), + ('PySide6\\translations\\qt_ar.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ar.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ko.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ko.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ja.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ja.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_tr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_tr.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_zh_CN.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_zh_CN.qm', + 'DATA'), + ('PySide6\\translations\\qt_en.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_en.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_fa.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_fa.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_nl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_nl.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_de.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_de.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_es.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_es.qm', + 'DATA'), + ('PySide6\\translations\\qt_sl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_sl.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_da.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_da.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_he.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_he.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ca.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ca.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_nl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_nl.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_cs.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_cs.qm', + 'DATA'), + ('PySide6\\translations\\qt_sk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_sk.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_pl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_pl.qm', + 'DATA'), + ('PySide6\\translations\\qt_ca.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ca.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_hu.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_hu.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_uk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_uk.qm', + 'DATA'), + ('PySide6\\translations\\qt_lv.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_lv.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ja.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ja.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_gl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_gl.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_hr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_hr.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ka.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ka.qm', + 'DATA'), + ('PySide6\\translations\\qt_es.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_es.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_hu.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_hu.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_hr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_hr.qm', + 'DATA'), + ('PySide6\\translations\\qt_fa.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_fa.qm', + 'DATA'), + ('PySide6\\translations\\qt_da.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_da.qm', + 'DATA'), + ('PySide6\\translations\\qt_nl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_nl.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_uk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_uk.qm', + 'DATA'), + ('PySide6\\translations\\qt_fi.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_fi.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_pl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_pl.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_zh_TW.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_zh_TW.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_sl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_sl.qm', + 'DATA'), + ('PySide6\\translations\\qt_pt_PT.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_pt_PT.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_da.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_da.qm', + 'DATA'), + ('PySide6\\translations\\qt_pt_BR.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_pt_BR.qm', + 'DATA'), + ('PySide6\\translations\\qt_ja.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ja.qm', + 'DATA'), + ('PySide6\\translations\\qt_zh_TW.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_zh_TW.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_en.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_en.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_zh_CN.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_zh_CN.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_bg.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_bg.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_fr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_fr.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_pt_BR.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_pt_BR.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_de.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_de.qm', + 'DATA'), + ('PySide6\\translations\\qt_tr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_tr.qm', + 'DATA'), + ('PySide6\\translations\\qt_ru.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ru.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_nn.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_nn.qm', + 'DATA'), + ('PySide6\\translations\\qt_gd.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_gd.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_pt_BR.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_pt_BR.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_nn.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_nn.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_zh_TW.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_zh_TW.qm', + 'DATA'), + ('PySide6\\translations\\qt_bg.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_bg.qm', + 'DATA'), + ('PySide6\\translations\\qt_cs.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_cs.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_lv.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_lv.qm', + 'DATA'), + ('PySide6\\translations\\qt_uk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_uk.qm', + 'DATA'), + ('PySide6\\translations\\qt_de.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_de.qm', + 'DATA'), + ('PySide6\\translations\\qt_lt.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_lt.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ca.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ca.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ar.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ar.qm', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\RECORD', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\RECORD', + 'DATA'), + ('wheel-0.45.1.dist-info\\METADATA', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel-0.45.1.dist-info\\METADATA', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\REQUESTED', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\REQUESTED', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\WHEEL', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\WHEEL', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\top_level.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\top_level.txt', + 'DATA'), + ('wheel-0.45.1.dist-info\\RECORD', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel-0.45.1.dist-info\\RECORD', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\METADATA', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\METADATA', + 'DATA'), + ('wheel-0.45.1.dist-info\\LICENSE.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel-0.45.1.dist-info\\LICENSE.txt', + 'DATA'), + ('wheel-0.45.1.dist-info\\WHEEL', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel-0.45.1.dist-info\\WHEEL', + 'DATA'), + ('wheel-0.45.1.dist-info\\entry_points.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel-0.45.1.dist-info\\entry_points.txt', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\INSTALLER', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\INSTALLER', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\LICENSE.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\LICENSE.txt', + 'DATA'), + ('base_library.zip', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\base_library.zip', + 'DATA')], + [], + False, + False, + 1773053360, + [('run.exe', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PyInstaller\\bootloader\\Windows-64bit-intel\\run.exe', + 'EXECUTABLE')], + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\python310.dll') diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/PKG-00.toc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/PKG-00.toc new file mode 100644 index 0000000..df8e2ca --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/PKG-00.toc @@ -0,0 +1,1497 @@ +('D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\eq_designer_new.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:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\PYZ-00.pyz', + 'PYZ'), + ('struct', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\localpycs\\struct.pyc', + 'PYMODULE'), + ('pyimod01_archive', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\localpycs\\pyimod01_archive.pyc', + 'PYMODULE'), + ('pyimod02_importers', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\localpycs\\pyimod02_importers.pyc', + 'PYMODULE'), + ('pyimod03_ctypes', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\localpycs\\pyimod03_ctypes.pyc', + 'PYMODULE'), + ('pyimod04_pywin32', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\localpycs\\pyimod04_pywin32.pyc', + 'PYMODULE'), + ('pyiboot01_bootstrap', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py', + 'PYSOURCE'), + ('pyi_rth_inspect', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py', + 'PYSOURCE'), + ('pyi_rth_pkgutil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py', + 'PYSOURCE'), + ('pyi_rth_multiprocessing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py', + 'PYSOURCE'), + ('pyi_rth_pkgres', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgres.py', + 'PYSOURCE'), + ('pyi_rth_setuptools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_setuptools.py', + 'PYSOURCE'), + ('pyi_rth_pyside6', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pyside6.py', + 'PYSOURCE'), + ('pyi_rth_mplconfig', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_mplconfig.py', + 'PYSOURCE'), + ('eq_designer_new', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\eq_designer_new.py', + 'PYSOURCE'), + ('python310.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\python310.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qgif.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qgif.dll', + 'BINARY'), + ('PySide6\\plugins\\platforms\\qwindows.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\platforms\\qwindows.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qwbmp.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qwbmp.dll', + 'BINARY'), + ('PySide6\\plugins\\platforminputcontexts\\qtvirtualkeyboardplugin.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\platforminputcontexts\\qtvirtualkeyboardplugin.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qico.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qico.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qtga.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qtga.dll', + 'BINARY'), + ('PySide6\\plugins\\platforms\\qoffscreen.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\platforms\\qoffscreen.dll', + 'BINARY'), + ('PySide6\\plugins\\iconengines\\qsvgicon.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\iconengines\\qsvgicon.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qsvg.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qsvg.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qtiff.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qtiff.dll', + 'BINARY'), + ('PySide6\\plugins\\generic\\qtuiotouchplugin.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\generic\\qtuiotouchplugin.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qicns.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qicns.dll', + 'BINARY'), + ('PySide6\\plugins\\platforms\\qdirect2d.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\platforms\\qdirect2d.dll', + 'BINARY'), + ('PySide6\\plugins\\platforms\\qminimal.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\platforms\\qminimal.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qjpeg.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qjpeg.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qpdf.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qpdf.dll', + 'BINARY'), + ('PySide6\\plugins\\imageformats\\qwebp.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\imageformats\\qwebp.dll', + 'BINARY'), + ('PySide6\\opengl32sw.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\opengl32sw.dll', + 'BINARY'), + ('PySide6\\plugins\\networkinformation\\qnetworklistmanager.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\networkinformation\\qnetworklistmanager.dll', + 'BINARY'), + ('PySide6\\plugins\\tls\\qschannelbackend.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\tls\\qschannelbackend.dll', + 'BINARY'), + ('libssl-3-x64.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\libssl-3-x64.dll', + 'BINARY'), + ('libcrypto-3-x64.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\libcrypto-3-x64.dll', + 'BINARY'), + ('PySide6\\plugins\\tls\\qcertonlybackend.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\tls\\qcertonlybackend.dll', + 'BINARY'), + ('PySide6\\plugins\\tls\\qopensslbackend.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\tls\\qopensslbackend.dll', + 'BINARY'), + ('matplotlib.libs\\msvcp140-6547a4e8b7053d61be063c313b1addd0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib.libs\\msvcp140-6547a4e8b7053d61be063c313b1addd0.dll', + 'BINARY'), + ('numpy.libs\\msvcp140-d64049c6e3865410a7dda6a7e9f0c575.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy.libs\\msvcp140-d64049c6e3865410a7dda6a7e9f0c575.dll', + 'BINARY'), + ('numpy.libs\\libscipy_openblas64_-c16e4918366c6bc1f1cd71e28ca36fc0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy.libs\\libscipy_openblas64_-c16e4918366c6bc1f1cd71e28ca36fc0.dll', + 'BINARY'), + ('PySide6\\plugins\\styles\\qmodernwindowsstyle.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\plugins\\styles\\qmodernwindowsstyle.dll', + 'BINARY'), + ('_ctypes.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_ctypes.pyd', + 'EXTENSION'), + ('_decimal.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_decimal.pyd', + 'EXTENSION'), + ('_hashlib.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_hashlib.pyd', + 'EXTENSION'), + ('unicodedata.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\unicodedata.pyd', + 'EXTENSION'), + ('select.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\select.pyd', + 'EXTENSION'), + ('_socket.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_socket.pyd', + 'EXTENSION'), + ('_lzma.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_lzma.pyd', + 'EXTENSION'), + ('_bz2.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_bz2.pyd', + 'EXTENSION'), + ('_queue.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_queue.pyd', + 'EXTENSION'), + ('_overlapped.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_overlapped.pyd', + 'EXTENSION'), + ('_ssl.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_ssl.pyd', + 'EXTENSION'), + ('_multiprocessing.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_multiprocessing.pyd', + 'EXTENSION'), + ('pyexpat.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\pyexpat.pyd', + 'EXTENSION'), + ('_asyncio.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_asyncio.pyd', + 'EXTENSION'), + ('hid.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\hid.cp310-win_amd64.pyd', + 'EXTENSION'), + ('tornado\\speedups.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\speedups.pyd', + 'EXTENSION'), + ('win32\\win32evtlog.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\win32\\win32evtlog.pyd', + 'EXTENSION'), + ('win32\\win32api.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\win32\\win32api.pyd', + 'EXTENSION'), + ('matplotlib\\backends\\_backend_agg.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\_backend_agg.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\_path.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_path.cp310-win_amd64.pyd', + 'EXTENSION'), + ('markupsafe\\_speedups.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\markupsafe\\_speedups.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\ft2font.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\ft2font.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\_core\\_multiarray_umath.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_multiarray_umath.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\linalg\\_umath_linalg.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\linalg\\_umath_linalg.cp310-win_amd64.pyd', + 'EXTENSION'), + ('psutil\\_psutil_windows.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\psutil\\_psutil_windows.pyd', + 'EXTENSION'), + ('win32\\win32pdh.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\win32\\win32pdh.pyd', + 'EXTENSION'), + ('PIL\\_imaging.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_imaging.cp310-win_amd64.pyd', + 'EXTENSION'), + ('_uuid.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_uuid.pyd', + 'EXTENSION'), + ('PIL\\_webp.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_webp.cp310-win_amd64.pyd', + 'EXTENSION'), + ('PIL\\_imagingtk.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_imagingtk.cp310-win_amd64.pyd', + 'EXTENSION'), + ('PIL\\_imagingcms.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_imagingcms.cp310-win_amd64.pyd', + 'EXTENSION'), + ('PIL\\_imagingmath.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_imagingmath.cp310-win_amd64.pyd', + 'EXTENSION'), + ('_elementtree.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\DLLs\\_elementtree.pyd', + 'EXTENSION'), + ('shiboken6\\Shiboken.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\shiboken6\\Shiboken.pyd', + 'EXTENSION'), + ('PySide6\\QtGui.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\QtGui.pyd', + 'EXTENSION'), + ('PySide6\\QtNetwork.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\QtNetwork.pyd', + 'EXTENSION'), + ('kiwisolver\\_cext.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\kiwisolver\\_cext.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\_tri.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_tri.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\_qhull.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_qhull.cp310-win_amd64.pyd', + 'EXTENSION'), + ('contourpy\\_contourpy.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\_contourpy.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\_image.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_image.cp310-win_amd64.pyd', + 'EXTENSION'), + ('matplotlib\\_c_internal_utils.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_c_internal_utils.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\_core\\_multiarray_tests.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_multiarray_tests.cp310-win_amd64.pyd', + 'EXTENSION'), + ('charset_normalizer\\md__mypyc.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\md__mypyc.cp310-win_amd64.pyd', + 'EXTENSION'), + ('charset_normalizer\\md.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\md.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\mtrand.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\mtrand.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_sfc64.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_sfc64.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_philox.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_philox.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_pcg64.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_pcg64.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_mt19937.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_mt19937.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\bit_generator.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\bit_generator.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_generator.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_generator.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_bounded_integers.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_bounded_integers.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\random\\_common.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_common.cp310-win_amd64.pyd', + 'EXTENSION'), + ('numpy\\fft\\_pocketfft_umath.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\fft\\_pocketfft_umath.cp310-win_amd64.pyd', + 'EXTENSION'), + ('yaml\\_yaml.cp310-win_amd64.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\_yaml.cp310-win_amd64.pyd', + 'EXTENSION'), + ('PySide6\\QtCore.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\QtCore.pyd', + 'EXTENSION'), + ('PySide6\\QtWidgets.pyd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\QtWidgets.pyd', + 'EXTENSION'), + ('zlib.dll', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\zlib.dll', 'BINARY'), + ('api-ms-win-crt-environment-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-environment-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-stdio-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-stdio-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-locale-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-locale-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-process-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-process-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-conio-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-conio-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-math-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-math-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-string-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-string-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-runtime-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-runtime-l1-1-0.dll', + 'BINARY'), + ('VCRUNTIME140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\VCRUNTIME140.dll', + 'BINARY'), + ('api-ms-win-crt-heap-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-heap-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-filesystem-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-filesystem-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-convert-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-convert-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-crt-time-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-time-l1-1-0.dll', + 'BINARY'), + ('PySide6\\Qt6Gui.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Gui.dll', + 'BINARY'), + ('PySide6\\Qt6Core.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Core.dll', + 'BINARY'), + ('MSVCP140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\MSVCP140.dll', + 'BINARY'), + ('VCRUNTIME140_1.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\VCRUNTIME140_1.dll', + 'BINARY'), + ('PySide6\\Qt6VirtualKeyboard.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6VirtualKeyboard.dll', + 'BINARY'), + ('PySide6\\Qt6Svg.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Svg.dll', + 'BINARY'), + ('api-ms-win-crt-utility-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-utility-l1-1-0.dll', + 'BINARY'), + ('PySide6\\Qt6Network.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Network.dll', + 'BINARY'), + ('PySide6\\Qt6Pdf.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Pdf.dll', + 'BINARY'), + ('api-ms-win-crt-private-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-crt-private-l1-1-0.dll', + 'BINARY'), + ('PySide6\\Qt6Widgets.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Widgets.dll', + 'BINARY'), + ('ffi-8.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\ffi-8.dll', + 'BINARY'), + ('liblzma.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\liblzma.dll', + 'BINARY'), + ('libbz2.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\libbz2.dll', + 'BINARY'), + ('libexpat.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Library\\bin\\libexpat.dll', + 'BINARY'), + ('python3.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\python3.dll', + 'BINARY'), + ('pywin32_system32\\pywintypes310.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pywin32_system32\\pywintypes310.dll', + 'BINARY'), + ('shiboken6\\shiboken6.abi3.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\shiboken6\\shiboken6.abi3.dll', + 'BINARY'), + ('shiboken6\\VCRUNTIME140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\shiboken6\\VCRUNTIME140.dll', + 'BINARY'), + ('shiboken6\\VCRUNTIME140_1.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\shiboken6\\VCRUNTIME140_1.dll', + 'BINARY'), + ('PySide6\\MSVCP140_2.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\MSVCP140_2.dll', + 'BINARY'), + ('PySide6\\VCRUNTIME140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\VCRUNTIME140.dll', + 'BINARY'), + ('PySide6\\MSVCP140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\MSVCP140.dll', + 'BINARY'), + ('PySide6\\VCRUNTIME140_1.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\VCRUNTIME140_1.dll', + 'BINARY'), + ('PySide6\\pyside6.abi3.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\pyside6.abi3.dll', + 'BINARY'), + ('ucrtbase.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\ucrtbase.dll', + 'BINARY'), + ('PySide6\\MSVCP140_1.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\MSVCP140_1.dll', + 'BINARY'), + ('api-ms-win-core-synch-l1-2-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-synch-l1-2-0.dll', + 'BINARY'), + ('PySide6\\Qt6Qml.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Qml.dll', + 'BINARY'), + ('PySide6\\Qt6Quick.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6Quick.dll', + 'BINARY'), + ('shiboken6\\MSVCP140.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\shiboken6\\MSVCP140.dll', + 'BINARY'), + ('api-ms-win-core-heap-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-heap-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-handle-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-handle-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-string-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-string-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-file-l2-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-file-l2-1-0.dll', + 'BINARY'), + ('api-ms-win-core-errorhandling-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-errorhandling-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-file-l1-2-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-file-l1-2-0.dll', + 'BINARY'), + ('api-ms-win-core-interlocked-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-interlocked-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-timezone-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-timezone-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-processenvironment-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-processenvironment-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-memory-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-memory-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-libraryloader-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-libraryloader-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-datetime-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-datetime-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-synch-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-synch-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-profile-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-profile-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-console-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-console-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-processthreads-l1-1-1.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-processthreads-l1-1-1.dll', + 'BINARY'), + ('api-ms-win-core-util-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-util-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-fibers-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-fibers-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-namedpipe-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-namedpipe-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-processthreads-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-processthreads-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-rtlsupport-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-rtlsupport-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-file-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-file-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-sysinfo-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-sysinfo-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-debug-l1-1-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-debug-l1-1-0.dll', + 'BINARY'), + ('api-ms-win-core-localization-l1-2-0.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\api-ms-win-core-localization-l1-2-0.dll', + 'BINARY'), + ('PySide6\\Qt6QmlModels.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6QmlModels.dll', + 'BINARY'), + ('PySide6\\Qt6QmlMeta.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6QmlMeta.dll', + 'BINARY'), + ('PySide6\\Qt6OpenGL.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6OpenGL.dll', + 'BINARY'), + ('PySide6\\Qt6QmlWorkerScript.dll', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\Lib\\site-packages\\PySide6\\Qt6QmlWorkerScript.dll', + 'BINARY'), + ('setuptools\\_vendor\\jaraco\\text\\Lorem ipsum.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\jaraco\\text\\Lorem ' + 'ipsum.txt', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\LICENSE', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\LICENSE', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\RECORD', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\RECORD', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\METADATA', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\METADATA', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\REQUESTED', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\REQUESTED', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\WHEEL', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\WHEEL', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\INSTALLER', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\INSTALLER', + 'DATA'), + ('setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\top_level.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata-8.0.0.dist-info\\top_level.txt', + 'DATA'), + ('dateutil\\zoneinfo\\dateutil-zoneinfo.tar.gz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\zoneinfo\\dateutil-zoneinfo.tar.gz', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\putri8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\putri8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizOneSymReg.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizOneSymReg.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pbkd8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pbkd8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmb10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmb10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizOneSymBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizOneSymBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\fivethirtyeight.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\fivethirtyeight.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-pastel.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-pastel.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\logo2.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\logo2.png', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-talk.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-talk.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvr8an.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvr8an.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFiveSymReg.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFiveSymReg.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralItalic.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralItalic.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\home.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\home.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\cmr10.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\cmr10.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvl8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvl8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-BoldOblique.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-BoldOblique.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\zoom_to_rect.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\zoom_to_rect.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniBolIta.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniBolIta.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\zoom_to_rect.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\zoom_to_rect.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\filesave.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\filesave.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-Bold.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-Bold.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\putr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\putr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pagdo8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pagdo8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pagk8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pagk8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-Oblique.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-Oblique.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\filesave.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\filesave.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmr10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmr10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\forward.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\forward.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-BoldOblique.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-BoldOblique.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\move_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\move_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-BoldItalic.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-BoldItalic.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\home.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\home.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\grace_hopper.jpg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\grace_hopper.jpg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\ptmb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\ptmb8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\help.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\help.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pplb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pplb8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-Bold.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-Bold.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pzdr.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pzdr.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-BoldOblique.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier-BoldOblique.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\classic.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\classic.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\back-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\back-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pplr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pplr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-poster.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-poster.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\tableau-colorblind10.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\tableau-colorblind10.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvbo8an.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvbo8an.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pplbi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pplbi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-Oblique.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-Oblique.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\forward.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\forward.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmss10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmss10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\msft.csv', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\msft.csv', + 'DATA'), + ('matplotlib\\mpl-data\\images\\hand.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\hand.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvro8an.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvro8an.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Symbol.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Symbol.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmtt10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmtt10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\home_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\home_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\images\\matplotlib_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\matplotlib_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\images\\qt4_editor_options.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\qt4_editor_options.png', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-dark-palette.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-dark-palette.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\README.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\README.txt', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-muted.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-muted.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\help-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\help-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pbkli8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pbkli8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\psyr.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\psyr.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\cmex10.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\cmex10.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\fast.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\fast.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pncb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pncb8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\qt4_editor_options_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\qt4_editor_options_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\putbi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\putbi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\subplots.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\subplots.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmsy10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmsy10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\topobathy.npz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\topobathy.npz', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\jacksboro_fault_dem.npz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\jacksboro_fault_dem.npz', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pncbi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pncbi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\subplots_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\subplots_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\kpsewhich.lua', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\kpsewhich.lua', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pbkl8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pbkl8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\subplots-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\subplots-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pbkdi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pbkdi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Italic.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Italic.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-Bold.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-Bold.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\back_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\back_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\LICENSE_STIX', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\LICENSE_STIX', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-Italic.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-Italic.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\membrane.dat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\membrane.dat', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\readme.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\readme.txt', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\zoom_to_rect-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\zoom_to_rect-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvro8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvro8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\ZapfDingbats.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\ZapfDingbats.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-Oblique.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-Oblique.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\home.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\home.png', + 'DATA'), + ('matplotlib\\mpl-data\\images\\forward_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\forward_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pcrb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pcrb8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\hand.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\hand.png', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\dark_background.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\dark_background.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\plot_directive\\plot_directive.css', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\plot_directive\\plot_directive.css', + 'DATA'), + ('matplotlib\\mpl-data\\matplotlibrc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc', + 'DATA'), + ('matplotlib\\mpl-data\\images\\filesave.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\filesave.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-ticks.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-ticks.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\_mpl-gallery.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\_mpl-gallery.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\subplots.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\subplots.png', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\Stocks.csv', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\Stocks.csv', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-Oblique.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-Oblique.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\filesave-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\filesave-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\grayscale.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\grayscale.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\cmtt10.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\cmtt10.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-BoldItalic.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-BoldItalic.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pagko8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pagko8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Courier.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizThreeSymReg.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizThreeSymReg.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvlo8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvlo8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\move.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\move.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\move.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\move.svg', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\_mpl-gallery-nogrid.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\_mpl-gallery-nogrid.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\ptmr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\ptmr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\eeg.dat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\eeg.dat', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-deep.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-deep.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\back.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\back.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-Bold.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansMono-Bold.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFourSymBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFourSymBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\axes_grid\\bivariate_normal.npy', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\axes_grid\\bivariate_normal.npy', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pncr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pncr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\help.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\help.png', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\Minduka_Present_Blue_Pack.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\Minduka_Present_Blue_Pack.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pncri8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pncri8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizTwoSymReg.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizTwoSymReg.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-Bold.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Helvetica-Bold.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\forward-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\forward-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pzcmi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pzcmi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvbo8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvbo8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\ptmri8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\ptmri8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\move.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\move.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\embedding_in_wx3.xrc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\embedding_in_wx3.xrc', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\goog.npz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\goog.npz', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFourSymReg.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizFourSymReg.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\zoom_to_rect.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\zoom_to_rect.png', + 'DATA'), + ('matplotlib\\mpl-data\\images\\help_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\help_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansDisplay.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSansDisplay.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-dark.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-dark.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\matplotlib.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\matplotlib.svg', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-white.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-white.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\forward.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\forward.svg', + 'DATA'), + ('matplotlib\\mpl-data\\images\\move-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\move-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-bright.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-bright.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmex10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmex10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\ggplot.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\ggplot.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizThreeSymBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizThreeSymBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\cmmi10.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\cmmi10.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\bmh.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\bmh.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\s1045.ima.gz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\s1045.ima.gz', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Bold.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Bold.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\matplotlib.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\matplotlib.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\ptmbi8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\ptmbi8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-whitegrid.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-whitegrid.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pcrro8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pcrro8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\qt4_editor_options.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\qt4_editor_options.svg', + 'DATA'), + ('matplotlib\\mpl-data\\images\\matplotlib.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\matplotlib.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-colorblind.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-colorblind.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\home-symbolic.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\home-symbolic.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXSizTwoSymBol.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXSizTwoSymBol.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\_classic_test_patch.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\_classic_test_patch.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-BoldOblique.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans-BoldOblique.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\qt4_editor_options.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\qt4_editor_options.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\subplots.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\subplots.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pagd8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pagd8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\images\\back.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\back.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\sample_data\\data_x_x2_x3.csv', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\sample_data\\data_x_x2_x3.csv', + 'DATA'), + ('matplotlib\\mpl-data\\images\\filesave_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\filesave_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Roman.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\pdfcorefonts\\Times-Roman.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\cmsy10.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\cmsy10.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\LICENSE_DEJAVU', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\LICENSE_DEJAVU', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvb8an.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvb8an.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-paper.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-paper.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralBolIta.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneralBolIta.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerifDisplay.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerifDisplay.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pcrr8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pcrr8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneral.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXGeneral.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\help.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\help.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\Solarize_Light2.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\Solarize_Light2.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pcrbo8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pcrbo8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-darkgrid.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-darkgrid.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\images\\back.svg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\back.svg', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUni.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUni.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\hand.pdf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\hand.pdf', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\pplri8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\pplri8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-notebook.mplstyle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\stylelib\\seaborn-v0_8-notebook.mplstyle', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\cmmi10.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\cmmi10.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniIta.ttf', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\STIXNonUniIta.ttf', + 'DATA'), + ('matplotlib\\mpl-data\\images\\zoom_to_rect_large.png', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\images\\zoom_to_rect_large.png', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\phvb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\phvb8a.afm', + 'DATA'), + ('matplotlib\\mpl-data\\fonts\\afm\\putb8a.afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\afm\\putb8a.afm', + 'DATA'), + ('certifi\\py.typed', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\certifi\\py.typed', + 'DATA'), + ('certifi\\cacert.pem', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\certifi\\cacert.pem', + 'DATA'), + ('PySide6\\translations\\qt_help_it.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_it.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_gd.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_gd.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_fi.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_fi.qm', + 'DATA'), + ('PySide6\\translations\\qt_fr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_fr.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ka.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ka.qm', + 'DATA'), + ('PySide6\\translations\\qt_ka.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ka.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_bg.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_bg.qm', + 'DATA'), + ('PySide6\\translations\\qt_ko.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ko.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_es.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_es.qm', + 'DATA'), + ('PySide6\\translations\\qt_gl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_gl.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ko.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ko.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ru.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ru.qm', + 'DATA'), + ('PySide6\\translations\\qt_nn.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_nn.qm', + 'DATA'), + ('PySide6\\translations\\qt_he.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_he.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_tr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_tr.qm', + 'DATA'), + ('PySide6\\translations\\qt_it.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_it.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_sk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_sk.qm', + 'DATA'), + ('PySide6\\translations\\qt_hr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_hr.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ar.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ar.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_fr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_fr.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_en.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_en.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_cs.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_cs.qm', + 'DATA'), + ('PySide6\\translations\\qt_hu.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_hu.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_sk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_sk.qm', + 'DATA'), + ('PySide6\\translations\\qt_sv.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_sv.qm', + 'DATA'), + ('PySide6\\translations\\qt_zh_CN.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_zh_CN.qm', + 'DATA'), + ('PySide6\\translations\\qt_pl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_pl.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_it.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_it.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ru.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ru.qm', + 'DATA'), + ('PySide6\\translations\\qt_ar.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ar.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ko.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ko.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ja.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ja.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_tr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_tr.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_zh_CN.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_zh_CN.qm', + 'DATA'), + ('PySide6\\translations\\qt_en.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_en.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_fa.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_fa.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_nl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_nl.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_de.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_de.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_es.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_es.qm', + 'DATA'), + ('PySide6\\translations\\qt_sl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_sl.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_da.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_da.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_he.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_he.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ca.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ca.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_nl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_nl.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_cs.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_cs.qm', + 'DATA'), + ('PySide6\\translations\\qt_sk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_sk.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_pl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_pl.qm', + 'DATA'), + ('PySide6\\translations\\qt_ca.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ca.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_hu.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_hu.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_uk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_uk.qm', + 'DATA'), + ('PySide6\\translations\\qt_lv.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_lv.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ja.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ja.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_gl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_gl.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_hr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_hr.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ka.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ka.qm', + 'DATA'), + ('PySide6\\translations\\qt_es.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_es.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_hu.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_hu.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_hr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_hr.qm', + 'DATA'), + ('PySide6\\translations\\qt_fa.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_fa.qm', + 'DATA'), + ('PySide6\\translations\\qt_da.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_da.qm', + 'DATA'), + ('PySide6\\translations\\qt_nl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_nl.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_uk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_uk.qm', + 'DATA'), + ('PySide6\\translations\\qt_fi.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_fi.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_pl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_pl.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_zh_TW.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_zh_TW.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_sl.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_sl.qm', + 'DATA'), + ('PySide6\\translations\\qt_pt_PT.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_pt_PT.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_da.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_da.qm', + 'DATA'), + ('PySide6\\translations\\qt_pt_BR.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_pt_BR.qm', + 'DATA'), + ('PySide6\\translations\\qt_ja.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ja.qm', + 'DATA'), + ('PySide6\\translations\\qt_zh_TW.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_zh_TW.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_en.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_en.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_zh_CN.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_zh_CN.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_bg.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_bg.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_fr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_fr.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_pt_BR.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_pt_BR.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_de.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_de.qm', + 'DATA'), + ('PySide6\\translations\\qt_tr.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_tr.qm', + 'DATA'), + ('PySide6\\translations\\qt_ru.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_ru.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_nn.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_nn.qm', + 'DATA'), + ('PySide6\\translations\\qt_gd.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_gd.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_pt_BR.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_pt_BR.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_nn.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_nn.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_zh_TW.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_zh_TW.qm', + 'DATA'), + ('PySide6\\translations\\qt_bg.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_bg.qm', + 'DATA'), + ('PySide6\\translations\\qt_cs.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_cs.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_lv.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_lv.qm', + 'DATA'), + ('PySide6\\translations\\qt_uk.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_uk.qm', + 'DATA'), + ('PySide6\\translations\\qt_de.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_de.qm', + 'DATA'), + ('PySide6\\translations\\qt_lt.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_lt.qm', + 'DATA'), + ('PySide6\\translations\\qt_help_ca.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qt_help_ca.qm', + 'DATA'), + ('PySide6\\translations\\qtbase_ar.qm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\translations\\qtbase_ar.qm', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\RECORD', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\RECORD', + 'DATA'), + ('wheel-0.45.1.dist-info\\METADATA', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel-0.45.1.dist-info\\METADATA', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\REQUESTED', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\REQUESTED', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\WHEEL', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\WHEEL', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\top_level.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\top_level.txt', + 'DATA'), + ('wheel-0.45.1.dist-info\\RECORD', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel-0.45.1.dist-info\\RECORD', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\METADATA', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\METADATA', + 'DATA'), + ('wheel-0.45.1.dist-info\\LICENSE.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel-0.45.1.dist-info\\LICENSE.txt', + 'DATA'), + ('wheel-0.45.1.dist-info\\WHEEL', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel-0.45.1.dist-info\\WHEEL', + 'DATA'), + ('wheel-0.45.1.dist-info\\entry_points.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel-0.45.1.dist-info\\entry_points.txt', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\INSTALLER', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\INSTALLER', + 'DATA'), + ('MarkupSafe-3.0.2.dist-info\\LICENSE.txt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\MarkupSafe-3.0.2.dist-info\\LICENSE.txt', + 'DATA'), + ('base_library.zip', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\base_library.zip', + 'DATA')], + 'python310.dll', + False, + False, + False, + [], + None, + None, + None) diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/PYZ-00.pyz b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/PYZ-00.pyz new file mode 100644 index 0000000..8579bd2 Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/PYZ-00.pyz differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/PYZ-00.toc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/PYZ-00.toc new file mode 100644 index 0000000..4cc0218 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/PYZ-00.toc @@ -0,0 +1,2823 @@ +('D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\build\\eq_designer_new\\PYZ-00.pyz', + [('PIL', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\__init__.py', + 'PYMODULE'), + ('PIL.BlpImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\BlpImagePlugin.py', + 'PYMODULE'), + ('PIL.BmpImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\BmpImagePlugin.py', + 'PYMODULE'), + ('PIL.BufrStubImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\BufrStubImagePlugin.py', + 'PYMODULE'), + ('PIL.CurImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\CurImagePlugin.py', + 'PYMODULE'), + ('PIL.DcxImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\DcxImagePlugin.py', + 'PYMODULE'), + ('PIL.DdsImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\DdsImagePlugin.py', + 'PYMODULE'), + ('PIL.EpsImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\EpsImagePlugin.py', + 'PYMODULE'), + ('PIL.ExifTags', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ExifTags.py', + 'PYMODULE'), + ('PIL.FitsImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\FitsImagePlugin.py', + 'PYMODULE'), + ('PIL.FliImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\FliImagePlugin.py', + 'PYMODULE'), + ('PIL.FpxImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\FpxImagePlugin.py', + 'PYMODULE'), + ('PIL.FtexImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\FtexImagePlugin.py', + 'PYMODULE'), + ('PIL.GbrImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\GbrImagePlugin.py', + 'PYMODULE'), + ('PIL.GifImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\GifImagePlugin.py', + 'PYMODULE'), + ('PIL.GimpGradientFile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\GimpGradientFile.py', + 'PYMODULE'), + ('PIL.GimpPaletteFile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\GimpPaletteFile.py', + 'PYMODULE'), + ('PIL.GribStubImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\GribStubImagePlugin.py', + 'PYMODULE'), + ('PIL.Hdf5StubImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\Hdf5StubImagePlugin.py', + 'PYMODULE'), + ('PIL.IcnsImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\IcnsImagePlugin.py', + 'PYMODULE'), + ('PIL.IcoImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\IcoImagePlugin.py', + 'PYMODULE'), + ('PIL.ImImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImImagePlugin.py', + 'PYMODULE'), + ('PIL.Image', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\Image.py', + 'PYMODULE'), + ('PIL.ImageChops', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageChops.py', + 'PYMODULE'), + ('PIL.ImageCms', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageCms.py', + 'PYMODULE'), + ('PIL.ImageColor', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageColor.py', + 'PYMODULE'), + ('PIL.ImageFile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageFile.py', + 'PYMODULE'), + ('PIL.ImageFilter', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageFilter.py', + 'PYMODULE'), + ('PIL.ImageMath', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageMath.py', + 'PYMODULE'), + ('PIL.ImageMode', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageMode.py', + 'PYMODULE'), + ('PIL.ImageOps', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageOps.py', + 'PYMODULE'), + ('PIL.ImagePalette', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImagePalette.py', + 'PYMODULE'), + ('PIL.ImageQt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageQt.py', + 'PYMODULE'), + ('PIL.ImageSequence', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageSequence.py', + 'PYMODULE'), + ('PIL.ImageShow', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageShow.py', + 'PYMODULE'), + ('PIL.ImageTk', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageTk.py', + 'PYMODULE'), + ('PIL.ImageWin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImageWin.py', + 'PYMODULE'), + ('PIL.ImtImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\ImtImagePlugin.py', + 'PYMODULE'), + ('PIL.IptcImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\IptcImagePlugin.py', + 'PYMODULE'), + ('PIL.Jpeg2KImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\Jpeg2KImagePlugin.py', + 'PYMODULE'), + ('PIL.JpegImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\JpegImagePlugin.py', + 'PYMODULE'), + ('PIL.JpegPresets', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\JpegPresets.py', + 'PYMODULE'), + ('PIL.McIdasImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\McIdasImagePlugin.py', + 'PYMODULE'), + ('PIL.MicImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\MicImagePlugin.py', + 'PYMODULE'), + ('PIL.MpegImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\MpegImagePlugin.py', + 'PYMODULE'), + ('PIL.MpoImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\MpoImagePlugin.py', + 'PYMODULE'), + ('PIL.MspImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\MspImagePlugin.py', + 'PYMODULE'), + ('PIL.PaletteFile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PaletteFile.py', + 'PYMODULE'), + ('PIL.PalmImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PalmImagePlugin.py', + 'PYMODULE'), + ('PIL.PcdImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PcdImagePlugin.py', + 'PYMODULE'), + ('PIL.PcxImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PcxImagePlugin.py', + 'PYMODULE'), + ('PIL.PdfImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PdfImagePlugin.py', + 'PYMODULE'), + ('PIL.PdfParser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PdfParser.py', + 'PYMODULE'), + ('PIL.PixarImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PixarImagePlugin.py', + 'PYMODULE'), + ('PIL.PngImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PngImagePlugin.py', + 'PYMODULE'), + ('PIL.PpmImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PpmImagePlugin.py', + 'PYMODULE'), + ('PIL.PsdImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\PsdImagePlugin.py', + 'PYMODULE'), + ('PIL.QoiImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\QoiImagePlugin.py', + 'PYMODULE'), + ('PIL.SgiImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\SgiImagePlugin.py', + 'PYMODULE'), + ('PIL.SpiderImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\SpiderImagePlugin.py', + 'PYMODULE'), + ('PIL.SunImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\SunImagePlugin.py', + 'PYMODULE'), + ('PIL.TgaImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\TgaImagePlugin.py', + 'PYMODULE'), + ('PIL.TiffImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\TiffImagePlugin.py', + 'PYMODULE'), + ('PIL.TiffTags', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\TiffTags.py', + 'PYMODULE'), + ('PIL.WebPImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\WebPImagePlugin.py', + 'PYMODULE'), + ('PIL.WmfImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\WmfImagePlugin.py', + 'PYMODULE'), + ('PIL.XVThumbImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\XVThumbImagePlugin.py', + 'PYMODULE'), + ('PIL.XbmImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\XbmImagePlugin.py', + 'PYMODULE'), + ('PIL.XpmImagePlugin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\XpmImagePlugin.py', + 'PYMODULE'), + ('PIL._binary', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_binary.py', + 'PYMODULE'), + ('PIL._deprecate', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_deprecate.py', + 'PYMODULE'), + ('PIL._typing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_typing.py', + 'PYMODULE'), + ('PIL._util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_util.py', + 'PYMODULE'), + ('PIL._version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\_version.py', + 'PYMODULE'), + ('PIL.features', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PIL\\features.py', + 'PYMODULE'), + ('PySide6', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\__init__.py', + 'PYMODULE'), + ('PySide6.support', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\support\\__init__.py', + 'PYMODULE'), + ('PySide6.support.deprecated', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PySide6\\support\\deprecated.py', + 'PYMODULE'), + ('__future__', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\__future__.py', + 'PYMODULE'), + ('_aix_support', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_aix_support.py', + 'PYMODULE'), + ('_bootsubprocess', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_bootsubprocess.py', + 'PYMODULE'), + ('_compat_pickle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_compat_pickle.py', + 'PYMODULE'), + ('_compression', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_compression.py', + 'PYMODULE'), + ('_distutils_hack', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\_distutils_hack\\__init__.py', + 'PYMODULE'), + ('_distutils_hack.override', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\_distutils_hack\\override.py', + 'PYMODULE'), + ('_osx_support', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_osx_support.py', + 'PYMODULE'), + ('_py_abc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_py_abc.py', + 'PYMODULE'), + ('_pydecimal', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_pydecimal.py', + 'PYMODULE'), + ('_pyi_rth_utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PyInstaller\\fake-modules\\_pyi_rth_utils\\__init__.py', + 'PYMODULE'), + ('_pyi_rth_utils._win32', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PyInstaller\\fake-modules\\_pyi_rth_utils\\_win32.py', + 'PYMODULE'), + ('_pyi_rth_utils.qt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PyInstaller\\fake-modules\\_pyi_rth_utils\\qt.py', + 'PYMODULE'), + ('_pyi_rth_utils.tempfile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\PyInstaller\\fake-modules\\_pyi_rth_utils\\tempfile.py', + 'PYMODULE'), + ('_sitebuiltins', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_sitebuiltins.py', + 'PYMODULE'), + ('_strptime', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_strptime.py', + 'PYMODULE'), + ('_threading_local', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\_threading_local.py', + 'PYMODULE'), + ('argparse', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\argparse.py', + 'PYMODULE'), + ('ast', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\ast.py', 'PYMODULE'), + ('asyncio', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\__init__.py', + 'PYMODULE'), + ('asyncio.base_events', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\base_events.py', + 'PYMODULE'), + ('asyncio.base_futures', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\base_futures.py', + 'PYMODULE'), + ('asyncio.base_subprocess', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\base_subprocess.py', + 'PYMODULE'), + ('asyncio.base_tasks', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\base_tasks.py', + 'PYMODULE'), + ('asyncio.constants', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\constants.py', + 'PYMODULE'), + ('asyncio.coroutines', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\coroutines.py', + 'PYMODULE'), + ('asyncio.events', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\events.py', + 'PYMODULE'), + ('asyncio.exceptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\exceptions.py', + 'PYMODULE'), + ('asyncio.format_helpers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\format_helpers.py', + 'PYMODULE'), + ('asyncio.futures', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\futures.py', + 'PYMODULE'), + ('asyncio.locks', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\locks.py', + 'PYMODULE'), + ('asyncio.log', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\log.py', + 'PYMODULE'), + ('asyncio.mixins', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\mixins.py', + 'PYMODULE'), + ('asyncio.proactor_events', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\proactor_events.py', + 'PYMODULE'), + ('asyncio.protocols', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\protocols.py', + 'PYMODULE'), + ('asyncio.queues', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\queues.py', + 'PYMODULE'), + ('asyncio.runners', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\runners.py', + 'PYMODULE'), + ('asyncio.selector_events', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\selector_events.py', + 'PYMODULE'), + ('asyncio.sslproto', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\sslproto.py', + 'PYMODULE'), + ('asyncio.staggered', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\staggered.py', + 'PYMODULE'), + ('asyncio.streams', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\streams.py', + 'PYMODULE'), + ('asyncio.subprocess', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\subprocess.py', + 'PYMODULE'), + ('asyncio.tasks', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\tasks.py', + 'PYMODULE'), + ('asyncio.threads', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\threads.py', + 'PYMODULE'), + ('asyncio.transports', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\transports.py', + 'PYMODULE'), + ('asyncio.trsock', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\trsock.py', + 'PYMODULE'), + ('asyncio.unix_events', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\unix_events.py', + 'PYMODULE'), + ('asyncio.windows_events', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\windows_events.py', + 'PYMODULE'), + ('asyncio.windows_utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\asyncio\\windows_utils.py', + 'PYMODULE'), + ('backports', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\backports\\__init__.py', + 'PYMODULE'), + ('base64', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\base64.py', + 'PYMODULE'), + ('bdb', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\bdb.py', 'PYMODULE'), + ('bisect', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\bisect.py', + 'PYMODULE'), + ('bz2', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\bz2.py', 'PYMODULE'), + ('calendar', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\calendar.py', + 'PYMODULE'), + ('certifi', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\certifi\\__init__.py', + 'PYMODULE'), + ('certifi.core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\certifi\\core.py', + 'PYMODULE'), + ('cgi', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\cgi.py', 'PYMODULE'), + ('charset_normalizer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\__init__.py', + 'PYMODULE'), + ('charset_normalizer.api', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\api.py', + 'PYMODULE'), + ('charset_normalizer.cd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\cd.py', + 'PYMODULE'), + ('charset_normalizer.constant', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\constant.py', + 'PYMODULE'), + ('charset_normalizer.legacy', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\legacy.py', + 'PYMODULE'), + ('charset_normalizer.models', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\models.py', + 'PYMODULE'), + ('charset_normalizer.utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\utils.py', + 'PYMODULE'), + ('charset_normalizer.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\charset_normalizer\\version.py', + 'PYMODULE'), + ('cmd', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\cmd.py', 'PYMODULE'), + ('code', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\code.py', 'PYMODULE'), + ('codeop', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\codeop.py', + 'PYMODULE'), + ('colorama', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\colorama\\__init__.py', + 'PYMODULE'), + ('colorama.ansi', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\colorama\\ansi.py', + 'PYMODULE'), + ('colorama.ansitowin32', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\colorama\\ansitowin32.py', + 'PYMODULE'), + ('colorama.initialise', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\colorama\\initialise.py', + 'PYMODULE'), + ('colorama.win32', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\colorama\\win32.py', + 'PYMODULE'), + ('colorama.winterm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\colorama\\winterm.py', + 'PYMODULE'), + ('colorsys', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\colorsys.py', + 'PYMODULE'), + ('concurrent', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\concurrent\\__init__.py', + 'PYMODULE'), + ('concurrent.futures', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\concurrent\\futures\\__init__.py', + 'PYMODULE'), + ('concurrent.futures._base', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\concurrent\\futures\\_base.py', + 'PYMODULE'), + ('concurrent.futures.process', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\concurrent\\futures\\process.py', + 'PYMODULE'), + ('concurrent.futures.thread', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\concurrent\\futures\\thread.py', + 'PYMODULE'), + ('configparser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\configparser.py', + 'PYMODULE'), + ('contextlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\contextlib.py', + 'PYMODULE'), + ('contextvars', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\contextvars.py', + 'PYMODULE'), + ('contourpy', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\__init__.py', + 'PYMODULE'), + ('contourpy._version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\_version.py', + 'PYMODULE'), + ('contourpy.array', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\array.py', + 'PYMODULE'), + ('contourpy.chunk', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\chunk.py', + 'PYMODULE'), + ('contourpy.convert', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\convert.py', + 'PYMODULE'), + ('contourpy.dechunk', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\dechunk.py', + 'PYMODULE'), + ('contourpy.enum_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\enum_util.py', + 'PYMODULE'), + ('contourpy.typecheck', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\typecheck.py', + 'PYMODULE'), + ('contourpy.types', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\contourpy\\types.py', + 'PYMODULE'), + ('copy', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\copy.py', 'PYMODULE'), + ('csv', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\csv.py', 'PYMODULE'), + ('ctypes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\ctypes\\__init__.py', + 'PYMODULE'), + ('ctypes._endian', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\ctypes\\_endian.py', + 'PYMODULE'), + ('ctypes.wintypes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\ctypes\\wintypes.py', + 'PYMODULE'), + ('curses', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\curses\\__init__.py', + 'PYMODULE'), + ('curses.has_key', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\curses\\has_key.py', + 'PYMODULE'), + ('cycler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\cycler\\__init__.py', + 'PYMODULE'), + ('dataclasses', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\dataclasses.py', + 'PYMODULE'), + ('datetime', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\datetime.py', + 'PYMODULE'), + ('dateutil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\__init__.py', + 'PYMODULE'), + ('dateutil._common', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\_common.py', + 'PYMODULE'), + ('dateutil._version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\_version.py', + 'PYMODULE'), + ('dateutil.easter', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\easter.py', + 'PYMODULE'), + ('dateutil.parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\parser\\__init__.py', + 'PYMODULE'), + ('dateutil.parser._parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\parser\\_parser.py', + 'PYMODULE'), + ('dateutil.parser.isoparser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\parser\\isoparser.py', + 'PYMODULE'), + ('dateutil.relativedelta', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\relativedelta.py', + 'PYMODULE'), + ('dateutil.rrule', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\rrule.py', + 'PYMODULE'), + ('dateutil.tz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\tz\\__init__.py', + 'PYMODULE'), + ('dateutil.tz._common', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\tz\\_common.py', + 'PYMODULE'), + ('dateutil.tz._factories', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\tz\\_factories.py', + 'PYMODULE'), + ('dateutil.tz.tz', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\tz\\tz.py', + 'PYMODULE'), + ('dateutil.tz.win', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\tz\\win.py', + 'PYMODULE'), + ('dateutil.zoneinfo', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\dateutil\\zoneinfo\\__init__.py', + 'PYMODULE'), + ('decimal', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\decimal.py', + 'PYMODULE'), + ('defusedxml', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\__init__.py', + 'PYMODULE'), + ('defusedxml.ElementTree', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\ElementTree.py', + 'PYMODULE'), + ('defusedxml.cElementTree', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\cElementTree.py', + 'PYMODULE'), + ('defusedxml.common', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\common.py', + 'PYMODULE'), + ('defusedxml.expatbuilder', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\expatbuilder.py', + 'PYMODULE'), + ('defusedxml.expatreader', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\expatreader.py', + 'PYMODULE'), + ('defusedxml.minidom', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\minidom.py', + 'PYMODULE'), + ('defusedxml.pulldom', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\pulldom.py', + 'PYMODULE'), + ('defusedxml.sax', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\sax.py', + 'PYMODULE'), + ('defusedxml.xmlrpc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\defusedxml\\xmlrpc.py', + 'PYMODULE'), + ('difflib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\difflib.py', + 'PYMODULE'), + ('dis', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\dis.py', 'PYMODULE'), + ('distutils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\__init__.py', + 'PYMODULE'), + ('distutils._msvccompiler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\_msvccompiler.py', + 'PYMODULE'), + ('distutils.archive_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\archive_util.py', + 'PYMODULE'), + ('distutils.ccompiler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\ccompiler.py', + 'PYMODULE'), + ('distutils.cmd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\cmd.py', + 'PYMODULE'), + ('distutils.command', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\command\\__init__.py', + 'PYMODULE'), + ('distutils.command.bdist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\command\\bdist.py', + 'PYMODULE'), + ('distutils.command.build', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\command\\build.py', + 'PYMODULE'), + ('distutils.command.build_ext', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\command\\build_ext.py', + 'PYMODULE'), + ('distutils.command.sdist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\command\\sdist.py', + 'PYMODULE'), + ('distutils.config', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\config.py', + 'PYMODULE'), + ('distutils.core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\core.py', + 'PYMODULE'), + ('distutils.debug', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\debug.py', + 'PYMODULE'), + ('distutils.dep_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\dep_util.py', + 'PYMODULE'), + ('distutils.dir_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\dir_util.py', + 'PYMODULE'), + ('distutils.dist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\dist.py', + 'PYMODULE'), + ('distutils.errors', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\errors.py', + 'PYMODULE'), + ('distutils.extension', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\extension.py', + 'PYMODULE'), + ('distutils.fancy_getopt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\fancy_getopt.py', + 'PYMODULE'), + ('distutils.file_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\file_util.py', + 'PYMODULE'), + ('distutils.filelist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\filelist.py', + 'PYMODULE'), + ('distutils.log', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\log.py', + 'PYMODULE'), + ('distutils.spawn', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\spawn.py', + 'PYMODULE'), + ('distutils.sysconfig', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\sysconfig.py', + 'PYMODULE'), + ('distutils.text_file', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\text_file.py', + 'PYMODULE'), + ('distutils.util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\util.py', + 'PYMODULE'), + ('distutils.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\version.py', + 'PYMODULE'), + ('distutils.versionpredicate', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\distutils\\versionpredicate.py', + 'PYMODULE'), + ('doctest', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\doctest.py', + 'PYMODULE'), + ('email', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\__init__.py', + 'PYMODULE'), + ('email._encoded_words', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\_encoded_words.py', + 'PYMODULE'), + ('email._header_value_parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\_header_value_parser.py', + 'PYMODULE'), + ('email._parseaddr', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\_parseaddr.py', + 'PYMODULE'), + ('email._policybase', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\_policybase.py', + 'PYMODULE'), + ('email.base64mime', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\base64mime.py', + 'PYMODULE'), + ('email.charset', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\charset.py', + 'PYMODULE'), + ('email.contentmanager', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\contentmanager.py', + 'PYMODULE'), + ('email.encoders', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\encoders.py', + 'PYMODULE'), + ('email.errors', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\errors.py', + 'PYMODULE'), + ('email.feedparser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\feedparser.py', + 'PYMODULE'), + ('email.generator', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\generator.py', + 'PYMODULE'), + ('email.header', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\header.py', + 'PYMODULE'), + ('email.headerregistry', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\headerregistry.py', + 'PYMODULE'), + ('email.iterators', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\iterators.py', + 'PYMODULE'), + ('email.message', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\message.py', + 'PYMODULE'), + ('email.parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\parser.py', + 'PYMODULE'), + ('email.policy', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\policy.py', + 'PYMODULE'), + ('email.quoprimime', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\quoprimime.py', + 'PYMODULE'), + ('email.utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\email\\utils.py', + 'PYMODULE'), + ('fileinput', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\fileinput.py', + 'PYMODULE'), + ('filter_utils', + 'D:\\xmos\\projects\\Fosi ' + 'Audio\\phaten_module_k6\\sw_usb_audio\\app_usb_aud_fosi_k6\\src\\extensions\\filter_utils.py', + 'PYMODULE'), + ('fnmatch', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\fnmatch.py', + 'PYMODULE'), + ('fractions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\fractions.py', + 'PYMODULE'), + ('ftplib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\ftplib.py', + 'PYMODULE'), + ('getopt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\getopt.py', + 'PYMODULE'), + ('getpass', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\getpass.py', + 'PYMODULE'), + ('gettext', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\gettext.py', + 'PYMODULE'), + ('glob', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\glob.py', 'PYMODULE'), + ('gzip', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\gzip.py', 'PYMODULE'), + ('hashlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\hashlib.py', + 'PYMODULE'), + ('hmac', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\hmac.py', 'PYMODULE'), + ('html', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\html\\__init__.py', + 'PYMODULE'), + ('html.entities', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\html\\entities.py', + 'PYMODULE'), + ('http', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\http\\__init__.py', + 'PYMODULE'), + ('http.client', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\http\\client.py', + 'PYMODULE'), + ('http.cookiejar', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\http\\cookiejar.py', + 'PYMODULE'), + ('http.cookies', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\http\\cookies.py', + 'PYMODULE'), + ('http.server', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\http\\server.py', + 'PYMODULE'), + ('importlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\__init__.py', + 'PYMODULE'), + ('importlib._abc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\_abc.py', + 'PYMODULE'), + ('importlib._adapters', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\_adapters.py', + 'PYMODULE'), + ('importlib._bootstrap', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\_bootstrap.py', + 'PYMODULE'), + ('importlib._bootstrap_external', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\_bootstrap_external.py', + 'PYMODULE'), + ('importlib._common', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\_common.py', + 'PYMODULE'), + ('importlib.abc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\abc.py', + 'PYMODULE'), + ('importlib.machinery', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\machinery.py', + 'PYMODULE'), + ('importlib.metadata', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\metadata\\__init__.py', + 'PYMODULE'), + ('importlib.metadata._adapters', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\metadata\\_adapters.py', + 'PYMODULE'), + ('importlib.metadata._collections', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\metadata\\_collections.py', + 'PYMODULE'), + ('importlib.metadata._functools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\metadata\\_functools.py', + 'PYMODULE'), + ('importlib.metadata._itertools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\metadata\\_itertools.py', + 'PYMODULE'), + ('importlib.metadata._meta', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\metadata\\_meta.py', + 'PYMODULE'), + ('importlib.metadata._text', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\metadata\\_text.py', + 'PYMODULE'), + ('importlib.readers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\readers.py', + 'PYMODULE'), + ('importlib.resources', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\resources.py', + 'PYMODULE'), + ('importlib.util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\importlib\\util.py', + 'PYMODULE'), + ('inspect', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\inspect.py', + 'PYMODULE'), + ('ipaddress', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\ipaddress.py', + 'PYMODULE'), + ('jaraco', '-', 'PYMODULE'), + ('jinja2', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\__init__.py', + 'PYMODULE'), + ('jinja2._identifier', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\_identifier.py', + 'PYMODULE'), + ('jinja2.async_utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\async_utils.py', + 'PYMODULE'), + ('jinja2.bccache', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\bccache.py', + 'PYMODULE'), + ('jinja2.compiler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\compiler.py', + 'PYMODULE'), + ('jinja2.constants', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\constants.py', + 'PYMODULE'), + ('jinja2.debug', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\debug.py', + 'PYMODULE'), + ('jinja2.defaults', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\defaults.py', + 'PYMODULE'), + ('jinja2.environment', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\environment.py', + 'PYMODULE'), + ('jinja2.exceptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\exceptions.py', + 'PYMODULE'), + ('jinja2.ext', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\ext.py', + 'PYMODULE'), + ('jinja2.filters', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\filters.py', + 'PYMODULE'), + ('jinja2.idtracking', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\idtracking.py', + 'PYMODULE'), + ('jinja2.lexer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\lexer.py', + 'PYMODULE'), + ('jinja2.loaders', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\loaders.py', + 'PYMODULE'), + ('jinja2.nodes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\nodes.py', + 'PYMODULE'), + ('jinja2.optimizer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\optimizer.py', + 'PYMODULE'), + ('jinja2.parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\parser.py', + 'PYMODULE'), + ('jinja2.runtime', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\runtime.py', + 'PYMODULE'), + ('jinja2.sandbox', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\sandbox.py', + 'PYMODULE'), + ('jinja2.tests', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\tests.py', + 'PYMODULE'), + ('jinja2.utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\utils.py', + 'PYMODULE'), + ('jinja2.visitor', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\jinja2\\visitor.py', + 'PYMODULE'), + ('json', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\json\\__init__.py', + 'PYMODULE'), + ('json.decoder', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\json\\decoder.py', + 'PYMODULE'), + ('json.encoder', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\json\\encoder.py', + 'PYMODULE'), + ('json.scanner', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\json\\scanner.py', + 'PYMODULE'), + ('kiwisolver', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\kiwisolver\\__init__.py', + 'PYMODULE'), + ('kiwisolver.exceptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\kiwisolver\\exceptions.py', + 'PYMODULE'), + ('logging', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\logging\\__init__.py', + 'PYMODULE'), + ('logging.handlers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\logging\\handlers.py', + 'PYMODULE'), + ('lzma', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\lzma.py', 'PYMODULE'), + ('markupsafe', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\markupsafe\\__init__.py', + 'PYMODULE'), + ('markupsafe._native', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\markupsafe\\_native.py', + 'PYMODULE'), + ('matplotlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\__init__.py', + 'PYMODULE'), + ('matplotlib._afm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_afm.py', + 'PYMODULE'), + ('matplotlib._api', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_api\\__init__.py', + 'PYMODULE'), + ('matplotlib._api.deprecation', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_api\\deprecation.py', + 'PYMODULE'), + ('matplotlib._blocking_input', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_blocking_input.py', + 'PYMODULE'), + ('matplotlib._cm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_cm.py', + 'PYMODULE'), + ('matplotlib._cm_listed', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_cm_listed.py', + 'PYMODULE'), + ('matplotlib._color_data', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_color_data.py', + 'PYMODULE'), + ('matplotlib._constrained_layout', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_constrained_layout.py', + 'PYMODULE'), + ('matplotlib._docstring', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_docstring.py', + 'PYMODULE'), + ('matplotlib._enums', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_enums.py', + 'PYMODULE'), + ('matplotlib._fontconfig_pattern', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_fontconfig_pattern.py', + 'PYMODULE'), + ('matplotlib._layoutgrid', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_layoutgrid.py', + 'PYMODULE'), + ('matplotlib._mathtext', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_mathtext.py', + 'PYMODULE'), + ('matplotlib._mathtext_data', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_mathtext_data.py', + 'PYMODULE'), + ('matplotlib._pylab_helpers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_pylab_helpers.py', + 'PYMODULE'), + ('matplotlib._text_helpers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_text_helpers.py', + 'PYMODULE'), + ('matplotlib._tight_bbox', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_tight_bbox.py', + 'PYMODULE'), + ('matplotlib._tight_layout', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_tight_layout.py', + 'PYMODULE'), + ('matplotlib._version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\_version.py', + 'PYMODULE'), + ('matplotlib.artist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\artist.py', + 'PYMODULE'), + ('matplotlib.axes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\axes\\__init__.py', + 'PYMODULE'), + ('matplotlib.axes._axes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\axes\\_axes.py', + 'PYMODULE'), + ('matplotlib.axes._base', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\axes\\_base.py', + 'PYMODULE'), + ('matplotlib.axes._secondary_axes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\axes\\_secondary_axes.py', + 'PYMODULE'), + ('matplotlib.axis', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\axis.py', + 'PYMODULE'), + ('matplotlib.backend_bases', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backend_bases.py', + 'PYMODULE'), + ('matplotlib.backend_managers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backend_managers.py', + 'PYMODULE'), + ('matplotlib.backend_tools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backend_tools.py', + 'PYMODULE'), + ('matplotlib.backends', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\__init__.py', + 'PYMODULE'), + ('matplotlib.backends.backend_agg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py', + 'PYMODULE'), + ('matplotlib.backends.backend_qt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\backend_qt.py', + 'PYMODULE'), + ('matplotlib.backends.backend_qt5agg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\backend_qt5agg.py', + 'PYMODULE'), + ('matplotlib.backends.backend_qtagg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\backend_qtagg.py', + 'PYMODULE'), + ('matplotlib.backends.backend_webagg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\backend_webagg.py', + 'PYMODULE'), + ('matplotlib.backends.backend_webagg_core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\backend_webagg_core.py', + 'PYMODULE'), + ('matplotlib.backends.qt_compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\qt_compat.py', + 'PYMODULE'), + ('matplotlib.backends.qt_editor', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\qt_editor\\__init__.py', + 'PYMODULE'), + ('matplotlib.backends.qt_editor._formlayout', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\qt_editor\\_formlayout.py', + 'PYMODULE'), + ('matplotlib.backends.qt_editor.figureoptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\qt_editor\\figureoptions.py', + 'PYMODULE'), + ('matplotlib.backends.registry', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\backends\\registry.py', + 'PYMODULE'), + ('matplotlib.bezier', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\bezier.py', + 'PYMODULE'), + ('matplotlib.category', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\category.py', + 'PYMODULE'), + ('matplotlib.cbook', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\cbook.py', + 'PYMODULE'), + ('matplotlib.cm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\cm.py', + 'PYMODULE'), + ('matplotlib.collections', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\collections.py', + 'PYMODULE'), + ('matplotlib.colorbar', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\colorbar.py', + 'PYMODULE'), + ('matplotlib.colors', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\colors.py', + 'PYMODULE'), + ('matplotlib.container', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\container.py', + 'PYMODULE'), + ('matplotlib.contour', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\contour.py', + 'PYMODULE'), + ('matplotlib.dates', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\dates.py', + 'PYMODULE'), + ('matplotlib.dviread', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\dviread.py', + 'PYMODULE'), + ('matplotlib.figure', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\figure.py', + 'PYMODULE'), + ('matplotlib.font_manager', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\font_manager.py', + 'PYMODULE'), + ('matplotlib.gridspec', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\gridspec.py', + 'PYMODULE'), + ('matplotlib.hatch', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\hatch.py', + 'PYMODULE'), + ('matplotlib.image', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\image.py', + 'PYMODULE'), + ('matplotlib.layout_engine', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\layout_engine.py', + 'PYMODULE'), + ('matplotlib.legend', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\legend.py', + 'PYMODULE'), + ('matplotlib.legend_handler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\legend_handler.py', + 'PYMODULE'), + ('matplotlib.lines', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\lines.py', + 'PYMODULE'), + ('matplotlib.markers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\markers.py', + 'PYMODULE'), + ('matplotlib.mathtext', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mathtext.py', + 'PYMODULE'), + ('matplotlib.mlab', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\mlab.py', + 'PYMODULE'), + ('matplotlib.offsetbox', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\offsetbox.py', + 'PYMODULE'), + ('matplotlib.patches', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\patches.py', + 'PYMODULE'), + ('matplotlib.path', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\path.py', + 'PYMODULE'), + ('matplotlib.patheffects', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\patheffects.py', + 'PYMODULE'), + ('matplotlib.projections', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\projections\\__init__.py', + 'PYMODULE'), + ('matplotlib.projections.geo', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\projections\\geo.py', + 'PYMODULE'), + ('matplotlib.projections.polar', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\projections\\polar.py', + 'PYMODULE'), + ('matplotlib.pyplot', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\pyplot.py', + 'PYMODULE'), + ('matplotlib.quiver', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\quiver.py', + 'PYMODULE'), + ('matplotlib.rcsetup', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\rcsetup.py', + 'PYMODULE'), + ('matplotlib.scale', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\scale.py', + 'PYMODULE'), + ('matplotlib.spines', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\spines.py', + 'PYMODULE'), + ('matplotlib.stackplot', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\stackplot.py', + 'PYMODULE'), + ('matplotlib.streamplot', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\streamplot.py', + 'PYMODULE'), + ('matplotlib.style', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\style\\__init__.py', + 'PYMODULE'), + ('matplotlib.style.core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\style\\core.py', + 'PYMODULE'), + ('matplotlib.table', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\table.py', + 'PYMODULE'), + ('matplotlib.texmanager', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\texmanager.py', + 'PYMODULE'), + ('matplotlib.text', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\text.py', + 'PYMODULE'), + ('matplotlib.textpath', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\textpath.py', + 'PYMODULE'), + ('matplotlib.ticker', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\ticker.py', + 'PYMODULE'), + ('matplotlib.transforms', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\transforms.py', + 'PYMODULE'), + ('matplotlib.tri', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\__init__.py', + 'PYMODULE'), + ('matplotlib.tri._triangulation', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\_triangulation.py', + 'PYMODULE'), + ('matplotlib.tri._tricontour', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\_tricontour.py', + 'PYMODULE'), + ('matplotlib.tri._trifinder', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\_trifinder.py', + 'PYMODULE'), + ('matplotlib.tri._triinterpolate', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\_triinterpolate.py', + 'PYMODULE'), + ('matplotlib.tri._tripcolor', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\_tripcolor.py', + 'PYMODULE'), + ('matplotlib.tri._triplot', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\_triplot.py', + 'PYMODULE'), + ('matplotlib.tri._trirefine', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\_trirefine.py', + 'PYMODULE'), + ('matplotlib.tri._tritools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\tri\\_tritools.py', + 'PYMODULE'), + ('matplotlib.typing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\typing.py', + 'PYMODULE'), + ('matplotlib.units', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\units.py', + 'PYMODULE'), + ('matplotlib.widgets', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\matplotlib\\widgets.py', + 'PYMODULE'), + ('mimetypes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\mimetypes.py', + 'PYMODULE'), + ('mpl_toolkits', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\mpl_toolkits\\__init__.py', + 'PYMODULE'), + ('mpl_toolkits.mplot3d', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\mpl_toolkits\\mplot3d\\__init__.py', + 'PYMODULE'), + ('mpl_toolkits.mplot3d.art3d', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\mpl_toolkits\\mplot3d\\art3d.py', + 'PYMODULE'), + ('mpl_toolkits.mplot3d.axes3d', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\mpl_toolkits\\mplot3d\\axes3d.py', + 'PYMODULE'), + ('mpl_toolkits.mplot3d.axis3d', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\mpl_toolkits\\mplot3d\\axis3d.py', + 'PYMODULE'), + ('mpl_toolkits.mplot3d.proj3d', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\mpl_toolkits\\mplot3d\\proj3d.py', + 'PYMODULE'), + ('multiprocessing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\__init__.py', + 'PYMODULE'), + ('multiprocessing.connection', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\connection.py', + 'PYMODULE'), + ('multiprocessing.context', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\context.py', + 'PYMODULE'), + ('multiprocessing.dummy', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\dummy\\__init__.py', + 'PYMODULE'), + ('multiprocessing.dummy.connection', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\dummy\\connection.py', + 'PYMODULE'), + ('multiprocessing.forkserver', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\forkserver.py', + 'PYMODULE'), + ('multiprocessing.heap', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\heap.py', + 'PYMODULE'), + ('multiprocessing.managers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\managers.py', + 'PYMODULE'), + ('multiprocessing.pool', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\pool.py', + 'PYMODULE'), + ('multiprocessing.popen_fork', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\popen_fork.py', + 'PYMODULE'), + ('multiprocessing.popen_forkserver', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\popen_forkserver.py', + 'PYMODULE'), + ('multiprocessing.popen_spawn_posix', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\popen_spawn_posix.py', + 'PYMODULE'), + ('multiprocessing.popen_spawn_win32', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\popen_spawn_win32.py', + 'PYMODULE'), + ('multiprocessing.process', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\process.py', + 'PYMODULE'), + ('multiprocessing.queues', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\queues.py', + 'PYMODULE'), + ('multiprocessing.reduction', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\reduction.py', + 'PYMODULE'), + ('multiprocessing.resource_sharer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\resource_sharer.py', + 'PYMODULE'), + ('multiprocessing.resource_tracker', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\resource_tracker.py', + 'PYMODULE'), + ('multiprocessing.shared_memory', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\shared_memory.py', + 'PYMODULE'), + ('multiprocessing.sharedctypes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\sharedctypes.py', + 'PYMODULE'), + ('multiprocessing.spawn', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\spawn.py', + 'PYMODULE'), + ('multiprocessing.synchronize', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\synchronize.py', + 'PYMODULE'), + ('multiprocessing.util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\multiprocessing\\util.py', + 'PYMODULE'), + ('netrc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\netrc.py', + 'PYMODULE'), + ('nturl2path', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\nturl2path.py', + 'PYMODULE'), + ('numbers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\numbers.py', + 'PYMODULE'), + ('numpy', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\__init__.py', + 'PYMODULE'), + ('numpy.__config__', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\__config__.py', + 'PYMODULE'), + ('numpy._array_api_info', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_array_api_info.py', + 'PYMODULE'), + ('numpy._core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\__init__.py', + 'PYMODULE'), + ('numpy._core._add_newdocs', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_add_newdocs.py', + 'PYMODULE'), + ('numpy._core._add_newdocs_scalars', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_add_newdocs_scalars.py', + 'PYMODULE'), + ('numpy._core._asarray', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_asarray.py', + 'PYMODULE'), + ('numpy._core._dtype', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_dtype.py', + 'PYMODULE'), + ('numpy._core._dtype_ctypes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_dtype_ctypes.py', + 'PYMODULE'), + ('numpy._core._exceptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_exceptions.py', + 'PYMODULE'), + ('numpy._core._internal', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_internal.py', + 'PYMODULE'), + ('numpy._core._machar', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_machar.py', + 'PYMODULE'), + ('numpy._core._methods', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_methods.py', + 'PYMODULE'), + ('numpy._core._string_helpers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_string_helpers.py', + 'PYMODULE'), + ('numpy._core._type_aliases', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_type_aliases.py', + 'PYMODULE'), + ('numpy._core._ufunc_config', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\_ufunc_config.py', + 'PYMODULE'), + ('numpy._core.arrayprint', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\arrayprint.py', + 'PYMODULE'), + ('numpy._core.defchararray', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\defchararray.py', + 'PYMODULE'), + ('numpy._core.einsumfunc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\einsumfunc.py', + 'PYMODULE'), + ('numpy._core.fromnumeric', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\fromnumeric.py', + 'PYMODULE'), + ('numpy._core.function_base', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\function_base.py', + 'PYMODULE'), + ('numpy._core.getlimits', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\getlimits.py', + 'PYMODULE'), + ('numpy._core.memmap', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\memmap.py', + 'PYMODULE'), + ('numpy._core.multiarray', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\multiarray.py', + 'PYMODULE'), + ('numpy._core.numeric', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\numeric.py', + 'PYMODULE'), + ('numpy._core.numerictypes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\numerictypes.py', + 'PYMODULE'), + ('numpy._core.overrides', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\overrides.py', + 'PYMODULE'), + ('numpy._core.printoptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\printoptions.py', + 'PYMODULE'), + ('numpy._core.records', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\records.py', + 'PYMODULE'), + ('numpy._core.shape_base', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\shape_base.py', + 'PYMODULE'), + ('numpy._core.strings', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\strings.py', + 'PYMODULE'), + ('numpy._core.umath', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_core\\umath.py', + 'PYMODULE'), + ('numpy._distributor_init', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_distributor_init.py', + 'PYMODULE'), + ('numpy._expired_attrs_2_0', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_expired_attrs_2_0.py', + 'PYMODULE'), + ('numpy._globals', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_globals.py', + 'PYMODULE'), + ('numpy._pytesttester', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_pytesttester.py', + 'PYMODULE'), + ('numpy._typing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\__init__.py', + 'PYMODULE'), + ('numpy._typing._add_docstring', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\_add_docstring.py', + 'PYMODULE'), + ('numpy._typing._array_like', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\_array_like.py', + 'PYMODULE'), + ('numpy._typing._char_codes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\_char_codes.py', + 'PYMODULE'), + ('numpy._typing._dtype_like', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\_dtype_like.py', + 'PYMODULE'), + ('numpy._typing._nbit', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\_nbit.py', + 'PYMODULE'), + ('numpy._typing._nested_sequence', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\_nested_sequence.py', + 'PYMODULE'), + ('numpy._typing._scalars', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\_scalars.py', + 'PYMODULE'), + ('numpy._typing._shape', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_typing\\_shape.py', + 'PYMODULE'), + ('numpy._utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_utils\\__init__.py', + 'PYMODULE'), + ('numpy._utils._convertions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_utils\\_convertions.py', + 'PYMODULE'), + ('numpy._utils._inspect', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\_utils\\_inspect.py', + 'PYMODULE'), + ('numpy.char', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\char\\__init__.py', + 'PYMODULE'), + ('numpy.core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\core\\__init__.py', + 'PYMODULE'), + ('numpy.core._utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\core\\_utils.py', + 'PYMODULE'), + ('numpy.ctypeslib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\ctypeslib.py', + 'PYMODULE'), + ('numpy.dtypes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\dtypes.py', + 'PYMODULE'), + ('numpy.exceptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\exceptions.py', + 'PYMODULE'), + ('numpy.f2py', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\__init__.py', + 'PYMODULE'), + ('numpy.f2py.__version__', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\__version__.py', + 'PYMODULE'), + ('numpy.f2py._backends', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\_backends\\__init__.py', + 'PYMODULE'), + ('numpy.f2py._backends._backend', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\_backends\\_backend.py', + 'PYMODULE'), + ('numpy.f2py._backends._distutils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\_backends\\_distutils.py', + 'PYMODULE'), + ('numpy.f2py._backends._meson', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\_backends\\_meson.py', + 'PYMODULE'), + ('numpy.f2py._isocbind', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\_isocbind.py', + 'PYMODULE'), + ('numpy.f2py.auxfuncs', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\auxfuncs.py', + 'PYMODULE'), + ('numpy.f2py.capi_maps', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\capi_maps.py', + 'PYMODULE'), + ('numpy.f2py.cb_rules', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\cb_rules.py', + 'PYMODULE'), + ('numpy.f2py.cfuncs', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\cfuncs.py', + 'PYMODULE'), + ('numpy.f2py.common_rules', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\common_rules.py', + 'PYMODULE'), + ('numpy.f2py.crackfortran', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\crackfortran.py', + 'PYMODULE'), + ('numpy.f2py.diagnose', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\diagnose.py', + 'PYMODULE'), + ('numpy.f2py.f2py2e', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\f2py2e.py', + 'PYMODULE'), + ('numpy.f2py.f90mod_rules', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\f90mod_rules.py', + 'PYMODULE'), + ('numpy.f2py.func2subr', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\func2subr.py', + 'PYMODULE'), + ('numpy.f2py.rules', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\rules.py', + 'PYMODULE'), + ('numpy.f2py.symbolic', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\symbolic.py', + 'PYMODULE'), + ('numpy.f2py.use_rules', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\f2py\\use_rules.py', + 'PYMODULE'), + ('numpy.fft', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\fft\\__init__.py', + 'PYMODULE'), + ('numpy.fft._helper', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\fft\\_helper.py', + 'PYMODULE'), + ('numpy.fft._pocketfft', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\fft\\_pocketfft.py', + 'PYMODULE'), + ('numpy.fft.helper', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\fft\\helper.py', + 'PYMODULE'), + ('numpy.lib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\__init__.py', + 'PYMODULE'), + ('numpy.lib._array_utils_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_array_utils_impl.py', + 'PYMODULE'), + ('numpy.lib._arraypad_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_arraypad_impl.py', + 'PYMODULE'), + ('numpy.lib._arraysetops_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_arraysetops_impl.py', + 'PYMODULE'), + ('numpy.lib._arrayterator_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_arrayterator_impl.py', + 'PYMODULE'), + ('numpy.lib._datasource', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_datasource.py', + 'PYMODULE'), + ('numpy.lib._function_base_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_function_base_impl.py', + 'PYMODULE'), + ('numpy.lib._histograms_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_histograms_impl.py', + 'PYMODULE'), + ('numpy.lib._index_tricks_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_index_tricks_impl.py', + 'PYMODULE'), + ('numpy.lib._iotools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_iotools.py', + 'PYMODULE'), + ('numpy.lib._nanfunctions_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_nanfunctions_impl.py', + 'PYMODULE'), + ('numpy.lib._npyio_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_npyio_impl.py', + 'PYMODULE'), + ('numpy.lib._polynomial_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_polynomial_impl.py', + 'PYMODULE'), + ('numpy.lib._scimath_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_scimath_impl.py', + 'PYMODULE'), + ('numpy.lib._shape_base_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_shape_base_impl.py', + 'PYMODULE'), + ('numpy.lib._stride_tricks_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_stride_tricks_impl.py', + 'PYMODULE'), + ('numpy.lib._twodim_base_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_twodim_base_impl.py', + 'PYMODULE'), + ('numpy.lib._type_check_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_type_check_impl.py', + 'PYMODULE'), + ('numpy.lib._ufunclike_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_ufunclike_impl.py', + 'PYMODULE'), + ('numpy.lib._utils_impl', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_utils_impl.py', + 'PYMODULE'), + ('numpy.lib._version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\_version.py', + 'PYMODULE'), + ('numpy.lib.array_utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\array_utils.py', + 'PYMODULE'), + ('numpy.lib.format', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\format.py', + 'PYMODULE'), + ('numpy.lib.introspect', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\introspect.py', + 'PYMODULE'), + ('numpy.lib.mixins', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\mixins.py', + 'PYMODULE'), + ('numpy.lib.npyio', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\npyio.py', + 'PYMODULE'), + ('numpy.lib.recfunctions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\recfunctions.py', + 'PYMODULE'), + ('numpy.lib.scimath', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\scimath.py', + 'PYMODULE'), + ('numpy.lib.stride_tricks', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\lib\\stride_tricks.py', + 'PYMODULE'), + ('numpy.linalg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\linalg\\__init__.py', + 'PYMODULE'), + ('numpy.linalg._linalg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\linalg\\_linalg.py', + 'PYMODULE'), + ('numpy.linalg.linalg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\linalg\\linalg.py', + 'PYMODULE'), + ('numpy.ma', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\ma\\__init__.py', + 'PYMODULE'), + ('numpy.ma.core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\ma\\core.py', + 'PYMODULE'), + ('numpy.ma.extras', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\ma\\extras.py', + 'PYMODULE'), + ('numpy.ma.mrecords', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\ma\\mrecords.py', + 'PYMODULE'), + ('numpy.matlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\matlib.py', + 'PYMODULE'), + ('numpy.matrixlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\matrixlib\\__init__.py', + 'PYMODULE'), + ('numpy.matrixlib.defmatrix', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\matrixlib\\defmatrix.py', + 'PYMODULE'), + ('numpy.polynomial', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\__init__.py', + 'PYMODULE'), + ('numpy.polynomial._polybase', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\_polybase.py', + 'PYMODULE'), + ('numpy.polynomial.chebyshev', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\chebyshev.py', + 'PYMODULE'), + ('numpy.polynomial.hermite', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\hermite.py', + 'PYMODULE'), + ('numpy.polynomial.hermite_e', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\hermite_e.py', + 'PYMODULE'), + ('numpy.polynomial.laguerre', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\laguerre.py', + 'PYMODULE'), + ('numpy.polynomial.legendre', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\legendre.py', + 'PYMODULE'), + ('numpy.polynomial.polynomial', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\polynomial.py', + 'PYMODULE'), + ('numpy.polynomial.polyutils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\polynomial\\polyutils.py', + 'PYMODULE'), + ('numpy.random', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\__init__.py', + 'PYMODULE'), + ('numpy.random._pickle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\random\\_pickle.py', + 'PYMODULE'), + ('numpy.rec', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\rec\\__init__.py', + 'PYMODULE'), + ('numpy.strings', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\strings\\__init__.py', + 'PYMODULE'), + ('numpy.testing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\testing\\__init__.py', + 'PYMODULE'), + ('numpy.testing._private', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\testing\\_private\\__init__.py', + 'PYMODULE'), + ('numpy.testing._private.extbuild', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\testing\\_private\\extbuild.py', + 'PYMODULE'), + ('numpy.testing._private.utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\testing\\_private\\utils.py', + 'PYMODULE'), + ('numpy.testing.overrides', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\testing\\overrides.py', + 'PYMODULE'), + ('numpy.typing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\typing\\__init__.py', + 'PYMODULE'), + ('numpy.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\numpy\\version.py', + 'PYMODULE'), + ('opcode', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\opcode.py', + 'PYMODULE'), + ('optparse', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\optparse.py', + 'PYMODULE'), + ('packaging', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\__init__.py', + 'PYMODULE'), + ('packaging._elffile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\_elffile.py', + 'PYMODULE'), + ('packaging._manylinux', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\_manylinux.py', + 'PYMODULE'), + ('packaging._musllinux', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\_musllinux.py', + 'PYMODULE'), + ('packaging._parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\_parser.py', + 'PYMODULE'), + ('packaging._structures', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\_structures.py', + 'PYMODULE'), + ('packaging._tokenizer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\_tokenizer.py', + 'PYMODULE'), + ('packaging.licenses', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\licenses\\__init__.py', + 'PYMODULE'), + ('packaging.licenses._spdx', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\licenses\\_spdx.py', + 'PYMODULE'), + ('packaging.markers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\markers.py', + 'PYMODULE'), + ('packaging.metadata', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\metadata.py', + 'PYMODULE'), + ('packaging.requirements', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\requirements.py', + 'PYMODULE'), + ('packaging.specifiers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\specifiers.py', + 'PYMODULE'), + ('packaging.tags', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\tags.py', + 'PYMODULE'), + ('packaging.utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\utils.py', + 'PYMODULE'), + ('packaging.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\packaging\\version.py', + 'PYMODULE'), + ('pathlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\pathlib.py', + 'PYMODULE'), + ('pdb', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\pdb.py', 'PYMODULE'), + ('pickle', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\pickle.py', + 'PYMODULE'), + ('pkg_resources', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pkg_resources\\__init__.py', + 'PYMODULE'), + ('pkgutil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\pkgutil.py', + 'PYMODULE'), + ('platform', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\platform.py', + 'PYMODULE'), + ('platformdirs', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\platformdirs\\__init__.py', + 'PYMODULE'), + ('platformdirs.android', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\platformdirs\\android.py', + 'PYMODULE'), + ('platformdirs.api', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\platformdirs\\api.py', + 'PYMODULE'), + ('platformdirs.macos', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\platformdirs\\macos.py', + 'PYMODULE'), + ('platformdirs.unix', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\platformdirs\\unix.py', + 'PYMODULE'), + ('platformdirs.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\platformdirs\\version.py', + 'PYMODULE'), + ('platformdirs.windows', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\platformdirs\\windows.py', + 'PYMODULE'), + ('plistlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\plistlib.py', + 'PYMODULE'), + ('pprint', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\pprint.py', + 'PYMODULE'), + ('psutil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\psutil\\__init__.py', + 'PYMODULE'), + ('psutil._common', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\psutil\\_common.py', + 'PYMODULE'), + ('psutil._pswindows', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\psutil\\_pswindows.py', + 'PYMODULE'), + ('py_compile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\py_compile.py', + 'PYMODULE'), + ('pydoc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\pydoc.py', + 'PYMODULE'), + ('pydoc_data', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\pydoc_data\\__init__.py', + 'PYMODULE'), + ('pydoc_data.topics', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\pydoc_data\\topics.py', + 'PYMODULE'), + ('pyparsing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\__init__.py', + 'PYMODULE'), + ('pyparsing.actions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\actions.py', + 'PYMODULE'), + ('pyparsing.common', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\common.py', + 'PYMODULE'), + ('pyparsing.core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\core.py', + 'PYMODULE'), + ('pyparsing.diagram', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\diagram\\__init__.py', + 'PYMODULE'), + ('pyparsing.exceptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\exceptions.py', + 'PYMODULE'), + ('pyparsing.helpers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\helpers.py', + 'PYMODULE'), + ('pyparsing.results', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\results.py', + 'PYMODULE'), + ('pyparsing.testing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\testing.py', + 'PYMODULE'), + ('pyparsing.unicode', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\unicode.py', + 'PYMODULE'), + ('pyparsing.util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\pyparsing\\util.py', + 'PYMODULE'), + ('queue', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\queue.py', + 'PYMODULE'), + ('quopri', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\quopri.py', + 'PYMODULE'), + ('random', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\random.py', + 'PYMODULE'), + ('rlcompleter', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\rlcompleter.py', + 'PYMODULE'), + ('runpy', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\runpy.py', + 'PYMODULE'), + ('secrets', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\secrets.py', + 'PYMODULE'), + ('selectors', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\selectors.py', + 'PYMODULE'), + ('setuptools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\__init__.py', + 'PYMODULE'), + ('setuptools._core_metadata', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_core_metadata.py', + 'PYMODULE'), + ('setuptools._distutils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\__init__.py', + 'PYMODULE'), + ('setuptools._distutils._log', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\_log.py', + 'PYMODULE'), + ('setuptools._distutils._macos_compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\_macos_compat.py', + 'PYMODULE'), + ('setuptools._distutils._modified', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\_modified.py', + 'PYMODULE'), + ('setuptools._distutils._msvccompiler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\_msvccompiler.py', + 'PYMODULE'), + ('setuptools._distutils.archive_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\archive_util.py', + 'PYMODULE'), + ('setuptools._distutils.ccompiler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\ccompiler.py', + 'PYMODULE'), + ('setuptools._distutils.cmd', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\cmd.py', + 'PYMODULE'), + ('setuptools._distutils.command', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\__init__.py', + 'PYMODULE'), + ('setuptools._distutils.command._framework_compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\_framework_compat.py', + 'PYMODULE'), + ('setuptools._distutils.command.bdist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\bdist.py', + 'PYMODULE'), + ('setuptools._distutils.command.bdist_dumb', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\bdist_dumb.py', + 'PYMODULE'), + ('setuptools._distutils.command.bdist_rpm', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\bdist_rpm.py', + 'PYMODULE'), + ('setuptools._distutils.command.build', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\build.py', + 'PYMODULE'), + ('setuptools._distutils.command.build_clib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\build_clib.py', + 'PYMODULE'), + ('setuptools._distutils.command.build_ext', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\build_ext.py', + 'PYMODULE'), + ('setuptools._distutils.command.build_py', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\build_py.py', + 'PYMODULE'), + ('setuptools._distutils.command.build_scripts', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\build_scripts.py', + 'PYMODULE'), + ('setuptools._distutils.command.check', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\check.py', + 'PYMODULE'), + ('setuptools._distutils.command.clean', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\clean.py', + 'PYMODULE'), + ('setuptools._distutils.command.config', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\config.py', + 'PYMODULE'), + ('setuptools._distutils.command.install', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\install.py', + 'PYMODULE'), + ('setuptools._distutils.command.install_data', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\install_data.py', + 'PYMODULE'), + ('setuptools._distutils.command.install_egg_info', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\install_egg_info.py', + 'PYMODULE'), + ('setuptools._distutils.command.install_headers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\install_headers.py', + 'PYMODULE'), + ('setuptools._distutils.command.install_lib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\install_lib.py', + 'PYMODULE'), + ('setuptools._distutils.command.install_scripts', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\install_scripts.py', + 'PYMODULE'), + ('setuptools._distutils.command.sdist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\command\\sdist.py', + 'PYMODULE'), + ('setuptools._distutils.compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compat\\__init__.py', + 'PYMODULE'), + ('setuptools._distutils.compat.numpy', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compat\\numpy.py', + 'PYMODULE'), + ('setuptools._distutils.compat.py39', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compat\\py39.py', + 'PYMODULE'), + ('setuptools._distutils.compilers', '-', 'PYMODULE'), + ('setuptools._distutils.compilers.C', '-', 'PYMODULE'), + ('setuptools._distutils.compilers.C.base', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compilers\\C\\base.py', + 'PYMODULE'), + ('setuptools._distutils.compilers.C.cygwin', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compilers\\C\\cygwin.py', + 'PYMODULE'), + ('setuptools._distutils.compilers.C.errors', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compilers\\C\\errors.py', + 'PYMODULE'), + ('setuptools._distutils.compilers.C.msvc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compilers\\C\\msvc.py', + 'PYMODULE'), + ('setuptools._distutils.compilers.C.unix', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compilers\\C\\unix.py', + 'PYMODULE'), + ('setuptools._distutils.compilers.C.zos', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\compilers\\C\\zos.py', + 'PYMODULE'), + ('setuptools._distutils.core', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\core.py', + 'PYMODULE'), + ('setuptools._distutils.cygwinccompiler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\cygwinccompiler.py', + 'PYMODULE'), + ('setuptools._distutils.debug', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\debug.py', + 'PYMODULE'), + ('setuptools._distutils.dep_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\dep_util.py', + 'PYMODULE'), + ('setuptools._distutils.dir_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\dir_util.py', + 'PYMODULE'), + ('setuptools._distutils.dist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\dist.py', + 'PYMODULE'), + ('setuptools._distutils.errors', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\errors.py', + 'PYMODULE'), + ('setuptools._distutils.extension', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\extension.py', + 'PYMODULE'), + ('setuptools._distutils.fancy_getopt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\fancy_getopt.py', + 'PYMODULE'), + ('setuptools._distutils.file_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\file_util.py', + 'PYMODULE'), + ('setuptools._distutils.filelist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\filelist.py', + 'PYMODULE'), + ('setuptools._distutils.log', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\log.py', + 'PYMODULE'), + ('setuptools._distutils.spawn', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\spawn.py', + 'PYMODULE'), + ('setuptools._distutils.sysconfig', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\sysconfig.py', + 'PYMODULE'), + ('setuptools._distutils.text_file', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\text_file.py', + 'PYMODULE'), + ('setuptools._distutils.unixccompiler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\unixccompiler.py', + 'PYMODULE'), + ('setuptools._distutils.util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\util.py', + 'PYMODULE'), + ('setuptools._distutils.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\version.py', + 'PYMODULE'), + ('setuptools._distutils.versionpredicate', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\versionpredicate.py', + 'PYMODULE'), + ('setuptools._distutils.zosccompiler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_distutils\\zosccompiler.py', + 'PYMODULE'), + ('setuptools._entry_points', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_entry_points.py', + 'PYMODULE'), + ('setuptools._imp', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_imp.py', + 'PYMODULE'), + ('setuptools._importlib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_importlib.py', + 'PYMODULE'), + ('setuptools._itertools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_itertools.py', + 'PYMODULE'), + ('setuptools._normalization', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_normalization.py', + 'PYMODULE'), + ('setuptools._path', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_path.py', + 'PYMODULE'), + ('setuptools._reqs', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_reqs.py', + 'PYMODULE'), + ('setuptools._shutil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_shutil.py', + 'PYMODULE'), + ('setuptools._static', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_static.py', + 'PYMODULE'), + ('setuptools._vendor', '-', 'PYMODULE'), + ('setuptools._vendor.backports', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\backports\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.backports.tarfile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\backports\\tarfile\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.backports.tarfile.compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\backports\\tarfile\\compat\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.backports.tarfile.compat.py38', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\backports\\tarfile\\compat\\py38.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata._adapters', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\_adapters.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata._collections', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\_collections.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata._compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\_compat.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata._functools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\_functools.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata._itertools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\_itertools.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata._meta', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\_meta.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata._text', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\_text.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata.compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\compat\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata.compat.py311', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\compat\\py311.py', + 'PYMODULE'), + ('setuptools._vendor.importlib_metadata.compat.py39', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\importlib_metadata\\compat\\py39.py', + 'PYMODULE'), + ('setuptools._vendor.jaraco', '-', 'PYMODULE'), + ('setuptools._vendor.jaraco.context', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\jaraco\\context.py', + 'PYMODULE'), + ('setuptools._vendor.jaraco.functools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\jaraco\\functools\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.jaraco.text', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\jaraco\\text\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.more_itertools', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\more_itertools\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.more_itertools.more', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\more_itertools\\more.py', + 'PYMODULE'), + ('setuptools._vendor.more_itertools.recipes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\more_itertools\\recipes.py', + 'PYMODULE'), + ('setuptools._vendor.packaging', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.packaging._elffile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\_elffile.py', + 'PYMODULE'), + ('setuptools._vendor.packaging._manylinux', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\_manylinux.py', + 'PYMODULE'), + ('setuptools._vendor.packaging._musllinux', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\_musllinux.py', + 'PYMODULE'), + ('setuptools._vendor.packaging._parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\_parser.py', + 'PYMODULE'), + ('setuptools._vendor.packaging._structures', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\_structures.py', + 'PYMODULE'), + ('setuptools._vendor.packaging._tokenizer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\_tokenizer.py', + 'PYMODULE'), + ('setuptools._vendor.packaging.markers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\markers.py', + 'PYMODULE'), + ('setuptools._vendor.packaging.requirements', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\requirements.py', + 'PYMODULE'), + ('setuptools._vendor.packaging.specifiers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\specifiers.py', + 'PYMODULE'), + ('setuptools._vendor.packaging.tags', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\tags.py', + 'PYMODULE'), + ('setuptools._vendor.packaging.utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\utils.py', + 'PYMODULE'), + ('setuptools._vendor.packaging.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\packaging\\version.py', + 'PYMODULE'), + ('setuptools._vendor.zipp', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\zipp\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.zipp.compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\zipp\\compat\\__init__.py', + 'PYMODULE'), + ('setuptools._vendor.zipp.compat.py310', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\zipp\\compat\\py310.py', + 'PYMODULE'), + ('setuptools._vendor.zipp.glob', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\_vendor\\zipp\\glob.py', + 'PYMODULE'), + ('setuptools.archive_util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\archive_util.py', + 'PYMODULE'), + ('setuptools.command', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\command\\__init__.py', + 'PYMODULE'), + ('setuptools.command._requirestxt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\command\\_requirestxt.py', + 'PYMODULE'), + ('setuptools.command.bdist_egg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\command\\bdist_egg.py', + 'PYMODULE'), + ('setuptools.command.bdist_wheel', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\command\\bdist_wheel.py', + 'PYMODULE'), + ('setuptools.command.build', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\command\\build.py', + 'PYMODULE'), + ('setuptools.command.egg_info', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\command\\egg_info.py', + 'PYMODULE'), + ('setuptools.command.sdist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\command\\sdist.py', + 'PYMODULE'), + ('setuptools.command.setopt', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\command\\setopt.py', + 'PYMODULE'), + ('setuptools.compat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\compat\\__init__.py', + 'PYMODULE'), + ('setuptools.compat.py310', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\compat\\py310.py', + 'PYMODULE'), + ('setuptools.compat.py311', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\compat\\py311.py', + 'PYMODULE'), + ('setuptools.compat.py39', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\compat\\py39.py', + 'PYMODULE'), + ('setuptools.config', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\__init__.py', + 'PYMODULE'), + ('setuptools.config._apply_pyprojecttoml', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\_apply_pyprojecttoml.py', + 'PYMODULE'), + ('setuptools.config._validate_pyproject', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\_validate_pyproject\\__init__.py', + 'PYMODULE'), + ('setuptools.config._validate_pyproject.error_reporting', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\_validate_pyproject\\error_reporting.py', + 'PYMODULE'), + ('setuptools.config._validate_pyproject.extra_validations', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\_validate_pyproject\\extra_validations.py', + 'PYMODULE'), + ('setuptools.config._validate_pyproject.fastjsonschema_exceptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\_validate_pyproject\\fastjsonschema_exceptions.py', + 'PYMODULE'), + ('setuptools.config._validate_pyproject.fastjsonschema_validations', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\_validate_pyproject\\fastjsonschema_validations.py', + 'PYMODULE'), + ('setuptools.config._validate_pyproject.formats', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\_validate_pyproject\\formats.py', + 'PYMODULE'), + ('setuptools.config.expand', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\expand.py', + 'PYMODULE'), + ('setuptools.config.pyprojecttoml', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\pyprojecttoml.py', + 'PYMODULE'), + ('setuptools.config.setupcfg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\config\\setupcfg.py', + 'PYMODULE'), + ('setuptools.depends', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\depends.py', + 'PYMODULE'), + ('setuptools.discovery', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\discovery.py', + 'PYMODULE'), + ('setuptools.dist', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\dist.py', + 'PYMODULE'), + ('setuptools.errors', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\errors.py', + 'PYMODULE'), + ('setuptools.extension', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\extension.py', + 'PYMODULE'), + ('setuptools.glob', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\glob.py', + 'PYMODULE'), + ('setuptools.installer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\installer.py', + 'PYMODULE'), + ('setuptools.logging', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\logging.py', + 'PYMODULE'), + ('setuptools.monkey', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\monkey.py', + 'PYMODULE'), + ('setuptools.msvc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\msvc.py', + 'PYMODULE'), + ('setuptools.unicode_utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\unicode_utils.py', + 'PYMODULE'), + ('setuptools.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\version.py', + 'PYMODULE'), + ('setuptools.warnings', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\warnings.py', + 'PYMODULE'), + ('setuptools.wheel', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\wheel.py', + 'PYMODULE'), + ('setuptools.windows_support', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\setuptools\\windows_support.py', + 'PYMODULE'), + ('shiboken6', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\shiboken6\\__init__.py', + 'PYMODULE'), + ('shlex', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\shlex.py', + 'PYMODULE'), + ('shutil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\shutil.py', + 'PYMODULE'), + ('signal', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\signal.py', + 'PYMODULE'), + ('site', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site.py', 'PYMODULE'), + ('six', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\six.py', + 'PYMODULE'), + ('smtplib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\smtplib.py', + 'PYMODULE'), + ('socket', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\socket.py', + 'PYMODULE'), + ('socketserver', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\socketserver.py', + 'PYMODULE'), + ('ssl', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\ssl.py', 'PYMODULE'), + ('statistics', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\statistics.py', + 'PYMODULE'), + ('string', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\string.py', + 'PYMODULE'), + ('stringprep', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\stringprep.py', + 'PYMODULE'), + ('subprocess', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\subprocess.py', + 'PYMODULE'), + ('sysconfig', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\sysconfig.py', + 'PYMODULE'), + ('tarfile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\tarfile.py', + 'PYMODULE'), + ('tempfile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\tempfile.py', + 'PYMODULE'), + ('textwrap', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\textwrap.py', + 'PYMODULE'), + ('threading', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\threading.py', + 'PYMODULE'), + ('token', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\token.py', + 'PYMODULE'), + ('tokenize', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\tokenize.py', + 'PYMODULE'), + ('tomli', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tomli\\__init__.py', + 'PYMODULE'), + ('tomli._parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tomli\\_parser.py', + 'PYMODULE'), + ('tomli._re', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tomli\\_re.py', + 'PYMODULE'), + ('tomli._types', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tomli\\_types.py', + 'PYMODULE'), + ('tornado', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\__init__.py', + 'PYMODULE'), + ('tornado._locale_data', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\_locale_data.py', + 'PYMODULE'), + ('tornado.autoreload', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\autoreload.py', + 'PYMODULE'), + ('tornado.concurrent', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\concurrent.py', + 'PYMODULE'), + ('tornado.escape', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\escape.py', + 'PYMODULE'), + ('tornado.gen', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\gen.py', + 'PYMODULE'), + ('tornado.http1connection', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\http1connection.py', + 'PYMODULE'), + ('tornado.httpclient', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\httpclient.py', + 'PYMODULE'), + ('tornado.httpserver', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\httpserver.py', + 'PYMODULE'), + ('tornado.httputil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\httputil.py', + 'PYMODULE'), + ('tornado.ioloop', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\ioloop.py', + 'PYMODULE'), + ('tornado.iostream', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\iostream.py', + 'PYMODULE'), + ('tornado.locale', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\locale.py', + 'PYMODULE'), + ('tornado.locks', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\locks.py', + 'PYMODULE'), + ('tornado.log', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\log.py', + 'PYMODULE'), + ('tornado.netutil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\netutil.py', + 'PYMODULE'), + ('tornado.options', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\options.py', + 'PYMODULE'), + ('tornado.platform', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\platform\\__init__.py', + 'PYMODULE'), + ('tornado.platform.asyncio', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\platform\\asyncio.py', + 'PYMODULE'), + ('tornado.process', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\process.py', + 'PYMODULE'), + ('tornado.queues', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\queues.py', + 'PYMODULE'), + ('tornado.routing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\routing.py', + 'PYMODULE'), + ('tornado.simple_httpclient', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\simple_httpclient.py', + 'PYMODULE'), + ('tornado.tcpclient', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\tcpclient.py', + 'PYMODULE'), + ('tornado.tcpserver', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\tcpserver.py', + 'PYMODULE'), + ('tornado.template', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\template.py', + 'PYMODULE'), + ('tornado.util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\util.py', + 'PYMODULE'), + ('tornado.web', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\web.py', + 'PYMODULE'), + ('tornado.websocket', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\tornado\\websocket.py', + 'PYMODULE'), + ('tracemalloc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\tracemalloc.py', + 'PYMODULE'), + ('tty', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\tty.py', 'PYMODULE'), + ('typing', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\typing.py', + 'PYMODULE'), + ('typing_extensions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\typing_extensions.py', + 'PYMODULE'), + ('unittest', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\__init__.py', + 'PYMODULE'), + ('unittest._log', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\_log.py', + 'PYMODULE'), + ('unittest.async_case', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\async_case.py', + 'PYMODULE'), + ('unittest.case', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\case.py', + 'PYMODULE'), + ('unittest.loader', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\loader.py', + 'PYMODULE'), + ('unittest.main', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\main.py', + 'PYMODULE'), + ('unittest.mock', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\mock.py', + 'PYMODULE'), + ('unittest.result', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\result.py', + 'PYMODULE'), + ('unittest.runner', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\runner.py', + 'PYMODULE'), + ('unittest.signals', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\signals.py', + 'PYMODULE'), + ('unittest.suite', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\suite.py', + 'PYMODULE'), + ('unittest.util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\unittest\\util.py', + 'PYMODULE'), + ('urllib', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\urllib\\__init__.py', + 'PYMODULE'), + ('urllib.error', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\urllib\\error.py', + 'PYMODULE'), + ('urllib.parse', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\urllib\\parse.py', + 'PYMODULE'), + ('urllib.request', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\urllib\\request.py', + 'PYMODULE'), + ('urllib.response', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\urllib\\response.py', + 'PYMODULE'), + ('uu', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\uu.py', 'PYMODULE'), + ('uuid', 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\uuid.py', 'PYMODULE'), + ('webbrowser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\webbrowser.py', + 'PYMODULE'), + ('wheel', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\__init__.py', + 'PYMODULE'), + ('wheel.cli', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\cli\\__init__.py', + 'PYMODULE'), + ('wheel.cli.convert', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\cli\\convert.py', + 'PYMODULE'), + ('wheel.cli.pack', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\cli\\pack.py', + 'PYMODULE'), + ('wheel.cli.tags', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\cli\\tags.py', + 'PYMODULE'), + ('wheel.cli.unpack', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\cli\\unpack.py', + 'PYMODULE'), + ('wheel.macosx_libfile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\macosx_libfile.py', + 'PYMODULE'), + ('wheel.metadata', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\metadata.py', + 'PYMODULE'), + ('wheel.util', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\util.py', + 'PYMODULE'), + ('wheel.vendored', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\__init__.py', + 'PYMODULE'), + ('wheel.vendored.packaging', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\__init__.py', + 'PYMODULE'), + ('wheel.vendored.packaging._elffile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\_elffile.py', + 'PYMODULE'), + ('wheel.vendored.packaging._manylinux', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\_manylinux.py', + 'PYMODULE'), + ('wheel.vendored.packaging._musllinux', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\_musllinux.py', + 'PYMODULE'), + ('wheel.vendored.packaging._parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\_parser.py', + 'PYMODULE'), + ('wheel.vendored.packaging._structures', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\_structures.py', + 'PYMODULE'), + ('wheel.vendored.packaging._tokenizer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\_tokenizer.py', + 'PYMODULE'), + ('wheel.vendored.packaging.markers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\markers.py', + 'PYMODULE'), + ('wheel.vendored.packaging.requirements', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\requirements.py', + 'PYMODULE'), + ('wheel.vendored.packaging.specifiers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\specifiers.py', + 'PYMODULE'), + ('wheel.vendored.packaging.tags', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\tags.py', + 'PYMODULE'), + ('wheel.vendored.packaging.utils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\utils.py', + 'PYMODULE'), + ('wheel.vendored.packaging.version', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\vendored\\packaging\\version.py', + 'PYMODULE'), + ('wheel.wheelfile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\wheel\\wheelfile.py', + 'PYMODULE'), + ('win32con', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\win32\\lib\\win32con.py', + 'PYMODULE'), + ('win32evtlogutil', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\win32\\lib\\win32evtlogutil.py', + 'PYMODULE'), + ('winerror', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\win32\\lib\\winerror.py', + 'PYMODULE'), + ('xml', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\__init__.py', + 'PYMODULE'), + ('xml.dom', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\dom\\__init__.py', + 'PYMODULE'), + ('xml.dom.NodeFilter', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\dom\\NodeFilter.py', + 'PYMODULE'), + ('xml.dom.domreg', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\dom\\domreg.py', + 'PYMODULE'), + ('xml.dom.expatbuilder', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\dom\\expatbuilder.py', + 'PYMODULE'), + ('xml.dom.minicompat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\dom\\minicompat.py', + 'PYMODULE'), + ('xml.dom.minidom', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\dom\\minidom.py', + 'PYMODULE'), + ('xml.dom.pulldom', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\dom\\pulldom.py', + 'PYMODULE'), + ('xml.dom.xmlbuilder', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\dom\\xmlbuilder.py', + 'PYMODULE'), + ('xml.etree', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\etree\\__init__.py', + 'PYMODULE'), + ('xml.etree.ElementInclude', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\etree\\ElementInclude.py', + 'PYMODULE'), + ('xml.etree.ElementPath', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\etree\\ElementPath.py', + 'PYMODULE'), + ('xml.etree.ElementTree', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\etree\\ElementTree.py', + 'PYMODULE'), + ('xml.etree.cElementTree', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\etree\\cElementTree.py', + 'PYMODULE'), + ('xml.parsers', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\parsers\\__init__.py', + 'PYMODULE'), + ('xml.parsers.expat', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\parsers\\expat.py', + 'PYMODULE'), + ('xml.sax', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\sax\\__init__.py', + 'PYMODULE'), + ('xml.sax._exceptions', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\sax\\_exceptions.py', + 'PYMODULE'), + ('xml.sax.expatreader', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\sax\\expatreader.py', + 'PYMODULE'), + ('xml.sax.handler', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\sax\\handler.py', + 'PYMODULE'), + ('xml.sax.saxutils', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\sax\\saxutils.py', + 'PYMODULE'), + ('xml.sax.xmlreader', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xml\\sax\\xmlreader.py', + 'PYMODULE'), + ('xmlrpc', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xmlrpc\\__init__.py', + 'PYMODULE'), + ('xmlrpc.client', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xmlrpc\\client.py', + 'PYMODULE'), + ('xmlrpc.server', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\xmlrpc\\server.py', + 'PYMODULE'), + ('yaml', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\__init__.py', + 'PYMODULE'), + ('yaml.composer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\composer.py', + 'PYMODULE'), + ('yaml.constructor', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\constructor.py', + 'PYMODULE'), + ('yaml.cyaml', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\cyaml.py', + 'PYMODULE'), + ('yaml.dumper', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\dumper.py', + 'PYMODULE'), + ('yaml.emitter', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\emitter.py', + 'PYMODULE'), + ('yaml.error', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\error.py', + 'PYMODULE'), + ('yaml.events', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\events.py', + 'PYMODULE'), + ('yaml.loader', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\loader.py', + 'PYMODULE'), + ('yaml.nodes', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\nodes.py', + 'PYMODULE'), + ('yaml.parser', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\parser.py', + 'PYMODULE'), + ('yaml.reader', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\reader.py', + 'PYMODULE'), + ('yaml.representer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\representer.py', + 'PYMODULE'), + ('yaml.resolver', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\resolver.py', + 'PYMODULE'), + ('yaml.scanner', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\scanner.py', + 'PYMODULE'), + ('yaml.serializer', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\serializer.py', + 'PYMODULE'), + ('yaml.tokens', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\site-packages\\yaml\\tokens.py', + 'PYMODULE'), + ('zipfile', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\zipfile.py', + 'PYMODULE'), + ('zipimport', + 'C:\\Users\\steven\\.conda\\envs\\mic_v2\\lib\\zipimport.py', + 'PYMODULE')]) diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/base_library.zip b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/base_library.zip new file mode 100644 index 0000000..b93ce00 Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/base_library.zip differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/eq_designer_new.pkg b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/eq_designer_new.pkg new file mode 100644 index 0000000..ce57d8e Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/eq_designer_new.pkg differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/localpycs/pyimod01_archive.pyc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/localpycs/pyimod01_archive.pyc new file mode 100644 index 0000000..6b6e133 Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/localpycs/pyimod01_archive.pyc differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/localpycs/pyimod02_importers.pyc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/localpycs/pyimod02_importers.pyc new file mode 100644 index 0000000..657cffc Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/localpycs/pyimod02_importers.pyc differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/localpycs/pyimod03_ctypes.pyc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/localpycs/pyimod03_ctypes.pyc new file mode 100644 index 0000000..d64ffd9 Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/localpycs/pyimod03_ctypes.pyc differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/localpycs/pyimod04_pywin32.pyc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/localpycs/pyimod04_pywin32.pyc new file mode 100644 index 0000000..3d37384 Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/localpycs/pyimod04_pywin32.pyc differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/localpycs/struct.pyc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/localpycs/struct.pyc new file mode 100644 index 0000000..9251ff0 Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/localpycs/struct.pyc differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/warn-eq_designer_new.txt b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/warn-eq_designer_new.txt new file mode 100644 index 0000000..bcd332e --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/warn-eq_designer_new.txt @@ -0,0 +1,254 @@ + +This file lists modules PyInstaller was not able to find. This does not +necessarily mean this module is required for running your program. Python and +Python 3rd-party packages include a lot of conditional or optional modules. For +example the module 'ntpath' only exists on Windows, whereas the module +'posixpath' only exists on Posix systems. + +Types if 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 pep517 - imported by importlib.metadata (delayed) +missing module named 'org.python' - imported by copy (optional), xml.sax (delayed, conditional) +missing module named posix - imported by shutil (conditional), importlib._bootstrap_external (conditional), os (conditional, optional) +missing module named resource - imported by posix (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 pwd - imported by posixpath (delayed, conditional), shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), http.server (delayed, optional), webbrowser (delayed), netrc (delayed, conditional), getpass (delayed), psutil (optional), distutils.util (delayed, conditional, optional), distutils.archive_util (optional), setuptools._vendor.backports.tarfile (optional), setuptools._distutils.util (delayed, conditional, optional), setuptools._distutils.archive_util (optional) +missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), distutils.archive_util (optional), setuptools._vendor.backports.tarfile (optional), setuptools._distutils.archive_util (optional) +missing module named _posixsubprocess - imported by subprocess (optional), multiprocessing.util (delayed) +missing module named fcntl - imported by subprocess (optional), xmlrpc.server (optional) +missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional) +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 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 org - imported by pickle (optional) +missing module named termios - imported by tty (top-level), getpass (optional) +missing module named vms_lib - imported by platform (delayed, optional) +missing module named 'java.lang' - imported by platform (delayed, optional), xml.sax._exceptions (conditional) +missing module named java - imported by platform (delayed) +missing module named _winreg - imported by platform (delayed, optional) +missing module named _scproxy - imported by urllib.request (conditional) +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 asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional) +missing module named 'distutils._modified' - imported by setuptools._distutils.file_util (delayed) +missing module named _typeshed - imported by setuptools.glob (conditional), setuptools.compat.py311 (conditional), pkg_resources (conditional), setuptools._distutils.dist (conditional) +missing module named '_typeshed.importlib' - imported by pkg_resources (conditional) +missing module named jnius - imported by platformdirs.android (delayed, conditional, optional) +missing module named android - imported by platformdirs.android (delayed, conditional, optional) +missing module named importlib_resources - imported by matplotlib.style.core (conditional), setuptools._vendor.jaraco.text (optional) +missing module named 'typing.io' - imported by importlib.resources (top-level) +missing module named jaraco.text.yield_lines - imported by setuptools._vendor.jaraco.text (top-level), setuptools._entry_points (top-level), setuptools.command._requirestxt (top-level) +missing module named _manylinux - imported by packaging._manylinux (delayed, optional), setuptools._vendor.packaging._manylinux (delayed, optional), wheel.vendored.packaging._manylinux (delayed, optional) +missing module named 'distutils._log' - imported by setuptools._distutils.command.bdist_dumb (top-level), setuptools._distutils.command.bdist_rpm (top-level), setuptools._distutils.command.build_clib (top-level), setuptools._distutils.command.build_ext (top-level), setuptools._distutils.command.build_py (top-level), setuptools._distutils.command.build_scripts (top-level), setuptools._distutils.command.clean (top-level), setuptools._distutils.command.config (top-level), setuptools._distutils.command.install (top-level), setuptools._distutils.command.install_scripts (top-level), setuptools._distutils.command.sdist (top-level) +missing module named usercustomize - imported by site (delayed, optional) +missing module named sitecustomize - imported by site (delayed, optional) +missing module named readline - imported by cmd (delayed, conditional, optional), code (delayed, conditional, optional), pdb (delayed, optional), site (delayed, optional), rlcompleter (optional) +missing module named trove_classifiers - imported by setuptools.config._validate_pyproject.formats (optional) +missing module named tomllib - imported by setuptools.compat.py310 (conditional) +missing module named pyimod02_importers - imported by C:\Users\steven\.conda\envs\mic_v2\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (delayed), C:\Users\steven\.conda\envs\mic_v2\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgres.py (delayed) +missing module named _curses - imported by curses (top-level), curses.has_key (top-level) +missing module named railroad - imported by pyparsing.diagram (top-level) +missing module named pyparsing.Word - imported by pyparsing (delayed), pyparsing.unicode (delayed) +missing module named _dummy_thread - imported by numpy._core.arrayprint (optional) +missing module named numpy._core.void - imported by numpy._core (conditional), 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.timedelta64 - imported by numpy._core (conditional), 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.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.spacing - imported by numpy._core (conditional), numpy (conditional) +missing module named numpy._core.sinh - imported by numpy._core (conditional), numpy (conditional) +missing module named numpy._core.signedinteger - 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.remainder - imported by numpy._core (conditional), numpy (conditional) +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.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.not_equal - imported by numpy._core (conditional), numpy (conditional) +missing module named numpy._core.negative - imported by numpy._core (conditional), 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.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.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.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.integer - imported by numpy._core (conditional), numpy (conditional), numpy.fft._helper (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.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.hypot - imported by numpy._core (conditional), 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.float16 - imported by numpy._core (conditional), 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.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.equal - imported by numpy._core (conditional), numpy (conditional) +missing module named numpy._core.e - imported by numpy._core (conditional), numpy (conditional) +missing module named numpy._core.divmod - imported by numpy._core (conditional), 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.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.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.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.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.ones - imported by numpy._core (top-level), numpy.lib._polynomial_impl (top-level), 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.atleast_1d - imported by numpy._core (top-level), numpy.lib._polynomial_impl (top-level), 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.vstack - imported by numpy._core (top-level), numpy.lib._shape_base_impl (top-level), 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.result_type - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), numpy (conditional), numpy.fft._pocketfft (top-level) +missing module named numpy._core.number - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), 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.array2string - imported by numpy._core (delayed), numpy.testing._private.utils (delayed), 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.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.array_repr - imported by numpy._core (top-level), numpy.testing._private.utils (top-level), 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.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.vecdot - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), 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.tensordot - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), 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.cross - imported by numpy._core (top-level), numpy.linalg._linalg (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.diagonal - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), 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.sort - imported by numpy._core (top-level), numpy.linalg._linalg (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.sign - imported by numpy._core (top-level), numpy.linalg._linalg (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.count_nonzero - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), 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.swapaxes - 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.object_ - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), numpy (conditional) +missing module named numpy._core.asanyarray - 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.atleast_2d - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), 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.amax - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional) +missing module named numpy._core.amin - 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.errstate - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), 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.isfinite - 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.sqrt - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level) +missing module named numpy._core.multiply - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional) +missing module named numpy._core.add - 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.inf - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy.testing._private.utils (delayed), 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.newaxis - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), 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.inexact - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), 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.csingle - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), 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.single - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), numpy (conditional) +missing module named numpy._core.intc - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), 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.zeros - imported by numpy._core (top-level), numpy.linalg._linalg (top-level), 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.iinfo - imported by numpy._core (top-level), numpy.lib._twodim_base_impl (top-level), numpy (conditional) +missing module named numpy._core.transpose - imported by numpy._core (top-level), numpy.lib._function_base_impl (top-level), numpy.linalg._linalg (top-level), numpy (conditional) +missing module named numpy._core.ndarray - imported by numpy._core (top-level), numpy.lib._utils_impl (top-level), numpy.testing._private.utils (top-level), numpy (conditional) +missing module named numpy._core.asarray - imported by numpy._core (top-level), numpy.lib._array_utils_impl (top-level), numpy.linalg._linalg (top-level), numpy (conditional), numpy.fft._pocketfft (top-level), numpy.fft._helper (top-level) +missing module named threadpoolctl - imported by numpy.lib._utils_impl (delayed, optional) +missing module named numpy._typing._ufunc - imported by numpy._typing (conditional) +missing module named olefile - imported by PIL.FpxImagePlugin (top-level), PIL.MicImagePlugin (top-level) +missing module named xmlrpclib - imported by defusedxml.xmlrpc (conditional) +runtime module named six.moves - imported by dateutil.tz.tz (top-level), dateutil.tz._factories (top-level), dateutil.tz.win (top-level), dateutil.rrule (top-level) +missing module named six.moves.range - imported by six.moves (top-level), dateutil.rrule (top-level) +missing module named StringIO - imported by six (conditional) +missing module named dateutil.tz.tzfile - imported by dateutil.tz (top-level), dateutil.zoneinfo (top-level) +missing module named shiboken2 - imported by matplotlib.backends.qt_compat (delayed, conditional, optional) +missing module named sip - imported by matplotlib.backends.qt_compat (delayed, conditional) +missing module named gi - imported by matplotlib.cbook (delayed, conditional) +missing module named numpy.VisibleDeprecationWarning - imported by numpy (optional), matplotlib.cbook (optional) +missing module named setuptools_scm - imported by matplotlib (delayed, conditional, optional) +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 numpy._distributor_init_local - imported by numpy (optional), numpy._distributor_init (optional) diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/xref-eq_designer_new.html b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/xref-eq_designer_new.html new file mode 100644 index 0000000..f52f9c2 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/build/eq_designer_new/xref-eq_designer_new.html @@ -0,0 +1,38587 @@ + + + + + modulegraph cross reference for eq_designer_new.py, pyi_rth_inspect.py, pyi_rth_mplconfig.py, pyi_rth_multiprocessing.py, pyi_rth_pkgres.py, pyi_rth_pkgutil.py, pyi_rth_pyside6.py, pyi_rth_setuptools.py + + + +

modulegraph cross reference for eq_designer_new.py, pyi_rth_inspect.py, pyi_rth_mplconfig.py, pyi_rth_multiprocessing.py, pyi_rth_pkgres.py, pyi_rth_pkgutil.py, pyi_rth_pyside6.py, pyi_rth_setuptools.py

+ +
+ + eq_designer_new.py +Script
+imports: + PySide6.QtCore + • PySide6.QtWidgets + • _collections_abc + • _weakrefset + • abc + • codecs + • collections + • collections.abc + • copyreg + • encodings + • encodings.aliases + • encodings.ascii + • encodings.base64_codec + • encodings.big5 + • encodings.big5hkscs + • encodings.bz2_codec + • encodings.charmap + • encodings.cp037 + • encodings.cp1006 + • encodings.cp1026 + • encodings.cp1125 + • encodings.cp1140 + • encodings.cp1250 + • encodings.cp1251 + • encodings.cp1252 + • encodings.cp1253 + • encodings.cp1254 + • encodings.cp1255 + • encodings.cp1256 + • encodings.cp1257 + • encodings.cp1258 + • encodings.cp273 + • encodings.cp424 + • encodings.cp437 + • encodings.cp500 + • encodings.cp720 + • encodings.cp737 + • encodings.cp775 + • encodings.cp850 + • encodings.cp852 + • encodings.cp855 + • encodings.cp856 + • encodings.cp857 + • encodings.cp858 + • encodings.cp860 + • encodings.cp861 + • encodings.cp862 + • encodings.cp863 + • encodings.cp864 + • encodings.cp865 + • encodings.cp866 + • encodings.cp869 + • encodings.cp874 + • encodings.cp875 + • encodings.cp932 + • encodings.cp949 + • encodings.cp950 + • encodings.euc_jis_2004 + • encodings.euc_jisx0213 + • encodings.euc_jp + • encodings.euc_kr + • encodings.gb18030 + • encodings.gb2312 + • encodings.gbk + • encodings.hex_codec + • encodings.hp_roman8 + • encodings.hz + • encodings.idna + • encodings.iso2022_jp + • encodings.iso2022_jp_1 + • encodings.iso2022_jp_2 + • encodings.iso2022_jp_2004 + • encodings.iso2022_jp_3 + • encodings.iso2022_jp_ext + • encodings.iso2022_kr + • encodings.iso8859_1 + • encodings.iso8859_10 + • encodings.iso8859_11 + • encodings.iso8859_13 + • encodings.iso8859_14 + • encodings.iso8859_15 + • encodings.iso8859_16 + • encodings.iso8859_2 + • encodings.iso8859_3 + • encodings.iso8859_4 + • encodings.iso8859_5 + • encodings.iso8859_6 + • encodings.iso8859_7 + • encodings.iso8859_8 + • encodings.iso8859_9 + • encodings.johab + • encodings.koi8_r + • encodings.koi8_t + • encodings.koi8_u + • encodings.kz1048 + • encodings.latin_1 + • encodings.mac_arabic + • encodings.mac_croatian + • encodings.mac_cyrillic + • encodings.mac_farsi + • encodings.mac_greek + • encodings.mac_iceland + • encodings.mac_latin2 + • encodings.mac_roman + • encodings.mac_romanian + • encodings.mac_turkish + • encodings.mbcs + • encodings.oem + • encodings.palmos + • encodings.ptcp154 + • encodings.punycode + • encodings.quopri_codec + • encodings.raw_unicode_escape + • encodings.rot_13 + • encodings.shift_jis + • encodings.shift_jis_2004 + • encodings.shift_jisx0213 + • encodings.tis_620 + • encodings.undefined + • encodings.unicode_escape + • encodings.utf_16 + • encodings.utf_16_be + • encodings.utf_16_le + • encodings.utf_32 + • encodings.utf_32_be + • encodings.utf_32_le + • encodings.utf_7 + • encodings.utf_8 + • encodings.utf_8_sig + • encodings.uu_codec + • encodings.zlib_codec + • enum + • filter_utils + • functools + • genericpath + • heapq + • hid + • io + • json + • keyword + • linecache + • locale + • logging + • matplotlib + • matplotlib.backends.backend_qt5agg + • matplotlib.figure + • matplotlib.pyplot + • ntpath + • numpy + • operator + • os + • pathlib + • posixpath + • pyi_rth_inspect.py + • pyi_rth_mplconfig.py + • pyi_rth_multiprocessing.py + • pyi_rth_pkgres.py + • pyi_rth_pkgutil.py + • pyi_rth_pyside6.py + • pyi_rth_setuptools.py + • re + • reprlib + • sre_compile + • sre_constants + • sre_parse + • stat + • struct + • time + • traceback + • types + • warnings + • weakref + +
+ +
+ +
+ + pyi_rth_inspect.py +Script
+imports: + inspect + • os + • sys + • zipfile + +
+
+imported by: + eq_designer_new.py + +
+ +
+ +
+ + pyi_rth_mplconfig.py +Script
+imports: + _pyi_rth_utils.tempfile + • atexit + • os + • shutil + +
+
+imported by: + eq_designer_new.py + +
+ +
+ +
+ + pyi_rth_multiprocessing.py +Script
+imports: + multiprocessing + • multiprocessing.spawn + • subprocess + • sys + +
+
+imported by: + eq_designer_new.py + +
+ +
+ +
+ + pyi_rth_pkgres.py +Script
+imports: + os + • pathlib + • pkg_resources + • pyimod02_importers + • sys + +
+
+imported by: + eq_designer_new.py + +
+ +
+ +
+ + pyi_rth_pkgutil.py +Script
+imports: + pkgutil + • pyimod02_importers + +
+
+imported by: + eq_designer_new.py + +
+ +
+ +
+ + pyi_rth_pyside6.py +Script
+imports: + _pyi_rth_utils + • _pyi_rth_utils.qt + • os + • sys + +
+
+imported by: + eq_designer_new.py + +
+ +
+ +
+ + pyi_rth_setuptools.py +Script
+imports: + _distutils_hack + • os + • setuptools + +
+
+imported by: + eq_designer_new.py + +
+ +
+ +
+ + '_typeshed.importlib' +MissingModule
+imported by: + pkg_resources + +
+ +
+ + + +
+ + 'distutils._modified' +MissingModule
+imported by: + setuptools._distutils.file_util + +
+ +
+ +
+ + 'java.lang' +MissingModule
+imported by: + platform + • xml.sax._exceptions + +
+ +
+ +
+ + 'numpy_distutils.command' +MissingModule
+imported by: + numpy.f2py.diagnose + +
+ +
+ +
+ + 'numpy_distutils.cpuinfo' +MissingModule
+imported by: + numpy.f2py.diagnose + +
+ +
+ +
+ + 'numpy_distutils.fcompiler' +MissingModule
+imported by: + numpy.f2py.diagnose + +
+ +
+ +
+ + 'org.python' +MissingModule
+imported by: + copy + • xml.sax + +
+ +
+ +
+ + 'typing.io' +MissingModule
+imported by: + importlib.resources + +
+ +
+ +
+ + PIL +Package +
+imported by: + PIL + • PIL.BlpImagePlugin + • PIL.BmpImagePlugin + • PIL.BufrStubImagePlugin + • PIL.CurImagePlugin + • PIL.DcxImagePlugin + • PIL.DdsImagePlugin + • PIL.EpsImagePlugin + • PIL.ExifTags + • PIL.FitsImagePlugin + • PIL.FliImagePlugin + • PIL.FpxImagePlugin + • PIL.FtexImagePlugin + • PIL.GbrImagePlugin + • PIL.GifImagePlugin + • PIL.GimpGradientFile + • PIL.GimpPaletteFile + • PIL.GribStubImagePlugin + • PIL.Hdf5StubImagePlugin + • PIL.IcnsImagePlugin + • PIL.IcoImagePlugin + • PIL.ImImagePlugin + • PIL.Image + • PIL.ImageChops + • PIL.ImageCms + • PIL.ImageColor + • PIL.ImageFile + • PIL.ImageFilter + • PIL.ImageMath + • PIL.ImageMode + • PIL.ImageOps + • PIL.ImagePalette + • PIL.ImageQt + • PIL.ImageSequence + • PIL.ImageShow + • PIL.ImageTk + • PIL.ImageWin + • PIL.ImtImagePlugin + • PIL.IptcImagePlugin + • PIL.Jpeg2KImagePlugin + • PIL.JpegImagePlugin + • PIL.JpegPresets + • PIL.McIdasImagePlugin + • PIL.MicImagePlugin + • PIL.MpegImagePlugin + • PIL.MpoImagePlugin + • PIL.MspImagePlugin + • PIL.PaletteFile + • PIL.PalmImagePlugin + • PIL.PcdImagePlugin + • PIL.PcxImagePlugin + • PIL.PdfImagePlugin + • PIL.PdfParser + • PIL.PixarImagePlugin + • PIL.PngImagePlugin + • PIL.PpmImagePlugin + • PIL.PsdImagePlugin + • PIL.QoiImagePlugin + • PIL.SgiImagePlugin + • PIL.SpiderImagePlugin + • PIL.SunImagePlugin + • PIL.TgaImagePlugin + • PIL.TiffImagePlugin + • PIL.TiffTags + • PIL.WebPImagePlugin + • PIL.WmfImagePlugin + • PIL.XVThumbImagePlugin + • PIL.XbmImagePlugin + • PIL.XpmImagePlugin + • PIL._binary + • PIL._deprecate + • PIL._imaging + • PIL._imagingcms + • PIL._imagingmath + • PIL._imagingtk + • PIL._typing + • PIL._util + • PIL._version + • PIL._webp + • PIL.features + • matplotlib.backends.backend_webagg_core + • matplotlib.colors + +
+ +
+ +
+ + PIL.BlpImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.JpegImagePlugin + • __future__ + • abc + • enum + • io + • os + • struct + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.BmpImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.ImagePalette + • PIL._binary + • __future__ + • os + • typing + +
+
+imported by: + PIL + • PIL.CurImagePlugin + • PIL.IcoImagePlugin + • PIL.Image + +
+ +
+ +
+ + PIL.BufrStubImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • __future__ + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.CurImagePlugin +SourceModule
+imports: + PIL + • PIL.BmpImagePlugin + • PIL.Image + • PIL.ImageFile + • PIL._binary + • __future__ + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.DcxImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.PcxImagePlugin + • PIL._binary + • __future__ + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.DdsImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.ImagePalette + • PIL._binary + • __future__ + • enum + • io + • struct + • sys + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.EpsImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL._binary + • __future__ + • io + • os + • re + • shutil + • subprocess + • sys + • tempfile + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.ExifTags +SourceModule
+imports: + PIL + • __future__ + • enum + +
+
+imported by: + PIL + • PIL.Image + • PIL.ImageOps + • PIL.TiffImagePlugin + +
+ +
+ +
+ + PIL.FitsImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • __future__ + • gzip + • math + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.FliImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.ImagePalette + • PIL._binary + • __future__ + • os + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.FpxImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL._binary + • __future__ + • olefile + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.FtexImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • __future__ + • enum + • io + • struct + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.GbrImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL._binary + • __future__ + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.GifImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageChops + • PIL.ImageFile + • PIL.ImageMath + • PIL.ImageOps + • PIL.ImagePalette + • PIL.ImageSequence + • PIL._binary + • PIL._imaging + • PIL._typing + • __future__ + • copy + • enum + • functools + • io + • itertools + • math + • os + • subprocess + • typing + +
+
+imported by: + PIL + • PIL.Image + +
+ +
+ +
+ + PIL.GimpGradientFile +SourceModule
+imports: + PIL + • PIL._binary + • __future__ + • math + • typing + +
+
+imported by: + PIL + • PIL.ImagePalette + +
+ +
+ +
+ + PIL.GimpPaletteFile +SourceModule
+imports: + PIL + • PIL._binary + • __future__ + • re + • typing + +
+
+imported by: + PIL + • PIL.ImagePalette + +
+ +
+ +
+ + PIL.GribStubImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • __future__ + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.Hdf5StubImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • __future__ + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.IcnsImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.Jpeg2KImagePlugin + • PIL.PngImagePlugin + • PIL._deprecate + • PIL.features + • __future__ + • io + • os + • struct + • sys + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.IcoImagePlugin +SourceModule
+imports: + PIL + • PIL.BmpImagePlugin + • PIL.Image + • PIL.ImageFile + • PIL.PngImagePlugin + • PIL._binary + • __future__ + • io + • math + • typing + • warnings + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.ImImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.ImagePalette + • __future__ + • os + • re + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.Image +SourceModule
+imports: + PIL + • PIL.BlpImagePlugin + • PIL.BmpImagePlugin + • PIL.BufrStubImagePlugin + • PIL.CurImagePlugin + • PIL.DcxImagePlugin + • PIL.DdsImagePlugin + • PIL.EpsImagePlugin + • PIL.ExifTags + • PIL.FitsImagePlugin + • PIL.FliImagePlugin + • PIL.FpxImagePlugin + • PIL.FtexImagePlugin + • PIL.GbrImagePlugin + • PIL.GifImagePlugin + • PIL.GribStubImagePlugin + • PIL.Hdf5StubImagePlugin + • PIL.IcnsImagePlugin + • PIL.IcoImagePlugin + • PIL.ImImagePlugin + • PIL.ImageCms + • PIL.ImageColor + • PIL.ImageFile + • PIL.ImageFilter + • PIL.ImageMode + • PIL.ImagePalette + • PIL.ImageQt + • PIL.ImageShow + • PIL.ImtImagePlugin + • PIL.IptcImagePlugin + • PIL.Jpeg2KImagePlugin + • PIL.JpegImagePlugin + • PIL.McIdasImagePlugin + • PIL.MicImagePlugin + • PIL.MpegImagePlugin + • PIL.MpoImagePlugin + • PIL.MspImagePlugin + • PIL.PalmImagePlugin + • PIL.PcdImagePlugin + • PIL.PcxImagePlugin + • PIL.PdfImagePlugin + • PIL.PixarImagePlugin + • PIL.PngImagePlugin + • PIL.PpmImagePlugin + • PIL.PsdImagePlugin + • PIL.QoiImagePlugin + • PIL.SgiImagePlugin + • PIL.SpiderImagePlugin + • PIL.SunImagePlugin + • PIL.TgaImagePlugin + • PIL.TiffImagePlugin + • PIL.TiffTags + • PIL.WebPImagePlugin + • PIL.WmfImagePlugin + • PIL.XVThumbImagePlugin + • PIL.XbmImagePlugin + • PIL.XpmImagePlugin + • PIL._binary + • PIL._deprecate + • PIL._imaging + • PIL._typing + • PIL._util + • __future__ + • abc + • atexit + • builtins + • collections.abc + • defusedxml + • defusedxml.ElementTree + • enum + • io + • logging + • math + • mmap + • os + • re + • struct + • sys + • tempfile + • types + • typing + • warnings + • xml.etree.ElementTree + +
+
+imported by: + PIL + • PIL.BlpImagePlugin + • PIL.BmpImagePlugin + • PIL.BufrStubImagePlugin + • PIL.CurImagePlugin + • PIL.DcxImagePlugin + • PIL.DdsImagePlugin + • PIL.EpsImagePlugin + • PIL.FitsImagePlugin + • PIL.FliImagePlugin + • PIL.FpxImagePlugin + • PIL.FtexImagePlugin + • PIL.GbrImagePlugin + • PIL.GifImagePlugin + • PIL.GribStubImagePlugin + • PIL.Hdf5StubImagePlugin + • PIL.IcnsImagePlugin + • PIL.IcoImagePlugin + • PIL.ImImagePlugin + • PIL.ImageChops + • PIL.ImageCms + • PIL.ImageColor + • PIL.ImageFile + • PIL.ImageFilter + • PIL.ImageMath + • PIL.ImageOps + • PIL.ImagePalette + • PIL.ImageQt + • PIL.ImageSequence + • PIL.ImageShow + • PIL.ImageTk + • PIL.ImageWin + • PIL.ImtImagePlugin + • PIL.IptcImagePlugin + • PIL.Jpeg2KImagePlugin + • PIL.JpegImagePlugin + • PIL.McIdasImagePlugin + • PIL.MicImagePlugin + • PIL.MpegImagePlugin + • PIL.MpoImagePlugin + • PIL.MspImagePlugin + • PIL.PalmImagePlugin + • PIL.PcdImagePlugin + • PIL.PcxImagePlugin + • PIL.PdfImagePlugin + • PIL.PixarImagePlugin + • PIL.PngImagePlugin + • PIL.PpmImagePlugin + • PIL.PsdImagePlugin + • PIL.QoiImagePlugin + • PIL.SgiImagePlugin + • PIL.SpiderImagePlugin + • PIL.SunImagePlugin + • PIL.TgaImagePlugin + • PIL.TiffImagePlugin + • PIL.WebPImagePlugin + • PIL.WmfImagePlugin + • PIL.XVThumbImagePlugin + • PIL.XbmImagePlugin + • PIL.XpmImagePlugin + • PIL.features + • matplotlib.backends.backend_webagg_core + • matplotlib.colors + • matplotlib.image + • matplotlib.pyplot + +
+ +
+ +
+ + PIL.ImageChops +SourceModule
+imports: + PIL + • PIL.Image + • __future__ + +
+
+imported by: + PIL + • PIL.GifImagePlugin + • PIL.PngImagePlugin + +
+ +
+ +
+ + PIL.ImageCms +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageWin + • PIL._deprecate + • PIL._imagingcms + • PIL._typing + • PIL._util + • __future__ + • enum + • functools + • operator + • sys + • typing + +
+
+imported by: + PIL + • PIL.Image + +
+ +
+ +
+ + PIL.ImageColor +SourceModule
+imports: + PIL + • PIL.Image + • __future__ + • colorsys + • functools + • re + +
+
+imported by: + PIL + • PIL.Image + • PIL.ImageOps + • PIL.ImagePalette + +
+ +
+ + + +
+ + PIL.ImageFilter +SourceModule
+imports: + PIL + • PIL.Image + • PIL._imaging + • PIL._typing + • __future__ + • abc + • collections.abc + • functools + • types + • typing + +
+
+imported by: + PIL + • PIL.Image + +
+ +
+ +
+ + PIL.ImageMath +SourceModule
+imports: + PIL + • PIL.Image + • PIL._deprecate + • PIL._imagingmath + • __future__ + • builtins + • types + • typing + +
+
+imported by: + PIL + • PIL.GifImagePlugin + +
+ +
+ +
+ + PIL.ImageMode +SourceModule
+imports: + PIL + • PIL._deprecate + • __future__ + • functools + • sys + • typing + +
+
+imported by: + PIL + • PIL.Image + +
+ +
+ +
+ + PIL.ImageOps +SourceModule
+imports: + PIL + • PIL.ExifTags + • PIL.Image + • PIL.ImageColor + • PIL.ImagePalette + • __future__ + • collections.abc + • functools + • operator + • re + • typing + +
+
+imported by: + PIL + • PIL.GifImagePlugin + • PIL.TiffImagePlugin + +
+ +
+ + + +
+ + PIL.ImageQt +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL._util + • __future__ + • io + • sys + • typing + +
+
+imported by: + PIL + • PIL.Image + +
+ +
+ +
+ + PIL.ImageSequence +SourceModule
+imports: + PIL + • PIL.Image + • __future__ + • typing + +
+
+imported by: + PIL + • PIL.GifImagePlugin + • PIL.MpoImagePlugin + • PIL.PdfImagePlugin + • PIL.PngImagePlugin + +
+ +
+ +
+ + PIL.ImageShow +SourceModule
+imports: + PIL + • PIL.Image + • __future__ + • abc + • os + • shlex + • shutil + • subprocess + • sys + • typing + +
+
+imported by: + PIL + • PIL.Image + +
+ +
+ +
+ + PIL.ImageTk +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL._imagingtk + • PIL._typing + • __future__ + • io + • typing + +
+
+imported by: + PIL + • PIL.SpiderImagePlugin + +
+ +
+ +
+ + PIL.ImageWin +SourceModule
+imports: + PIL + • PIL.Image + • __future__ + +
+
+imported by: + PIL + • PIL.ImageCms + +
+ +
+ +
+ + PIL.ImtImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • __future__ + • re + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.IptcImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.JpegImagePlugin + • PIL.TiffImagePlugin + • PIL._binary + • PIL._deprecate + • __future__ + • collections.abc + • io + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.Jpeg2KImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.ImagePalette + • PIL._binary + • __future__ + • collections.abc + • io + • os + • struct + • typing + +
+
+imported by: + PIL + • PIL.IcnsImagePlugin + • PIL.Image + +
+ +
+ +
+ + PIL.JpegImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.JpegPresets + • PIL.MpoImagePlugin + • PIL.TiffImagePlugin + • PIL._binary + • PIL._deprecate + • __future__ + • array + • io + • math + • os + • struct + • subprocess + • sys + • tempfile + • typing + • warnings + +
+
+imported by: + PIL + • PIL.BlpImagePlugin + • PIL.Image + • PIL.IptcImagePlugin + • PIL.MpoImagePlugin + +
+ +
+ +
+ + PIL.JpegPresets +SourceModule
+imports: + PIL + • __future__ + +
+
+imported by: + PIL.JpegImagePlugin + +
+ +
+ +
+ + PIL.McIdasImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • __future__ + • struct + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.MicImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.TiffImagePlugin + • __future__ + • olefile + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.MpegImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL._binary + • PIL._typing + • __future__ + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.MpoImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.ImageSequence + • PIL.JpegImagePlugin + • PIL.TiffImagePlugin + • PIL._binary + • __future__ + • itertools + • os + • struct + • typing + +
+
+imported by: + PIL.Image + • PIL.JpegImagePlugin + +
+ +
+ +
+ + PIL.MspImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL._binary + • __future__ + • io + • struct + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.PaletteFile +SourceModule
+imports: + PIL + • PIL._binary + • __future__ + • typing + +
+
+imported by: + PIL + • PIL.ImagePalette + +
+ +
+ +
+ + PIL.PalmImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL._binary + • __future__ + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.PcdImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • __future__ + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.PcxImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.ImagePalette + • PIL._binary + • __future__ + • io + • logging + • typing + +
+
+imported by: + PIL.DcxImagePlugin + • PIL.Image + +
+ +
+ +
+ + PIL.PdfImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.ImageSequence + • PIL.PdfParser + • PIL.features + • __future__ + • io + • math + • os + • time + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.PdfParser +SourceModule
+imports: + PIL + • __future__ + • calendar + • codecs + • collections + • mmap + • os + • re + • time + • typing + • zlib + +
+
+imported by: + PIL + • PIL.PdfImagePlugin + +
+ +
+ +
+ + PIL.PixarImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL._binary + • __future__ + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.PngImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageChops + • PIL.ImageFile + • PIL.ImagePalette + • PIL.ImageSequence + • PIL._binary + • PIL._imaging + • __future__ + • collections.abc + • enum + • io + • itertools + • logging + • re + • struct + • typing + • warnings + • zlib + +
+
+imported by: + PIL + • PIL.IcnsImagePlugin + • PIL.IcoImagePlugin + • PIL.Image + • matplotlib.colors + • matplotlib.image + +
+ +
+ +
+ + PIL.PpmImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL._binary + • __future__ + • math + • typing + +
+
+imported by: + PIL + • PIL.Image + +
+ +
+ +
+ + PIL.PsdImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.ImagePalette + • PIL._binary + • __future__ + • functools + • io + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.QoiImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL._binary + • __future__ + • os + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.SgiImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL._binary + • __future__ + • os + • struct + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.SpiderImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.ImageTk + • __future__ + • os + • struct + • sys + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.SunImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.ImagePalette + • PIL._binary + • __future__ + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.TgaImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.ImagePalette + • PIL._binary + • __future__ + • typing + • warnings + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.TiffImagePlugin +SourceModule
+imports: + PIL + • PIL.ExifTags + • PIL.Image + • PIL.ImageFile + • PIL.ImageOps + • PIL.ImagePalette + • PIL.TiffTags + • PIL._binary + • PIL._deprecate + • PIL._typing + • PIL._util + • __future__ + • collections.abc + • fractions + • io + • itertools + • logging + • math + • numbers + • os + • struct + • typing + • warnings + +
+ + +
+ +
+ + PIL.TiffTags +SourceModule
+imports: + PIL + • __future__ + • typing + +
+
+imported by: + PIL + • PIL.Image + • PIL.TiffImagePlugin + +
+ +
+ +
+ + PIL.WebPImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL._webp + • __future__ + • io + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.WmfImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL._binary + • __future__ + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.XVThumbImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.ImagePalette + • PIL._binary + • __future__ + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.XbmImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • __future__ + • re + • typing + +
+
+imported by: + PIL.Image + +
+ +
+ +
+ + PIL.XpmImagePlugin +SourceModule
+imports: + PIL + • PIL.Image + • PIL.ImageFile + • PIL.ImagePalette + • PIL._binary + • __future__ + • re + +
+
+imported by: + PIL.Image + +
+ +
+ + + +
+ + PIL._deprecate +SourceModule
+imports: + PIL + • __future__ + • warnings + +
+ + +
+ +
+ + PIL._imaging C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\PIL\_imaging.cp310-win_amd64.pyd
+imports: + PIL + • typing + +
+
+imported by: + PIL + • PIL.GifImagePlugin + • PIL.Image + • PIL.ImageFilter + • PIL.PngImagePlugin + +
+ +
+ +
+ + PIL._imagingcms C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\PIL\_imagingcms.cp310-win_amd64.pyd
+imports: + PIL + • PIL._typing + • datetime + • sys + • typing + +
+
+imported by: + PIL + • PIL.ImageCms + +
+ +
+ +
+ + PIL._imagingmath C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\PIL\_imagingmath.cp310-win_amd64.pyd
+imports: + PIL + • typing + +
+
+imported by: + PIL + • PIL.ImageMath + +
+ +
+ +
+ + PIL._imagingtk C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\PIL\_imagingtk.cp310-win_amd64.pyd
+imports: + PIL + • typing + +
+
+imported by: + PIL + • PIL.ImageTk + +
+ +
+ +
+ + PIL._typing +SourceModule
+imports: + PIL + • __future__ + • collections.abc + • numbers + • numpy.typing + • os + • sys + • types + • typing + • typing_extensions + +
+ + +
+ +
+ + PIL._util +SourceModule
+imports: + PIL + • PIL._typing + • __future__ + • os + • typing + +
+
+imported by: + PIL.Image + • PIL.ImageCms + • PIL.ImageFile + • PIL.ImageQt + • PIL.TiffImagePlugin + +
+ +
+ +
+ + PIL._version +SourceModule
+imports: + PIL + • __future__ + +
+
+imported by: + PIL + +
+ +
+ +
+ + PIL._webp C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\PIL\_webp.cp310-win_amd64.pyd
+imports: + PIL + • typing + +
+
+imported by: + PIL + • PIL.WebPImagePlugin + +
+ +
+ +
+ + PIL.features +SourceModule
+imports: + PIL + • PIL.Image + • PIL._deprecate + • __future__ + • collections + • os + • sys + • typing + • warnings + +
+
+imported by: + PIL + • PIL.IcnsImagePlugin + • PIL.PdfImagePlugin + +
+ +
+ +
+ + PySide6 +Package
+imports: + PySide6 + • PySide6.QtNetwork + • PySide6.support.deprecated + • inspect + • os + • pathlib + • shiboken6 + • shiboken6.Shiboken + • sys + • types + +
+ + +
+ +
+ + PySide6.QtCore C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\PySide6\QtCore.pyd
+imports: + PySide6 + • PySide6.QtCore + • __future__ + • collections.abc + • enum + • os + • shiboken6 + • shiboken6.Shiboken + • typing + +
+ + +
+ +
+ + PySide6.QtGui C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\PySide6\QtGui.pyd
+imports: + PySide6 + • PySide6.QtCore + • PySide6.QtGui + • __future__ + • collections.abc + • enum + • os + • shiboken6 + • shiboken6.Shiboken + • typing + +
+ + +
+ +
+ + PySide6.QtNetwork C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\PySide6\QtNetwork.pyd
+imports: + PySide6 + • PySide6.QtCore + • PySide6.QtNetwork + • __future__ + • enum + • os + • shiboken6 + • shiboken6.Shiboken + • typing + +
+
+imported by: + PySide6 + • PySide6.QtNetwork + +
+ +
+ +
+ + PySide6.QtWidgets C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\PySide6\QtWidgets.pyd
+imports: + PySide6 + • PySide6.QtCore + • PySide6.QtGui + • PySide6.QtWidgets + • __future__ + • collections.abc + • enum + • os + • shiboken6 + • shiboken6.Shiboken + • typing + +
+ + +
+ +
+ + PySide6.support +Package
+imports: + PySide6 + • __future__ + • shiboken6.Shiboken + +
+
+imported by: + PySide6.support.deprecated + +
+ +
+ +
+ + PySide6.support.deprecated +SourceModule
+imports: + PySide6.support + • __future__ + +
+
+imported by: + PySide6 + +
+ +
+ +
+ + StringIO +MissingModule
+imported by: + six + +
+ +
+ +
+ + __future__ +SourceModule
+imported by: + PIL + • PIL.BlpImagePlugin + • PIL.BmpImagePlugin + • PIL.BufrStubImagePlugin + • PIL.CurImagePlugin + • PIL.DcxImagePlugin + • PIL.DdsImagePlugin + • PIL.EpsImagePlugin + • PIL.ExifTags + • PIL.FitsImagePlugin + • PIL.FliImagePlugin + • PIL.FpxImagePlugin + • PIL.FtexImagePlugin + • PIL.GbrImagePlugin + • PIL.GifImagePlugin + • PIL.GimpGradientFile + • PIL.GimpPaletteFile + • PIL.GribStubImagePlugin + • PIL.Hdf5StubImagePlugin + • PIL.IcnsImagePlugin + • PIL.IcoImagePlugin + • PIL.ImImagePlugin + • PIL.Image + • PIL.ImageChops + • PIL.ImageCms + • PIL.ImageColor + • PIL.ImageFile + • PIL.ImageFilter + • PIL.ImageMath + • PIL.ImageMode + • PIL.ImageOps + • PIL.ImagePalette + • PIL.ImageQt + • PIL.ImageSequence + • PIL.ImageShow + • PIL.ImageTk + • PIL.ImageWin + • PIL.ImtImagePlugin + • PIL.IptcImagePlugin + • PIL.Jpeg2KImagePlugin + • PIL.JpegImagePlugin + • PIL.JpegPresets + • PIL.McIdasImagePlugin + • PIL.MicImagePlugin + • PIL.MpegImagePlugin + • PIL.MpoImagePlugin + • PIL.MspImagePlugin + • PIL.PaletteFile + • PIL.PalmImagePlugin + • PIL.PcdImagePlugin + • PIL.PcxImagePlugin + • PIL.PdfImagePlugin + • PIL.PdfParser + • PIL.PixarImagePlugin + • PIL.PngImagePlugin + • PIL.PpmImagePlugin + • PIL.PsdImagePlugin + • PIL.QoiImagePlugin + • PIL.SgiImagePlugin + • PIL.SpiderImagePlugin + • PIL.SunImagePlugin + • PIL.TgaImagePlugin + • PIL.TiffImagePlugin + • PIL.TiffTags + • PIL.WebPImagePlugin + • PIL.WmfImagePlugin + • PIL.XVThumbImagePlugin + • PIL.XbmImagePlugin + • PIL.XpmImagePlugin + • PIL._binary + • PIL._deprecate + • PIL._typing + • PIL._util + • PIL._version + • PIL.features + • PySide6.QtCore + • PySide6.QtGui + • PySide6.QtNetwork + • PySide6.QtWidgets + • PySide6.support + • PySide6.support.deprecated + • charset_normalizer + • charset_normalizer.api + • charset_normalizer.cd + • charset_normalizer.constant + • charset_normalizer.legacy + • charset_normalizer.md + • charset_normalizer.models + • charset_normalizer.utils + • charset_normalizer.version + • codeop + • contourpy + • contourpy.array + • contourpy.chunk + • contourpy.convert + • contourpy.dechunk + • contourpy.enum_util + • contourpy.typecheck + • contourpy.types + • cycler + • dateutil.parser._parser + • defusedxml + • defusedxml.ElementTree + • defusedxml.cElementTree + • defusedxml.expatbuilder + • defusedxml.expatreader + • defusedxml.minidom + • defusedxml.pulldom + • defusedxml.sax + • defusedxml.xmlrpc + • doctest + • markupsafe + • matplotlib._mathtext + • matplotlib._mathtext_data + • matplotlib._text_helpers + • matplotlib.font_manager + • matplotlib.pyplot + • numpy._typing + • numpy._typing._array_like + • numpy._typing._nested_sequence + • numpy.f2py._backends._backend + • numpy.f2py._backends._meson + • packaging._elffile + • packaging._manylinux + • packaging._musllinux + • packaging._parser + • packaging._tokenizer + • packaging.licenses + • packaging.licenses._spdx + • packaging.markers + • packaging.metadata + • packaging.requirements + • packaging.specifiers + • packaging.tags + • packaging.utils + • packaging.version + • pkg_resources + • platformdirs + • platformdirs.android + • platformdirs.api + • platformdirs.macos + • platformdirs.unix + • platformdirs.windows + • pyparsing.core + • pyparsing.diagram + • pyparsing.exceptions + • pyparsing.results + • setuptools + • setuptools._core_metadata + • setuptools._distutils._modified + • setuptools._distutils.archive_util + • setuptools._distutils.cmd + • setuptools._distutils.command.bdist + • setuptools._distutils.command.build + • setuptools._distutils.command.build_clib + • setuptools._distutils.command.build_ext + • setuptools._distutils.command.config + • setuptools._distutils.command.install + • setuptools._distutils.command.install_data + • setuptools._distutils.command.install_lib + • setuptools._distutils.command.sdist + • setuptools._distutils.compat + • setuptools._distutils.compilers.C.base + • setuptools._distutils.compilers.C.msvc + • setuptools._distutils.compilers.C.unix + • setuptools._distutils.core + • setuptools._distutils.dist + • setuptools._distutils.extension + • setuptools._distutils.fancy_getopt + • setuptools._distutils.filelist + • setuptools._distutils.spawn + • setuptools._distutils.sysconfig + • setuptools._distutils.util + • setuptools._path + • setuptools._reqs + • setuptools._vendor.importlib_metadata + • setuptools._vendor.importlib_metadata._meta + • setuptools._vendor.jaraco.context + • setuptools._vendor.packaging._elffile + • setuptools._vendor.packaging._manylinux + • setuptools._vendor.packaging._musllinux + • setuptools._vendor.packaging._parser + • setuptools._vendor.packaging._tokenizer + • setuptools._vendor.packaging.markers + • setuptools._vendor.packaging.requirements + • setuptools._vendor.packaging.specifiers + • setuptools._vendor.packaging.tags + • setuptools._vendor.packaging.utils + • setuptools._vendor.packaging.version + • setuptools.command._requirestxt + • setuptools.command.bdist_egg + • setuptools.command.bdist_wheel + • setuptools.command.build + • setuptools.command.sdist + • setuptools.compat.py311 + • setuptools.config._apply_pyprojecttoml + • setuptools.config.expand + • setuptools.config.pyprojecttoml + • setuptools.config.setupcfg + • setuptools.depends + • setuptools.discovery + • setuptools.dist + • setuptools.errors + • setuptools.extension + • setuptools.glob + • setuptools.installer + • setuptools.monkey + • setuptools.msvc + • setuptools.warnings + • shiboken6.Shiboken + • six + • tomli._parser + • tomli._re + • wheel + • wheel.cli + • wheel.cli.convert + • wheel.cli.pack + • wheel.cli.tags + • wheel.cli.unpack + • wheel.macosx_libfile + • wheel.metadata + • wheel.util + • wheel.wheelfile + +
+ +
+ +
+ + _abc (builtin module)
+imported by: + abc + +
+ +
+ +
+ + _aix_support +SourceModule
+imports: + _bootsubprocess + • subprocess + • sys + • sysconfig + +
+
+imported by: + distutils.util + • sysconfig + +
+ +
+ +
+ + _ast (builtin module)
+imported by: + ast + +
+ +
+ +
+ + _asyncio C:\Users\steven\.conda\envs\mic_v2\DLLs\_asyncio.pyd
+imported by: + asyncio.events + • asyncio.futures + • asyncio.tasks + +
+ +
+ +
+ + _bisect (builtin module)
+imported by: + bisect + +
+ +
+ +
+ + _blake2 (builtin module)
+imported by: + hashlib + +
+ +
+ +
+ + _bootsubprocess +SourceModule
+imports: + os + +
+
+imported by: + _aix_support + +
+ +
+ +
+ + _bz2 C:\Users\steven\.conda\envs\mic_v2\DLLs\_bz2.pyd
+imported by: + bz2 + +
+ +
+ +
+ + _codecs (builtin module)
+imported by: + codecs + +
+ +
+ +
+ + _codecs_cn (builtin module)
+imported by: + encodings.gb18030 + • encodings.gb2312 + • encodings.gbk + • encodings.hz + +
+ +
+ +
+ + _codecs_hk (builtin module)
+imported by: + encodings.big5hkscs + +
+ +
+ +
+ + _codecs_iso2022 (builtin module) + +
+ +
+ + _codecs_jp (builtin module) + +
+ +
+ + _codecs_kr (builtin module)
+imported by: + encodings.cp949 + • encodings.euc_kr + • encodings.johab + +
+ +
+ +
+ + _codecs_tw (builtin module)
+imported by: + encodings.big5 + • encodings.cp950 + +
+ +
+ +
+ + _collections (builtin module)
+imported by: + collections + • threading + +
+ +
+ +
+ + _collections_abc +SourceModule
+imports: + abc + • sys + +
+
+imported by: + collections + • collections.abc + • contextlib + • eq_designer_new.py + • locale + • os + • pathlib + • random + • types + • weakref + +
+ +
+ +
+ + _compat_pickle +SourceModule
+imported by: + _pickle + • pickle + +
+ +
+ +
+ + _compression +SourceModule
+imports: + io + • sys + +
+
+imported by: + bz2 + • gzip + • lzma + +
+ +
+ +
+ + _contextvars (builtin module)
+imported by: + contextvars + +
+ +
+ +
+ + _csv (builtin module)
+imported by: + csv + +
+ +
+ +
+ + _ctypes C:\Users\steven\.conda\envs\mic_v2\DLLs\_ctypes.pyd
+imported by: + ctypes + • numpy._core._dtype_ctypes + +
+ +
+ +
+ + _curses +MissingModule
+imports: + curses + +
+
+imported by: + curses + • curses.has_key + +
+ +
+ +
+ + _datetime (builtin module)
+imports: + _strptime + • time + +
+
+imported by: + datetime + +
+ +
+ +
+ + _decimal C:\Users\steven\.conda\envs\mic_v2\DLLs\_decimal.pyd
+imported by: + decimal + +
+ +
+ +
+ + _distutils_hack +Package
+imports: + importlib + • importlib.abc + • importlib.util + • os + • sys + • traceback + • warnings + +
+ + +
+ +
+ + _distutils_hack.override +SourceModule
+imports: + _distutils_hack + +
+
+imported by: + setuptools + • setuptools.discovery + +
+ +
+ +
+ + _dummy_thread +MissingModule
+imported by: + numpy._core.arrayprint + +
+ +
+ +
+ + _elementtree C:\Users\steven\.conda\envs\mic_v2\DLLs\_elementtree.pyd +
+imported by: + xml.etree.ElementTree + +
+ +
+ +
+ + _frozen_importlib +ExcludedModule
+imported by: + importlib + • importlib.abc + • zipimport + +
+ +
+ +
+ + _frozen_importlib_external +MissingModule
+imported by: + importlib + • importlib._bootstrap + • importlib.abc + • zipimport + +
+ +
+ +
+ + _functools (builtin module)
+imported by: + functools + +
+ +
+ +
+ + _hashlib C:\Users\steven\.conda\envs\mic_v2\DLLs\_hashlib.pyd
+imported by: + hashlib + • hmac + +
+ +
+ +
+ + _heapq (builtin module)
+imported by: + heapq + +
+ +
+ +
+ + _imp (builtin module) + +
+ +
+ + _io (builtin module)
+imported by: + importlib._bootstrap_external + • io + • unittest.mock + • zipimport + +
+ +
+ +
+ + _json (builtin module)
+imports: + json.decoder + +
+
+imported by: + json.decoder + • json.encoder + • json.scanner + +
+ +
+ +
+ + _locale (builtin module)
+imported by: + locale + • re + +
+ +
+ +
+ + _lzma C:\Users\steven\.conda\envs\mic_v2\DLLs\_lzma.pyd
+imported by: + lzma + +
+ +
+ + + +
+ + _md5 (builtin module)
+imported by: + hashlib + +
+ +
+ + + +
+ + _multiprocessing C:\Users\steven\.conda\envs\mic_v2\DLLs\_multiprocessing.pyd + +
+ +
+ + _opcode (builtin module)
+imported by: + opcode + +
+ +
+ +
+ + _operator (builtin module)
+imported by: + hmac + • operator + +
+ +
+ +
+ + _osx_support +SourceModule
+imports: + contextlib + • os + • re + • sys + • tempfile + +
+
+imported by: + distutils.sysconfig + • distutils.util + +
+ +
+ +
+ + _overlapped C:\Users\steven\.conda\envs\mic_v2\DLLs\_overlapped.pyd
+imported by: + asyncio.windows_events + +
+ +
+ +
+ + _pickle (builtin module)
+imports: + _compat_pickle + • codecs + • copyreg + +
+
+imported by: + pickle + +
+ +
+ +
+ + _posixshmem +MissingModule + +
+ +
+ + _posixsubprocess +MissingModule
+imports: + gc + +
+
+imported by: + multiprocessing.util + • subprocess + +
+ +
+ +
+ + _py_abc +SourceModule
+imports: + _weakrefset + +
+
+imported by: + abc + +
+ +
+ +
+ + _pydecimal +SourceModule
+imports: + collections + • contextvars + • itertools + • locale + • math + • numbers + • re + • sys + +
+
+imported by: + decimal + +
+ +
+ +
+ + _pyi_rth_utils +Package
+imports: + _pyi_rth_utils + • _pyi_rth_utils._win32 + • _pyi_rth_utils.qt + • os + • sys + +
+ + +
+ +
+ + _pyi_rth_utils._win32 +SourceModule
+imports: + _pyi_rth_utils + • ctypes + • ctypes.wintypes + +
+
+imported by: + _pyi_rth_utils + • _pyi_rth_utils.tempfile + +
+ +
+ +
+ + _pyi_rth_utils.qt +SourceModule
+imports: + _pyi_rth_utils + • atexit + • importlib + • os + +
+
+imported by: + _pyi_rth_utils + • pyi_rth_pyside6.py + +
+ +
+ +
+ + _pyi_rth_utils.tempfile +SourceModule
+imports: + _pyi_rth_utils + • _pyi_rth_utils._win32 + • errno + • os + • sys + • tempfile + +
+
+imported by: + pyi_rth_mplconfig.py + +
+ +
+ +
+ + _queue C:\Users\steven\.conda\envs\mic_v2\DLLs\_queue.pyd
+imported by: + queue + +
+ +
+ +
+ + _random (builtin module)
+imported by: + random + +
+ +
+ +
+ + _scproxy +MissingModule
+imported by: + urllib.request + +
+ +
+ +
+ + _sha1 (builtin module)
+imported by: + hashlib + +
+ +
+ +
+ + _sha256 (builtin module)
+imported by: + hashlib + +
+ +
+ +
+ + _sha3 (builtin module)
+imported by: + hashlib + +
+ +
+ +
+ + _sha512 (builtin module)
+imported by: + hashlib + • random + +
+ +
+ +
+ + _signal (builtin module)
+imported by: + signal + +
+ +
+ +
+ + _sitebuiltins +SourceModule
+imports: + os + • pydoc + • sys + +
+
+imported by: + site + +
+ +
+ +
+ + _socket C:\Users\steven\.conda\envs\mic_v2\DLLs\_socket.pyd
+imported by: + socket + • typing_extensions + +
+ +
+ +
+ + _sre (builtin module)
+imports: + copy + • re + +
+
+imported by: + sre_compile + • sre_constants + +
+ +
+ +
+ + _ssl C:\Users\steven\.conda\envs\mic_v2\DLLs\_ssl.pyd
+imports: + socket + +
+
+imported by: + ssl + +
+ +
+ +
+ + _stat (builtin module)
+imported by: + stat + +
+ +
+ +
+ + _statistics (builtin module)
+imported by: + statistics + +
+ +
+ +
+ + _string (builtin module)
+imported by: + jinja2.sandbox + • string + +
+ +
+ +
+ + _strptime +SourceModule
+imports: + _thread + • calendar + • datetime + • locale + • re + • time + +
+
+imported by: + _datetime + • datetime + • time + +
+ +
+ +
+ + _struct (builtin module)
+imported by: + struct + +
+ +
+ +
+ + _thread (builtin module)
+imported by: + _strptime + • asyncio.base_futures + • dataclasses + • functools + • numpy._core.arrayprint + • reprlib + • six.moves._thread + • tempfile + • threading + +
+ +
+ +
+ + _threading_local +SourceModule
+imports: + contextlib + • threading + • weakref + +
+
+imported by: + threading + +
+ +
+ +
+ + _tracemalloc (builtin module)
+imported by: + tracemalloc + +
+ +
+ +
+ + _typeshed +MissingModule + +
+ +
+ + _uuid C:\Users\steven\.conda\envs\mic_v2\DLLs\_uuid.pyd
+imported by: + uuid + +
+ +
+ +
+ + _warnings (builtin module)
+imported by: + importlib._bootstrap_external + • warnings + • zipimport + +
+ +
+ +
+ + _weakref (builtin module)
+imported by: + _weakrefset + • collections + • weakref + • xml.sax.expatreader + +
+ +
+ +
+ + _weakrefset +SourceModule
+imports: + _weakref + • types + +
+
+imported by: + _py_abc + • eq_designer_new.py + • multiprocessing.process + • threading + • weakref + +
+ +
+ + + +
+ + _winreg +MissingModule
+imported by: + platform + +
+ +
+ + + +
+ + android +MissingModule
+imported by: + platformdirs.android + +
+ +
+ +
+ + argparse +SourceModule
+imports: + copy + • gettext + • os + • re + • shutil + • sys + • textwrap + • warnings + +
+
+imported by: + ast + • calendar + • code + • dis + • doctest + • gzip + • http.server + • inspect + • matplotlib.dviread + • numpy.f2py.f2py2e + • py_compile + • setuptools._vendor.backports.tarfile + • tarfile + • tokenize + • unittest.main + • wheel.cli + • zipfile + +
+ +
+ +
+ + array (builtin module) + +
+ + + +
+ + asyncio +Package + + +
+ +
+ + asyncio.DefaultEventLoopPolicy +MissingModule
+imported by: + asyncio + • asyncio.events + +
+ +
+ +
+ + asyncio.base_events +SourceModule
+imports: + asyncio + • asyncio.constants + • asyncio.coroutines + • asyncio.events + • asyncio.exceptions + • asyncio.futures + • asyncio.log + • asyncio.protocols + • asyncio.sslproto + • asyncio.staggered + • asyncio.tasks + • asyncio.transports + • asyncio.trsock + • collections + • collections.abc + • concurrent.futures + • functools + • heapq + • itertools + • os + • socket + • ssl + • stat + • subprocess + • sys + • threading + • time + • traceback + • warnings + • weakref + +
+ + +
+ +
+ + asyncio.base_futures +SourceModule
+imports: + _thread + • asyncio + • asyncio.format_helpers + • reprlib + +
+
+imported by: + asyncio + • asyncio.base_tasks + • asyncio.coroutines + • asyncio.futures + +
+ +
+ +
+ + asyncio.base_subprocess +SourceModule
+imports: + asyncio + • asyncio.log + • asyncio.protocols + • asyncio.transports + • collections + • subprocess + • warnings + +
+
+imported by: + asyncio + • asyncio.unix_events + • asyncio.windows_events + +
+ +
+ +
+ + asyncio.base_tasks +SourceModule
+imports: + asyncio + • asyncio.base_futures + • asyncio.coroutines + • linecache + • traceback + +
+
+imported by: + asyncio + • asyncio.tasks + +
+ +
+ +
+ + asyncio.constants +SourceModule
+imports: + asyncio + • enum + +
+ + +
+ +
+ + asyncio.coroutines +SourceModule
+imports: + asyncio + • asyncio.base_futures + • asyncio.constants + • asyncio.format_helpers + • asyncio.log + • collections.abc + • functools + • inspect + • os + • sys + • traceback + • types + • warnings + +
+ + +
+ + + +
+ + asyncio.exceptions +SourceModule
+imports: + asyncio + +
+ + +
+ +
+ + asyncio.format_helpers +SourceModule
+imports: + asyncio + • asyncio.constants + • functools + • inspect + • reprlib + • sys + • traceback + +
+ + +
+ + + +
+ + asyncio.locks +SourceModule
+imports: + asyncio + • asyncio.exceptions + • asyncio.mixins + • asyncio.tasks + • collections + +
+
+imported by: + asyncio + • asyncio.queues + • asyncio.staggered + +
+ +
+ + + +
+ + asyncio.mixins +SourceModule
+imports: + asyncio + • asyncio.events + • threading + +
+
+imported by: + asyncio + • asyncio.locks + • asyncio.queues + +
+ +
+ +
+ + asyncio.proactor_events +SourceModule +
+imported by: + asyncio + • asyncio.windows_events + +
+ +
+ +
+ + asyncio.protocols +SourceModule
+imports: + asyncio + +
+ + +
+ +
+ + asyncio.queues +SourceModule
+imports: + asyncio + • asyncio.locks + • asyncio.mixins + • collections + • heapq + • types + +
+
+imported by: + asyncio + • asyncio.tasks + +
+ +
+ +
+ + asyncio.runners +SourceModule
+imports: + asyncio + • asyncio.coroutines + • asyncio.events + • asyncio.tasks + +
+
+imported by: + asyncio + +
+ +
+ +
+ + asyncio.selector_events +SourceModule +
+imported by: + asyncio + • asyncio.unix_events + • asyncio.windows_events + +
+ +
+ +
+ + asyncio.sslproto +SourceModule
+imports: + asyncio + • asyncio.constants + • asyncio.log + • asyncio.protocols + • asyncio.transports + • collections + • ssl + • warnings + +
+ + +
+ +
+ + asyncio.staggered +SourceModule
+imports: + asyncio + • asyncio.events + • asyncio.exceptions + • asyncio.locks + • asyncio.tasks + • contextlib + • typing + +
+
+imported by: + asyncio + • asyncio.base_events + +
+ +
+ +
+ + asyncio.streams +SourceModule +
+imported by: + asyncio + • asyncio.subprocess + +
+ +
+ +
+ + asyncio.subprocess +SourceModule
+imports: + asyncio + • asyncio.events + • asyncio.log + • asyncio.protocols + • asyncio.streams + • asyncio.tasks + • subprocess + +
+
+imported by: + asyncio + +
+ +
+ + + +
+ + asyncio.threads +SourceModule
+imports: + asyncio + • asyncio.events + • contextvars + • functools + +
+
+imported by: + asyncio + +
+ +
+ +
+ + asyncio.transports +SourceModule
+imports: + asyncio + +
+ + +
+ +
+ + asyncio.trsock +SourceModule
+imports: + asyncio + • socket + • warnings + +
+ + +
+ +
+ + asyncio.unix_events +SourceModule +
+imported by: + asyncio + +
+ +
+ +
+ + asyncio.windows_events +SourceModule +
+imported by: + asyncio + +
+ +
+ +
+ + asyncio.windows_utils +SourceModule
+imports: + _winapi + • asyncio + • itertools + • msvcrt + • os + • subprocess + • sys + • tempfile + • warnings + +
+
+imported by: + asyncio + • asyncio.windows_events + +
+ +
+ +
+ + atexit (builtin module) + +
+ +
+ + backports +Package
+imports: + backports.tarfile + • pkgutil + +
+ + +
+ +
+ + backports.tarfile +AliasNode +
+imported by: + backports + • setuptools._vendor.jaraco.context + +
+ +
+ +
+ + base64 +SourceModule
+imports: + binascii + • getopt + • re + • struct + • sys + +
+ + +
+ +
+ + bdb +SourceModule
+imports: + fnmatch + • inspect + • linecache + • os + • reprlib + • sys + +
+
+imported by: + pdb + +
+ +
+ +
+ + binascii (builtin module) + +
+ +
+ + bisect +SourceModule
+imports: + _bisect + +
+
+imported by: + dateutil.tz.tz + • multiprocessing.heap + • random + • statistics + • urllib.request + +
+ +
+ +
+ + builtins (builtin module) + +
+ +
+ + bz2 +SourceModule
+imports: + _bz2 + • _compression + • builtins + • io + • os + +
+ + +
+ +
+ + calendar +SourceModule
+imports: + argparse + • datetime + • itertools + • locale + • sys + +
+ + +
+ +
+ + certifi +Package
+imports: + certifi.core + +
+
+imported by: + certifi.core + • matplotlib + +
+ +
+ +
+ + certifi.core +SourceModule
+imports: + atexit + • certifi + • importlib.resources + • os + • sys + • types + • typing + +
+
+imported by: + certifi + +
+ +
+ +
+ + cgi +SourceModule
+imports: + collections.abc + • email.message + • email.parser + • html + • io + • locale + • os + • re + • sys + • tempfile + • traceback + • urllib.parse + • warnings + +
+
+imported by: + distutils.config + +
+ +
+ + + + + + + + + +
+ + charset_normalizer.legacy +SourceModule +
+imported by: + charset_normalizer + +
+ +
+ +
+ + charset_normalizer.md C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\charset_normalizer\md.cp310-win_amd64.pyd +
+imported by: + charset_normalizer.api + • charset_normalizer.cd + +
+ +
+ +
+ + charset_normalizer.md__mypyc C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\charset_normalizer\md__mypyc.cp310-win_amd64.pyd
+imports: + charset_normalizer + +
+
+imported by: + charset_normalizer + +
+ +
+ + + + + +
+ + charset_normalizer.version +SourceModule
+imports: + __future__ + • charset_normalizer + +
+
+imported by: + charset_normalizer + +
+ +
+ +
+ + cmd +SourceModule
+imports: + readline + • string + • sys + +
+
+imported by: + pdb + +
+ +
+ +
+ + code +SourceModule
+imports: + argparse + • codeop + • readline + • sys + • traceback + +
+
+imported by: + pdb + +
+ +
+ +
+ + codecs +SourceModule
+imports: + _codecs + • builtins + • encodings + • sys + +
+
+imported by: + PIL.PdfParser + • _pickle + • charset_normalizer.cd + • charset_normalizer.constant + • charset_normalizer.utils + • encodings + • encodings.ascii + • encodings.base64_codec + • encodings.big5 + • encodings.big5hkscs + • encodings.bz2_codec + • encodings.charmap + • encodings.cp037 + • encodings.cp1006 + • encodings.cp1026 + • encodings.cp1125 + • encodings.cp1140 + • encodings.cp1250 + • encodings.cp1251 + • encodings.cp1252 + • encodings.cp1253 + • encodings.cp1254 + • encodings.cp1255 + • encodings.cp1256 + • encodings.cp1257 + • encodings.cp1258 + • encodings.cp273 + • encodings.cp424 + • encodings.cp437 + • encodings.cp500 + • encodings.cp720 + • encodings.cp737 + • encodings.cp775 + • encodings.cp850 + • encodings.cp852 + • encodings.cp855 + • encodings.cp856 + • encodings.cp857 + • encodings.cp858 + • encodings.cp860 + • encodings.cp861 + • encodings.cp862 + • encodings.cp863 + • encodings.cp864 + • encodings.cp865 + • encodings.cp866 + • encodings.cp869 + • encodings.cp874 + • encodings.cp875 + • encodings.cp932 + • encodings.cp949 + • encodings.cp950 + • encodings.euc_jis_2004 + • encodings.euc_jisx0213 + • encodings.euc_jp + • encodings.euc_kr + • encodings.gb18030 + • encodings.gb2312 + • encodings.gbk + • encodings.hex_codec + • encodings.hp_roman8 + • encodings.hz + • encodings.idna + • encodings.iso2022_jp + • encodings.iso2022_jp_1 + • encodings.iso2022_jp_2 + • encodings.iso2022_jp_2004 + • encodings.iso2022_jp_3 + • encodings.iso2022_jp_ext + • encodings.iso2022_kr + • encodings.iso8859_1 + • encodings.iso8859_10 + • encodings.iso8859_11 + • encodings.iso8859_13 + • encodings.iso8859_14 + • encodings.iso8859_15 + • encodings.iso8859_16 + • encodings.iso8859_2 + • encodings.iso8859_3 + • encodings.iso8859_4 + • encodings.iso8859_5 + • encodings.iso8859_6 + • encodings.iso8859_7 + • encodings.iso8859_8 + • encodings.iso8859_9 + • encodings.johab + • encodings.koi8_r + • encodings.koi8_t + • encodings.koi8_u + • encodings.kz1048 + • encodings.latin_1 + • encodings.mac_arabic + • encodings.mac_croatian + • encodings.mac_cyrillic + • encodings.mac_farsi + • encodings.mac_greek + • encodings.mac_iceland + • encodings.mac_latin2 + • encodings.mac_roman + • encodings.mac_romanian + • encodings.mac_turkish + • encodings.mbcs + • encodings.oem + • encodings.palmos + • encodings.ptcp154 + • encodings.punycode + • encodings.quopri_codec + • encodings.raw_unicode_escape + • encodings.rot_13 + • encodings.shift_jis + • encodings.shift_jis_2004 + • encodings.shift_jisx0213 + • encodings.tis_620 + • encodings.undefined + • encodings.unicode_escape + • encodings.utf_16 + • encodings.utf_16_be + • encodings.utf_16_le + • encodings.utf_32 + • encodings.utf_32_be + • encodings.utf_32_le + • encodings.utf_7 + • encodings.utf_8 + • encodings.utf_8_sig + • encodings.uu_codec + • encodings.zlib_codec + • eq_designer_new.py + • json + • numpy.f2py.crackfortran + • pickle + • plistlib + • tokenize + • tornado.locale + • xml.sax.saxutils + • yaml.reader + +
+ +
+ +
+ + codeop +SourceModule
+imports: + __future__ + • warnings + +
+
+imported by: + code + +
+ +
+ +
+ + collections +Package
+imports: + _collections + • _collections_abc + • _weakref + • copy + • heapq + • itertools + • keyword + • operator + • reprlib + • sys + +
+
+imported by: + PIL.PdfParser + • PIL.features + • _pydecimal + • ast + • asyncio.base_events + • asyncio.base_subprocess + • asyncio.locks + • asyncio.proactor_events + • asyncio.queues + • asyncio.selector_events + • asyncio.sslproto + • asyncio.streams + • charset_normalizer.cd + • collections.abc + • concurrent.futures._base + • configparser + • contextlib + • dateutil.tz._factories + • dateutil.tz.tz + • difflib + • dis + • doctest + • email.feedparser + • eq_designer_new.py + • functools + • importlib.metadata + • importlib.metadata._collections + • importlib.readers + • inspect + • jinja2.environment + • jinja2.filters + • jinja2.lexer + • jinja2.loaders + • jinja2.nodes + • jinja2.runtime + • jinja2.sandbox + • jinja2.tests + • jinja2.utils + • matplotlib + • matplotlib._afm + • matplotlib._pylab_helpers + • matplotlib.artist + • matplotlib.backend_bases + • matplotlib.category + • matplotlib.cbook + • matplotlib.dviread + • matplotlib.font_manager + • matplotlib.patches + • matplotlib.textpath + • mpl_toolkits.mplot3d.axes3d + • multiprocessing.heap + • multiprocessing.pool + • multiprocessing.queues + • numpy._core.overrides + • numpy._core.records + • packaging._manylinux + • pkg_resources + • pkgutil + • platform + • pprint + • psutil + • psutil._common + • psutil._pswindows + • pydoc + • pyparsing.core + • pyparsing.results + • queue + • selectors + • setuptools._distutils.command.install + • setuptools._vendor.importlib_metadata + • setuptools._vendor.importlib_metadata._collections + • setuptools._vendor.more_itertools.more + • setuptools._vendor.more_itertools.recipes + • setuptools._vendor.packaging._manylinux + • setuptools.command._requirestxt + • setuptools.config.setupcfg + • shlex + • shutil + • ssl + • statistics + • string + • threading + • tokenize + • tornado.gen + • tornado.iostream + • tornado.locks + • tornado.queues + • tornado.simple_httpclient + • traceback + • typing + • typing_extensions + • unittest._log + • unittest.case + • unittest.util + • urllib.parse + • wheel.cli.convert + • wheel.vendored.packaging._manylinux + • xml.etree.ElementTree + • yaml.representer + +
+ +
+ +
+ + collections.abc +SourceModule
+imports: + _collections_abc + • collections + +
+
+imported by: + PIL.Image + • PIL.ImageFilter + • PIL.ImageOps + • PIL.ImagePalette + • PIL.IptcImagePlugin + • PIL.Jpeg2KImagePlugin + • PIL.PngImagePlugin + • PIL.TiffImagePlugin + • PIL._typing + • PySide6.QtCore + • PySide6.QtGui + • PySide6.QtWidgets + • asyncio.base_events + • asyncio.coroutines + • cgi + • configparser + • cycler + • eq_designer_new.py + • http.client + • importlib.resources + • inspect + • jinja2.filters + • jinja2.loaders + • jinja2.runtime + • jinja2.sandbox + • jinja2.tests + • jinja2.utils + • logging + • markupsafe + • matplotlib + • matplotlib._mathtext + • matplotlib._path + • matplotlib.axes._base + • matplotlib.cbook + • matplotlib.cm + • matplotlib.colors + • matplotlib.markers + • matplotlib.pyplot + • matplotlib.spines + • matplotlib.typing + • numpy._core._ufunc_config + • numpy._typing._array_like + • numpy._typing._dtype_like + • numpy._typing._nested_sequence + • numpy._typing._shape + • numpy.lib._function_base_impl + • numpy.lib._npyio_impl + • numpy.random._generator + • numpy.random.bit_generator + • numpy.random.mtrand + • pkg_resources + • platformdirs.api + • platformdirs.unix + • platformdirs.windows + • pyparsing.core + • pyparsing.results + • selectors + • setuptools + • setuptools._distutils._modified + • setuptools._distutils.cmd + • setuptools._distutils.command.bdist + • setuptools._distutils.command.build + • setuptools._distutils.command.build_clib + • setuptools._distutils.command.build_ext + • setuptools._distutils.command.config + • setuptools._distutils.command.install_data + • setuptools._distutils.command.sdist + • setuptools._distutils.compat + • setuptools._distutils.compilers.C.base + • setuptools._distutils.compilers.C.msvc + • setuptools._distutils.compilers.C.unix + • setuptools._distutils.core + • setuptools._distutils.dist + • setuptools._distutils.extension + • setuptools._distutils.fancy_getopt + • setuptools._distutils.filelist + • setuptools._distutils.spawn + • setuptools._distutils.util + • setuptools._reqs + • setuptools._vendor.jaraco.functools + • setuptools._vendor.more_itertools.more + • setuptools._vendor.more_itertools.recipes + • setuptools.command._requirestxt + • setuptools.command.bdist_wheel + • setuptools.command.egg_info + • setuptools.config._apply_pyprojecttoml + • setuptools.config.expand + • setuptools.config.pyprojecttoml + • setuptools.config.setupcfg + • setuptools.discovery + • setuptools.dist + • setuptools.glob + • tomli._parser + • tornado.gen + • tornado.httputil + • tracemalloc + • typing + • typing_extensions + • wheel.cli.convert + • wheel.cli.tags + • xml.etree.ElementTree + • yaml.constructor + +
+ +
+ +
+ + colorama +Package + + +
+ +
+ + colorama.ansi +SourceModule
+imports: + colorama + +
+
+imported by: + colorama + • colorama.ansitowin32 + +
+ +
+ +
+ + colorama.ansitowin32 +SourceModule
+imports: + colorama + • colorama.ansi + • colorama.win32 + • colorama.winterm + • os + • re + • sys + +
+
+imported by: + colorama + • colorama.initialise + +
+ +
+ +
+ + colorama.initialise +SourceModule
+imports: + atexit + • colorama + • colorama.ansitowin32 + • contextlib + • sys + +
+
+imported by: + colorama + +
+ +
+ +
+ + colorama.win32 +SourceModule
+imports: + colorama + • ctypes + • ctypes.wintypes + +
+
+imported by: + colorama + • colorama.ansitowin32 + • colorama.winterm + +
+ +
+ +
+ + colorama.winterm +SourceModule
+imports: + colorama + • colorama.win32 + • msvcrt + +
+
+imported by: + colorama.ansitowin32 + +
+ +
+ +
+ + colorsys +SourceModule
+imported by: + PIL.ImageColor + +
+ +
+ +
+ + concurrent +Package
+imported by: + concurrent.futures + • tornado.concurrent + +
+ +
+ + + +
+ + concurrent.futures._base +SourceModule
+imports: + collections + • concurrent.futures + • logging + • threading + • time + • types + +
+ + +
+ +
+ + concurrent.futures.process +SourceModule +
+imported by: + concurrent.futures + +
+ +
+ +
+ + concurrent.futures.thread +SourceModule
+imports: + concurrent.futures + • concurrent.futures._base + • itertools + • os + • queue + • threading + • types + • weakref + +
+
+imported by: + concurrent.futures + +
+ +
+ +
+ + configparser +SourceModule
+imports: + collections + • collections.abc + • functools + • io + • itertools + • os + • re + • sys + • warnings + +
+ + +
+ +
+ + contextlib +SourceModule
+imports: + _collections_abc + • abc + • collections + • functools + • sys + • types + +
+
+imported by: + _osx_support + • _threading_local + • ast + • asyncio.staggered + • colorama.initialise + • dateutil.tz.tz + • distutils.command.build_ext + • getpass + • glob + • http.server + • importlib._adapters + • importlib._common + • importlib.metadata + • importlib.resources + • importlib.util + • jinja2.compiler + • matplotlib + • matplotlib._api.deprecation + • matplotlib.artist + • matplotlib.axes._base + • matplotlib.backend_bases + • matplotlib.backends.backend_agg + • matplotlib.backends.backend_webagg + • matplotlib.cbook + • matplotlib.contour + • matplotlib.figure + • matplotlib.layout_engine + • matplotlib.pyplot + • matplotlib.style.core + • matplotlib.widgets + • mpl_toolkits.mplot3d.art3d + • numpy._core._methods + • numpy._core._ufunc_config + • numpy._core.arrayprint + • numpy._core.memmap + • numpy._core.records + • numpy.lib._histograms_impl + • numpy.lib._npyio_impl + • numpy.testing._private.utils + • packaging._manylinux + • packaging._tokenizer + • psutil + • psutil._pswindows + • pyparsing.testing + • pyparsing.util + • setuptools._distutils.command.build_ext + • setuptools._distutils.command.check + • setuptools._distutils.command.install + • setuptools._distutils.compilers.C.msvc + • setuptools._distutils.dist + • setuptools._distutils.version + • setuptools._path + • setuptools._vendor.importlib_metadata + • setuptools._vendor.jaraco.context + • setuptools._vendor.packaging._manylinux + • setuptools._vendor.packaging._tokenizer + • setuptools._vendor.zipp + • setuptools.archive_util + • setuptools.command.sdist + • setuptools.config._validate_pyproject.error_reporting + • setuptools.config.pyprojecttoml + • setuptools.config.setupcfg + • setuptools.depends + • setuptools.msvc + • setuptools.wheel + • shiboken6 + • subprocess + • typing + • typing_extensions + • unittest.case + • unittest.mock + • urllib.request + • wheel.vendored.packaging._manylinux + • wheel.vendored.packaging._tokenizer + • xml.etree.ElementTree + • zipfile + +
+ +
+ +
+ + contextvars +SourceModule
+imports: + _contextvars + +
+ + +
+ + + +
+ + contourpy._contourpy C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\contourpy\_contourpy.cp310-win_amd64.pyd
+imports: + contourpy + • contourpy._contourpy + • numpy + • numpy.typing + • typing + +
+ + +
+ +
+ + contourpy._version +SourceModule
+imports: + contourpy + +
+
+imported by: + contourpy + +
+ +
+ +
+ + contourpy.array +SourceModule
+imports: + __future__ + • contourpy + • contourpy._contourpy + • contourpy.typecheck + • contourpy.types + • itertools + • numpy + • typing + +
+
+imported by: + contourpy.convert + • contourpy.dechunk + +
+ +
+ +
+ + contourpy.chunk +SourceModule
+imports: + __future__ + • contourpy + • math + +
+
+imported by: + contourpy + +
+ +
+ +
+ + contourpy.convert +SourceModule +
+imported by: + contourpy + +
+ +
+ +
+ + contourpy.dechunk +SourceModule +
+imported by: + contourpy + +
+ +
+ +
+ + contourpy.enum_util +SourceModule
+imports: + __future__ + • contourpy + • contourpy._contourpy + +
+
+imported by: + contourpy + • contourpy.convert + • contourpy.dechunk + • contourpy.typecheck + +
+ +
+ +
+ + contourpy.typecheck +SourceModule
+imports: + __future__ + • contourpy + • contourpy._contourpy + • contourpy.enum_util + • contourpy.types + • numpy + • typing + +
+
+imported by: + contourpy.array + • contourpy.convert + • contourpy.dechunk + +
+ +
+ +
+ + contourpy.types +SourceModule
+imports: + __future__ + • contourpy + • numpy + +
+
+imported by: + contourpy.array + • contourpy.convert + • contourpy.typecheck + +
+ +
+ + + +
+ + copyreg +SourceModule
+imports: + functools + • operator + +
+
+imported by: + _pickle + • copy + • eq_designer_new.py + • multiprocessing.reduction + • numpy._core + • pickle + • re + • yaml.representer + +
+ +
+ +
+ + csv +SourceModule
+imports: + _csv + • io + • re + +
+ + +
+ + + +
+ + ctypes._endian +SourceModule
+imports: + ctypes + • sys + +
+
+imported by: + ctypes + +
+ +
+ +
+ + ctypes.wintypes +SourceModule
+imports: + ctypes + +
+ + +
+ +
+ + curses +Package
+imports: + _curses + • curses + • curses.has_key + • os + • sys + +
+
+imported by: + _curses + • curses + • curses.has_key + • tornado.log + +
+ +
+ +
+ + curses.has_key +SourceModule
+imports: + _curses + • curses + +
+
+imported by: + curses + +
+ +
+ +
+ + cycler +Package
+imports: + __future__ + • collections.abc + • copy + • functools + • itertools + • operator + • typing + +
+
+imported by: + matplotlib.pyplot + • matplotlib.rcsetup + • matplotlib.widgets + +
+ +
+ +
+ + dataclasses +SourceModule
+imports: + _thread + • abc + • builtins + • copy + • functools + • inspect + • keyword + • re + • sys + • types + +
+ + +
+ + + + + +
+ + dateutil._common +SourceModule
+imports: + dateutil + +
+
+imported by: + dateutil.relativedelta + • dateutil.rrule + +
+ +
+ +
+ + dateutil._version +SourceModule
+imports: + dateutil + +
+
+imported by: + dateutil + +
+ +
+ +
+ + dateutil.easter +SourceModule
+imports: + datetime + • dateutil + +
+
+imported by: + dateutil + • dateutil.rrule + +
+ +
+ + + +
+ + dateutil.parser._parser +SourceModule
+imports: + __future__ + • calendar + • datetime + • dateutil + • dateutil.parser + • dateutil.relativedelta + • dateutil.tz + • decimal + • io + • re + • six + • string + • time + • warnings + +
+
+imported by: + dateutil.parser + • dateutil.tz.tz + +
+ +
+ +
+ + dateutil.parser.isoparser +SourceModule
+imports: + calendar + • datetime + • dateutil + • dateutil.parser + • dateutil.tz + • functools + • re + • six + +
+
+imported by: + dateutil.parser + +
+ +
+ +
+ + dateutil.relativedelta +SourceModule
+imports: + calendar + • datetime + • dateutil + • dateutil._common + • math + • operator + • six + • warnings + +
+
+imported by: + dateutil + • dateutil.parser._parser + • dateutil.tz.tz + • matplotlib.dates + +
+ +
+ +
+ + dateutil.rrule +SourceModule
+imports: + calendar + • datetime + • dateutil + • dateutil._common + • dateutil.easter + • dateutil.parser + • dateutil.tz + • fractions + • functools + • heapq + • itertools + • math + • re + • six + • six.moves + • six.moves._thread + • six.moves.range + • sys + • warnings + +
+
+imported by: + dateutil + • dateutil.tz.tz + • matplotlib.dates + +
+ +
+ + + +
+ + dateutil.tz._common +SourceModule
+imports: + datetime + • dateutil.tz + • functools + • six + +
+
+imported by: + dateutil.tz.tz + • dateutil.tz.win + +
+ +
+ +
+ + dateutil.tz._factories +SourceModule
+imports: + collections + • datetime + • dateutil.tz + • six.moves + • six.moves._thread + • weakref + +
+
+imported by: + dateutil.tz.tz + +
+ +
+ +
+ + dateutil.tz.tz +SourceModule +
+imported by: + dateutil.tz + +
+ +
+ +
+ + dateutil.tz.tzfile +MissingModule
+imported by: + dateutil.tz + • dateutil.zoneinfo + +
+ +
+ +
+ + dateutil.tz.win +SourceModule
+imports: + ctypes + • ctypes.wintypes + • datetime + • dateutil.tz + • dateutil.tz._common + • six + • six.moves + • six.moves.winreg + • struct + +
+
+imported by: + dateutil.tz.tz + +
+ +
+ +
+ + dateutil.zoneinfo +Package
+imports: + dateutil + • dateutil.tz + • dateutil.tz.tzfile + • io + • json + • pkgutil + • tarfile + • warnings + +
+
+imported by: + dateutil.tz.tz + +
+ +
+ + + + + +
+ + defusedxml.ElementTree +SourceModule
+imports: + __future__ + • defusedxml + • defusedxml.common + • importlib + • sys + • warnings + • xml.etree.ElementTree + +
+
+imported by: + PIL.Image + • defusedxml + • defusedxml.cElementTree + +
+ +
+ +
+ + defusedxml.cElementTree +SourceModule +
+imported by: + defusedxml + +
+ +
+ +
+ + defusedxml.common +SourceModule
+imports: + defusedxml + • sys + • xml.parsers.expat + +
+ + +
+ +
+ + defusedxml.expatbuilder +SourceModule
+imports: + __future__ + • defusedxml + • defusedxml.common + • xml.dom.expatbuilder + +
+
+imported by: + defusedxml + • defusedxml.minidom + +
+ +
+ +
+ + defusedxml.expatreader +SourceModule
+imports: + __future__ + • defusedxml + • defusedxml.common + • xml.sax.expatreader + +
+
+imported by: + defusedxml + • defusedxml.sax + +
+ +
+ +
+ + defusedxml.minidom +SourceModule +
+imported by: + defusedxml + +
+ +
+ +
+ + defusedxml.pulldom +SourceModule
+imports: + __future__ + • defusedxml + • defusedxml.sax + • xml.dom.pulldom + +
+
+imported by: + defusedxml + • defusedxml.minidom + +
+ +
+ +
+ + defusedxml.sax +SourceModule
+imports: + __future__ + • defusedxml + • defusedxml.expatreader + • io + • xml.sax + +
+
+imported by: + defusedxml + • defusedxml.pulldom + +
+ +
+ +
+ + defusedxml.xmlrpc +SourceModule
+imports: + __future__ + • defusedxml + • defusedxml.common + • gzip + • io + • xmlrpc + • xmlrpc.client + • xmlrpc.server + • xmlrpclib + +
+
+imported by: + defusedxml + +
+ +
+ +
+ + difflib +SourceModule
+imports: + collections + • difflib + • heapq + • re + • types + +
+
+imported by: + difflib + • doctest + • numpy.testing._private.utils + • unittest.case + +
+ +
+ +
+ + dis +SourceModule
+imports: + argparse + • collections + • io + • opcode + • sys + • types + +
+
+imported by: + inspect + • pdb + • setuptools.depends + +
+ +
+ + + +
+ + distutils._msvccompiler +SourceModule
+imports: + distutils + • distutils.ccompiler + • distutils.errors + • distutils.log + • distutils.util + • itertools + • os + • subprocess + • winreg + +
+
+imported by: + distutils.command.build_ext + +
+ +
+ +
+ + distutils.archive_util +SourceModule
+imports: + distutils + • distutils.dir_util + • distutils.errors + • distutils.log + • distutils.spawn + • grp + • os + • pwd + • sys + • tarfile + • warnings + • zipfile + +
+ + +
+ + + + + + + +
+ + distutils.command.bdist +SourceModule +
+imported by: + setuptools.command + +
+ +
+ +
+ + distutils.command.build +SourceModule
+imports: + distutils.ccompiler + • distutils.command + • distutils.core + • distutils.errors + • distutils.util + • os + • sys + +
+
+imported by: + setuptools.command.build + +
+ +
+ +
+ + distutils.command.build_ext +SourceModule +
+imported by: + setuptools + +
+ +
+ + + +
+ + distutils.config +SourceModule
+imports: + cgi + • configparser + • distutils + • distutils.cmd + • os + +
+
+imported by: + distutils.core + +
+ +
+ + + + + +
+ + distutils.dep_util +SourceModule
+imports: + distutils + • distutils.errors + • os + • stat + +
+ + +
+ + + + + + + +
+ + distutils.extension +SourceModule
+imports: + distutils + • distutils.sysconfig + • distutils.text_file + • distutils.util + • os + • re + • warnings + +
+ + +
+ + + +
+ + distutils.file_util +SourceModule
+imports: + distutils + • distutils.dep_util + • distutils.errors + • distutils.log + • errno + • os + • os.path + • stat + +
+ + +
+ +
+ + distutils.filelist +SourceModule
+imports: + distutils + • distutils.debug + • distutils.errors + • distutils.log + • distutils.util + • fnmatch + • functools + • os + • re + +
+ + +
+ + + +
+ + distutils.spawn +SourceModule
+imports: + distutils + • distutils.debug + • distutils.errors + • distutils.log + • distutils.sysconfig + • os + • subprocess + • sys + +
+ + +
+ + + +
+ + distutils.text_file +SourceModule
+imports: + distutils + • io + • sys + +
+ + +
+ + + +
+ + distutils.version +SourceModule
+imports: + distutils + • re + +
+
+imported by: + distutils.versionpredicate + +
+ +
+ +
+ + distutils.versionpredicate +SourceModule
+imports: + distutils + • distutils.version + • operator + • re + +
+
+imported by: + distutils.dist + • setuptools._distutils.dist + +
+ +
+ +
+ + doctest +SourceModule
+imports: + __future__ + • argparse + • builtins + • collections + • difflib + • inspect + • io + • linecache + • os + • pdb + • re + • sys + • traceback + • unittest + +
+ + +
+ + + +
+ + email._encoded_words +SourceModule
+imports: + base64 + • binascii + • email + • email.errors + • functools + • re + • string + +
+
+imported by: + email._header_value_parser + • email.message + +
+ +
+ +
+ + email._header_value_parser +SourceModule
+imports: + email + • email._encoded_words + • email.errors + • email.utils + • operator + • re + • string + • sys + • urllib + +
+
+imported by: + email + • email.headerregistry + +
+ +
+ +
+ + email._parseaddr +SourceModule
+imports: + calendar + • email + • time + +
+
+imported by: + email.utils + +
+ +
+ +
+ + email._policybase +SourceModule
+imports: + abc + • email + • email.charset + • email.header + • email.utils + +
+
+imported by: + email.feedparser + • email.message + • email.parser + • email.policy + +
+ +
+ +
+ + email.base64mime +SourceModule
+imports: + base64 + • binascii + • email + +
+
+imported by: + email.charset + • email.header + • smtplib + +
+ +
+ +
+ + email.charset +SourceModule
+imports: + email + • email.base64mime + • email.encoders + • email.errors + • email.quoprimime + • functools + +
+
+imported by: + email + • email._policybase + • email.contentmanager + • email.header + • email.message + • email.utils + +
+ +
+ +
+ + email.contentmanager +SourceModule
+imports: + binascii + • email + • email.charset + • email.errors + • email.message + • email.quoprimime + +
+
+imported by: + email.policy + +
+ +
+ +
+ + email.encoders +SourceModule
+imports: + base64 + • email + • quopri + +
+
+imported by: + email.charset + +
+ +
+ +
+ + email.errors +SourceModule
+imports: + email + +
+ + +
+ +
+ + email.feedparser +SourceModule
+imports: + collections + • email + • email._policybase + • email.errors + • email.message + • io + • re + +
+
+imported by: + email.parser + • packaging.metadata + +
+ +
+ +
+ + email.generator +SourceModule
+imports: + copy + • email + • email.errors + • email.utils + • io + • random + • re + • sys + • time + +
+
+imported by: + email.message + • setuptools.command.bdist_wheel + • smtplib + • wheel.cli.pack + +
+ +
+ +
+ + email.header +SourceModule
+imports: + binascii + • email + • email.base64mime + • email.charset + • email.errors + • email.quoprimime + • re + +
+
+imported by: + email + • email._policybase + • packaging.metadata + +
+ +
+ +
+ + email.headerregistry +SourceModule
+imports: + email + • email._header_value_parser + • email.errors + • email.utils + • types + +
+ + +
+ +
+ + email.iterators +SourceModule
+imports: + email + • io + • sys + +
+
+imported by: + email.message + +
+ +
+ + + +
+ + email.parser +SourceModule
+imports: + email + • email._policybase + • email.feedparser + • io + +
+
+imported by: + cgi + • email + • http.client + • packaging.metadata + • pkg_resources + • wheel.cli.convert + • wheel.cli.pack + • wheel.cli.tags + • wheel.metadata + +
+ +
+ +
+ + email.policy +SourceModule
+imports: + email + • email._policybase + • email.contentmanager + • email.headerregistry + • email.message + • email.utils + • re + • sys + +
+ + +
+ +
+ + email.quoprimime +SourceModule
+imports: + email + • re + • string + +
+
+imported by: + email.charset + • email.contentmanager + • email.header + +
+ +
+ +
+ + email.utils +SourceModule
+imports: + datetime + • email + • email._parseaddr + • email.charset + • os + • random + • re + • socket + • time + • urllib.parse + +
+ + +
+ +
+ + encodings +Package
+imports: + _winapi + • codecs + • encodings + • encodings.aliases + • encodings.ascii + • encodings.base64_codec + • encodings.big5 + • encodings.big5hkscs + • encodings.bz2_codec + • encodings.charmap + • encodings.cp037 + • encodings.cp1006 + • encodings.cp1026 + • encodings.cp1125 + • encodings.cp1140 + • encodings.cp1250 + • encodings.cp1251 + • encodings.cp1252 + • encodings.cp1253 + • encodings.cp1254 + • encodings.cp1255 + • encodings.cp1256 + • encodings.cp1257 + • encodings.cp1258 + • encodings.cp273 + • encodings.cp424 + • encodings.cp437 + • encodings.cp500 + • encodings.cp720 + • encodings.cp737 + • encodings.cp775 + • encodings.cp850 + • encodings.cp852 + • encodings.cp855 + • encodings.cp856 + • encodings.cp857 + • encodings.cp858 + • encodings.cp860 + • encodings.cp861 + • encodings.cp862 + • encodings.cp863 + • encodings.cp864 + • encodings.cp865 + • encodings.cp866 + • encodings.cp869 + • encodings.cp874 + • encodings.cp875 + • encodings.cp932 + • encodings.cp949 + • encodings.cp950 + • encodings.euc_jis_2004 + • encodings.euc_jisx0213 + • encodings.euc_jp + • encodings.euc_kr + • encodings.gb18030 + • encodings.gb2312 + • encodings.gbk + • encodings.hex_codec + • encodings.hp_roman8 + • encodings.hz + • encodings.idna + • encodings.iso2022_jp + • encodings.iso2022_jp_1 + • encodings.iso2022_jp_2 + • encodings.iso2022_jp_2004 + • encodings.iso2022_jp_3 + • encodings.iso2022_jp_ext + • encodings.iso2022_kr + • encodings.iso8859_1 + • encodings.iso8859_10 + • encodings.iso8859_11 + • encodings.iso8859_13 + • encodings.iso8859_14 + • encodings.iso8859_15 + • encodings.iso8859_16 + • encodings.iso8859_2 + • encodings.iso8859_3 + • encodings.iso8859_4 + • encodings.iso8859_5 + • encodings.iso8859_6 + • encodings.iso8859_7 + • encodings.iso8859_8 + • encodings.iso8859_9 + • encodings.johab + • encodings.koi8_r + • encodings.koi8_t + • encodings.koi8_u + • encodings.kz1048 + • encodings.latin_1 + • encodings.mac_arabic + • encodings.mac_croatian + • encodings.mac_cyrillic + • encodings.mac_farsi + • encodings.mac_greek + • encodings.mac_iceland + • encodings.mac_latin2 + • encodings.mac_roman + • encodings.mac_romanian + • encodings.mac_turkish + • encodings.mbcs + • encodings.oem + • encodings.palmos + • encodings.ptcp154 + • encodings.punycode + • encodings.quopri_codec + • encodings.raw_unicode_escape + • encodings.rot_13 + • encodings.shift_jis + • encodings.shift_jis_2004 + • encodings.shift_jisx0213 + • encodings.tis_620 + • encodings.undefined + • encodings.unicode_escape + • encodings.utf_16 + • encodings.utf_16_be + • encodings.utf_16_le + • encodings.utf_32 + • encodings.utf_32_be + • encodings.utf_32_le + • encodings.utf_7 + • encodings.utf_8 + • encodings.utf_8_sig + • encodings.uu_codec + • encodings.zlib_codec + • sys + +
+
+imported by: + codecs + • encodings + • encodings.aliases + • encodings.ascii + • encodings.base64_codec + • encodings.big5 + • encodings.big5hkscs + • encodings.bz2_codec + • encodings.charmap + • encodings.cp037 + • encodings.cp1006 + • encodings.cp1026 + • encodings.cp1125 + • encodings.cp1140 + • encodings.cp1250 + • encodings.cp1251 + • encodings.cp1252 + • encodings.cp1253 + • encodings.cp1254 + • encodings.cp1255 + • encodings.cp1256 + • encodings.cp1257 + • encodings.cp1258 + • encodings.cp273 + • encodings.cp424 + • encodings.cp437 + • encodings.cp500 + • encodings.cp720 + • encodings.cp737 + • encodings.cp775 + • encodings.cp850 + • encodings.cp852 + • encodings.cp855 + • encodings.cp856 + • encodings.cp857 + • encodings.cp858 + • encodings.cp860 + • encodings.cp861 + • encodings.cp862 + • encodings.cp863 + • encodings.cp864 + • encodings.cp865 + • encodings.cp866 + • encodings.cp869 + • encodings.cp874 + • encodings.cp875 + • encodings.cp932 + • encodings.cp949 + • encodings.cp950 + • encodings.euc_jis_2004 + • encodings.euc_jisx0213 + • encodings.euc_jp + • encodings.euc_kr + • encodings.gb18030 + • encodings.gb2312 + • encodings.gbk + • encodings.hex_codec + • encodings.hp_roman8 + • encodings.hz + • encodings.idna + • encodings.iso2022_jp + • encodings.iso2022_jp_1 + • encodings.iso2022_jp_2 + • encodings.iso2022_jp_2004 + • encodings.iso2022_jp_3 + • encodings.iso2022_jp_ext + • encodings.iso2022_kr + • encodings.iso8859_1 + • encodings.iso8859_10 + • encodings.iso8859_11 + • encodings.iso8859_13 + • encodings.iso8859_14 + • encodings.iso8859_15 + • encodings.iso8859_16 + • encodings.iso8859_2 + • encodings.iso8859_3 + • encodings.iso8859_4 + • encodings.iso8859_5 + • encodings.iso8859_6 + • encodings.iso8859_7 + • encodings.iso8859_8 + • encodings.iso8859_9 + • encodings.johab + • encodings.koi8_r + • encodings.koi8_t + • encodings.koi8_u + • encodings.kz1048 + • encodings.latin_1 + • encodings.mac_arabic + • encodings.mac_croatian + • encodings.mac_cyrillic + • encodings.mac_farsi + • encodings.mac_greek + • encodings.mac_iceland + • encodings.mac_latin2 + • encodings.mac_roman + • encodings.mac_romanian + • encodings.mac_turkish + • encodings.mbcs + • encodings.oem + • encodings.palmos + • encodings.ptcp154 + • encodings.punycode + • encodings.quopri_codec + • encodings.raw_unicode_escape + • encodings.rot_13 + • encodings.shift_jis + • encodings.shift_jis_2004 + • encodings.shift_jisx0213 + • encodings.tis_620 + • encodings.undefined + • encodings.unicode_escape + • encodings.utf_16 + • encodings.utf_16_be + • encodings.utf_16_le + • encodings.utf_32 + • encodings.utf_32_be + • encodings.utf_32_le + • encodings.utf_7 + • encodings.utf_8 + • encodings.utf_8_sig + • encodings.uu_codec + • encodings.zlib_codec + • eq_designer_new.py + • locale + +
+ +
+ +
+ + encodings.aliases +SourceModule
+imports: + encodings + +
+ + +
+ +
+ + encodings.ascii +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.base64_codec +SourceModule
+imports: + base64 + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.big5 +SourceModule
+imports: + _codecs_tw + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.big5hkscs +SourceModule
+imports: + _codecs_hk + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.bz2_codec +SourceModule
+imports: + bz2 + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.charmap +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp037 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp1006 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp1026 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp1125 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp1140 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp1250 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp1251 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp1252 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp1253 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp1254 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp1255 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp1256 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp1257 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp1258 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp273 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp424 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp437 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp500 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp720 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp737 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp775 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp850 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp852 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp855 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp856 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp857 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp858 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp860 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp861 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp862 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp863 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp864 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp865 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp866 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp869 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp874 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp875 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp932 +SourceModule
+imports: + _codecs_jp + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp949 +SourceModule
+imports: + _codecs_kr + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.cp950 +SourceModule
+imports: + _codecs_tw + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.euc_jis_2004 +SourceModule
+imports: + _codecs_jp + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.euc_jisx0213 +SourceModule
+imports: + _codecs_jp + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.euc_jp +SourceModule
+imports: + _codecs_jp + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.euc_kr +SourceModule
+imports: + _codecs_kr + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.gb18030 +SourceModule
+imports: + _codecs_cn + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.gb2312 +SourceModule
+imports: + _codecs_cn + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.gbk +SourceModule
+imports: + _codecs_cn + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.hex_codec +SourceModule
+imports: + binascii + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.hp_roman8 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.hz +SourceModule
+imports: + _codecs_cn + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.idna +SourceModule
+imports: + codecs + • encodings + • re + • stringprep + • unicodedata + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso2022_jp +SourceModule
+imports: + _codecs_iso2022 + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso2022_jp_1 +SourceModule
+imports: + _codecs_iso2022 + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso2022_jp_2 +SourceModule
+imports: + _codecs_iso2022 + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso2022_jp_2004 +SourceModule
+imports: + _codecs_iso2022 + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso2022_jp_3 +SourceModule
+imports: + _codecs_iso2022 + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso2022_jp_ext +SourceModule
+imports: + _codecs_iso2022 + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso2022_kr +SourceModule
+imports: + _codecs_iso2022 + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso8859_1 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso8859_10 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso8859_11 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso8859_13 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso8859_14 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso8859_15 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso8859_16 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso8859_2 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso8859_3 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso8859_4 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso8859_5 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso8859_6 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso8859_7 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso8859_8 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.iso8859_9 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.johab +SourceModule
+imports: + _codecs_kr + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.koi8_r +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.koi8_t +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.koi8_u +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.kz1048 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.latin_1 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.mac_arabic +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.mac_croatian +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.mac_cyrillic +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.mac_farsi +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.mac_greek +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.mac_iceland +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.mac_latin2 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.mac_roman +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.mac_romanian +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.mac_turkish +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.mbcs +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.oem +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.palmos +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.ptcp154 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.punycode +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.quopri_codec +SourceModule
+imports: + codecs + • encodings + • io + • quopri + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.raw_unicode_escape +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.rot_13 +SourceModule
+imports: + codecs + • encodings + • sys + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.shift_jis +SourceModule
+imports: + _codecs_jp + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.shift_jis_2004 +SourceModule
+imports: + _codecs_jp + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.shift_jisx0213 +SourceModule
+imports: + _codecs_jp + • _multibytecodec + • codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.tis_620 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.undefined +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.unicode_escape +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.utf_16 +SourceModule
+imports: + codecs + • encodings + • sys + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.utf_16_be +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.utf_16_le +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.utf_32 +SourceModule
+imports: + codecs + • encodings + • sys + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.utf_32_be +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.utf_32_le +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.utf_7 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.utf_8 +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.utf_8_sig +SourceModule
+imports: + codecs + • encodings + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.uu_codec +SourceModule
+imports: + binascii + • codecs + • encodings + • io + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ +
+ + encodings.zlib_codec +SourceModule
+imports: + codecs + • encodings + • zlib + +
+
+imported by: + encodings + • eq_designer_new.py + +
+ +
+ + + + + +
+ + fcntl +MissingModule
+imported by: + subprocess + • xmlrpc.server + +
+ +
+ +
+ + fileinput +SourceModule
+imports: + bz2 + • getopt + • gzip + • io + • os + • sys + • types + • warnings + +
+
+imported by: + numpy.f2py.crackfortran + +
+ +
+ +
+ + filter_utils +SourceModule
+imports: + math + • numpy + • typing + +
+
+imported by: + eq_designer_new.py + +
+ +
+ +
+ + fnmatch +SourceModule
+imports: + functools + • itertools + • os + • posixpath + • re + +
+ + +
+ +
+ + fractions +SourceModule
+imports: + decimal + • math + • numbers + • operator + • re + • sys + +
+
+imported by: + PIL.TiffImagePlugin + • dateutil.rrule + • statistics + +
+ +
+ +
+ + ftplib +SourceModule
+imports: + netrc + • re + • socket + • ssl + • sys + • warnings + +
+
+imported by: + urllib.request + +
+ +
+ +
+ + functools +SourceModule
+imports: + _functools + • _thread + • abc + • collections + • reprlib + • types + • typing + • weakref + +
+
+imported by: + PIL.GifImagePlugin + • PIL.ImageCms + • PIL.ImageColor + • PIL.ImageFilter + • PIL.ImageMode + • PIL.ImageOps + • PIL.PsdImagePlugin + • asyncio.base_events + • asyncio.coroutines + • asyncio.format_helpers + • asyncio.selector_events + • asyncio.tasks + • asyncio.threads + • charset_normalizer.cd + • charset_normalizer.md + • charset_normalizer.utils + • concurrent.futures.process + • configparser + • contextlib + • copyreg + • cycler + • dataclasses + • dateutil.parser + • dateutil.parser.isoparser + • dateutil.rrule + • dateutil.tz._common + • distutils.filelist + • distutils.sysconfig + • email._encoded_words + • email.charset + • eq_designer_new.py + • fnmatch + • importlib._common + • importlib.metadata + • importlib.metadata._functools + • importlib.resources + • importlib.util + • inspect + • ipaddress + • jinja2.async_utils + • jinja2.compiler + • jinja2.environment + • jinja2.runtime + • jinja2.sandbox + • linecache + • locale + • matplotlib + • matplotlib._api + • matplotlib._api.deprecation + • matplotlib._cm + • matplotlib._fontconfig_pattern + • matplotlib._mathtext + • matplotlib.artist + • matplotlib.axes._axes + • matplotlib.axes._base + • matplotlib.axis + • matplotlib.backend_bases + • matplotlib.backend_tools + • matplotlib.backends.backend_qt + • matplotlib.bezier + • matplotlib.cbook + • matplotlib.cm + • matplotlib.colors + • matplotlib.contour + • matplotlib.dates + • matplotlib.dviread + • matplotlib.font_manager + • matplotlib.mathtext + • matplotlib.mlab + • matplotlib.offsetbox + • matplotlib.patches + • matplotlib.path + • matplotlib.pyplot + • matplotlib.rcsetup + • matplotlib.spines + • matplotlib.texmanager + • matplotlib.text + • matplotlib.transforms + • multiprocessing.reduction + • multiprocessing.shared_memory + • numpy._core._ufunc_config + • numpy._core.arrayprint + • numpy._core.defchararray + • numpy._core.fromnumeric + • numpy._core.function_base + • numpy._core.multiarray + • numpy._core.numeric + • numpy._core.overrides + • numpy._core.shape_base + • numpy._utils + • numpy.f2py.auxfuncs + • numpy.fft._pocketfft + • numpy.lib._arraysetops_impl + • numpy.lib._arrayterator_impl + • numpy.lib._function_base_impl + • numpy.lib._histograms_impl + • numpy.lib._index_tricks_impl + • numpy.lib._nanfunctions_impl + • numpy.lib._npyio_impl + • numpy.lib._polynomial_impl + • numpy.lib._shape_base_impl + • numpy.lib._twodim_base_impl + • numpy.lib._type_check_impl + • numpy.lib._ufunclike_impl + • numpy.lib._utils_impl + • numpy.linalg._linalg + • numpy.ma.core + • numpy.polynomial.polyutils + • numpy.testing._private.utils + • operator + • packaging._manylinux + • packaging._musllinux + • packaging.utils + • pathlib + • pickle + • pkg_resources + • pkgutil + • platform + • platformdirs.android + • platformdirs.windows + • psutil + • psutil._common + • psutil._pswindows + • pyparsing.core + • pyparsing.exceptions + • pyparsing.util + • re + • setuptools + • setuptools._distutils._modified + • setuptools._distutils.command._framework_compat + • setuptools._distutils.command.install_data + • setuptools._distutils.compat.py39 + • setuptools._distutils.dir_util + • setuptools._distutils.filelist + • setuptools._distutils.sysconfig + • setuptools._distutils.util + • setuptools._entry_points + • setuptools._reqs + • setuptools._static + • setuptools._vendor.importlib_metadata + • setuptools._vendor.importlib_metadata._functools + • setuptools._vendor.jaraco.context + • setuptools._vendor.jaraco.functools + • setuptools._vendor.jaraco.text + • setuptools._vendor.more_itertools.more + • setuptools._vendor.more_itertools.recipes + • setuptools._vendor.packaging._manylinux + • setuptools._vendor.packaging._musllinux + • setuptools._vendor.packaging.utils + • setuptools.command.egg_info + • setuptools.config + • setuptools.config._apply_pyprojecttoml + • setuptools.config._validate_pyproject + • setuptools.config.pyprojecttoml + • setuptools.config.setupcfg + • setuptools.dist + • setuptools.extension + • setuptools.installer + • setuptools.wheel + • shiboken6 + • six + • tempfile + • threading + • tokenize + • tomli._re + • tornado.autoreload + • tornado.concurrent + • tornado.gen + • tornado.httpclient + • tornado.httputil + • tornado.ioloop + • tornado.platform.asyncio + • tornado.routing + • tornado.simple_httpclient + • tornado.tcpclient + • tornado.web + • tracemalloc + • types + • typing + • typing_extensions + • unittest.case + • unittest.loader + • unittest.mock + • unittest.result + • unittest.signals + • wheel.metadata + • wheel.vendored.packaging._manylinux + • wheel.vendored.packaging._musllinux + • xmlrpc.server + +
+ +
+ +
+ + gc (builtin module)
+imports: + time + +
+ + +
+ +
+ + genericpath +SourceModule
+imports: + os + • stat + +
+
+imported by: + eq_designer_new.py + • ntpath + • posixpath + +
+ +
+ +
+ + getopt +SourceModule
+imports: + gettext + • os + • sys + +
+
+imported by: + base64 + • distutils.fancy_getopt + • fileinput + • mimetypes + • pdb + • pydoc + • quopri + • setuptools._distutils.fancy_getopt + • webbrowser + +
+ +
+ +
+ + getpass +SourceModule
+imports: + contextlib + • io + • msvcrt + • os + • pwd + • sys + • termios + • warnings + +
+
+imported by: + urllib.request + +
+ +
+ +
+ + gettext +SourceModule
+imports: + builtins + • copy + • errno + • locale + • os + • re + • struct + • sys + • warnings + +
+
+imported by: + argparse + • getopt + • jinja2.ext + • optparse + • tornado.locale + +
+ +
+ +
+ + gi +MissingModule
+imported by: + matplotlib.cbook + +
+ +
+ + + +
+ + grp +MissingModule + +
+ +
+ + gzip +SourceModule
+imports: + _compression + • argparse + • builtins + • errno + • io + • os + • struct + • sys + • time + • warnings + • zlib + +
+ + +
+ +
+ + hashlib +SourceModule
+imports: + _blake2 + • _hashlib + • _md5 + • _sha1 + • _sha256 + • _sha3 + • _sha512 + • logging + • warnings + +
+ + +
+ +
+ + heapq +SourceModule
+imports: + _heapq + +
+ + +
+ +
+ + hid C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\hid.cp310-win_amd64.pyd
+imported by: + eq_designer_new.py + +
+ +
+ +
+ + hmac +SourceModule
+imports: + _hashlib + • _operator + • hashlib + • warnings + +
+
+imported by: + multiprocessing.connection + • secrets + • smtplib + • tornado.web + +
+ +
+ +
+ + html +Package
+imports: + html.entities + • re + +
+
+imported by: + cgi + • html.entities + • http.server + • markupsafe + • tornado.escape + • xmlrpc.server + +
+ +
+ +
+ + html.entities +SourceModule
+imports: + html + +
+
+imported by: + html + • pyparsing.helpers + +
+ +
+ +
+ + http +Package
+imports: + enum + +
+
+imported by: + http.client + • http.cookiejar + • http.cookies + • http.server + +
+ +
+ +
+ + http.client +SourceModule
+imports: + collections.abc + • email.message + • email.parser + • errno + • http + • io + • re + • socket + • ssl + • sys + • urllib.parse + • warnings + +
+
+imported by: + http.cookiejar + • http.server + • logging.handlers + • tornado.httputil + • urllib.request + • xmlrpc.client + +
+ +
+ +
+ + http.cookiejar +SourceModule
+imports: + calendar + • copy + • datetime + • http + • http.client + • io + • logging + • os + • re + • threading + • time + • traceback + • urllib.parse + • urllib.request + • warnings + +
+
+imported by: + urllib.request + +
+ +
+ +
+ + http.cookies +SourceModule
+imports: + http + • re + • string + • time + • types + +
+
+imported by: + tornado.httputil + • tornado.web + +
+ +
+ +
+ + http.server +SourceModule
+imports: + argparse + • base64 + • binascii + • contextlib + • copy + • datetime + • email.utils + • html + • http + • http.client + • io + • itertools + • mimetypes + • os + • posixpath + • pwd + • select + • shutil + • socket + • socketserver + • subprocess + • sys + • time + • urllib.parse + +
+
+imported by: + pydoc + • xmlrpc.server + +
+ +
+ + + +
+ + importlib._abc +SourceModule
+imports: + abc + • importlib + • importlib._bootstrap + • warnings + +
+
+imported by: + importlib.abc + • importlib.util + +
+ +
+ +
+ + importlib._adapters +SourceModule
+imports: + contextlib + • importlib + • importlib.abc + +
+
+imported by: + importlib._common + +
+ +
+ +
+ + importlib._bootstrap +SourceModule
+imports: + _frozen_importlib_external + • importlib + +
+
+imported by: + importlib + • importlib._abc + • importlib.machinery + • importlib.util + • pydoc + +
+ +
+ +
+ + importlib._bootstrap_external +SourceModule
+imports: + _imp + • _io + • _warnings + • importlib + • importlib.metadata + • importlib.readers + • marshal + • nt + • posix + • sys + • tokenize + • winreg + +
+
+imported by: + importlib + • importlib.abc + • importlib.machinery + • importlib.util + • py_compile + • pydoc + +
+ +
+ +
+ + importlib._common +SourceModule
+imports: + contextlib + • functools + • importlib + • importlib._adapters + • importlib.abc + • os + • pathlib + • tempfile + • types + • typing + +
+
+imported by: + importlib + • importlib.resources + +
+ +
+ + + + + + + +
+ + importlib.metadata._adapters +SourceModule
+imports: + email.message + • importlib.metadata + • importlib.metadata._text + • re + • textwrap + +
+
+imported by: + importlib.metadata + +
+ +
+ +
+ + importlib.metadata._collections +SourceModule
+imports: + collections + • importlib.metadata + +
+
+imported by: + importlib.metadata + +
+ +
+ +
+ + importlib.metadata._functools +SourceModule
+imports: + functools + • importlib.metadata + • types + +
+
+imported by: + importlib.metadata + • importlib.metadata._text + +
+ +
+ +
+ + importlib.metadata._itertools +SourceModule
+imports: + importlib.metadata + • itertools + +
+
+imported by: + importlib.metadata + +
+ +
+ +
+ + importlib.metadata._meta +SourceModule
+imports: + importlib.metadata + • typing + +
+
+imported by: + importlib.metadata + +
+ +
+ +
+ + importlib.metadata._text +SourceModule +
+imported by: + importlib.metadata._adapters + +
+ +
+ +
+ + importlib.readers +SourceModule
+imports: + collections + • importlib + • importlib.abc + • pathlib + • zipfile + +
+
+imported by: + importlib._bootstrap_external + • zipimport + +
+ +
+ +
+ + importlib.resources +SourceModule
+imports: + 'typing.io' + • collections.abc + • contextlib + • functools + • importlib + • importlib._common + • importlib.abc + • importlib.machinery + • io + • os + • pathlib + • types + • typing + +
+ + +
+ + + +
+ + importlib_metadata +AliasNode +
+imported by: + setuptools._importlib + +
+ +
+ +
+ + importlib_resources +MissingModule + +
+ +
+ + inspect +SourceModule
+imports: + abc + • argparse + • ast + • builtins + • collections + • collections.abc + • dis + • enum + • functools + • importlib + • importlib.machinery + • itertools + • linecache + • operator + • os + • re + • sys + • token + • tokenize + • types + • warnings + +
+ + +
+ +
+ + io +SourceModule
+imports: + _io + • abc + • warnings + +
+
+imported by: + PIL.BlpImagePlugin + • PIL.DdsImagePlugin + • PIL.EpsImagePlugin + • PIL.FtexImagePlugin + • PIL.GifImagePlugin + • PIL.IcnsImagePlugin + • PIL.IcoImagePlugin + • PIL.Image + • PIL.ImageFile + • PIL.ImageQt + • PIL.ImageTk + • PIL.IptcImagePlugin + • PIL.Jpeg2KImagePlugin + • PIL.JpegImagePlugin + • PIL.MspImagePlugin + • PIL.PcxImagePlugin + • PIL.PdfImagePlugin + • PIL.PngImagePlugin + • PIL.PsdImagePlugin + • PIL.TiffImagePlugin + • PIL.WebPImagePlugin + • _compression + • asyncio.proactor_events + • asyncio.unix_events + • bz2 + • cgi + • configparser + • csv + • dateutil.parser._parser + • dateutil.zoneinfo + • defusedxml.sax + • defusedxml.xmlrpc + • dis + • distutils.text_file + • doctest + • email.feedparser + • email.generator + • email.iterators + • email.message + • email.parser + • encodings.quopri_codec + • encodings.uu_codec + • eq_designer_new.py + • fileinput + • getpass + • gzip + • http.client + • http.cookiejar + • http.server + • importlib.resources + • jinja2.bccache + • jinja2.compiler + • logging + • logging.handlers + • lzma + • matplotlib.backend_bases + • matplotlib.backends.backend_webagg + • matplotlib.backends.backend_webagg_core + • matplotlib.colors + • matplotlib.font_manager + • multiprocessing.connection + • multiprocessing.popen_forkserver + • multiprocessing.popen_spawn_posix + • multiprocessing.reduction + • numpy.lib.format + • numpy.testing._private.utils + • os + • pathlib + • pdb + • pickle + • pkg_resources + • plistlib + • pprint + • pydoc + • pyparsing.diagram + • quopri + • runpy + • setuptools._vendor.backports.tarfile + • setuptools._vendor.zipp + • setuptools._vendor.zipp.compat.py310 + • setuptools.command._requirestxt + • setuptools.config._validate_pyproject.error_reporting + • setuptools.dist + • shiboken6 + • shlex + • site + • six + • smtplib + • socket + • socketserver + • subprocess + • tarfile + • tempfile + • tokenize + • tornado.httpclient + • tornado.iostream + • tornado.simple_httpclient + • tornado.template + • tornado.web + • unittest.mock + • unittest.result + • urllib.error + • urllib.request + • uuid + • wheel.macosx_libfile + • wheel.wheelfile + • xml.dom.minidom + • xml.dom.pulldom + • xml.etree.ElementTree + • xml.sax + • xml.sax.saxutils + • xmlrpc.client + • yaml + • zipfile + +
+ +
+ +
+ + ipaddress +SourceModule
+imports: + functools + • re + +
+
+imported by: + psutil._common + • urllib.parse + • urllib.request + +
+ +
+ +
+ + itertools (builtin module)
+imported by: + PIL.GifImagePlugin + • PIL.ImageFile + • PIL.MpoImagePlugin + • PIL.PngImagePlugin + • PIL.TiffImagePlugin + • _pydecimal + • asyncio.base_events + • asyncio.tasks + • asyncio.unix_events + • asyncio.windows_utils + • calendar + • collections + • concurrent.futures.process + • concurrent.futures.thread + • configparser + • contourpy.array + • contourpy.convert + • cycler + • dateutil.rrule + • distutils._msvccompiler + • fnmatch + • glob + • http.server + • importlib.metadata + • importlib.metadata._itertools + • inspect + • jinja2.compiler + • jinja2.filters + • jinja2.runtime + • matplotlib._api + • matplotlib._layoutgrid + • matplotlib.axes._axes + • matplotlib.backend_bases + • matplotlib.backends.qt_editor.figureoptions + • matplotlib.category + • matplotlib.cbook + • matplotlib.collections + • matplotlib.colors + • matplotlib.dviread + • matplotlib.figure + • matplotlib.legend + • matplotlib.legend_handler + • matplotlib.stackplot + • matplotlib.ticker + • matplotlib.widgets + • mpl_toolkits.mplot3d.axes3d + • multiprocessing.connection + • multiprocessing.pool + • multiprocessing.process + • multiprocessing.util + • numpy._core.einsumfunc + • numpy._core.numeric + • numpy._core.shape_base + • numpy.f2py._backends._meson + • numpy.f2py.f2py2e + • numpy.lib._npyio_impl + • numpy.lib.recfunctions + • numpy.ma.extras + • packaging.specifiers + • packaging.version + • pickle + • platform + • plistlib + • pyparsing.unicode + • pyparsing.util + • random + • reprlib + • setuptools._distutils.command.install + • setuptools._distutils.command.sdist + • setuptools._distutils.compat.py39 + • setuptools._distutils.compilers.C.msvc + • setuptools._distutils.compilers.C.unix + • setuptools._distutils.dir_util + • setuptools._entry_points + • setuptools._vendor.importlib_metadata + • setuptools._vendor.importlib_metadata._itertools + • setuptools._vendor.jaraco.functools + • setuptools._vendor.jaraco.text + • setuptools._vendor.more_itertools.more + • setuptools._vendor.more_itertools.recipes + • setuptools._vendor.packaging.specifiers + • setuptools._vendor.packaging.version + • setuptools._vendor.zipp + • setuptools.command._requirestxt + • setuptools.command.sdist + • setuptools.config._apply_pyprojecttoml + • setuptools.config._validate_pyproject.formats + • setuptools.config.expand + • setuptools.discovery + • setuptools.dist + • setuptools.msvc + • setuptools.wheel + • six + • statistics + • threading + • tokenize + • traceback + • weakref + • wheel.cli.tags + • wheel.metadata + • wheel.vendored.packaging.specifiers + • wheel.vendored.packaging.version + • zipfile + +
+ +
+ +
+ + jaraco +NamespacePackage
+imported by: + jaraco.context + • jaraco.functools + • jaraco.text + +
+ +
+ +
+ + jaraco.context +AliasNode +
+imported by: + setuptools._vendor.jaraco.text + +
+ +
+ + + + + + + +
+ + java +MissingModule
+imported by: + platform + +
+ +
+ + + +
+ + jinja2._identifier +SourceModule
+imports: + jinja2 + • re + +
+
+imported by: + jinja2.lexer + +
+ +
+ +
+ + jinja2.async_utils +SourceModule
+imports: + functools + • inspect + • jinja2 + • jinja2.utils + • typing + • typing_extensions + +
+
+imported by: + jinja2.filters + • jinja2.runtime + +
+ +
+ +
+ + jinja2.bccache +SourceModule
+imports: + errno + • fnmatch + • hashlib + • io + • jinja2 + • jinja2.environment + • marshal + • os + • pickle + • stat + • sys + • tempfile + • types + • typing + • typing_extensions + +
+
+imported by: + jinja2 + • jinja2.environment + +
+ +
+ +
+ + jinja2.compiler +SourceModule +
+imported by: + jinja2.environment + • jinja2.nodes + +
+ +
+ +
+ + jinja2.constants +SourceModule
+imports: + jinja2 + +
+
+imported by: + jinja2.utils + +
+ +
+ +
+ + jinja2.debug +SourceModule
+imports: + jinja2 + • jinja2.exceptions + • jinja2.runtime + • jinja2.utils + • sys + • types + • typing + +
+
+imported by: + jinja2.environment + +
+ +
+ +
+ + jinja2.defaults +SourceModule
+imports: + jinja2 + • jinja2.filters + • jinja2.tests + • jinja2.utils + • typing + • typing_extensions + +
+
+imported by: + jinja2.environment + • jinja2.ext + +
+ +
+ +
+ + jinja2.environment +SourceModule
+imports: + asyncio + • collections + • functools + • jinja2 + • jinja2.bccache + • jinja2.compiler + • jinja2.debug + • jinja2.defaults + • jinja2.exceptions + • jinja2.ext + • jinja2.lexer + • jinja2.loaders + • jinja2.nodes + • jinja2.parser + • jinja2.runtime + • jinja2.utils + • markupsafe + • os + • types + • typing + • typing_extensions + • weakref + • zipfile + +
+ + +
+ +
+ + jinja2.exceptions +SourceModule
+imports: + jinja2 + • jinja2.runtime + • typing + +
+ + +
+ +
+ + jinja2.ext +SourceModule
+imports: + gettext + • jinja2 + • jinja2.defaults + • jinja2.environment + • jinja2.exceptions + • jinja2.lexer + • jinja2.nodes + • jinja2.parser + • jinja2.runtime + • jinja2.utils + • markupsafe + • pprint + • re + • typing + • typing_extensions + +
+
+imported by: + jinja2 + • jinja2.environment + +
+ +
+ +
+ + jinja2.filters +SourceModule
+imports: + collections + • collections.abc + • inspect + • itertools + • jinja2 + • jinja2.async_utils + • jinja2.environment + • jinja2.exceptions + • jinja2.nodes + • jinja2.runtime + • jinja2.sandbox + • jinja2.utils + • markupsafe + • math + • random + • re + • textwrap + • typing + • typing_extensions + +
+
+imported by: + jinja2.defaults + +
+ +
+ +
+ + jinja2.idtracking +SourceModule
+imports: + jinja2 + • jinja2.nodes + • jinja2.visitor + • typing + • typing_extensions + +
+
+imported by: + jinja2.compiler + +
+ +
+ +
+ + jinja2.lexer +SourceModule
+imports: + ast + • collections + • jinja2 + • jinja2._identifier + • jinja2.environment + • jinja2.exceptions + • jinja2.utils + • re + • sys + • typing + • typing_extensions + +
+
+imported by: + jinja2.environment + • jinja2.ext + • jinja2.parser + • jinja2.utils + +
+ +
+ +
+ + jinja2.loaders +SourceModule
+imports: + collections + • collections.abc + • hashlib + • importlib + • importlib.util + • jinja2 + • jinja2.environment + • jinja2.exceptions + • jinja2.utils + • os + • posixpath + • sys + • types + • typing + • weakref + • zipimport + +
+
+imported by: + jinja2 + • jinja2.environment + +
+ +
+ +
+ + jinja2.nodes +SourceModule
+imports: + collections + • inspect + • jinja2 + • jinja2.compiler + • jinja2.environment + • jinja2.utils + • markupsafe + • operator + • typing + • typing_extensions + +
+ + +
+ +
+ + jinja2.optimizer +SourceModule
+imports: + jinja2 + • jinja2.environment + • jinja2.nodes + • jinja2.visitor + • typing + +
+
+imported by: + jinja2.compiler + +
+ +
+ +
+ + jinja2.parser +SourceModule
+imports: + jinja2 + • jinja2.environment + • jinja2.exceptions + • jinja2.lexer + • jinja2.nodes + • typing + • typing_extensions + +
+
+imported by: + jinja2.environment + • jinja2.ext + +
+ +
+ +
+ + jinja2.runtime +SourceModule
+imports: + collections + • collections.abc + • functools + • itertools + • jinja2 + • jinja2.async_utils + • jinja2.environment + • jinja2.exceptions + • jinja2.nodes + • jinja2.utils + • logging + • markupsafe + • sys + • typing + • typing_extensions + +
+ + +
+ +
+ + jinja2.sandbox +SourceModule
+imports: + _string + • collections + • collections.abc + • functools + • jinja2 + • jinja2.environment + • jinja2.exceptions + • jinja2.runtime + • markupsafe + • operator + • string + • types + • typing + +
+
+imported by: + jinja2.filters + +
+ +
+ +
+ + jinja2.tests +SourceModule
+imports: + collections + • collections.abc + • jinja2 + • jinja2.environment + • jinja2.runtime + • jinja2.utils + • numbers + • operator + • typing + +
+
+imported by: + jinja2.defaults + +
+ +
+ +
+ + jinja2.utils +SourceModule
+imports: + collections + • collections.abc + • enum + • jinja2 + • jinja2.constants + • jinja2.environment + • jinja2.lexer + • jinja2.runtime + • json + • markupsafe + • os + • pprint + • random + • re + • threading + • types + • typing + • typing_extensions + • urllib.parse + +
+ + +
+ +
+ + jinja2.visitor +SourceModule
+imports: + jinja2 + • jinja2.nodes + • typing + • typing_extensions + +
+
+imported by: + jinja2.compiler + • jinja2.idtracking + • jinja2.optimizer + +
+ +
+ +
+ + jnius +MissingModule
+imported by: + platformdirs.android + +
+ +
+ + + +
+ + json.decoder +SourceModule
+imports: + _json + • json + • json.scanner + • re + +
+
+imported by: + _json + • json + +
+ +
+ +
+ + json.encoder +SourceModule
+imports: + _json + • json + • re + +
+
+imported by: + json + +
+ +
+ +
+ + json.scanner +SourceModule
+imports: + _json + • json + • re + +
+
+imported by: + json + • json.decoder + +
+ +
+ +
+ + keyword +SourceModule
+imported by: + collections + • dataclasses + • eq_designer_new.py + • jinja2.compiler + • rlcompleter + • shiboken6 + +
+ +
+ +
+ + kiwisolver +Package
+imports: + kiwisolver._cext + • kiwisolver.exceptions + +
+ + +
+ +
+ + kiwisolver._cext C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\kiwisolver\_cext.cp310-win_amd64.pyd
+imports: + kiwisolver + • typing + • typing_extensions + +
+
+imported by: + kiwisolver + +
+ +
+ +
+ + kiwisolver.exceptions +SourceModule
+imports: + kiwisolver + +
+
+imported by: + kiwisolver + +
+ +
+ +
+ + linecache +SourceModule
+imports: + functools + • os + • sys + • tokenize + +
+
+imported by: + asyncio.base_tasks + • bdb + • doctest + • eq_designer_new.py + • inspect + • pdb + • pkg_resources + • tornado.template + • traceback + • tracemalloc + • warnings + +
+ +
+ +
+ + locale +SourceModule
+imports: + _collections_abc + • _locale + • builtins + • encodings + • encodings.aliases + • functools + • os + • re + • sys + • warnings + +
+
+imported by: + _pydecimal + • _strptime + • calendar + • cgi + • eq_designer_new.py + • gettext + • matplotlib + • matplotlib.ticker + +
+ +
+ +
+ + logging +Package
+imports: + atexit + • collections.abc + • io + • os + • pickle + • re + • string + • sys + • threading + • time + • traceback + • warnings + • weakref + +
+
+imported by: + PIL.Image + • PIL.PcxImagePlugin + • PIL.PngImagePlugin + • PIL.TiffImagePlugin + • asyncio.futures + • asyncio.log + • charset_normalizer + • charset_normalizer.api + • charset_normalizer.md + • charset_normalizer.utils + • concurrent.futures._base + • eq_designer_new.py + • hashlib + • http.cookiejar + • jinja2.runtime + • logging.handlers + • matplotlib + • matplotlib._afm + • matplotlib._constrained_layout + • matplotlib._layoutgrid + • matplotlib._mathtext + • matplotlib.artist + • matplotlib.axes._axes + • matplotlib.axes._base + • matplotlib.axis + • matplotlib.backend_bases + • matplotlib.backends.backend_webagg_core + • matplotlib.backends.qt_editor._formlayout + • matplotlib.category + • matplotlib.colorbar + • matplotlib.dates + • matplotlib.dviread + • matplotlib.figure + • matplotlib.font_manager + • matplotlib.gridspec + • matplotlib.image + • matplotlib.legend + • matplotlib.lines + • matplotlib.mathtext + • matplotlib.pyplot + • matplotlib.style.core + • matplotlib.texmanager + • matplotlib.text + • matplotlib.textpath + • matplotlib.ticker + • multiprocessing.util + • packaging.tags + • setuptools._distutils._log + • setuptools._distutils.cmd + • setuptools._distutils.dist + • setuptools._distutils.log + • setuptools._vendor.packaging.tags + • setuptools.config._apply_pyprojecttoml + • setuptools.config._validate_pyproject.error_reporting + • setuptools.config._validate_pyproject.formats + • setuptools.config.pyprojecttoml + • setuptools.logging + • tornado.http1connection + • tornado.log + • unittest._log + • wheel.util + • wheel.vendored.packaging.tags + +
+ +
+ +
+ + logging.handlers +SourceModule
+imports: + base64 + • copy + • email.message + • email.utils + • http.client + • io + • logging + • os + • pickle + • queue + • re + • smtplib + • socket + • stat + • struct + • threading + • time + • urllib.parse + • win32evtlog + • win32evtlogutil + +
+
+imported by: + tornado.log + +
+ +
+ +
+ + lzma +SourceModule
+imports: + _compression + • _lzma + • builtins + • io + • os + +
+ + +
+ + + +
+ + markupsafe._native +SourceModule
+imports: + markupsafe + +
+
+imported by: + markupsafe + +
+ +
+ +
+ + markupsafe._speedups C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\markupsafe\_speedups.cp310-win_amd64.pyd
+imports: + markupsafe + +
+
+imported by: + markupsafe + +
+ +
+ +
+ + marshal (builtin module) + +
+ + + +
+ + matplotlib +Package +
+imported by: + eq_designer_new.py + • matplotlib + • matplotlib._afm + • matplotlib._api + • matplotlib._blocking_input + • matplotlib._c_internal_utils + • matplotlib._cm + • matplotlib._cm_listed + • matplotlib._color_data + • matplotlib._constrained_layout + • matplotlib._docstring + • matplotlib._enums + • matplotlib._fontconfig_pattern + • matplotlib._image + • matplotlib._layoutgrid + • matplotlib._mathtext + • matplotlib._mathtext_data + • matplotlib._path + • matplotlib._pylab_helpers + • matplotlib._qhull + • matplotlib._text_helpers + • matplotlib._tight_bbox + • matplotlib._tight_layout + • matplotlib._tri + • matplotlib._version + • matplotlib.artist + • matplotlib.axes + • matplotlib.axes._axes + • matplotlib.axes._base + • matplotlib.axes._secondary_axes + • matplotlib.axis + • matplotlib.backend_bases + • matplotlib.backend_managers + • matplotlib.backend_tools + • matplotlib.backends + • matplotlib.backends.backend_agg + • matplotlib.backends.backend_qt + • matplotlib.backends.backend_qt5agg + • matplotlib.backends.backend_webagg + • matplotlib.backends.backend_webagg_core + • matplotlib.backends.qt_compat + • matplotlib.backends.qt_editor._formlayout + • matplotlib.backends.qt_editor.figureoptions + • matplotlib.backends.registry + • matplotlib.bezier + • matplotlib.category + • matplotlib.cbook + • matplotlib.cm + • matplotlib.collections + • matplotlib.colorbar + • matplotlib.colors + • matplotlib.container + • matplotlib.contour + • matplotlib.dates + • matplotlib.dviread + • matplotlib.figure + • matplotlib.font_manager + • matplotlib.ft2font + • matplotlib.gridspec + • matplotlib.hatch + • matplotlib.image + • matplotlib.layout_engine + • matplotlib.legend + • matplotlib.legend_handler + • matplotlib.lines + • matplotlib.markers + • matplotlib.mathtext + • matplotlib.mlab + • matplotlib.offsetbox + • matplotlib.patches + • matplotlib.path + • matplotlib.patheffects + • matplotlib.projections + • matplotlib.projections.geo + • matplotlib.projections.polar + • matplotlib.pyplot + • matplotlib.quiver + • matplotlib.rcsetup + • matplotlib.scale + • matplotlib.spines + • matplotlib.stackplot + • matplotlib.streamplot + • matplotlib.style + • matplotlib.style.core + • matplotlib.table + • matplotlib.texmanager + • matplotlib.text + • matplotlib.textpath + • matplotlib.ticker + • matplotlib.transforms + • matplotlib.tri + • matplotlib.tri._triangulation + • matplotlib.tri._tricontour + • matplotlib.tri._trifinder + • matplotlib.tri._triinterpolate + • matplotlib.tri._tripcolor + • matplotlib.tri._trirefine + • matplotlib.tri._tritools + • matplotlib.typing + • matplotlib.units + • matplotlib.widgets + • mpl_toolkits.mplot3d.art3d + • mpl_toolkits.mplot3d.axes3d + • mpl_toolkits.mplot3d.axis3d + • mpl_toolkits.mplot3d.proj3d + +
+ +
+ +
+ + matplotlib._afm +SourceModule
+imports: + collections + • logging + • matplotlib + • matplotlib._mathtext_data + • re + +
+
+imported by: + matplotlib + • matplotlib.font_manager + +
+ +
+ +
+ + matplotlib._api +Package
+imports: + functools + • itertools + • matplotlib + • matplotlib._api + • matplotlib._api.deprecation + • re + • sys + • warnings + +
+
+imported by: + matplotlib + • matplotlib._api + • matplotlib._api.deprecation + • matplotlib._constrained_layout + • matplotlib._docstring + • matplotlib._text_helpers + • matplotlib._tight_layout + • matplotlib.artist + • matplotlib.axes._axes + • matplotlib.axes._base + • matplotlib.axes._secondary_axes + • matplotlib.axis + • matplotlib.backend_bases + • matplotlib.backend_managers + • matplotlib.backend_tools + • matplotlib.backends.backend_agg + • matplotlib.backends.backend_qt + • matplotlib.backends.backend_webagg_core + • matplotlib.backends.qt_editor._formlayout + • matplotlib.bezier + • matplotlib.category + • matplotlib.cbook + • matplotlib.cm + • matplotlib.collections + • matplotlib.colorbar + • matplotlib.colors + • matplotlib.contour + • matplotlib.dates + • matplotlib.dviread + • matplotlib.figure + • matplotlib.font_manager + • matplotlib.gridspec + • matplotlib.hatch + • matplotlib.image + • matplotlib.legend + • matplotlib.lines + • matplotlib.markers + • matplotlib.mathtext + • matplotlib.mlab + • matplotlib.offsetbox + • matplotlib.patches + • matplotlib.path + • matplotlib.projections.geo + • matplotlib.projections.polar + • matplotlib.pyplot + • matplotlib.quiver + • matplotlib.rcsetup + • matplotlib.scale + • matplotlib.spines + • matplotlib.stackplot + • matplotlib.streamplot + • matplotlib.style.core + • matplotlib.table + • matplotlib.texmanager + • matplotlib.text + • matplotlib.ticker + • matplotlib.transforms + • matplotlib.tri._triangulation + • matplotlib.tri._trifinder + • matplotlib.tri._triinterpolate + • matplotlib.tri._tripcolor + • matplotlib.tri._trirefine + • matplotlib.tri._tritools + • matplotlib.widgets + • mpl_toolkits.mplot3d.axes3d + • mpl_toolkits.mplot3d.axis3d + • mpl_toolkits.mplot3d.proj3d + +
+ +
+ +
+ + matplotlib._api.deprecation +SourceModule
+imports: + contextlib + • functools + • inspect + • math + • matplotlib._api + • warnings + +
+
+imported by: + matplotlib._api + +
+ +
+ +
+ + matplotlib._blocking_input +SourceModule
+imports: + matplotlib + +
+
+imported by: + matplotlib + • matplotlib.figure + +
+ +
+ +
+ + matplotlib._c_internal_utils C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\matplotlib\_c_internal_utils.cp310-win_amd64.pyd
+imports: + matplotlib + +
+
+imported by: + matplotlib + • matplotlib.cbook + +
+ +
+ +
+ + matplotlib._cm +SourceModule
+imports: + functools + • matplotlib + • numpy + +
+
+imported by: + matplotlib + • matplotlib.cm + • matplotlib.colors + +
+ +
+ +
+ + matplotlib._cm_listed +SourceModule
+imports: + matplotlib + • matplotlib.colors + +
+
+imported by: + matplotlib.cm + +
+ +
+ +
+ + matplotlib._color_data +SourceModule
+imports: + matplotlib + +
+
+imported by: + matplotlib.colors + +
+ +
+ +
+ + matplotlib._constrained_layout +SourceModule +
+imported by: + matplotlib.layout_engine + +
+ +
+ + + + + +
+ + matplotlib._fontconfig_pattern +SourceModule
+imports: + functools + • matplotlib + • pyparsing + • re + +
+
+imported by: + matplotlib.font_manager + • matplotlib.rcsetup + +
+ +
+ +
+ + matplotlib._image C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\matplotlib\_image.cp310-win_amd64.pyd
+imports: + matplotlib + +
+
+imported by: + matplotlib + • matplotlib.image + +
+ +
+ +
+ + matplotlib._layoutgrid +SourceModule
+imports: + itertools + • kiwisolver + • logging + • matplotlib + • matplotlib.patches + • matplotlib.transforms + • numpy + +
+
+imported by: + matplotlib._constrained_layout + +
+ +
+ +
+ + matplotlib._mathtext +SourceModule
+imports: + __future__ + • abc + • collections.abc + • copy + • enum + • functools + • logging + • matplotlib + • matplotlib._mathtext_data + • matplotlib.cbook + • matplotlib.font_manager + • matplotlib.ft2font + • numpy + • os + • packaging.version + • pyparsing + • re + • string + • types + • typing + • unicodedata + +
+
+imported by: + matplotlib + • matplotlib.mathtext + +
+ +
+ +
+ + matplotlib._mathtext_data +SourceModule
+imports: + __future__ + • matplotlib + • typing + +
+
+imported by: + matplotlib._afm + • matplotlib._mathtext + +
+ +
+ +
+ + matplotlib._path C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\matplotlib\_path.cp310-win_amd64.pyd
+imports: + collections.abc + • matplotlib + • matplotlib.transforms + • numpy + +
+ + +
+ + + +
+ + matplotlib._qhull C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\matplotlib\_qhull.cp310-win_amd64.pyd
+imports: + matplotlib + +
+
+imported by: + matplotlib + • matplotlib.tri._triangulation + +
+ +
+ +
+ + matplotlib._text_helpers +SourceModule
+imports: + __future__ + • dataclasses + • matplotlib + • matplotlib._api + • matplotlib.ft2font + +
+
+imported by: + matplotlib + • matplotlib.textpath + +
+ +
+ +
+ + matplotlib._tight_bbox +SourceModule
+imports: + matplotlib + • matplotlib.transforms + +
+
+imported by: + matplotlib + • matplotlib.backend_bases + +
+ +
+ + + +
+ + matplotlib._tri C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\matplotlib\_tri.cp310-win_amd64.pyd
+imports: + matplotlib + • typing + +
+ + +
+ +
+ + matplotlib._version +SourceModule
+imports: + matplotlib + +
+
+imported by: + matplotlib + +
+ +
+ + + + + + + + + + + + + + + +
+ + matplotlib.backend_managers +SourceModule +
+imported by: + matplotlib.backend_bases + +
+ +
+ + + + + +
+ + matplotlib.backends._backend_agg C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\matplotlib\backends\_backend_agg.cp310-win_amd64.pyd
+imports: + matplotlib.backends + +
+
+imported by: + matplotlib.backends.backend_agg + +
+ +
+ + + + + +
+ + matplotlib.backends.backend_qt5agg +SourceModule +
+imported by: + eq_designer_new.py + +
+ +
+ + + + + + + + + + + + + + + +
+ + matplotlib.backends.registry +SourceModule
+imports: + enum + • importlib + • importlib.metadata + • matplotlib + • matplotlib.backends + • sys + +
+
+imported by: + matplotlib.backend_bases + • matplotlib.backends + +
+ +
+ +
+ + matplotlib.bezier +SourceModule
+imports: + functools + • math + • matplotlib + • matplotlib._api + • matplotlib.path + • numpy + • warnings + +
+
+imported by: + matplotlib.patches + • matplotlib.path + +
+ +
+ +
+ + matplotlib.category +SourceModule
+imports: + collections + • dateutil.parser + • itertools + • logging + • matplotlib + • matplotlib._api + • matplotlib.ticker + • matplotlib.units + • numpy + +
+
+imported by: + matplotlib.axes._axes + +
+ +
+ +
+ + matplotlib.cbook +SourceModule
+imports: + bz2 + • collections + • collections.abc + • contextlib + • functools + • gc + • gi + • gzip + • itertools + • math + • matplotlib + • matplotlib._api + • matplotlib._c_internal_utils + • matplotlib.artist + • numpy + • numpy.VisibleDeprecationWarning + • numpy.exceptions + • operator + • os + • pathlib + • shlex + • subprocess + • sys + • time + • traceback + • types + • weakref + +
+ + +
+ + + + + + + + + +
+ + matplotlib.container +SourceModule
+imports: + matplotlib + • matplotlib.artist + • matplotlib.cbook + +
+ + +
+ + + + + +
+ + matplotlib.dviread +SourceModule
+imports: + argparse + • collections + • enum + • functools + • itertools + • logging + • matplotlib + • matplotlib._api + • matplotlib.cbook + • numpy + • os + • pathlib + • re + • struct + • subprocess + • sys + +
+
+imported by: + matplotlib + • matplotlib.texmanager + • matplotlib.textpath + +
+ +
+ + + + + +
+ + matplotlib.ft2font C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\matplotlib\ft2font.cp310-win_amd64.pyd
+imports: + matplotlib + • numpy + • numpy.typing + • typing + +
+ + +
+ +
+ + matplotlib.gridspec +SourceModule + + +
+ +
+ + matplotlib.hatch +SourceModule
+imports: + matplotlib + • matplotlib._api + • matplotlib.path + • numpy + +
+ + +
+ + + + + + + +
+ + matplotlib.legend_handler +SourceModule +
+imported by: + matplotlib + • matplotlib.legend + +
+ +
+ + + + + + + +
+ + matplotlib.mlab +SourceModule
+imports: + functools + • matplotlib + • matplotlib._api + • matplotlib._docstring + • matplotlib.cbook + • numbers + • numpy + +
+
+imported by: + matplotlib.axes._axes + • matplotlib.pyplot + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ + matplotlib.rcsetup +SourceModule
+imports: + ast + • cycler + • functools + • matplotlib + • matplotlib._api + • matplotlib._enums + • matplotlib._fontconfig_pattern + • matplotlib.backends + • matplotlib.cbook + • matplotlib.colors + • numbers + • numpy + • operator + • os + • re + +
+ + +
+ +
+ + matplotlib.scale +SourceModule +
+imported by: + matplotlib + • matplotlib.axis + • matplotlib.cm + • matplotlib.colors + • matplotlib.pyplot + +
+ +
+ + + +
+ + matplotlib.stackplot +SourceModule
+imports: + itertools + • matplotlib + • matplotlib._api + • numpy + +
+
+imported by: + matplotlib.axes._axes + +
+ +
+ +
+ + matplotlib.streamplot +SourceModule +
+imported by: + matplotlib.axes._axes + +
+ +
+ +
+ + matplotlib.style +Package
+imports: + matplotlib + • matplotlib.style.core + +
+
+imported by: + matplotlib + • matplotlib.pyplot + • matplotlib.style.core + +
+ +
+ +
+ + matplotlib.style.core +SourceModule
+imports: + contextlib + • importlib.resources + • importlib_resources + • logging + • matplotlib + • matplotlib._api + • matplotlib._docstring + • matplotlib.style + • os + • pathlib + • sys + • warnings + +
+
+imported by: + matplotlib + • matplotlib.style + +
+ +
+ + + +
+ + matplotlib.texmanager +SourceModule
+imports: + functools + • hashlib + • logging + • matplotlib + • matplotlib._api + • matplotlib.cbook + • matplotlib.dviread + • numpy + • os + • pathlib + • subprocess + • tempfile + +
+
+imported by: + matplotlib.backend_bases + • matplotlib.textpath + +
+ +
+ + + + + + + + + + + + + +
+ + matplotlib.tri._tricontour +SourceModule +
+imported by: + matplotlib.tri + +
+ +
+ +
+ + matplotlib.tri._trifinder +SourceModule
+imports: + matplotlib + • matplotlib._api + • matplotlib._tri + • matplotlib.tri + • numpy + +
+ + +
+ + + +
+ + matplotlib.tri._tripcolor +SourceModule +
+imported by: + matplotlib.tri + +
+ +
+ +
+ + matplotlib.tri._triplot +SourceModule +
+imported by: + matplotlib.tri + +
+ +
+ +
+ + matplotlib.tri._trirefine +SourceModule +
+imported by: + matplotlib.tri + +
+ +
+ +
+ + matplotlib.tri._tritools +SourceModule
+imports: + matplotlib + • matplotlib._api + • matplotlib.tri + • numpy + +
+ + +
+ +
+ + matplotlib.typing +SourceModule
+imports: + collections.abc + • matplotlib + • matplotlib._enums + • matplotlib.markers + • matplotlib.path + • pathlib + • typing + +
+
+imported by: + matplotlib.pyplot + +
+ +
+ +
+ + matplotlib.units +SourceModule
+imports: + decimal + • matplotlib + • matplotlib.cbook + • numbers + • numpy + • numpy.ma + +
+ + +
+ + + +
+ + mimetypes +SourceModule
+imports: + _winapi + • getopt + • os + • posixpath + • sys + • urllib.parse + • winreg + +
+ + +
+ +
+ + mmap (builtin module) + +
+ + + +
+ + mpl_toolkits +Package
+imports: + os + +
+
+imported by: + mpl_toolkits.mplot3d + +
+ +
+ + + + + + + + + + + +
+ + msvcrt (builtin module) + +
+ + + +
+ + multiprocessing.AuthenticationError +MissingModule
+imported by: + multiprocessing + • multiprocessing.connection + +
+ +
+ +
+ + multiprocessing.BufferTooShort +MissingModule
+imported by: + multiprocessing + • multiprocessing.connection + +
+ +
+ +
+ + multiprocessing.TimeoutError +MissingModule
+imported by: + multiprocessing + • multiprocessing.pool + +
+ +
+ + + + + +
+ + multiprocessing.dummy +Package
+imports: + array + • multiprocessing + • multiprocessing.dummy.connection + • multiprocessing.pool + • queue + • sys + • threading + • weakref + +
+ + +
+ +
+ + multiprocessing.dummy.connection +SourceModule
+imports: + multiprocessing.dummy + • queue + +
+
+imported by: + multiprocessing.dummy + +
+ +
+ + + + + +
+ + multiprocessing.get_start_method +MissingModule
+imported by: + multiprocessing + • multiprocessing.spawn + +
+ +
+ +
+ + multiprocessing.heap +SourceModule
+imports: + _winapi + • bisect + • collections + • mmap + • multiprocessing + • multiprocessing.context + • multiprocessing.util + • os + • sys + • tempfile + • threading + +
+ + +
+ + + + + + + + + + + +
+ + multiprocessing.popen_spawn_win32 +SourceModule
+imports: + _winapi + • msvcrt + • multiprocessing + • multiprocessing.context + • multiprocessing.spawn + • multiprocessing.util + • os + • signal + • sys + +
+
+imported by: + multiprocessing.context + +
+ +
+ + + +
+ + multiprocessing.queues +SourceModule + + +
+ +
+ + multiprocessing.reduction +SourceModule
+imports: + _winapi + • abc + • array + • copyreg + • functools + • io + • multiprocessing + • multiprocessing.context + • multiprocessing.resource_sharer + • os + • pickle + • socket + • sys + +
+
+imported by: + multiprocessing + • multiprocessing.context + +
+ +
+ + + + + +
+ + multiprocessing.set_start_method +MissingModule
+imported by: + multiprocessing + • multiprocessing.spawn + +
+ +
+ +
+ + multiprocessing.shared_memory +SourceModule
+imports: + _posixshmem + • _winapi + • errno + • functools + • mmap + • multiprocessing + • multiprocessing.resource_tracker + • os + • secrets + • struct + • types + +
+
+imported by: + multiprocessing + • multiprocessing.managers + +
+ +
+ + + + + + + + + +
+ + netrc +SourceModule
+imports: + os + • pwd + • shlex + • stat + +
+
+imported by: + ftplib + +
+ +
+ +
+ + nt (builtin module)
+imported by: + ctypes + • importlib._bootstrap_external + • ntpath + • os + • shutil + +
+ +
+ +
+ + ntpath +SourceModule
+imports: + _winapi + • genericpath + • nt + • os + • stat + • string + • sys + +
+
+imported by: + eq_designer_new.py + • os + • os.path + • pathlib + • pkg_resources + +
+ +
+ +
+ + nturl2path +SourceModule
+imports: + string + • urllib.parse + +
+
+imported by: + urllib.request + +
+ +
+ + + +
+ + numpy +Package
+imports: + numpy + • numpy.VisibleDeprecationWarning + • numpy.__config__ + • numpy._array_api_info + • numpy._core + • numpy._core._dtype_ctypes + • numpy._core._multiarray_tests + • numpy._core.add + • numpy._core.all + • numpy._core.amax + • numpy._core.amin + • numpy._core.arange + • numpy._core.arccos + • numpy._core.arccosh + • numpy._core.arcsin + • numpy._core.arcsinh + • numpy._core.arctan + • numpy._core.arctan2 + • numpy._core.arctanh + • numpy._core.argsort + • numpy._core.array + • numpy._core.array2string + • numpy._core.array_repr + • numpy._core.asanyarray + • numpy._core.asarray + • numpy._core.atleast_1d + • numpy._core.atleast_2d + • numpy._core.atleast_3d + • numpy._core.bitwise_and + • numpy._core.bitwise_count + • numpy._core.bitwise_or + • numpy._core.bitwise_xor + • numpy._core.bool_ + • numpy._core.byte + • numpy._core.bytes_ + • numpy._core.cbrt + • numpy._core.cdouble + • numpy._core.ceil + • numpy._core.character + • numpy._core.clongdouble + • numpy._core.complex64 + • numpy._core.complexfloating + • numpy._core.conj + • numpy._core.conjugate + • numpy._core.copysign + • numpy._core.cos + • numpy._core.cosh + • numpy._core.count_nonzero + • numpy._core.cross + • numpy._core.csingle + • numpy._core.datetime64 + • numpy._core.deg2rad + • numpy._core.degrees + • numpy._core.diagonal + • numpy._core.divide + • numpy._core.divmod + • numpy._core.dot + • numpy._core.double + • numpy._core.e + • numpy._core.empty + • numpy._core.empty_like + • numpy._core.equal + • numpy._core.errstate + • numpy._core.euler_gamma + • numpy._core.exp + • numpy._core.expm1 + • numpy._core.fabs + • numpy._core.finfo + • numpy._core.float16 + • numpy._core.float32 + • numpy._core.float_power + • numpy._core.floating + • numpy._core.floor + • numpy._core.floor_divide + • numpy._core.fmax + • numpy._core.fmin + • numpy._core.fmod + • numpy._core.frexp + • numpy._core.frompyfunc + • numpy._core.gcd + • numpy._core.greater + • numpy._core.greater_equal + • numpy._core.half + • numpy._core.heaviside + • numpy._core.hstack + • numpy._core.hypot + • numpy._core.iinfo + • numpy._core.inexact + • numpy._core.inf + • numpy._core.int16 + • numpy._core.int32 + • numpy._core.int64 + • numpy._core.int8 + • numpy._core.intc + • numpy._core.integer + • numpy._core.intp + • numpy._core.isfinite + • numpy._core.isnan + • numpy._core.isnat + • numpy._core.isscalar + • numpy._core.lcm + • numpy._core.ldexp + • numpy._core.left_shift + • numpy._core.less + • numpy._core.less_equal + • numpy._core.linspace + • numpy._core.log + • numpy._core.log1p + • numpy._core.log2 + • numpy._core.logaddexp + • numpy._core.logaddexp2 + • numpy._core.logical_and + • numpy._core.logical_not + • numpy._core.logical_or + • numpy._core.logical_xor + • numpy._core.long + • numpy._core.longdouble + • numpy._core.matmul + • numpy._core.matrix_transpose + • numpy._core.max + • numpy._core.maximum + • numpy._core.memmap + • numpy._core.minimum + • numpy._core.mod + • numpy._core.modf + • numpy._core.moveaxis + • numpy._core.multiply + • numpy._core.ndarray + • numpy._core.negative + • numpy._core.newaxis + • numpy._core.not_equal + • numpy._core.number + • numpy._core.object_ + • numpy._core.ones + • numpy._core.outer + • numpy._core.pi + • numpy._core.positive + • numpy._core.power + • numpy._core.printoptions + • numpy._core.prod + • numpy._core.rad2deg + • numpy._core.radians + • numpy._core.reciprocal + • numpy._core.remainder + • numpy._core.result_type + • numpy._core.right_shift + • numpy._core.rint + • numpy._core.short + • numpy._core.sign + • numpy._core.signbit + • numpy._core.signedinteger + • numpy._core.single + • numpy._core.sinh + • numpy._core.sort + • numpy._core.spacing + • numpy._core.sqrt + • numpy._core.square + • numpy._core.str_ + • numpy._core.subtract + • numpy._core.sum + • numpy._core.swapaxes + • numpy._core.tan + • numpy._core.tanh + • numpy._core.tensordot + • numpy._core.timedelta64 + • numpy._core.trace + • numpy._core.transpose + • numpy._core.true_divide + • numpy._core.trunc + • numpy._core.ubyte + • numpy._core.uint + • numpy._core.uint16 + • numpy._core.uint32 + • numpy._core.uint64 + • numpy._core.uintc + • numpy._core.uintp + • numpy._core.ulong + • numpy._core.ulonglong + • numpy._core.unsignedinteger + • numpy._core.ushort + • numpy._core.vecdot + • numpy._core.void + • numpy._core.vstack + • numpy._core.zeros + • numpy._distributor_init + • numpy._distributor_init_local + • numpy._expired_attrs_2_0 + • numpy._globals + • numpy._pytesttester + • numpy.char + • numpy.core + • numpy.ctypeslib + • numpy.dtypes + • numpy.exceptions + • numpy.f2py + • numpy.fft + • numpy.lib + • numpy.lib._arraypad_impl + • numpy.lib._arraysetops_impl + • numpy.lib._function_base_impl + • numpy.lib._histograms_impl + • numpy.lib._index_tricks_impl + • numpy.lib._nanfunctions_impl + • numpy.lib._npyio_impl + • numpy.lib._polynomial_impl + • numpy.lib._shape_base_impl + • numpy.lib._stride_tricks_impl + • numpy.lib._twodim_base_impl + • numpy.lib._type_check_impl + • numpy.lib._ufunclike_impl + • numpy.lib._utils_impl + • numpy.lib.scimath + • numpy.linalg + • numpy.ma + • numpy.matlib + • numpy.matrixlib + • numpy.polynomial + • numpy.random + • numpy.rec + • numpy.strings + • numpy.testing + • numpy.typing + • numpy.version + • os + • pathlib + • sys + • warnings + +
+
+imported by: + contourpy + • contourpy._contourpy + • contourpy.array + • contourpy.convert + • contourpy.typecheck + • contourpy.types + • eq_designer_new.py + • filter_utils + • matplotlib._cm + • matplotlib._constrained_layout + • matplotlib._enums + • matplotlib._layoutgrid + • matplotlib._mathtext + • matplotlib._path + • matplotlib._tight_layout + • matplotlib.artist + • matplotlib.axes._axes + • matplotlib.axes._base + • matplotlib.axes._secondary_axes + • matplotlib.axis + • matplotlib.backend_bases + • matplotlib.backend_tools + • matplotlib.backends.backend_agg + • matplotlib.backends.backend_webagg_core + • matplotlib.bezier + • matplotlib.category + • matplotlib.cbook + • matplotlib.cm + • matplotlib.collections + • matplotlib.colorbar + • matplotlib.colors + • matplotlib.contour + • matplotlib.dates + • matplotlib.dviread + • matplotlib.figure + • matplotlib.ft2font + • matplotlib.gridspec + • matplotlib.hatch + • matplotlib.image + • matplotlib.legend + • matplotlib.legend_handler + • matplotlib.lines + • matplotlib.markers + • matplotlib.mlab + • matplotlib.offsetbox + • matplotlib.patches + • matplotlib.path + • matplotlib.patheffects + • matplotlib.projections.geo + • matplotlib.projections.polar + • matplotlib.pyplot + • matplotlib.quiver + • matplotlib.rcsetup + • matplotlib.scale + • matplotlib.spines + • matplotlib.stackplot + • matplotlib.streamplot + • matplotlib.table + • matplotlib.texmanager + • matplotlib.text + • matplotlib.textpath + • matplotlib.ticker + • matplotlib.transforms + • matplotlib.tri._triangulation + • matplotlib.tri._tricontour + • matplotlib.tri._trifinder + • matplotlib.tri._triinterpolate + • matplotlib.tri._tripcolor + • matplotlib.tri._triplot + • matplotlib.tri._trirefine + • matplotlib.tri._tritools + • matplotlib.units + • matplotlib.widgets + • mpl_toolkits.mplot3d.art3d + • mpl_toolkits.mplot3d.axes3d + • mpl_toolkits.mplot3d.axis3d + • mpl_toolkits.mplot3d.proj3d + • numpy + • numpy.__config__ + • numpy._array_api_info + • numpy._core + • numpy._core._dtype + • numpy._core._dtype_ctypes + • numpy._core._internal + • numpy._core._methods + • numpy._core.arrayprint + • numpy._core.defchararray + • numpy._core.fromnumeric + • numpy._core.function_base + • numpy._core.memmap + • numpy._core.numeric + • numpy._core.strings + • numpy._core.umath + • numpy._distributor_init + • numpy._expired_attrs_2_0 + • numpy._globals + • numpy._pytesttester + • numpy._typing + • numpy._typing._array_like + • numpy._typing._dtype_like + • numpy._typing._scalars + • numpy._utils + • numpy.char + • numpy.core + • numpy.ctypeslib + • numpy.dtypes + • numpy.exceptions + • numpy.f2py + • numpy.f2py.diagnose + • numpy.f2py.f90mod_rules + • numpy.fft + • numpy.lib + • numpy.lib._arraypad_impl + • numpy.lib._arraysetops_impl + • numpy.lib._function_base_impl + • numpy.lib._histograms_impl + • numpy.lib._index_tricks_impl + • numpy.lib._iotools + • numpy.lib._nanfunctions_impl + • numpy.lib._npyio_impl + • numpy.lib._stride_tricks_impl + • numpy.lib._twodim_base_impl + • numpy.lib._utils_impl + • numpy.lib.format + • numpy.lib.recfunctions + • numpy.linalg + • numpy.linalg._linalg + • numpy.ma + • numpy.ma.core + • numpy.ma.extras + • numpy.ma.mrecords + • numpy.matlib + • numpy.matrixlib + • numpy.polynomial + • numpy.polynomial._polybase + • numpy.polynomial.chebyshev + • numpy.polynomial.hermite + • numpy.polynomial.hermite_e + • numpy.polynomial.laguerre + • numpy.polynomial.legendre + • numpy.polynomial.polynomial + • numpy.polynomial.polyutils + • numpy.random + • numpy.random._generator + • numpy.random._mt19937 + • numpy.random._philox + • numpy.random._sfc64 + • numpy.random.bit_generator + • numpy.random.mtrand + • numpy.rec + • numpy.strings + • numpy.testing + • numpy.testing._private.utils + • numpy.testing.overrides + • numpy.typing + • numpy.version + +
+ +
+ +
+ + numpy.VisibleDeprecationWarning +MissingModule
+imported by: + matplotlib.cbook + • numpy + +
+ +
+ +
+ + numpy.__config__ +SourceModule
+imports: + enum + • json + • numpy + • numpy._core._multiarray_umath + • warnings + • yaml + +
+
+imported by: + numpy + +
+ +
+ + + +
+ + numpy._core +Package
+imports: + copyreg + • numpy + • numpy._core + • numpy._core._add_newdocs + • numpy._core._add_newdocs_scalars + • numpy._core._asarray + • numpy._core._dtype + • numpy._core._dtype_ctypes + • numpy._core._exceptions + • numpy._core._internal + • numpy._core._machar + • numpy._core._methods + • numpy._core.add + • numpy._core.all + • numpy._core.amax + • numpy._core.amin + • numpy._core.arange + • numpy._core.arccos + • numpy._core.arccosh + • numpy._core.arcsin + • numpy._core.arcsinh + • numpy._core.arctan + • numpy._core.arctan2 + • numpy._core.arctanh + • numpy._core.argsort + • numpy._core.array + • numpy._core.array2string + • numpy._core.array_repr + • numpy._core.asanyarray + • numpy._core.asarray + • numpy._core.atleast_1d + • numpy._core.atleast_2d + • numpy._core.atleast_3d + • numpy._core.bitwise_and + • numpy._core.bitwise_count + • numpy._core.bitwise_or + • numpy._core.bitwise_xor + • numpy._core.bool_ + • numpy._core.byte + • numpy._core.bytes_ + • numpy._core.cbrt + • numpy._core.cdouble + • numpy._core.ceil + • numpy._core.character + • numpy._core.clongdouble + • numpy._core.complex64 + • numpy._core.complexfloating + • numpy._core.conj + • numpy._core.conjugate + • numpy._core.copysign + • numpy._core.cos + • numpy._core.cosh + • numpy._core.count_nonzero + • numpy._core.cross + • numpy._core.csingle + • numpy._core.datetime64 + • numpy._core.deg2rad + • numpy._core.degrees + • numpy._core.diagonal + • numpy._core.divide + • numpy._core.divmod + • numpy._core.dot + • numpy._core.double + • numpy._core.e + • numpy._core.einsumfunc + • numpy._core.empty + • numpy._core.empty_like + • numpy._core.equal + • numpy._core.errstate + • numpy._core.euler_gamma + • numpy._core.exp + • numpy._core.expm1 + • numpy._core.fabs + • numpy._core.finfo + • numpy._core.float16 + • numpy._core.float32 + • numpy._core.float_power + • numpy._core.floating + • numpy._core.floor + • numpy._core.floor_divide + • numpy._core.fmax + • numpy._core.fmin + • numpy._core.fmod + • numpy._core.frexp + • numpy._core.fromnumeric + • numpy._core.frompyfunc + • numpy._core.function_base + • numpy._core.gcd + • numpy._core.getlimits + • numpy._core.greater + • numpy._core.greater_equal + • numpy._core.half + • numpy._core.heaviside + • numpy._core.hstack + • numpy._core.hypot + • numpy._core.iinfo + • numpy._core.inexact + • numpy._core.inf + • numpy._core.int16 + • numpy._core.int32 + • numpy._core.int64 + • numpy._core.int8 + • numpy._core.intc + • numpy._core.integer + • numpy._core.intp + • numpy._core.isfinite + • numpy._core.isnan + • numpy._core.isnat + • numpy._core.isscalar + • numpy._core.lcm + • numpy._core.ldexp + • numpy._core.left_shift + • numpy._core.less + • numpy._core.less_equal + • numpy._core.linspace + • numpy._core.log + • numpy._core.log1p + • numpy._core.log2 + • numpy._core.logaddexp + • numpy._core.logaddexp2 + • numpy._core.logical_and + • numpy._core.logical_not + • numpy._core.logical_or + • numpy._core.logical_xor + • numpy._core.long + • numpy._core.longdouble + • numpy._core.matmul + • numpy._core.matrix_transpose + • numpy._core.max + • numpy._core.maximum + • numpy._core.memmap + • numpy._core.minimum + • numpy._core.mod + • numpy._core.modf + • numpy._core.moveaxis + • numpy._core.multiarray + • numpy._core.multiply + • numpy._core.ndarray + • numpy._core.negative + • numpy._core.newaxis + • numpy._core.not_equal + • numpy._core.number + • numpy._core.numeric + • numpy._core.numerictypes + • numpy._core.object_ + • numpy._core.ones + • numpy._core.outer + • numpy._core.overrides + • numpy._core.pi + • numpy._core.positive + • numpy._core.power + • numpy._core.prod + • numpy._core.rad2deg + • numpy._core.radians + • numpy._core.reciprocal + • numpy._core.records + • numpy._core.remainder + • numpy._core.result_type + • numpy._core.right_shift + • numpy._core.rint + • numpy._core.shape_base + • numpy._core.short + • numpy._core.sign + • numpy._core.signbit + • numpy._core.signedinteger + • numpy._core.single + • numpy._core.sinh + • numpy._core.sort + • numpy._core.spacing + • numpy._core.sqrt + • numpy._core.square + • numpy._core.str_ + • numpy._core.subtract + • numpy._core.sum + • numpy._core.swapaxes + • numpy._core.tan + • numpy._core.tanh + • numpy._core.tensordot + • numpy._core.timedelta64 + • numpy._core.trace + • numpy._core.transpose + • numpy._core.true_divide + • numpy._core.trunc + • numpy._core.ubyte + • numpy._core.uint + • numpy._core.uint16 + • numpy._core.uint32 + • numpy._core.uint64 + • numpy._core.uintc + • numpy._core.uintp + • numpy._core.ulong + • numpy._core.ulonglong + • numpy._core.umath + • numpy._core.unsignedinteger + • numpy._core.ushort + • numpy._core.vecdot + • numpy._core.void + • numpy._core.vstack + • numpy._core.zeros + • numpy._pytesttester + • numpy.version + • os + • sys + • warnings + +
+
+imported by: + numpy + • numpy._array_api_info + • numpy._core + • numpy._core._add_newdocs + • numpy._core._add_newdocs_scalars + • numpy._core._asarray + • numpy._core._dtype + • numpy._core._dtype_ctypes + • numpy._core._exceptions + • numpy._core._internal + • numpy._core._machar + • numpy._core._methods + • numpy._core._multiarray_tests + • numpy._core._multiarray_umath + • numpy._core._string_helpers + • numpy._core._type_aliases + • numpy._core._ufunc_config + • numpy._core.arrayprint + • numpy._core.defchararray + • numpy._core.einsumfunc + • numpy._core.fromnumeric + • numpy._core.function_base + • numpy._core.getlimits + • numpy._core.memmap + • numpy._core.multiarray + • numpy._core.numeric + • numpy._core.numerictypes + • numpy._core.overrides + • numpy._core.printoptions + • numpy._core.records + • numpy._core.shape_base + • numpy._core.strings + • numpy._core.umath + • numpy.core + • numpy.fft._helper + • numpy.fft._pocketfft + • numpy.lib._array_utils_impl + • numpy.lib._arraysetops_impl + • numpy.lib._function_base_impl + • numpy.lib._histograms_impl + • numpy.lib._index_tricks_impl + • numpy.lib._nanfunctions_impl + • numpy.lib._npyio_impl + • numpy.lib._polynomial_impl + • numpy.lib._shape_base_impl + • numpy.lib._twodim_base_impl + • numpy.lib._type_check_impl + • numpy.lib._utils_impl + • numpy.lib.mixins + • numpy.linalg._linalg + • numpy.ma.core + • numpy.testing._private.utils + +
+ +
+ +
+ + numpy._core._add_newdocs +SourceModule +
+imported by: + numpy._core + +
+ +
+ +
+ + numpy._core._add_newdocs_scalars +SourceModule
+imports: + numpy._core + • numpy._core.function_base + • numpy._core.numerictypes + • os + • sys + +
+
+imported by: + numpy._core + +
+ +
+ +
+ + numpy._core._asarray +SourceModule +
+imported by: + numpy._core + • numpy._core.numeric + +
+ +
+ +
+ + numpy._core._dtype +SourceModule
+imports: + numpy + • numpy._core + +
+
+imported by: + numpy._core + • numpy._core.numerictypes + +
+ +
+ +
+ + numpy._core._dtype_ctypes +SourceModule
+imports: + _ctypes + • ctypes + • numpy + • numpy._core + +
+
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core._exceptions +SourceModule
+imports: + numpy._core + • numpy._utils + +
+
+imported by: + numpy._core + • numpy._core._methods + +
+ +
+ +
+ + numpy._core._internal +SourceModule
+imports: + ast + • ctypes + • math + • numpy + • numpy._core + • numpy._core.multiarray + • numpy.exceptions + • re + • sys + • warnings + +
+
+imported by: + numpy._core + • numpy.ctypeslib + +
+ +
+ +
+ + numpy._core._machar +SourceModule +
+imported by: + numpy._core + • numpy._core.getlimits + +
+ +
+ + + +
+ + numpy._core._multiarray_tests C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\numpy\_core\_multiarray_tests.cp310-win_amd64.pyd
+imports: + numpy._core + +
+
+imported by: + numpy + +
+ +
+ +
+ + numpy._core._multiarray_umath C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\numpy\_core\_multiarray_umath.cp310-win_amd64.pyd
+imports: + numpy._core + +
+ + +
+ +
+ + numpy._core._string_helpers +SourceModule
+imports: + numpy._core + +
+
+imported by: + numpy._core.numerictypes + +
+ +
+ +
+ + numpy._core._type_aliases +SourceModule
+imports: + numpy._core + • numpy._core.multiarray + +
+
+imported by: + numpy._core.numerictypes + +
+ +
+ +
+ + numpy._core._ufunc_config +SourceModule
+imports: + collections.abc + • contextlib + • contextvars + • functools + • numpy._core + • numpy._core.umath + • numpy._utils + +
+ + +
+ +
+ + numpy._core.add +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.all +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + • numpy.testing._private.utils + +
+ +
+ +
+ + numpy._core.amax +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.amin +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.arange +MissingModule
+imported by: + numpy + • numpy._core + • numpy.fft._helper + • numpy.testing._private.utils + +
+ +
+ +
+ + numpy._core.arccos +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.arccosh +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.arcsin +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.arcsinh +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.arctan +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.arctan2 +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.arctanh +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.argsort +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.array +MissingModule + +
+ +
+ + numpy._core.array2string +MissingModule
+imported by: + numpy + • numpy._core + • numpy.testing._private.utils + +
+ +
+ +
+ + numpy._core.array_repr +MissingModule
+imported by: + numpy + • numpy._core + • numpy.testing._private.utils + +
+ +
+ + + +
+ + numpy._core.asanyarray +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.asarray +MissingModule + +
+ +
+ + numpy._core.atleast_1d +MissingModule
+imported by: + numpy + • numpy._core + • numpy.lib._polynomial_impl + +
+ +
+ +
+ + numpy._core.atleast_2d +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.atleast_3d +MissingModule
+imported by: + numpy + • numpy._core + • numpy.lib._shape_base_impl + +
+ +
+ +
+ + numpy._core.bitwise_and +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.bitwise_count +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.bitwise_or +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.bitwise_xor +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.bool_ +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.byte +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.bytes_ +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.cbrt +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.cdouble +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.ceil +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.character +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.clongdouble +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.complex64 +MissingModule
+imported by: + numpy + • numpy._array_api_info + • numpy._core + +
+ +
+ +
+ + numpy._core.complexfloating +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.conj +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.conjugate +MissingModule
+imported by: + numpy + • numpy._core + • numpy.fft._pocketfft + +
+ +
+ +
+ + numpy._core.copysign +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.cos +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.cosh +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.count_nonzero +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.cross +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.csingle +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.datetime64 +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.defchararray +SourceModule +
+imported by: + numpy.char + +
+ +
+ +
+ + numpy._core.deg2rad +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.degrees +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.diagonal +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.divide +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.divmod +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.dot +MissingModule
+imported by: + numpy + • numpy._core + • numpy.lib._polynomial_impl + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.double +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.e +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.einsumfunc +SourceModule +
+imported by: + numpy._core + +
+ +
+ +
+ + numpy._core.empty +MissingModule + +
+ +
+ + numpy._core.empty_like +MissingModule
+imported by: + numpy + • numpy._core + • numpy.fft._pocketfft + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.equal +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.errstate +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + • numpy.testing._private.utils + +
+ +
+ +
+ + numpy._core.euler_gamma +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.exp +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.expm1 +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.fabs +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.finfo +MissingModule
+imported by: + numpy + • numpy._core + • numpy.lib._polynomial_impl + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.float16 +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.float32 +MissingModule + +
+ +
+ + numpy._core.float_power +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.floating +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.floor +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.floor_divide +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.fmax +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.fmin +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.fmod +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.frexp +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ + + +
+ + numpy._core.frompyfunc +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ + + +
+ + numpy._core.gcd +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.getlimits +SourceModule +
+imported by: + numpy._core + • numpy.lib._type_check_impl + +
+ +
+ +
+ + numpy._core.greater +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.greater_equal +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.half +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.heaviside +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.hstack +MissingModule
+imported by: + numpy + • numpy._core + • numpy.lib._polynomial_impl + +
+ +
+ +
+ + numpy._core.hypot +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.iinfo +MissingModule
+imported by: + numpy + • numpy._core + • numpy.lib._twodim_base_impl + +
+ +
+ +
+ + numpy._core.inexact +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.inf +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + • numpy.testing._private.utils + +
+ +
+ +
+ + numpy._core.int16 +MissingModule
+imported by: + numpy + • numpy._array_api_info + • numpy._core + +
+ +
+ +
+ + numpy._core.int32 +MissingModule
+imported by: + numpy + • numpy._array_api_info + • numpy._core + +
+ +
+ +
+ + numpy._core.int64 +MissingModule
+imported by: + numpy + • numpy._array_api_info + • numpy._core + +
+ +
+ +
+ + numpy._core.int8 +MissingModule
+imported by: + numpy + • numpy._array_api_info + • numpy._core + +
+ +
+ +
+ + numpy._core.intc +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.integer +MissingModule
+imported by: + numpy + • numpy._core + • numpy.fft._helper + +
+ +
+ +
+ + numpy._core.intp +MissingModule + +
+ +
+ + numpy._core.isfinite +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.isnan +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + • numpy.testing._private.utils + +
+ +
+ +
+ + numpy._core.isnat +MissingModule
+imported by: + numpy + • numpy._core + • numpy.testing._private.utils + +
+ +
+ +
+ + numpy._core.isscalar +MissingModule + +
+ +
+ + numpy._core.lcm +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.ldexp +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.left_shift +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.less +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.less_equal +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.linspace +MissingModule
+imported by: + numpy + • numpy._core + • numpy.lib._index_tricks_impl + +
+ +
+ +
+ + numpy._core.log +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.log1p +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.log2 +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.logaddexp +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.logaddexp2 +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.logical_and +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.logical_not +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.logical_or +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.logical_xor +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.long +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.longdouble +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.matmul +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.matrix_transpose +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.max +MissingModule
+imported by: + numpy + • numpy._core + • numpy.testing._private.utils + +
+ +
+ +
+ + numpy._core.maximum +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.memmap +SourceModule
+imports: + contextlib + • mmap + • numpy + • numpy._core + • numpy._core.numeric + • numpy._utils + • operator + • os.path + +
+
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.minimum +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.mod +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.modf +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.moveaxis +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ + + +
+ + numpy._core.multiply +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.ndarray +MissingModule + +
+ +
+ + numpy._core.negative +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.newaxis +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.not_equal +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.number +MissingModule
+imported by: + numpy + • numpy._core + • numpy.testing._private.utils + +
+ +
+ + + + + +
+ + numpy._core.object_ +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + • numpy.testing._private.utils + +
+ +
+ +
+ + numpy._core.ones +MissingModule
+imported by: + numpy + • numpy._core + • numpy.lib._polynomial_impl + +
+ +
+ +
+ + numpy._core.outer +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ + + +
+ + numpy._core.pi +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.positive +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.power +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.printoptions +SourceModule
+imports: + contextvars + • numpy._core + • sys + +
+
+imported by: + numpy + • numpy._core.arrayprint + +
+ +
+ +
+ + numpy._core.prod +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.rad2deg +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.radians +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.reciprocal +MissingModule
+imported by: + numpy + • numpy._core + • numpy.fft._pocketfft + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.records +SourceModule +
+imported by: + numpy._core + • numpy.lib.recfunctions + • numpy.ma.mrecords + • numpy.rec + +
+ +
+ +
+ + numpy._core.remainder +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.result_type +MissingModule
+imported by: + numpy + • numpy._core + • numpy.fft._pocketfft + • numpy.testing._private.utils + +
+ +
+ +
+ + numpy._core.right_shift +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.rint +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ + + +
+ + numpy._core.short +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.sign +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.signbit +MissingModule
+imported by: + numpy + • numpy._core + • numpy.testing._private.utils + +
+ +
+ +
+ + numpy._core.signedinteger +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.single +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.sinh +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.sort +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.spacing +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.sqrt +MissingModule
+imported by: + numpy + • numpy._core + • numpy.fft._pocketfft + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.square +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.str_ +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.strings +SourceModule
+imports: + numpy + • numpy._core + • numpy._core.multiarray + • numpy._core.umath + • sys + +
+
+imported by: + numpy._core.defchararray + • numpy.strings + +
+ +
+ +
+ + numpy._core.subtract +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.sum +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.swapaxes +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.tan +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.tanh +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.tensordot +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.timedelta64 +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.trace +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.transpose +MissingModule + +
+ +
+ + numpy._core.true_divide +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.trunc +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.ubyte +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.uint +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.uint16 +MissingModule
+imported by: + numpy + • numpy._array_api_info + • numpy._core + +
+ +
+ +
+ + numpy._core.uint32 +MissingModule
+imported by: + numpy + • numpy._array_api_info + • numpy._core + +
+ +
+ +
+ + numpy._core.uint64 +MissingModule
+imported by: + numpy + • numpy._array_api_info + • numpy._core + +
+ +
+ +
+ + numpy._core.uintc +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.uintp +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.ulong +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.ulonglong +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ + + +
+ + numpy._core.unsignedinteger +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.ushort +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.vecdot +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._core.void +MissingModule
+imported by: + numpy + • numpy._core + +
+ +
+ +
+ + numpy._core.vstack +MissingModule
+imported by: + numpy + • numpy._core + • numpy.lib._shape_base_impl + +
+ +
+ +
+ + numpy._core.zeros +MissingModule
+imported by: + numpy + • numpy._core + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._distributor_init +SourceModule
+imports: + numpy + • numpy._distributor_init_local + +
+
+imported by: + numpy + +
+ +
+ +
+ + numpy._distributor_init_local +MissingModule
+imported by: + numpy + • numpy._distributor_init + +
+ +
+ +
+ + numpy._expired_attrs_2_0 +SourceModule
+imports: + numpy + +
+
+imported by: + numpy + +
+ +
+ +
+ + numpy._globals +SourceModule
+imports: + enum + • numpy + • numpy._utils + +
+
+imported by: + numpy + • numpy._core._methods + • numpy.linalg._linalg + +
+ +
+ +
+ + numpy._pytesttester +SourceModule
+imports: + numpy + • numpy.testing + • os + • sys + • warnings + +
+
+imported by: + numpy + • numpy._core + • numpy.f2py + • numpy.fft + • numpy.lib + • numpy.linalg + • numpy.ma + • numpy.matrixlib + • numpy.polynomial + • numpy.random + • numpy.testing + • numpy.typing + +
+ +
+ + + +
+ + numpy._typing._add_docstring +SourceModule
+imports: + numpy._typing + • numpy._typing._array_like + • re + • textwrap + +
+
+imported by: + numpy.typing + +
+ +
+ +
+ + numpy._typing._array_like +SourceModule
+imports: + __future__ + • collections.abc + • numpy + • numpy._typing + • numpy._typing._nested_sequence + • sys + • typing + +
+
+imported by: + numpy._typing + • numpy._typing._add_docstring + +
+ +
+ +
+ + numpy._typing._char_codes +SourceModule
+imports: + numpy._typing + • typing + +
+
+imported by: + numpy._typing + • numpy._typing._dtype_like + +
+ +
+ +
+ + numpy._typing._dtype_like +SourceModule +
+imported by: + numpy._typing + +
+ +
+ +
+ + numpy._typing._nbit +SourceModule
+imports: + numpy._typing + • typing + +
+
+imported by: + numpy._typing + +
+ +
+ +
+ + numpy._typing._nested_sequence +SourceModule
+imports: + __future__ + • collections.abc + • numpy._typing + • typing + +
+
+imported by: + numpy._typing + • numpy._typing._array_like + +
+ +
+ +
+ + numpy._typing._scalars +SourceModule
+imports: + numpy + • numpy._typing + • typing + +
+
+imported by: + numpy._typing + +
+ +
+ +
+ + numpy._typing._shape +SourceModule
+imports: + collections.abc + • numpy._typing + • typing + +
+
+imported by: + numpy._typing + • numpy._typing._dtype_like + +
+ +
+ +
+ + numpy._typing._ufunc +MissingModule
+imported by: + numpy._typing + +
+ +
+ + + +
+ + numpy._utils._convertions +SourceModule
+imports: + numpy._utils + +
+
+imported by: + numpy._utils + +
+ +
+ +
+ + numpy._utils._inspect +SourceModule
+imports: + numpy._utils + • types + +
+
+imported by: + numpy._core.overrides + • numpy.ma.core + +
+ +
+ +
+ + numpy.char +Package
+imports: + numpy + • numpy._core.defchararray + +
+
+imported by: + numpy + +
+ +
+ +
+ + numpy.core +Package
+imports: + numpy + • numpy._core + • numpy.core._utils + +
+
+imported by: + numpy + • numpy.core._utils + +
+ +
+ +
+ + numpy.core._utils +SourceModule
+imports: + numpy.core + • warnings + +
+
+imported by: + numpy.core + +
+ +
+ +
+ + numpy.ctypeslib +SourceModule
+imports: + ctypes + • numpy + • numpy._core._internal + • numpy._core.multiarray + • os + • sys + • sysconfig + +
+
+imported by: + numpy + +
+ +
+ +
+ + numpy.dtypes +SourceModule
+imports: + numpy + • numpy.dtypes + +
+
+imported by: + numpy + • numpy.dtypes + +
+ +
+ + + + + + + + + +
+ + numpy.f2py._backends._backend +SourceModule
+imports: + __future__ + • abc + • numpy.f2py._backends + +
+ + +
+ +
+ + numpy.f2py._backends._distutils +SourceModule
+imports: + numpy.exceptions + • numpy.f2py._backends + • numpy.f2py._backends._backend + • os + • shutil + • sys + • warnings + +
+
+imported by: + numpy.f2py._backends + +
+ +
+ +
+ + numpy.f2py._backends._meson +SourceModule
+imports: + __future__ + • errno + • itertools + • numpy.f2py._backends + • numpy.f2py._backends._backend + • os + • pathlib + • re + • shutil + • string + • subprocess + • sys + • warnings + +
+
+imported by: + numpy.f2py._backends + +
+ +
+ +
+ + numpy.f2py._isocbind +SourceModule
+imports: + numpy.f2py + +
+
+imported by: + numpy.f2py.capi_maps + • numpy.f2py.func2subr + +
+ +
+ + + + + +
+ + numpy.f2py.cb_rules +SourceModule +
+imported by: + numpy.f2py + • numpy.f2py.capi_maps + • numpy.f2py.f2py2e + +
+ +
+ +
+ + numpy.f2py.cfuncs +SourceModule
+imports: + copy + • numpy.f2py + • numpy.f2py.__version__ + • numpy.f2py.capi_maps + • sys + +
+ + +
+ + + +
+ + numpy.f2py.crackfortran +SourceModule
+imports: + charset_normalizer + • codecs + • copy + • fileinput + • numpy.f2py + • numpy.f2py.__version__ + • numpy.f2py.auxfuncs + • numpy.f2py.symbolic + • os + • pathlib + • platform + • re + • string + • sys + +
+ + +
+ +
+ + numpy.f2py.diagnose +SourceModule +
+imported by: + numpy.f2py + +
+ +
+ +
+ + numpy.f2py.f2py2e +SourceModule +
+imported by: + numpy.f2py + • numpy.f2py.diagnose + +
+ +
+ + + +
+ + numpy.f2py.func2subr +SourceModule
+imports: + copy + • numpy.f2py + • numpy.f2py._isocbind + • numpy.f2py.auxfuncs + +
+ + +
+ + + +
+ + numpy.f2py.symbolic +SourceModule
+imports: + enum + • math + • numpy.f2py + • re + • warnings + +
+
+imported by: + numpy.f2py + • numpy.f2py.crackfortran + +
+ +
+ +
+ + numpy.f2py.use_rules +SourceModule
+imports: + numpy.f2py + • numpy.f2py.auxfuncs + +
+
+imported by: + numpy.f2py + • numpy.f2py.rules + +
+ +
+ + + +
+ + numpy.fft._helper +SourceModule +
+imported by: + numpy.fft + • numpy.fft.helper + +
+ +
+ + + +
+ + numpy.fft._pocketfft_umath C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\numpy\fft\_pocketfft_umath.cp310-win_amd64.pyd
+imports: + numpy.fft + +
+
+imported by: + numpy.fft + • numpy.fft._pocketfft + +
+ +
+ +
+ + numpy.fft.helper +SourceModule
+imports: + numpy.fft + • numpy.fft._helper + • warnings + +
+
+imported by: + numpy.fft + +
+ +
+ +
+ + numpy.lib +Package + + +
+ +
+ + numpy.lib._array_utils_impl +SourceModule +
+imported by: + numpy.lib.array_utils + +
+ +
+ +
+ + numpy.lib._arraypad_impl +SourceModule +
+imported by: + numpy + • numpy.lib + +
+ +
+ +
+ + numpy.lib._arraysetops_impl +SourceModule
+imports: + functools + • numpy + • numpy._core + • numpy._core._multiarray_umath + • numpy._core.overrides + • numpy.lib + • typing + • warnings + +
+
+imported by: + numpy + • numpy.lib + +
+ +
+ +
+ + numpy.lib._arrayterator_impl +SourceModule
+imports: + functools + • numpy.lib + • operator + +
+
+imported by: + numpy.lib + +
+ +
+ +
+ + numpy.lib._datasource +SourceModule
+imports: + bz2 + • gzip + • lzma + • numpy._utils + • numpy.lib + • os + • shutil + • tempfile + • urllib.error + • urllib.parse + • urllib.request + +
+
+imported by: + numpy.lib._npyio_impl + +
+ +
+ + + +
+ + numpy.lib._histograms_impl +SourceModule
+imports: + contextlib + • functools + • numpy + • numpy._core + • numpy._core.overrides + • numpy.lib + • operator + • warnings + +
+
+imported by: + numpy + • numpy.lib + • numpy.lib._function_base_impl + +
+ +
+ + + +
+ + numpy.lib._iotools +SourceModule
+imports: + numpy + • numpy._core.numeric + • numpy._utils + • numpy.lib + +
+
+imported by: + numpy.lib._npyio_impl + • numpy.lib.recfunctions + +
+ +
+ +
+ + numpy.lib._nanfunctions_impl +SourceModule +
+imported by: + numpy + • numpy.lib + +
+ +
+ +
+ + numpy.lib._npyio_impl +SourceModule +
+imported by: + numpy + • numpy.lib + • numpy.lib.npyio + +
+ +
+ + + + + + + +
+ + numpy.lib._stride_tricks_impl +SourceModule
+imports: + numpy + • numpy._core.numeric + • numpy._core.overrides + • numpy.lib + +
+ + +
+ + + + + +
+ + numpy.lib._ufunclike_impl +SourceModule
+imports: + functools + • numpy._core.numeric + • numpy._core.overrides + • numpy.lib + • warnings + +
+
+imported by: + numpy + • numpy.lib + • numpy.lib._type_check_impl + +
+ +
+ +
+ + numpy.lib._utils_impl +SourceModule
+imports: + ast + • functools + • inspect + • numpy + • numpy._core + • numpy._core._multiarray_umath + • numpy._core.ndarray + • numpy._utils + • numpy.lib + • os + • platform + • pprint + • pydoc + • re + • sys + • textwrap + • threadpoolctl + • types + • warnings + +
+
+imported by: + numpy + • numpy.lib + • numpy.lib.format + +
+ +
+ +
+ + numpy.lib._version +SourceModule
+imports: + numpy.lib + • re + +
+
+imported by: + numpy.lib + +
+ +
+ + + +
+ + numpy.lib.format +SourceModule
+imports: + ast + • io + • numpy + • numpy.lib + • numpy.lib._utils_impl + • os + • pickle + • struct + • tokenize + • warnings + +
+
+imported by: + numpy.lib + • numpy.lib._npyio_impl + +
+ +
+ +
+ + numpy.lib.introspect +SourceModule
+imports: + numpy._core._multiarray_umath + • numpy.lib + • re + +
+
+imported by: + numpy.lib + +
+ +
+ +
+ + numpy.lib.mixins +SourceModule
+imports: + numpy._core + • numpy._core.umath + • numpy.lib + +
+
+imported by: + numpy.lib + +
+ +
+ +
+ + numpy.lib.npyio +SourceModule
+imports: + numpy.lib + • numpy.lib._npyio_impl + +
+
+imported by: + numpy.lib + +
+ +
+ +
+ + numpy.lib.recfunctions +SourceModule +
+imported by: + numpy.lib + • numpy.testing.overrides + +
+ +
+ +
+ + numpy.lib.scimath +SourceModule
+imports: + numpy.lib + • numpy.lib._scimath_impl + +
+
+imported by: + numpy + • numpy.lib + +
+ +
+ +
+ + numpy.lib.stride_tricks +SourceModule +
+imported by: + numpy.lib + • numpy.lib._index_tricks_impl + +
+ +
+ + + +
+ + numpy.linalg._linalg +SourceModule
+imports: + functools + • numpy + • numpy._core + • numpy._core.add + • numpy._core.all + • numpy._core.amax + • numpy._core.amin + • numpy._core.argsort + • numpy._core.array + • numpy._core.asanyarray + • numpy._core.asarray + • numpy._core.atleast_2d + • numpy._core.cdouble + • numpy._core.complexfloating + • numpy._core.count_nonzero + • numpy._core.cross + • numpy._core.csingle + • numpy._core.diagonal + • numpy._core.divide + • numpy._core.dot + • numpy._core.double + • numpy._core.empty + • numpy._core.empty_like + • numpy._core.errstate + • numpy._core.finfo + • numpy._core.inexact + • numpy._core.inf + • numpy._core.intc + • numpy._core.intp + • numpy._core.isfinite + • numpy._core.isnan + • numpy._core.matmul + • numpy._core.matrix_transpose + • numpy._core.moveaxis + • numpy._core.multiply + • numpy._core.newaxis + • numpy._core.object_ + • numpy._core.outer + • numpy._core.overrides + • numpy._core.prod + • numpy._core.reciprocal + • numpy._core.sign + • numpy._core.single + • numpy._core.sort + • numpy._core.sqrt + • numpy._core.sum + • numpy._core.swapaxes + • numpy._core.tensordot + • numpy._core.trace + • numpy._core.transpose + • numpy._core.vecdot + • numpy._core.zeros + • numpy._globals + • numpy._typing + • numpy._utils + • numpy.lib._twodim_base_impl + • numpy.lib.array_utils + • numpy.linalg + • numpy.linalg._umath_linalg + • operator + • typing + • warnings + +
+
+imported by: + numpy.linalg + • numpy.linalg.linalg + +
+ +
+ +
+ + numpy.linalg._umath_linalg C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\numpy\linalg\_umath_linalg.cp310-win_amd64.pyd
+imports: + numpy.linalg + +
+ + +
+ +
+ + numpy.linalg.linalg +SourceModule
+imports: + numpy.linalg + • numpy.linalg._linalg + • warnings + +
+
+imported by: + numpy.linalg + +
+ +
+ + + +
+ + numpy.ma.core +SourceModule
+imports: + builtins + • copy + • functools + • inspect + • numpy + • numpy._core + • numpy._core.multiarray + • numpy._core.numeric + • numpy._core.numerictypes + • numpy._core.umath + • numpy._utils + • numpy._utils._inspect + • numpy.ma + • operator + • re + • textwrap + • typing + • warnings + +
+
+imported by: + numpy.ma + • numpy.ma.extras + +
+ +
+ +
+ + numpy.ma.extras +SourceModule +
+imported by: + numpy.ma + +
+ +
+ +
+ + numpy.ma.mrecords +SourceModule
+imports: + numpy + • numpy._core.records + • numpy.ma + • warnings + +
+
+imported by: + numpy.lib._npyio_impl + • numpy.lib.recfunctions + +
+ +
+ +
+ + numpy.matlib +SourceModule
+imports: + numpy + • numpy.matrixlib.defmatrix + • warnings + +
+
+imported by: + numpy + +
+ +
+ + + +
+ + numpy.matrixlib.defmatrix +SourceModule
+imports: + ast + • numpy._core.numeric + • numpy._utils + • numpy.linalg + • numpy.matrixlib + • sys + • warnings + +
+
+imported by: + numpy.lib._shape_base_impl + • numpy.matlib + • numpy.matrixlib + +
+ +
+ + + + + + + + + + + + + + + + + + + + + +
+ + numpy.random._bounded_integers C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\numpy\random\_bounded_integers.cp310-win_amd64.pyd
+imports: + numpy.random + +
+
+imported by: + numpy.random + +
+ +
+ +
+ + numpy.random._common C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\numpy\random\_common.cp310-win_amd64.pyd
+imports: + numpy.random + +
+
+imported by: + numpy.random + +
+ +
+ +
+ + numpy.random._generator C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\numpy\random\_generator.cp310-win_amd64.pyd
+imports: + collections.abc + • numpy + • numpy._typing + • numpy.random + • typing + +
+
+imported by: + numpy.random + • numpy.random._pickle + +
+ +
+ +
+ + numpy.random._mt19937 C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\numpy\random\_mt19937.cp310-win_amd64.pyd
+imports: + numpy + • numpy._typing + • numpy.random + • numpy.random.bit_generator + • numpy.typing + • typing + +
+
+imported by: + numpy.random + • numpy.random._pickle + +
+ +
+ +
+ + numpy.random._pcg64 C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\numpy\random\_pcg64.cp310-win_amd64.pyd
+imports: + numpy._typing + • numpy.random + • numpy.random.bit_generator + • typing + +
+
+imported by: + numpy.random + • numpy.random._pickle + +
+ +
+ +
+ + numpy.random._philox C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\numpy\random\_philox.cp310-win_amd64.pyd
+imports: + numpy + • numpy._typing + • numpy.random + • numpy.random.bit_generator + • numpy.typing + • typing + +
+
+imported by: + numpy.random + • numpy.random._pickle + +
+ +
+ + + +
+ + numpy.random._sfc64 C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\numpy\random\_sfc64.cp310-win_amd64.pyd
+imports: + numpy + • numpy._typing + • numpy.random + • numpy.random.bit_generator + • typing + +
+
+imported by: + numpy.random + • numpy.random._pickle + +
+ +
+ +
+ + numpy.random.bit_generator C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\numpy\random\bit_generator.cp310-win_amd64.pyd
+imports: + abc + • collections.abc + • numpy + • numpy._typing + • numpy.random + • threading + • typing + +
+ + +
+ +
+ + numpy.random.mtrand C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\numpy\random\mtrand.cp310-win_amd64.pyd
+imports: + builtins + • collections.abc + • numpy + • numpy._typing + • numpy.random + • numpy.random.bit_generator + • typing + +
+
+imported by: + numpy.random + • numpy.random._pickle + +
+ +
+ +
+ + numpy.rec +Package
+imports: + numpy + • numpy._core.records + +
+
+imported by: + numpy + +
+ +
+ +
+ + numpy.strings +Package
+imports: + numpy + • numpy._core.strings + +
+
+imported by: + numpy + • numpy._core.defchararray + +
+ +
+ + + + + +
+ + numpy.testing._private.extbuild +SourceModule
+imports: + importlib.util + • numpy.testing._private + • os + • pathlib + • subprocess + • sys + • sysconfig + • textwrap + +
+
+imported by: + numpy.testing + • numpy.testing._private + +
+ +
+ + + +
+ + numpy.testing.overrides +SourceModule +
+imported by: + numpy.testing + +
+ +
+ + + +
+ + numpy.version +SourceModule
+imports: + numpy + +
+
+imported by: + numpy + • numpy._core + • numpy.f2py.__version__ + +
+ +
+ +
+ + numpy_distutils +MissingModule
+imported by: + numpy.f2py.diagnose + +
+ +
+ +
+ + olefile +MissingModule
+imported by: + PIL.FpxImagePlugin + • PIL.MicImagePlugin + +
+ +
+ +
+ + opcode +SourceModule
+imports: + _opcode + +
+
+imported by: + dis + +
+ +
+ +
+ + operator +SourceModule
+imports: + _operator + • builtins + • functools + +
+ + +
+ +
+ + optparse +SourceModule
+imports: + gettext + • os + • sys + • textwrap + +
+
+imported by: + tornado.autoreload + • uu + +
+ +
+ +
+ + org +MissingModule
+imported by: + pickle + +
+ +
+ +
+ + os +SourceModule
+imports: + _collections_abc + • abc + • io + • nt + • ntpath + • os.path + • posix + • posixpath + • stat + • subprocess + • sys + • warnings + +
+
+imported by: + PIL.BlpImagePlugin + • PIL.BmpImagePlugin + • PIL.EpsImagePlugin + • PIL.FliImagePlugin + • PIL.GifImagePlugin + • PIL.IcnsImagePlugin + • PIL.ImImagePlugin + • PIL.Image + • PIL.ImageFile + • PIL.ImageShow + • PIL.Jpeg2KImagePlugin + • PIL.JpegImagePlugin + • PIL.MpoImagePlugin + • PIL.PdfImagePlugin + • PIL.PdfParser + • PIL.QoiImagePlugin + • PIL.SgiImagePlugin + • PIL.SpiderImagePlugin + • PIL.TiffImagePlugin + • PIL._typing + • PIL._util + • PIL.features + • PySide6 + • PySide6.QtCore + • PySide6.QtGui + • PySide6.QtNetwork + • PySide6.QtWidgets + • _bootsubprocess + • _distutils_hack + • _osx_support + • _pyi_rth_utils + • _pyi_rth_utils.qt + • _pyi_rth_utils.tempfile + • _sitebuiltins + • argparse + • asyncio.base_events + • asyncio.coroutines + • asyncio.events + • asyncio.proactor_events + • asyncio.unix_events + • asyncio.windows_utils + • bdb + • bz2 + • certifi.core + • cgi + • charset_normalizer.api + • colorama.ansitowin32 + • concurrent.futures.process + • concurrent.futures.thread + • configparser + • ctypes + • curses + • dateutil.tz.tz + • distutils._msvccompiler + • distutils.archive_util + • distutils.ccompiler + • distutils.cmd + • distutils.command.bdist + • distutils.command.build + • distutils.command.build_ext + • distutils.command.sdist + • distutils.config + • distutils.core + • distutils.debug + • distutils.dep_util + • distutils.dir_util + • distutils.dist + • distutils.extension + • distutils.file_util + • distutils.filelist + • distutils.spawn + • distutils.sysconfig + • distutils.util + • doctest + • email.utils + • eq_designer_new.py + • fileinput + • fnmatch + • genericpath + • getopt + • getpass + • gettext + • glob + • gzip + • http.cookiejar + • http.server + • importlib._common + • importlib.metadata + • importlib.resources + • inspect + • jinja2.bccache + • jinja2.environment + • jinja2.loaders + • jinja2.utils + • linecache + • locale + • logging + • logging.handlers + • lzma + • matplotlib + • matplotlib._mathtext + • matplotlib.backend_bases + • matplotlib.backends.backend_qt + • matplotlib.backends.backend_webagg_core + • matplotlib.backends.qt_compat + • matplotlib.cbook + • matplotlib.dviread + • matplotlib.font_manager + • matplotlib.image + • matplotlib.pyplot + • matplotlib.rcsetup + • matplotlib.style.core + • matplotlib.texmanager + • mimetypes + • mpl_toolkits + • multiprocessing.connection + • multiprocessing.context + • multiprocessing.forkserver + • multiprocessing.heap + • multiprocessing.managers + • multiprocessing.pool + • multiprocessing.popen_fork + • multiprocessing.popen_forkserver + • multiprocessing.popen_spawn_posix + • multiprocessing.popen_spawn_win32 + • multiprocessing.process + • multiprocessing.queues + • multiprocessing.reduction + • multiprocessing.resource_sharer + • multiprocessing.resource_tracker + • multiprocessing.shared_memory + • multiprocessing.spawn + • multiprocessing.util + • netrc + • ntpath + • numpy + • numpy._core + • numpy._core._add_newdocs_scalars + • numpy._core._methods + • numpy._core.overrides + • numpy._core.records + • numpy._pytesttester + • numpy.ctypeslib + • numpy.f2py + • numpy.f2py._backends._distutils + • numpy.f2py._backends._meson + • numpy.f2py.capi_maps + • numpy.f2py.crackfortran + • numpy.f2py.diagnose + • numpy.f2py.f2py2e + • numpy.f2py.rules + • numpy.lib._datasource + • numpy.lib._npyio_impl + • numpy.lib._utils_impl + • numpy.lib.format + • numpy.polynomial._polybase + • numpy.testing._private.extbuild + • numpy.testing._private.utils + • optparse + • os.path + • packaging._elffile + • packaging._manylinux + • packaging.markers + • pathlib + • pdb + • pkg_resources + • pkgutil + • platform + • platformdirs + • platformdirs.android + • platformdirs.api + • platformdirs.unix + • platformdirs.windows + • plistlib + • posixpath + • psutil + • psutil._common + • psutil._pswindows + • py_compile + • pydoc + • pyi_rth_inspect.py + • pyi_rth_mplconfig.py + • pyi_rth_pkgres.py + • pyi_rth_pyside6.py + • pyi_rth_setuptools.py + • pyparsing.core + • random + • runpy + • setuptools + • setuptools._core_metadata + • setuptools._distutils.archive_util + • setuptools._distutils.cmd + • setuptools._distutils.command._framework_compat + • setuptools._distutils.command.bdist + • setuptools._distutils.command.bdist_dumb + • setuptools._distutils.command.bdist_rpm + • setuptools._distutils.command.build + • setuptools._distutils.command.build_clib + • setuptools._distutils.command.build_ext + • setuptools._distutils.command.build_py + • setuptools._distutils.command.build_scripts + • setuptools._distutils.command.clean + • setuptools._distutils.command.config + • setuptools._distutils.command.install + • setuptools._distutils.command.install_data + • setuptools._distutils.command.install_egg_info + • setuptools._distutils.command.install_lib + • setuptools._distutils.command.install_scripts + • setuptools._distutils.command.sdist + • setuptools._distutils.compilers.C.base + • setuptools._distutils.compilers.C.cygwin + • setuptools._distutils.compilers.C.msvc + • setuptools._distutils.compilers.C.unix + • setuptools._distutils.compilers.C.zos + • setuptools._distutils.core + • setuptools._distutils.debug + • setuptools._distutils.dir_util + • setuptools._distutils.dist + • setuptools._distutils.extension + • setuptools._distutils.file_util + • setuptools._distutils.filelist + • setuptools._distutils.spawn + • setuptools._distutils.sysconfig + • setuptools._distutils.util + • setuptools._imp + • setuptools._path + • setuptools._shutil + • setuptools._vendor.backports.tarfile + • setuptools._vendor.importlib_metadata + • setuptools._vendor.importlib_metadata._meta + • setuptools._vendor.importlib_metadata.compat.py311 + • setuptools._vendor.jaraco.context + • setuptools._vendor.packaging._elffile + • setuptools._vendor.packaging._manylinux + • setuptools._vendor.packaging.markers + • setuptools._vendor.zipp.glob + • setuptools.archive_util + • setuptools.command.bdist_egg + • setuptools.command.bdist_wheel + • setuptools.command.egg_info + • setuptools.command.sdist + • setuptools.command.setopt + • setuptools.config._apply_pyprojecttoml + • setuptools.config._validate_pyproject.error_reporting + • setuptools.config._validate_pyproject.formats + • setuptools.config.expand + • setuptools.config.pyprojecttoml + • setuptools.config.setupcfg + • setuptools.discovery + • setuptools.dist + • setuptools.glob + • setuptools.installer + • setuptools.msvc + • setuptools.warnings + • setuptools.wheel + • shiboken6 + • shlex + • shutil + • site + • socket + • socketserver + • ssl + • subprocess + • sysconfig + • tarfile + • tempfile + • threading + • tornado.autoreload + • tornado.ioloop + • tornado.iostream + • tornado.locale + • tornado.netutil + • tornado.options + • tornado.process + • tornado.tcpserver + • tornado.util + • tornado.websocket + • unittest.loader + • unittest.main + • urllib.request + • uu + • uuid + • webbrowser + • wheel.cli + • wheel.cli.tags + • wheel.macosx_libfile + • wheel.vendored.packaging._elffile + • wheel.vendored.packaging._manylinux + • wheel.vendored.packaging.markers + • xml.dom.domreg + • xml.sax + • xml.sax.saxutils + • xmlrpc.server + • zipfile + • zipimport + +
+ +
+ + + + + +
+ + packaging._elffile +SourceModule
+imports: + __future__ + • enum + • os + • packaging + • struct + • typing + +
+
+imported by: + packaging._manylinux + • packaging._musllinux + • pkg_resources + +
+ +
+ +
+ + packaging._manylinux +SourceModule
+imports: + __future__ + • _manylinux + • collections + • contextlib + • ctypes + • functools + • os + • packaging + • packaging._elffile + • re + • sys + • typing + • warnings + +
+
+imported by: + packaging + • packaging.tags + • pkg_resources + +
+ +
+ +
+ + packaging._musllinux +SourceModule
+imports: + __future__ + • functools + • packaging + • packaging._elffile + • re + • subprocess + • sys + • sysconfig + • typing + +
+
+imported by: + packaging + • packaging.tags + • pkg_resources + +
+ +
+ +
+ + packaging._parser +SourceModule
+imports: + __future__ + • ast + • packaging + • packaging._tokenizer + • typing + +
+
+imported by: + packaging.markers + • packaging.requirements + • pkg_resources + +
+ +
+ +
+ + packaging._structures +SourceModule
+imports: + packaging + +
+
+imported by: + packaging.version + • pkg_resources + +
+ +
+ +
+ + packaging._tokenizer +SourceModule
+imports: + __future__ + • contextlib + • dataclasses + • packaging + • packaging.specifiers + • re + • typing + +
+ + +
+ + + +
+ + packaging.licenses._spdx +SourceModule
+imports: + __future__ + • packaging.licenses + • typing + +
+
+imported by: + packaging.licenses + • pkg_resources + +
+ +
+ +
+ + packaging.markers +SourceModule
+imports: + __future__ + • operator + • os + • packaging + • packaging._parser + • packaging._tokenizer + • packaging.specifiers + • packaging.utils + • platform + • sys + • typing + +
+ + +
+ +
+ + packaging.metadata +SourceModule +
+imported by: + pkg_resources + +
+ +
+ + + +
+ + packaging.specifiers +SourceModule
+imports: + __future__ + • abc + • itertools + • packaging + • packaging.utils + • packaging.version + • re + • typing + +
+ + +
+ +
+ + packaging.tags +SourceModule
+imports: + __future__ + • importlib.machinery + • logging + • packaging + • packaging._manylinux + • packaging._musllinux + • platform + • re + • struct + • subprocess + • sys + • sysconfig + • typing + +
+ + +
+ + + + + +
+ + pathlib +SourceModule
+imports: + _collections_abc + • errno + • fnmatch + • functools + • grp + • io + • ntpath + • operator + • os + • posixpath + • pwd + • re + • stat + • sys + • urllib.parse + • warnings + +
+ + +
+ +
+ + pdb +SourceModule
+imports: + bdb + • cmd + • code + • dis + • getopt + • glob + • inspect + • io + • linecache + • os + • pdb + • pprint + • pydoc + • re + • readline + • runpy + • shlex + • signal + • sys + • tokenize + • traceback + +
+
+imported by: + doctest + • pdb + +
+ +
+ +
+ + pep517 +MissingModule
+imported by: + importlib.metadata + +
+ +
+ +
+ + pickle +SourceModule
+imports: + _compat_pickle + • _pickle + • codecs + • copyreg + • functools + • io + • itertools + • org + • pprint + • re + • struct + • sys + • types + +
+ + +
+ + + +
+ + pkgutil +SourceModule
+imports: + collections + • functools + • importlib + • importlib.machinery + • importlib.util + • inspect + • marshal + • os + • os.path + • re + • sys + • types + • warnings + • zipimport + +
+
+imported by: + backports + • dateutil.zoneinfo + • pkg_resources + • pydoc + • pyi_rth_pkgutil.py + • runpy + • tornado.autoreload + +
+ +
+ + + + + +
+ + platformdirs.android +SourceModule
+imports: + __future__ + • android + • functools + • jnius + • os + • platformdirs + • platformdirs.api + • re + • sys + • typing + +
+
+imported by: + platformdirs + +
+ +
+ +
+ + platformdirs.api +SourceModule
+imports: + __future__ + • abc + • collections.abc + • os + • pathlib + • platformdirs + • typing + +
+ + +
+ +
+ + platformdirs.macos +SourceModule
+imports: + __future__ + • os.path + • pathlib + • platformdirs + • platformdirs.api + • sys + • typing + +
+
+imported by: + platformdirs + +
+ +
+ +
+ + platformdirs.unix +SourceModule
+imports: + __future__ + • collections.abc + • configparser + • os + • pathlib + • platformdirs + • platformdirs.api + • sys + • typing + +
+
+imported by: + platformdirs + +
+ +
+ +
+ + platformdirs.version +SourceModule
+imports: + platformdirs + • typing + +
+
+imported by: + platformdirs + +
+ +
+ +
+ + platformdirs.windows +SourceModule
+imports: + __future__ + • collections.abc + • ctypes + • functools + • os + • platformdirs + • platformdirs.api + • sys + • typing + • winreg + +
+
+imported by: + platformdirs + +
+ +
+ +
+ + plistlib +SourceModule
+imports: + binascii + • codecs + • datetime + • enum + • io + • itertools + • os + • re + • struct + • xml.parsers.expat + +
+
+imported by: + matplotlib.font_manager + • pkg_resources + +
+ +
+ +
+ + posix +MissingModule
+imports: + resource + +
+
+imported by: + importlib._bootstrap_external + • os + • shutil + +
+ +
+ +
+ + posixpath +SourceModule
+imports: + genericpath + • os + • pwd + • re + • stat + • sys + +
+ + +
+ +
+ + pprint +SourceModule
+imports: + collections + • dataclasses + • io + • re + • sys + • time + • types + +
+ + +
+ +
+ + psutil +Package
+imports: + collections + • contextlib + • datetime + • functools + • os + • psutil + • psutil._common + • psutil._psutil_windows + • psutil._pswindows + • pwd + • signal + • socket + • subprocess + • sys + • threading + • time + +
+ + +
+ +
+ + psutil._common +SourceModule
+imports: + collections + • ctypes + • enum + • functools + • inspect + • ipaddress + • os + • psutil + • socket + • stat + • sys + • threading + • warnings + +
+
+imported by: + psutil + • psutil._pswindows + +
+ +
+ +
+ + psutil._psutil_windows C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\psutil\_psutil_windows.pyd
+imports: + psutil + +
+
+imported by: + psutil + • psutil._pswindows + +
+ +
+ +
+ + psutil._pswindows +SourceModule
+imports: + collections + • contextlib + • enum + • functools + • os + • psutil + • psutil._common + • psutil._psutil_windows + • signal + • sys + • time + +
+
+imported by: + psutil + +
+ +
+ +
+ + pwd +MissingModule + +
+ +
+ + py_compile +SourceModule
+imports: + argparse + • enum + • importlib._bootstrap_external + • importlib.machinery + • importlib.util + • os + • os.path + • sys + • traceback + +
+
+imported by: + distutils.util + • setuptools._distutils.util + • zipfile + +
+ +
+ +
+ + pydoc +SourceModule
+imports: + builtins + • collections + • email.message + • getopt + • http.server + • importlib._bootstrap + • importlib._bootstrap_external + • importlib.machinery + • importlib.util + • inspect + • io + • os + • pkgutil + • platform + • pydoc_data.topics + • re + • reprlib + • select + • subprocess + • sys + • sysconfig + • tempfile + • textwrap + • threading + • time + • tokenize + • traceback + • tty + • types + • urllib.parse + • warnings + • webbrowser + +
+
+imported by: + _sitebuiltins + • numpy.lib._utils_impl + • pdb + • xmlrpc.server + +
+ +
+ +
+ + pydoc_data +Package
+imported by: + pydoc_data.topics + +
+ +
+ +
+ + pydoc_data.topics +SourceModule
+imports: + pydoc_data + +
+
+imported by: + pydoc + +
+ +
+ +
+ + pyexpat C:\Users\steven\.conda\envs\mic_v2\DLLs\pyexpat.pyd
+imported by: + _elementtree + • xml.etree.ElementTree + • xml.parsers.expat + +
+ +
+ +
+ + pyimod02_importers +MissingModule
+imported by: + pyi_rth_pkgres.py + • pyi_rth_pkgutil.py + +
+ +
+ + + +
+ + pyparsing.Word +MissingModule
+imported by: + pyparsing + • pyparsing.unicode + +
+ +
+ +
+ + pyparsing.actions +SourceModule
+imports: + pyparsing + • pyparsing.core + • pyparsing.exceptions + • pyparsing.util + +
+
+imported by: + pyparsing + • pyparsing.core + +
+ +
+ +
+ + pyparsing.common +SourceModule
+imports: + datetime + • pyparsing + • pyparsing.core + • pyparsing.helpers + +
+
+imported by: + pyparsing + +
+ +
+ +
+ + pyparsing.core +SourceModule
+imports: + __future__ + • abc + • collections + • collections.abc + • copy + • enum + • functools + • operator + • os + • pathlib + • pyparsing + • pyparsing.actions + • pyparsing.diagram + • pyparsing.exceptions + • pyparsing.results + • pyparsing.testing + • pyparsing.unicode + • pyparsing.util + • re + • string + • sys + • threading + • traceback + • types + • typing + • warnings + +
+ + +
+ +
+ + pyparsing.diagram +Package
+imports: + __future__ + • dataclasses + • inspect + • io + • jinja2 + • pyparsing + • railroad + • re + • typing + +
+
+imported by: + pyparsing.core + +
+ +
+ +
+ + pyparsing.exceptions +SourceModule
+imports: + __future__ + • copy + • functools + • inspect + • pyparsing + • pyparsing.core + • pyparsing.unicode + • pyparsing.util + • re + • sys + • typing + +
+
+imported by: + pyparsing + • pyparsing.actions + • pyparsing.core + +
+ +
+ +
+ + pyparsing.helpers +SourceModule
+imports: + html.entities + • operator + • pyparsing + • pyparsing.core + • pyparsing.util + • re + • sys + • typing + +
+
+imported by: + pyparsing + • pyparsing.common + +
+ +
+ +
+ + pyparsing.results +SourceModule
+imports: + __future__ + • collections + • collections.abc + • pprint + • pyparsing + • pyparsing.util + • typing + +
+
+imported by: + pyparsing + • pyparsing.core + +
+ +
+ +
+ + pyparsing.testing +SourceModule
+imports: + contextlib + • pyparsing + • pyparsing.core + • re + • typing + +
+
+imported by: + pyparsing + • pyparsing.core + +
+ +
+ +
+ + pyparsing.unicode +SourceModule
+imports: + itertools + • pyparsing + • pyparsing.Word + • sys + • typing + +
+
+imported by: + pyparsing + • pyparsing.core + • pyparsing.exceptions + +
+ +
+ +
+ + pyparsing.util +SourceModule
+imports: + contextlib + • functools + • inspect + • itertools + • pyparsing + • types + • typing + • warnings + +
+ + +
+ + + +
+ + quopri +SourceModule
+imports: + binascii + • getopt + • io + • sys + +
+
+imported by: + email.encoders + • email.message + • encodings.quopri_codec + +
+ +
+ +
+ + railroad +MissingModule
+imported by: + pyparsing.diagram + +
+ +
+ +
+ + random +SourceModule
+imports: + _collections_abc + • _random + • _sha512 + • bisect + • hashlib + • itertools + • math + • operator + • os + • statistics + • time + • warnings + +
+ + +
+ +
+ + re +SourceModule
+imports: + _locale + • copyreg + • enum + • functools + • sre_compile + • sre_constants + • sre_parse + +
+
+imported by: + PIL.EpsImagePlugin + • PIL.GimpPaletteFile + • PIL.ImImagePlugin + • PIL.Image + • PIL.ImageColor + • PIL.ImageOps + • PIL.ImtImagePlugin + • PIL.PdfParser + • PIL.PngImagePlugin + • PIL.XbmImagePlugin + • PIL.XpmImagePlugin + • _osx_support + • _pydecimal + • _sre + • _strptime + • argparse + • base64 + • cgi + • charset_normalizer.constant + • charset_normalizer.models + • charset_normalizer.utils + • colorama.ansitowin32 + • configparser + • csv + • dataclasses + • dateutil.parser._parser + • dateutil.parser.isoparser + • dateutil.rrule + • difflib + • distutils.ccompiler + • distutils.cmd + • distutils.command.build_ext + • distutils.dist + • distutils.extension + • distutils.fancy_getopt + • distutils.filelist + • distutils.sysconfig + • distutils.util + • distutils.version + • distutils.versionpredicate + • doctest + • email._encoded_words + • email._header_value_parser + • email.feedparser + • email.generator + • email.header + • email.message + • email.policy + • email.quoprimime + • email.utils + • encodings.idna + • eq_designer_new.py + • fnmatch + • fractions + • ftplib + • gettext + • glob + • html + • http.client + • http.cookiejar + • http.cookies + • importlib.metadata + • importlib.metadata._adapters + • importlib.metadata._text + • inspect + • ipaddress + • jinja2._identifier + • jinja2.ext + • jinja2.filters + • jinja2.lexer + • jinja2.utils + • json.decoder + • json.encoder + • json.scanner + • locale + • logging + • logging.handlers + • matplotlib + • matplotlib._afm + • matplotlib._api + • matplotlib._fontconfig_pattern + • matplotlib._mathtext + • matplotlib.artist + • matplotlib.axes._axes + • matplotlib.axes._base + • matplotlib.backend_tools + • matplotlib.colors + • matplotlib.dates + • matplotlib.dviread + • matplotlib.font_manager + • matplotlib.rcsetup + • numpy._core._internal + • numpy._typing._add_docstring + • numpy.f2py._backends._meson + • numpy.f2py.auxfuncs + • numpy.f2py.capi_maps + • numpy.f2py.crackfortran + • numpy.f2py.f2py2e + • numpy.f2py.symbolic + • numpy.lib._function_base_impl + • numpy.lib._npyio_impl + • numpy.lib._polynomial_impl + • numpy.lib._utils_impl + • numpy.lib._version + • numpy.lib.introspect + • numpy.ma.core + • numpy.testing._private.utils + • packaging._manylinux + • packaging._musllinux + • packaging._tokenizer + • packaging.licenses + • packaging.specifiers + • packaging.tags + • packaging.utils + • packaging.version + • pathlib + • pdb + • pickle + • pkg_resources + • pkgutil + • platform + • platformdirs.android + • plistlib + • posixpath + • pprint + • pydoc + • pyparsing.core + • pyparsing.diagram + • pyparsing.exceptions + • pyparsing.helpers + • pyparsing.testing + • rlcompleter + • setuptools + • setuptools._distutils.cmd + • setuptools._distutils.command.build_ext + • setuptools._distutils.command.build_scripts + • setuptools._distutils.command.config + • setuptools._distutils.command.install_egg_info + • setuptools._distutils.compilers.C.base + • setuptools._distutils.compilers.C.unix + • setuptools._distutils.dist + • setuptools._distutils.fancy_getopt + • setuptools._distutils.filelist + • setuptools._distutils.sysconfig + • setuptools._distutils.util + • setuptools._distutils.version + • setuptools._distutils.versionpredicate + • setuptools._normalization + • setuptools._vendor.backports.tarfile + • setuptools._vendor.importlib_metadata + • setuptools._vendor.importlib_metadata._adapters + • setuptools._vendor.importlib_metadata._text + • setuptools._vendor.jaraco.text + • setuptools._vendor.packaging._manylinux + • setuptools._vendor.packaging._musllinux + • setuptools._vendor.packaging._tokenizer + • setuptools._vendor.packaging.specifiers + • setuptools._vendor.packaging.tags + • setuptools._vendor.packaging.utils + • setuptools._vendor.packaging.version + • setuptools._vendor.zipp + • setuptools._vendor.zipp.glob + • setuptools.command.bdist_egg + • setuptools.command.bdist_wheel + • setuptools.command.egg_info + • setuptools.command.sdist + • setuptools.config._validate_pyproject.error_reporting + • setuptools.config._validate_pyproject.fastjsonschema_exceptions + • setuptools.config._validate_pyproject.fastjsonschema_validations + • setuptools.config._validate_pyproject.formats + • setuptools.dist + • setuptools.extension + • setuptools.glob + • setuptools.wheel + • shiboken6 + • shlex + • smtplib + • string + • sysconfig + • tarfile + • textwrap + • tokenize + • tomli._re + • tornado.escape + • tornado.http1connection + • tornado.httputil + • tornado.iostream + • tornado.locale + • tornado.options + • tornado.routing + • tornado.simple_httpclient + • tornado.template + • tornado.util + • tornado.web + • typing + • unittest.case + • unittest.loader + • urllib.parse + • urllib.request + • warnings + • wheel.cli.convert + • wheel.cli.pack + • wheel.metadata + • wheel.vendored.packaging._manylinux + • wheel.vendored.packaging._musllinux + • wheel.vendored.packaging._tokenizer + • wheel.vendored.packaging.specifiers + • wheel.vendored.packaging.tags + • wheel.vendored.packaging.utils + • wheel.vendored.packaging.version + • wheel.wheelfile + • xml.etree.ElementPath + • xml.etree.ElementTree + • xmlrpc.server + • yaml.constructor + • yaml.reader + • yaml.resolver + • zipfile + +
+ +
+ +
+ + readline +MissingModule
+imported by: + cmd + • code + • pdb + • rlcompleter + • site + +
+ +
+ +
+ + reprlib +SourceModule
+imports: + _thread + • builtins + • itertools + +
+
+imported by: + asyncio.base_futures + • asyncio.format_helpers + • bdb + • collections + • eq_designer_new.py + • functools + • pydoc + +
+ +
+ +
+ + resource +MissingModule
+imported by: + posix + +
+ +
+ +
+ + rlcompleter +SourceModule
+imports: + atexit + • builtins + • inspect + • keyword + • re + • readline + +
+
+imported by: + site + +
+ +
+ +
+ + runpy +SourceModule
+imports: + importlib.machinery + • importlib.util + • io + • os + • pkgutil + • sys + • types + • warnings + +
+
+imported by: + multiprocessing.spawn + • pdb + • tornado.autoreload + +
+ +
+ +
+ + secrets +SourceModule
+imports: + base64 + • binascii + • hmac + • random + +
+
+imported by: + multiprocessing.shared_memory + +
+ +
+ +
+ + select C:\Users\steven\.conda\envs\mic_v2\DLLs\select.pyd
+imported by: + http.server + • pydoc + • selectors + • subprocess + • tornado.platform.asyncio + +
+ +
+ +
+ + selectors +SourceModule
+imports: + abc + • collections + • collections.abc + • math + • select + • sys + +
+ + +
+ +
+ + setuptools +Package
+imports: + __future__ + • _distutils_hack + • _distutils_hack.override + • abc + • collections.abc + • distutils.command.build_ext + • distutils.core + • distutils.errors + • functools + • os + • re + • setuptools + • setuptools._core_metadata + • setuptools._distutils + • setuptools._distutils._log + • setuptools._distutils._macos_compat + • setuptools._distutils._modified + • setuptools._distutils._msvccompiler + • setuptools._distutils.archive_util + • setuptools._distutils.ccompiler + • setuptools._distutils.cmd + • setuptools._distutils.command + • setuptools._distutils.command._framework_compat + • setuptools._distutils.command.bdist + • setuptools._distutils.command.bdist_dumb + • setuptools._distutils.command.bdist_rpm + • setuptools._distutils.command.build + • setuptools._distutils.command.build_clib + • setuptools._distutils.command.build_ext + • setuptools._distutils.command.build_py + • setuptools._distutils.command.build_scripts + • setuptools._distutils.command.check + • setuptools._distutils.command.clean + • setuptools._distutils.command.config + • setuptools._distutils.command.install + • setuptools._distutils.command.install_data + • setuptools._distutils.command.install_egg_info + • setuptools._distutils.command.install_headers + • setuptools._distutils.command.install_lib + • setuptools._distutils.command.install_scripts + • setuptools._distutils.command.sdist + • setuptools._distutils.compat + • setuptools._distutils.compat.numpy + • setuptools._distutils.compat.py39 + • setuptools._distutils.core + • setuptools._distutils.cygwinccompiler + • setuptools._distutils.debug + • setuptools._distutils.dep_util + • setuptools._distutils.dir_util + • setuptools._distutils.dist + • setuptools._distutils.errors + • setuptools._distutils.extension + • setuptools._distutils.fancy_getopt + • setuptools._distutils.file_util + • setuptools._distutils.filelist + • setuptools._distutils.log + • setuptools._distutils.spawn + • setuptools._distutils.sysconfig + • setuptools._distutils.text_file + • setuptools._distutils.unixccompiler + • setuptools._distutils.util + • setuptools._distutils.version + • setuptools._distutils.versionpredicate + • setuptools._distutils.zosccompiler + • setuptools._entry_points + • setuptools._imp + • setuptools._normalization + • setuptools._reqs + • setuptools._shutil + • setuptools.command + • setuptools.depends + • setuptools.discovery + • setuptools.dist + • setuptools.extension + • setuptools.logging + • setuptools.monkey + • setuptools.msvc + • setuptools.version + • setuptools.warnings + • setuptools.windows_support + • sys + • typing + +
+ + +
+ + + + + + + +
+ + setuptools._distutils._macos_compat +SourceModule
+imports: + importlib + • setuptools._distutils + • sys + +
+ + +
+ + + + + + + + + + + + + +
+ + setuptools._distutils.command._framework_compat +SourceModule
+imports: + functools + • os + • setuptools._distutils.command + • subprocess + • sys + • sysconfig + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + setuptools._distutils.command.install_scripts +SourceModule +
+imported by: + setuptools + +
+ +
+ + + + + + + +
+ + setuptools._distutils.compat.py39 +SourceModule
+imports: + _imp + • functools + • itertools + • platform + • setuptools._distutils.compat + • sys + +
+ + +
+ +
+ + setuptools._distutils.compilers +NamespacePackage
+imports: + setuptools._distutils + +
+
+imported by: + setuptools._distutils.compilers.C + +
+ +
+ + + + + + + + + + + + + + + + + + + + + +
+ + setuptools._distutils.dep_util +SourceModule +
+imported by: + setuptools + +
+ +
+ + + + + + + + + + + + + + + +
+ + setuptools._distutils.log +SourceModule +
+imported by: + setuptools + +
+ +
+ + + + + +
+ + setuptools._distutils.text_file +SourceModule
+imports: + setuptools._distutils + • sys + +
+ + +
+ + + + + + + +
+ + setuptools._distutils.versionpredicate +SourceModule +
+imported by: + setuptools + +
+ +
+ + + + + +
+ + setuptools._imp +SourceModule
+imports: + importlib.machinery + • importlib.util + • os + • setuptools + • tokenize + +
+
+imported by: + setuptools + • setuptools.depends + +
+ +
+ + + +
+ + setuptools._itertools +SourceModule
+imports: + more_itertools + • setuptools + +
+
+imported by: + setuptools._entry_points + +
+ +
+ +
+ + setuptools._normalization +SourceModule
+imports: + packaging + • packaging.licenses + • re + • setuptools + • typing + +
+ + +
+ + + + + +
+ + setuptools._shutil +SourceModule
+imports: + distutils + • distutils.log + • os + • setuptools + • setuptools.compat + • setuptools.compat.py311 + • stat + • typing + +
+
+imported by: + setuptools + • setuptools.command.bdist_wheel + +
+ +
+ + + + + +
+ + setuptools._vendor.backports +Package
+imports: + setuptools._vendor + +
+ + +
+ +
+ + setuptools._vendor.backports.tarfile +Package
+imports: + argparse + • builtins + • bz2 + • copy + • grp + • gzip + • io + • lzma + • os + • pwd + • re + • setuptools._vendor.backports + • setuptools._vendor.backports.tarfile.compat.py38 + • shutil + • stat + • struct + • sys + • time + • warnings + • zlib + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + setuptools._vendor.jaraco.context +SourceModule
+imports: + __future__ + • backports + • backports.tarfile + • contextlib + • functools + • operator + • os + • setuptools._vendor.jaraco + • shutil + • subprocess + • sys + • tarfile + • tempfile + • typing + • urllib.request + • warnings + +
+
+imported by: + jaraco.context + +
+ +
+ +
+ + setuptools._vendor.jaraco.functools +Package
+imports: + collections.abc + • functools + • inspect + • itertools + • more_itertools + • operator + • setuptools._vendor.jaraco + • time + • types + • warnings + +
+
+imported by: + jaraco.functools + +
+ +
+ +
+ + setuptools._vendor.jaraco.text +Package +
+imported by: + jaraco.text + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + setuptools._vendor.zipp +Package
+imports: + contextlib + • io + • itertools + • pathlib + • posixpath + • re + • setuptools._vendor + • setuptools._vendor.zipp.compat.py310 + • setuptools._vendor.zipp.glob + • stat + • sys + • zipfile + +
+ + +
+ + + +
+ + setuptools._vendor.zipp.compat.py310 +SourceModule
+imports: + io + • setuptools._vendor.zipp.compat + • sys + +
+
+imported by: + setuptools._vendor.zipp + +
+ +
+ +
+ + setuptools._vendor.zipp.glob +SourceModule
+imports: + os + • re + • setuptools._vendor.zipp + +
+
+imported by: + setuptools._vendor.zipp + +
+ +
+ +
+ + setuptools.archive_util +SourceModule
+imports: + contextlib + • distutils.errors + • os + • posixpath + • setuptools + • setuptools._path + • shutil + • tarfile + • zipfile + +
+
+imported by: + setuptools.wheel + +
+ +
+ + + + + +
+ + setuptools.command.bdist_egg +SourceModule
+imports: + __future__ + • distutils + • distutils.dir_util + • distutils.log + • marshal + • os + • pkg_resources + • re + • setuptools + • setuptools._path + • setuptools.command + • setuptools.extension + • sys + • sysconfig + • textwrap + • types + • typing + • typing_extensions + • zipfile + +
+ + +
+ + + +
+ + setuptools.command.build +SourceModule +
+imported by: + setuptools.command.sdist + +
+ +
+ + + +
+ + setuptools.command.sdist +SourceModule +
+imported by: + setuptools.command.egg_info + +
+ +
+ +
+ + setuptools.command.setopt +SourceModule +
+imported by: + setuptools.command.egg_info + +
+ +
+ + + +
+ + setuptools.compat.py310 +SourceModule
+imports: + setuptools.compat + • sys + • tomli + • tomllib + +
+
+imported by: + setuptools.config.pyprojecttoml + +
+ +
+ +
+ + setuptools.compat.py311 +SourceModule
+imports: + __future__ + • _typeshed + • setuptools.compat + • shutil + • sys + • typing + • typing_extensions + +
+
+imported by: + setuptools._shutil + • setuptools.compat + +
+ +
+ +
+ + setuptools.compat.py39 +SourceModule
+imports: + setuptools.compat + • sys + +
+
+imported by: + setuptools.compat + • setuptools.unicode_utils + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + setuptools.depends +SourceModule
+imports: + __future__ + • contextlib + • dis + • marshal + • packaging.version + • setuptools + • setuptools._imp + • sys + • types + • typing + +
+
+imported by: + setuptools + +
+ +
+ +
+ + setuptools.discovery +SourceModule
+imports: + __future__ + • _distutils_hack.override + • collections.abc + • distutils + • distutils.log + • distutils.util + • fnmatch + • glob + • inspect + • itertools + • os + • pathlib + • setuptools + • setuptools._path + • setuptools.errors + • typing + +
+
+imported by: + setuptools + • setuptools.config.expand + • setuptools.dist + +
+ +
+ + + + + + + +
+ + setuptools.glob +SourceModule
+imports: + __future__ + • _typeshed + • collections.abc + • fnmatch + • os + • re + • setuptools + • typing + +
+
+imported by: + setuptools.command.egg_info + +
+ +
+ +
+ + setuptools.installer +SourceModule
+imports: + __future__ + • distutils + • distutils.errors + • distutils.log + • functools + • glob + • os + • pkg_resources + • setuptools + • setuptools._reqs + • setuptools.warnings + • setuptools.wheel + • subprocess + • sys + • tempfile + +
+
+imported by: + setuptools.dist + +
+ +
+ +
+ + setuptools.logging +SourceModule
+imports: + distutils.log + • inspect + • logging + • setuptools + • setuptools.monkey + • sys + +
+
+imported by: + setuptools + +
+ +
+ +
+ + setuptools.monkey +SourceModule
+imports: + __future__ + • distutils.filelist + • inspect + • platform + • setuptools + • setuptools._core_metadata + • sys + • types + • typing + +
+
+imported by: + setuptools + • setuptools.dist + • setuptools.extension + • setuptools.logging + +
+ +
+ +
+ + setuptools.msvc +SourceModule
+imports: + __future__ + • contextlib + • distutils.errors + • itertools + • json + • more_itertools + • os + • os.path + • platform + • setuptools + • typing + • typing_extensions + • winreg + +
+
+imported by: + setuptools + +
+ +
+ + + +
+ + setuptools.version +SourceModule
+imports: + setuptools + • setuptools._importlib + +
+
+imported by: + setuptools + +
+ +
+ + + +
+ + setuptools.wheel +SourceModule +
+imported by: + setuptools.installer + +
+ +
+ +
+ + setuptools.windows_support +SourceModule
+imports: + ctypes + • ctypes.wintypes + • platform + • setuptools + +
+
+imported by: + setuptools + • setuptools.dist + +
+ +
+ +
+ + setuptools_scm +MissingModule
+imported by: + matplotlib + +
+ +
+ +
+ + shiboken2 +MissingModule
+imported by: + matplotlib.backends.qt_compat + +
+ +
+ +
+ + shiboken6 +Package
+imports: + base64 + • contextlib + • functools + • io + • keyword + • marshal + • os + • re + • shiboken6.Shiboken + • struct + • sys + • tempfile + • textwrap + • traceback + • types + • typing + • zipfile + +
+ + +
+ +
+ + shiboken6.Shiboken C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\shiboken6\Shiboken.pyd
+imports: + __future__ + • shiboken6 + • shiboken6.Shiboken + +
+ + +
+ +
+ + shlex +SourceModule
+imports: + collections + • io + • os + • re + • sys + • warnings + +
+ + +
+ + + + + +
+ + sip +MissingModule
+imported by: + matplotlib.backends.qt_compat + +
+ +
+ +
+ + site +SourceModule
+imports: + _sitebuiltins + • atexit + • builtins + • io + • os + • readline + • rlcompleter + • sitecustomize + • stat + • sys + • textwrap + • traceback + • usercustomize + +
+ + +
+ +
+ + sitecustomize +MissingModule
+imported by: + site + +
+ +
+ +
+ + six +SourceModule
+imports: + StringIO + • __future__ + • functools + • importlib.util + • io + • itertools + • operator + • struct + • sys + • types + +
+ + +
+ +
+ + six.moves +RuntimePackage
+imports: + six + • six.moves._thread + • six.moves.range + • six.moves.winreg + +
+ + +
+ +
+ + six.moves._thread +AliasNode
+imports: + _thread + +
+
+imported by: + dateutil.rrule + • dateutil.tz._factories + • dateutil.tz.tz + • six.moves + +
+ +
+ +
+ + six.moves.range +MissingModule
+imported by: + dateutil.rrule + • six.moves + +
+ +
+ +
+ + six.moves.winreg +AliasNode
+imports: + winreg + +
+
+imported by: + dateutil.tz.win + • six.moves + +
+ +
+ +
+ + smtplib +SourceModule
+imports: + base64 + • copy + • datetime + • email.base64mime + • email.generator + • email.message + • email.utils + • hmac + • io + • re + • socket + • ssl + • sys + • warnings + +
+
+imported by: + logging.handlers + +
+ +
+ + + +
+ + socketserver +SourceModule
+imports: + io + • os + • selectors + • socket + • sys + • threading + • time + • traceback + +
+
+imported by: + http.server + • xmlrpc.server + +
+ +
+ +
+ + sre_compile +SourceModule
+imports: + _sre + • sre_constants + • sre_parse + • sys + +
+
+imported by: + eq_designer_new.py + • re + +
+ +
+ +
+ + sre_constants +SourceModule
+imports: + _sre + +
+
+imported by: + eq_designer_new.py + • re + • sre_compile + • sre_parse + +
+ +
+ +
+ + sre_parse +SourceModule
+imports: + sre_constants + • unicodedata + • warnings + +
+
+imported by: + eq_designer_new.py + • re + • sre_compile + +
+ +
+ +
+ + ssl +SourceModule
+imports: + _ssl + • base64 + • calendar + • collections + • enum + • errno + • os + • socket + • sys + • time + • warnings + +
+ + +
+ + + +
+ + statistics +SourceModule
+imports: + _statistics + • bisect + • collections + • decimal + • fractions + • itertools + • math + • numbers + • operator + • random + +
+
+imported by: + random + +
+ +
+ + + +
+ + stringprep +SourceModule
+imports: + unicodedata + +
+
+imported by: + encodings.idna + +
+ +
+ + + +
+ + subprocess +SourceModule
+imports: + _posixsubprocess + • _winapi + • builtins + • contextlib + • errno + • fcntl + • grp + • io + • msvcrt + • os + • pwd + • select + • selectors + • signal + • sys + • threading + • time + • types + • warnings + +
+ + +
+ +
+ + sys (builtin module)
+imported by: + PIL.DdsImagePlugin + • PIL.EpsImagePlugin + • PIL.IcnsImagePlugin + • PIL.Image + • PIL.ImageCms + • PIL.ImageFile + • PIL.ImageMode + • PIL.ImageQt + • PIL.ImageShow + • PIL.JpegImagePlugin + • PIL.SpiderImagePlugin + • PIL._imagingcms + • PIL._typing + • PIL.features + • PySide6 + • _aix_support + • _collections_abc + • _compression + • _distutils_hack + • _osx_support + • _pydecimal + • _pyi_rth_utils + • _pyi_rth_utils.tempfile + • _sitebuiltins + • argparse + • ast + • asyncio + • asyncio.base_events + • asyncio.coroutines + • asyncio.events + • asyncio.format_helpers + • asyncio.futures + • asyncio.streams + • asyncio.unix_events + • asyncio.windows_events + • asyncio.windows_utils + • base64 + • bdb + • calendar + • certifi.core + • cgi + • cmd + • code + • codecs + • collections + • colorama.ansitowin32 + • colorama.initialise + • concurrent.futures.process + • configparser + • contextlib + • ctypes + • ctypes._endian + • curses + • dataclasses + • datetime + • dateutil + • dateutil.rrule + • dateutil.tz.tz + • defusedxml.ElementTree + • defusedxml.common + • dis + • distutils + • distutils.archive_util + • distutils.ccompiler + • distutils.cmd + • distutils.command.build + • distutils.command.build_ext + • distutils.command.sdist + • distutils.core + • distutils.dist + • distutils.fancy_getopt + • distutils.log + • distutils.spawn + • distutils.sysconfig + • distutils.text_file + • distutils.util + • doctest + • email._header_value_parser + • email.generator + • email.iterators + • email.policy + • encodings + • encodings.rot_13 + • encodings.utf_16 + • encodings.utf_32 + • enum + • fileinput + • fractions + • ftplib + • getopt + • getpass + • gettext + • glob + • gzip + • http.client + • http.server + • importlib + • importlib._bootstrap_external + • importlib.metadata + • importlib.util + • inspect + • jinja2.bccache + • jinja2.debug + • jinja2.lexer + • jinja2.loaders + • jinja2.runtime + • linecache + • locale + • logging + • matplotlib + • matplotlib._api + • matplotlib.backend_bases + • matplotlib.backends.backend_qt + • matplotlib.backends.backend_webagg + • matplotlib.backends.qt_compat + • matplotlib.backends.registry + • matplotlib.cbook + • matplotlib.dviread + • matplotlib.font_manager + • matplotlib.pyplot + • matplotlib.style.core + • matplotlib.tri._triangulation + • mimetypes + • multiprocessing + • multiprocessing.connection + • multiprocessing.context + • multiprocessing.dummy + • multiprocessing.forkserver + • multiprocessing.heap + • multiprocessing.managers + • multiprocessing.popen_spawn_win32 + • multiprocessing.process + • multiprocessing.queues + • multiprocessing.reduction + • multiprocessing.resource_sharer + • multiprocessing.resource_tracker + • multiprocessing.spawn + • multiprocessing.synchronize + • multiprocessing.util + • ntpath + • numpy + • numpy._core + • numpy._core._add_newdocs_scalars + • numpy._core._internal + • numpy._core.arrayprint + • numpy._core.numeric + • numpy._core.printoptions + • numpy._core.strings + • numpy._pytesttester + • numpy._typing._array_like + • numpy.ctypeslib + • numpy.f2py + • numpy.f2py._backends._distutils + • numpy.f2py._backends._meson + • numpy.f2py.auxfuncs + • numpy.f2py.cfuncs + • numpy.f2py.crackfortran + • numpy.f2py.diagnose + • numpy.f2py.f2py2e + • numpy.f2py.rules + • numpy.lib._function_base_impl + • numpy.lib._index_tricks_impl + • numpy.lib._utils_impl + • numpy.matrixlib.defmatrix + • numpy.testing._private.extbuild + • numpy.testing._private.utils + • optparse + • os + • packaging._manylinux + • packaging._musllinux + • packaging.markers + • packaging.metadata + • packaging.tags + • pathlib + • pdb + • pickle + • pkg_resources + • pkgutil + • platform + • platformdirs + • platformdirs.android + • platformdirs.macos + • platformdirs.unix + • platformdirs.windows + • posixpath + • pprint + • psutil + • psutil._common + • psutil._pswindows + • py_compile + • pydoc + • pyi_rth_inspect.py + • pyi_rth_multiprocessing.py + • pyi_rth_pkgres.py + • pyi_rth_pyside6.py + • pyparsing.core + • pyparsing.exceptions + • pyparsing.helpers + • pyparsing.unicode + • quopri + • runpy + • selectors + • setuptools + • setuptools._distutils + • setuptools._distutils._macos_compat + • setuptools._distutils.cmd + • setuptools._distutils.command._framework_compat + • setuptools._distutils.command.bdist_rpm + • setuptools._distutils.command.build + • setuptools._distutils.command.build_ext + • setuptools._distutils.command.build_py + • setuptools._distutils.command.install + • setuptools._distutils.command.install_egg_info + • setuptools._distutils.command.install_lib + • setuptools._distutils.command.sdist + • setuptools._distutils.compat.py39 + • setuptools._distutils.compilers.C.base + • setuptools._distutils.compilers.C.cygwin + • setuptools._distutils.compilers.C.unix + • setuptools._distutils.core + • setuptools._distutils.dist + • setuptools._distutils.fancy_getopt + • setuptools._distutils.spawn + • setuptools._distutils.sysconfig + • setuptools._distutils.text_file + • setuptools._distutils.util + • setuptools._importlib + • setuptools._path + • setuptools._vendor.backports.tarfile + • setuptools._vendor.backports.tarfile.compat.py38 + • setuptools._vendor.importlib_metadata + • setuptools._vendor.importlib_metadata._compat + • setuptools._vendor.importlib_metadata.compat.py311 + • setuptools._vendor.jaraco.context + • setuptools._vendor.more_itertools.more + • setuptools._vendor.more_itertools.recipes + • setuptools._vendor.packaging._manylinux + • setuptools._vendor.packaging._musllinux + • setuptools._vendor.packaging.markers + • setuptools._vendor.packaging.tags + • setuptools._vendor.zipp + • setuptools._vendor.zipp.compat.py310 + • setuptools.command + • setuptools.command.bdist_egg + • setuptools.command.bdist_wheel + • setuptools.command.egg_info + • setuptools.compat.py310 + • setuptools.compat.py311 + • setuptools.compat.py39 + • setuptools.config._validate_pyproject.error_reporting + • setuptools.config.expand + • setuptools.depends + • setuptools.dist + • setuptools.installer + • setuptools.logging + • setuptools.monkey + • setuptools.unicode_utils + • shiboken6 + • shlex + • shutil + • site + • six + • smtplib + • socket + • socketserver + • sre_compile + • ssl + • subprocess + • sysconfig + • tarfile + • tempfile + • threading + • tokenize + • tomli._parser + • tornado.autoreload + • tornado.concurrent + • tornado.gen + • tornado.ioloop + • tornado.iostream + • tornado.log + • tornado.netutil + • tornado.options + • tornado.platform.asyncio + • tornado.process + • tornado.simple_httpclient + • tornado.util + • tornado.web + • tornado.websocket + • traceback + • types + • typing + • typing_extensions + • unittest.case + • unittest.loader + • unittest.main + • unittest.mock + • unittest.result + • unittest.runner + • unittest.suite + • urllib.parse + • urllib.request + • uu + • uuid + • warnings + • weakref + • webbrowser + • wheel.cli + • wheel.macosx_libfile + • wheel.vendored.packaging._manylinux + • wheel.vendored.packaging._musllinux + • wheel.vendored.packaging.markers + • wheel.vendored.packaging.tags + • xml.dom.domreg + • xml.etree.ElementTree + • xml.parsers.expat + • xml.sax + • xml.sax._exceptions + • xml.sax.expatreader + • xml.sax.saxutils + • xmlrpc.client + • xmlrpc.server + • yaml.constructor + • zipfile + • zipimport + +
+ +
+ + + +
+ + tarfile +SourceModule
+imports: + argparse + • builtins + • bz2 + • copy + • grp + • gzip + • io + • lzma + • os + • pwd + • re + • shutil + • stat + • struct + • sys + • time + • warnings + • zlib + +
+ + +
+ + + +
+ + termios +MissingModule
+imported by: + getpass + • tty + +
+ +
+ + + + + +
+ + threadpoolctl +MissingModule
+imported by: + numpy.lib._utils_impl + +
+ +
+ + + +
+ + token +SourceModule
+imported by: + inspect + • tokenize + +
+ +
+ +
+ + tokenize +SourceModule
+imports: + argparse + • builtins + • codecs + • collections + • functools + • io + • itertools + • re + • sys + • token + +
+ + +
+ +
+ + tomli +Package
+imports: + tomli._parser + +
+
+imported by: + setuptools.compat.py310 + • tomli._parser + • tomli._re + • tomli._types + +
+ +
+ +
+ + tomli._parser +SourceModule
+imports: + __future__ + • collections.abc + • string + • sys + • tomli + • tomli._re + • tomli._types + • types + • typing + • warnings + +
+
+imported by: + tomli + +
+ +
+ +
+ + tomli._re +SourceModule
+imports: + __future__ + • datetime + • functools + • re + • tomli + • tomli._types + • typing + +
+
+imported by: + tomli._parser + +
+ +
+ +
+ + tomli._types +SourceModule
+imports: + tomli + • typing + +
+
+imported by: + tomli._parser + • tomli._re + +
+ +
+ +
+ + tomllib +MissingModule
+imported by: + setuptools.compat.py310 + +
+ +
+ + + +
+ + tornado._locale_data +SourceModule
+imports: + tornado + +
+
+imported by: + tornado.locale + +
+ +
+ +
+ + tornado.autoreload +SourceModule
+imports: + functools + • importlib.abc + • optparse + • os + • pkgutil + • runpy + • signal + • subprocess + • sys + • tornado + • tornado.autoreload + • tornado.ioloop + • tornado.log + • tornado.process + • traceback + • types + • typing + • weakref + +
+
+imported by: + tornado + • tornado.autoreload + • tornado.web + +
+ +
+ +
+ + tornado.concurrent +SourceModule
+imports: + asyncio + • concurrent + • concurrent.futures + • functools + • sys + • tornado + • tornado.ioloop + • tornado.log + • types + • typing + +
+ + +
+ +
+ + tornado.escape +SourceModule
+imports: + html + • json + • re + • tornado + • tornado.util + • typing + • urllib.parse + +
+ + +
+ + + +
+ + tornado.http1connection +SourceModule
+imports: + asyncio + • logging + • re + • tornado + • tornado.concurrent + • tornado.escape + • tornado.gen + • tornado.httputil + • tornado.iostream + • tornado.log + • tornado.util + • types + • typing + +
+
+imported by: + tornado.httpserver + • tornado.simple_httpclient + +
+ +
+ +
+ + tornado.httpclient +SourceModule
+imports: + datetime + • functools + • io + • ssl + • time + • tornado + • tornado.concurrent + • tornado.escape + • tornado.gen + • tornado.httputil + • tornado.ioloop + • tornado.options + • tornado.simple_httpclient + • tornado.util + • typing + • weakref + +
+
+imported by: + tornado + • tornado.simple_httpclient + • tornado.websocket + +
+ +
+ +
+ + tornado.httpserver +SourceModule +
+imported by: + tornado.routing + • tornado.web + +
+ +
+ +
+ + tornado.httputil +SourceModule
+imports: + asyncio + • calendar + • collections.abc + • copy + • datetime + • doctest + • email.utils + • functools + • http.client + • http.cookies + • re + • ssl + • time + • tornado + • tornado.escape + • tornado.log + • tornado.util + • typing + • unicodedata + • unittest + • urllib.parse + +
+ + +
+ + + +
+ + tornado.iostream +SourceModule
+imports: + asyncio + • collections + • doctest + • errno + • io + • numbers + • os + • re + • socket + • ssl + • sys + • tornado + • tornado.concurrent + • tornado.ioloop + • tornado.log + • tornado.netutil + • tornado.util + • types + • typing + +
+ + +
+ +
+ + tornado.locale +SourceModule
+imports: + codecs + • csv + • datetime + • gettext + • glob + • os + • re + • tornado + • tornado._locale_data + • tornado.escape + • tornado.log + • typing + +
+
+imported by: + tornado + • tornado.web + +
+ +
+ +
+ + tornado.locks +SourceModule
+imports: + collections + • datetime + • tornado + • tornado.concurrent + • tornado.gen + • tornado.ioloop + • types + • typing + +
+
+imported by: + tornado.queues + +
+ +
+ + + +
+ + tornado.netutil +SourceModule
+imports: + asyncio + • concurrent.futures + • errno + • os + • socket + • ssl + • stat + • sys + • tornado + • tornado.concurrent + • tornado.ioloop + • tornado.util + • typing + +
+ + +
+ +
+ + tornado.options +SourceModule
+imports: + datetime + • numbers + • os + • re + • sys + • textwrap + • tornado + • tornado.escape + • tornado.log + • tornado.util + • typing + +
+
+imported by: + tornado.httpclient + • tornado.log + +
+ +
+ +
+ + tornado.platform +Package
+imports: + tornado + +
+
+imported by: + tornado.platform.asyncio + +
+ +
+ +
+ + tornado.platform.asyncio +SourceModule
+imports: + asyncio + • atexit + • concurrent.futures + • errno + • functools + • select + • socket + • sys + • threading + • tornado.gen + • tornado.ioloop + • tornado.platform + • typing + • warnings + +
+
+imported by: + tornado.ioloop + +
+ +
+ +
+ + tornado.process +SourceModule
+imports: + asyncio + • binascii + • multiprocessing + • os + • random + • signal + • subprocess + • sys + • time + • tornado + • tornado.concurrent + • tornado.ioloop + • tornado.iostream + • tornado.log + • typing + +
+
+imported by: + tornado.autoreload + • tornado.ioloop + • tornado.tcpserver + +
+ +
+ +
+ + tornado.queues +SourceModule
+imports: + collections + • datetime + • heapq + • tornado + • tornado.concurrent + • tornado.gen + • tornado.ioloop + • tornado.locks + • typing + +
+
+imported by: + tornado.websocket + +
+ +
+ +
+ + tornado.routing +SourceModule
+imports: + functools + • re + • tornado + • tornado.escape + • tornado.httpserver + • tornado.httputil + • tornado.log + • tornado.util + • typing + +
+
+imported by: + tornado.web + +
+ +
+ +
+ + tornado.simple_httpclient +SourceModule
+imports: + base64 + • collections + • copy + • functools + • io + • re + • socket + • ssl + • sys + • time + • tornado + • tornado.escape + • tornado.gen + • tornado.http1connection + • tornado.httpclient + • tornado.httputil + • tornado.ioloop + • tornado.iostream + • tornado.log + • tornado.netutil + • tornado.tcpclient + • types + • typing + • urllib.parse + +
+
+imported by: + tornado.httpclient + • tornado.websocket + +
+ +
+ +
+ + tornado.speedups C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\tornado\speedups.pyd
+imports: + tornado + +
+
+imported by: + tornado.util + +
+ +
+ +
+ + tornado.tcpclient +SourceModule
+imports: + datetime + • functools + • numbers + • socket + • ssl + • tornado + • tornado.concurrent + • tornado.gen + • tornado.ioloop + • tornado.iostream + • tornado.netutil + • typing + +
+
+imported by: + tornado.simple_httpclient + • tornado.websocket + +
+ +
+ +
+ + tornado.tcpserver +SourceModule
+imports: + errno + • os + • socket + • ssl + • tornado + • tornado.gen + • tornado.ioloop + • tornado.iostream + • tornado.log + • tornado.netutil + • tornado.process + • tornado.util + • typing + +
+
+imported by: + tornado.httpserver + +
+ +
+ +
+ + tornado.template +SourceModule
+imports: + datetime + • io + • linecache + • os.path + • posixpath + • re + • threading + • tornado + • tornado.escape + • tornado.log + • tornado.util + • typing + +
+
+imported by: + matplotlib.backends.backend_webagg + • tornado + • tornado.web + +
+ +
+ +
+ + tornado.util +SourceModule
+imports: + array + • asyncio + • atexit + • datetime + • doctest + • inspect + • os + • re + • sys + • tornado + • tornado.speedups + • types + • typing + • unittest + • zlib + +
+ + +
+ +
+ + tornado.web +SourceModule
+imports: + base64 + • binascii + • datetime + • email.utils + • functools + • gzip + • hashlib + • hmac + • http.cookies + • inspect + • io + • mimetypes + • numbers + • os.path + • re + • socket + • sys + • threading + • time + • tornado + • tornado.autoreload + • tornado.concurrent + • tornado.escape + • tornado.gen + • tornado.httpserver + • tornado.httputil + • tornado.iostream + • tornado.locale + • tornado.log + • tornado.routing + • tornado.template + • tornado.util + • traceback + • types + • typing + • urllib.parse + • warnings + +
+ + +
+ +
+ + tornado.websocket +SourceModule
+imports: + abc + • asyncio + • base64 + • hashlib + • os + • struct + • sys + • tornado + • tornado.concurrent + • tornado.escape + • tornado.gen + • tornado.httpclient + • tornado.httputil + • tornado.ioloop + • tornado.iostream + • tornado.log + • tornado.netutil + • tornado.queues + • tornado.simple_httpclient + • tornado.tcpclient + • tornado.util + • types + • typing + • typing_extensions + • urllib.parse + • warnings + • zlib + +
+ + +
+ + + +
+ + tracemalloc +SourceModule
+imports: + _tracemalloc + • collections.abc + • fnmatch + • functools + • linecache + • os.path + • pickle + +
+
+imported by: + warnings + +
+ +
+ +
+ + trove_classifiers +MissingModule + +
+ +
+ + tty +SourceModule
+imports: + termios + +
+
+imported by: + pydoc + +
+ +
+ +
+ + types +SourceModule
+imports: + _collections_abc + • functools + • sys + +
+
+imported by: + PIL.Image + • PIL.ImageFilter + • PIL.ImageMath + • PIL._typing + • PySide6 + • _weakrefset + • asyncio.coroutines + • asyncio.futures + • asyncio.queues + • asyncio.tasks + • certifi.core + • concurrent.futures._base + • concurrent.futures.thread + • contextlib + • copy + • ctypes + • dataclasses + • difflib + • dis + • email.headerregistry + • enum + • eq_designer_new.py + • fileinput + • functools + • http.cookies + • importlib._common + • importlib.metadata._functools + • importlib.resources + • importlib.util + • inspect + • jinja2.bccache + • jinja2.debug + • jinja2.environment + • jinja2.loaders + • jinja2.sandbox + • jinja2.utils + • matplotlib._mathtext + • matplotlib.axes._base + • matplotlib.backend_tools + • matplotlib.cbook + • matplotlib.patches + • matplotlib.projections.polar + • multiprocessing.managers + • multiprocessing.pool + • multiprocessing.queues + • multiprocessing.shared_memory + • multiprocessing.spawn + • numpy._core.fromnumeric + • numpy._core.function_base + • numpy._utils._inspect + • numpy.f2py.auxfuncs + • numpy.lib._utils_impl + • pickle + • pkg_resources + • pkgutil + • pprint + • pydoc + • pyparsing.core + • pyparsing.util + • queue + • runpy + • setuptools._vendor.importlib_metadata + • setuptools._vendor.importlib_metadata._functools + • setuptools._vendor.importlib_metadata.compat.py311 + • setuptools._vendor.jaraco.functools + • setuptools.command.bdist_egg + • setuptools.config._apply_pyprojecttoml + • setuptools.config.expand + • setuptools.config.pyprojecttoml + • setuptools.depends + • setuptools.monkey + • shiboken6 + • six + • subprocess + • sysconfig + • tempfile + • tomli._parser + • tornado.autoreload + • tornado.concurrent + • tornado.gen + • tornado.http1connection + • tornado.iostream + • tornado.locks + • tornado.simple_httpclient + • tornado.util + • tornado.web + • tornado.websocket + • typing + • typing_extensions + • unittest.case + • unittest.loader + • unittest.mock + • urllib.parse + • yaml.constructor + • yaml.representer + +
+ +
+ +
+ + typing +SourceModule
+imports: + abc + • collections + • collections.abc + • contextlib + • functools + • operator + • re + • sys + • types + +
+
+imported by: + PIL.BlpImagePlugin + • PIL.BmpImagePlugin + • PIL.BufrStubImagePlugin + • PIL.DdsImagePlugin + • PIL.EpsImagePlugin + • PIL.GifImagePlugin + • PIL.GimpGradientFile + • PIL.GimpPaletteFile + • PIL.GribStubImagePlugin + • PIL.Hdf5StubImagePlugin + • PIL.IcnsImagePlugin + • PIL.IcoImagePlugin + • PIL.ImImagePlugin + • PIL.Image + • PIL.ImageCms + • PIL.ImageFile + • PIL.ImageFilter + • PIL.ImageMath + • PIL.ImageMode + • PIL.ImageOps + • PIL.ImagePalette + • PIL.ImageQt + • PIL.ImageSequence + • PIL.ImageShow + • PIL.ImageTk + • PIL.IptcImagePlugin + • PIL.Jpeg2KImagePlugin + • PIL.JpegImagePlugin + • PIL.MpoImagePlugin + • PIL.MspImagePlugin + • PIL.PaletteFile + • PIL.PalmImagePlugin + • PIL.PcxImagePlugin + • PIL.PdfImagePlugin + • PIL.PdfParser + • PIL.PngImagePlugin + • PIL.PpmImagePlugin + • PIL.PsdImagePlugin + • PIL.SgiImagePlugin + • PIL.SpiderImagePlugin + • PIL.TgaImagePlugin + • PIL.TiffImagePlugin + • PIL.TiffTags + • PIL.WebPImagePlugin + • PIL.WmfImagePlugin + • PIL.XbmImagePlugin + • PIL._imaging + • PIL._imagingcms + • PIL._imagingmath + • PIL._imagingtk + • PIL._typing + • PIL._util + • PIL._webp + • PIL.features + • PySide6.QtCore + • PySide6.QtGui + • PySide6.QtNetwork + • PySide6.QtWidgets + • asyncio.staggered + • certifi.core + • charset_normalizer.api + • charset_normalizer.cd + • charset_normalizer.legacy + • charset_normalizer.models + • charset_normalizer.utils + • contourpy + • contourpy._contourpy + • contourpy.array + • contourpy.convert + • contourpy.dechunk + • contourpy.typecheck + • cycler + • filter_utils + • functools + • importlib._common + • importlib.abc + • importlib.metadata + • importlib.metadata._meta + • importlib.resources + • jinja2.async_utils + • jinja2.bccache + • jinja2.compiler + • jinja2.debug + • jinja2.defaults + • jinja2.environment + • jinja2.exceptions + • jinja2.ext + • jinja2.filters + • jinja2.idtracking + • jinja2.lexer + • jinja2.loaders + • jinja2.nodes + • jinja2.optimizer + • jinja2.parser + • jinja2.runtime + • jinja2.sandbox + • jinja2.tests + • jinja2.utils + • jinja2.visitor + • kiwisolver._cext + • markupsafe + • matplotlib._mathtext + • matplotlib._mathtext_data + • matplotlib._tri + • matplotlib.ft2font + • matplotlib.pyplot + • matplotlib.typing + • numpy._typing + • numpy._typing._array_like + • numpy._typing._char_codes + • numpy._typing._dtype_like + • numpy._typing._nbit + • numpy._typing._nested_sequence + • numpy._typing._scalars + • numpy._typing._shape + • numpy.lib._arraysetops_impl + • numpy.linalg._linalg + • numpy.ma.core + • numpy.polynomial._polybase + • numpy.random._generator + • numpy.random._mt19937 + • numpy.random._pcg64 + • numpy.random._philox + • numpy.random._sfc64 + • numpy.random.bit_generator + • numpy.random.mtrand + • packaging._elffile + • packaging._manylinux + • packaging._musllinux + • packaging._parser + • packaging._tokenizer + • packaging.licenses + • packaging.licenses._spdx + • packaging.markers + • packaging.metadata + • packaging.requirements + • packaging.specifiers + • packaging.tags + • packaging.utils + • packaging.version + • pkg_resources + • platformdirs + • platformdirs.android + • platformdirs.api + • platformdirs.macos + • platformdirs.unix + • platformdirs.version + • platformdirs.windows + • pyparsing + • pyparsing.core + • pyparsing.diagram + • pyparsing.exceptions + • pyparsing.helpers + • pyparsing.results + • pyparsing.testing + • pyparsing.unicode + • pyparsing.util + • setuptools + • setuptools._distutils._modified + • setuptools._distutils.archive_util + • setuptools._distutils.cmd + • setuptools._distutils.command.bdist + • setuptools._distutils.command.bdist_dumb + • setuptools._distutils.command.bdist_rpm + • setuptools._distutils.command.build + • setuptools._distutils.command.build_clib + • setuptools._distutils.command.build_ext + • setuptools._distutils.command.build_py + • setuptools._distutils.command.build_scripts + • setuptools._distutils.command.check + • setuptools._distutils.command.clean + • setuptools._distutils.command.install + • setuptools._distutils.command.install_data + • setuptools._distutils.command.install_egg_info + • setuptools._distutils.command.install_headers + • setuptools._distutils.command.install_lib + • setuptools._distutils.command.install_scripts + • setuptools._distutils.command.sdist + • setuptools._distutils.compat + • setuptools._distutils.compilers.C.base + • setuptools._distutils.dist + • setuptools._distutils.fancy_getopt + • setuptools._distutils.filelist + • setuptools._distutils.spawn + • setuptools._distutils.sysconfig + • setuptools._distutils.util + • setuptools._normalization + • setuptools._path + • setuptools._reqs + • setuptools._shutil + • setuptools._static + • setuptools._vendor.importlib_metadata + • setuptools._vendor.importlib_metadata._meta + • setuptools._vendor.importlib_metadata.compat.py39 + • setuptools._vendor.jaraco.context + • setuptools._vendor.packaging._elffile + • setuptools._vendor.packaging._manylinux + • setuptools._vendor.packaging._musllinux + • setuptools._vendor.packaging._parser + • setuptools._vendor.packaging._tokenizer + • setuptools._vendor.packaging.markers + • setuptools._vendor.packaging.requirements + • setuptools._vendor.packaging.specifiers + • setuptools._vendor.packaging.tags + • setuptools._vendor.packaging.utils + • setuptools._vendor.packaging.version + • setuptools.command._requirestxt + • setuptools.command.bdist_egg + • setuptools.command.bdist_wheel + • setuptools.command.build + • setuptools.command.sdist + • setuptools.compat.py311 + • setuptools.config + • setuptools.config._apply_pyprojecttoml + • setuptools.config._validate_pyproject + • setuptools.config._validate_pyproject.error_reporting + • setuptools.config._validate_pyproject.extra_validations + • setuptools.config._validate_pyproject.formats + • setuptools.config.expand + • setuptools.config.pyprojecttoml + • setuptools.config.setupcfg + • setuptools.depends + • setuptools.discovery + • setuptools.dist + • setuptools.extension + • setuptools.glob + • setuptools.monkey + • setuptools.msvc + • setuptools.warnings + • shiboken6 + • tomli._parser + • tomli._re + • tomli._types + • tornado + • tornado.autoreload + • tornado.concurrent + • tornado.escape + • tornado.gen + • tornado.http1connection + • tornado.httpclient + • tornado.httpserver + • tornado.httputil + • tornado.ioloop + • tornado.iostream + • tornado.locale + • tornado.locks + • tornado.log + • tornado.netutil + • tornado.options + • tornado.platform.asyncio + • tornado.process + • tornado.queues + • tornado.routing + • tornado.simple_httpclient + • tornado.tcpclient + • tornado.tcpserver + • tornado.template + • tornado.util + • tornado.web + • tornado.websocket + • typing_extensions + • wheel.macosx_libfile + • wheel.metadata + • wheel.vendored.packaging._elffile + • wheel.vendored.packaging._manylinux + • wheel.vendored.packaging._musllinux + • wheel.vendored.packaging._parser + • wheel.vendored.packaging._tokenizer + • wheel.vendored.packaging.markers + • wheel.vendored.packaging.requirements + • wheel.vendored.packaging.specifiers + • wheel.vendored.packaging.tags + • wheel.vendored.packaging.utils + • wheel.vendored.packaging.version + • wheel.wheelfile + +
+ +
+ + + +
+ + unicodedata C:\Users\steven\.conda\envs\mic_v2\DLLs\unicodedata.pyd + +
+ + + +
+ + unittest._log +SourceModule
+imports: + collections + • logging + • unittest + • unittest.case + +
+
+imported by: + unittest.case + +
+ +
+ +
+ + unittest.async_case +SourceModule
+imports: + asyncio + • inspect + • unittest + • unittest.case + +
+
+imported by: + unittest + +
+ +
+ +
+ + unittest.case +SourceModule
+imports: + collections + • contextlib + • difflib + • functools + • pprint + • re + • sys + • traceback + • types + • unittest + • unittest._log + • unittest.result + • unittest.util + • warnings + +
+ + +
+ +
+ + unittest.loader +SourceModule
+imports: + fnmatch + • functools + • os + • re + • sys + • traceback + • types + • unittest + • unittest.case + • unittest.suite + • unittest.util + • warnings + +
+
+imported by: + unittest + • unittest.main + +
+ +
+ +
+ + unittest.main +SourceModule
+imports: + argparse + • os + • sys + • unittest + • unittest.loader + • unittest.runner + • unittest.signals + +
+
+imported by: + unittest + +
+ +
+ +
+ + unittest.mock +SourceModule
+imports: + _io + • asyncio + • builtins + • contextlib + • functools + • inspect + • io + • pprint + • sys + • threading + • types + • unittest + • unittest.util + +
+ + +
+ +
+ + unittest.result +SourceModule
+imports: + functools + • io + • sys + • traceback + • unittest + • unittest.util + +
+
+imported by: + unittest + • unittest.case + • unittest.runner + +
+ +
+ +
+ + unittest.runner +SourceModule
+imports: + sys + • time + • unittest + • unittest.result + • unittest.signals + • warnings + +
+
+imported by: + unittest + • unittest.main + +
+ +
+ +
+ + unittest.signals +SourceModule
+imports: + functools + • signal + • unittest + • weakref + +
+
+imported by: + unittest + • unittest.main + • unittest.runner + +
+ +
+ +
+ + unittest.suite +SourceModule
+imports: + sys + • unittest + • unittest.case + • unittest.util + +
+
+imported by: + unittest + • unittest.loader + +
+ +
+ +
+ + unittest.util +SourceModule
+imports: + collections + • os.path + • unittest + +
+
+imported by: + unittest + • unittest.case + • unittest.loader + • unittest.mock + • unittest.result + • unittest.suite + +
+ +
+ +
+ + urllib +Package + +
+ +
+ + urllib.error +SourceModule
+imports: + io + • urllib + • urllib.response + +
+
+imported by: + numpy.lib._datasource + • urllib.request + +
+ +
+ + + +
+ + urllib.request +SourceModule
+imports: + _scproxy + • base64 + • bisect + • contextlib + • email + • email.utils + • fnmatch + • ftplib + • getpass + • hashlib + • http.client + • http.cookiejar + • io + • ipaddress + • mimetypes + • nturl2path + • os + • posixpath + • re + • socket + • ssl + • string + • sys + • tempfile + • time + • urllib + • urllib.error + • urllib.parse + • urllib.response + • warnings + • winreg + +
+ + +
+ +
+ + urllib.response +SourceModule
+imports: + tempfile + • urllib + +
+
+imported by: + urllib.error + • urllib.request + +
+ +
+ +
+ + usercustomize +MissingModule
+imported by: + site + +
+ +
+ +
+ + uu +SourceModule
+imports: + binascii + • optparse + • os + • sys + +
+
+imported by: + email.message + +
+ +
+ +
+ + uuid +SourceModule
+imports: + _uuid + • enum + • hashlib + • io + • os + • platform + • random + • shutil + • socket + • subprocess + • sys + • time + +
+
+imported by: + matplotlib.backend_tools + +
+ +
+ +
+ + vms_lib +MissingModule
+imported by: + platform + +
+ +
+ +
+ + warnings +SourceModule
+imports: + _warnings + • builtins + • linecache + • re + • sys + • traceback + • tracemalloc + +
+
+imported by: + PIL.IcoImagePlugin + • PIL.Image + • PIL.JpegImagePlugin + • PIL.PngImagePlugin + • PIL.TgaImagePlugin + • PIL.TiffImagePlugin + • PIL._deprecate + • PIL.features + • _distutils_hack + • argparse + • ast + • asyncio.base_events + • asyncio.base_subprocess + • asyncio.coroutines + • asyncio.proactor_events + • asyncio.selector_events + • asyncio.sslproto + • asyncio.streams + • asyncio.tasks + • asyncio.trsock + • asyncio.unix_events + • asyncio.windows_utils + • cgi + • charset_normalizer.legacy + • codeop + • configparser + • dateutil.parser + • dateutil.parser._parser + • dateutil.relativedelta + • dateutil.rrule + • dateutil.tz.tz + • dateutil.zoneinfo + • defusedxml + • defusedxml.ElementTree + • defusedxml.cElementTree + • distutils + • distutils.archive_util + • distutils.command.sdist + • distutils.dist + • distutils.extension + • distutils.sysconfig + • enum + • eq_designer_new.py + • fileinput + • ftplib + • getpass + • gettext + • gzip + • hashlib + • hmac + • http.client + • http.cookiejar + • importlib + • importlib._abc + • importlib.abc + • importlib.metadata + • importlib.util + • inspect + • io + • locale + • logging + • markupsafe + • matplotlib._api + • matplotlib._api.deprecation + • matplotlib.artist + • matplotlib.axis + • matplotlib.bezier + • matplotlib.collections + • matplotlib.image + • matplotlib.projections + • matplotlib.style.core + • multiprocessing.forkserver + • multiprocessing.pool + • multiprocessing.resource_tracker + • numpy + • numpy.__config__ + • numpy._core + • numpy._core._internal + • numpy._core._methods + • numpy._core.arrayprint + • numpy._core.fromnumeric + • numpy._core.function_base + • numpy._core.getlimits + • numpy._core.numeric + • numpy._core.numerictypes + • numpy._core.records + • numpy._core.shape_base + • numpy._pytesttester + • numpy._utils + • numpy.core._utils + • numpy.f2py + • numpy.f2py._backends._distutils + • numpy.f2py._backends._meson + • numpy.f2py.symbolic + • numpy.fft._pocketfft + • numpy.fft.helper + • numpy.lib + • numpy.lib._arraysetops_impl + • numpy.lib._function_base_impl + • numpy.lib._histograms_impl + • numpy.lib._index_tricks_impl + • numpy.lib._nanfunctions_impl + • numpy.lib._npyio_impl + • numpy.lib._polynomial_impl + • numpy.lib._shape_base_impl + • numpy.lib._ufunclike_impl + • numpy.lib._utils_impl + • numpy.lib.format + • numpy.linalg._linalg + • numpy.linalg.linalg + • numpy.ma.core + • numpy.ma.extras + • numpy.ma.mrecords + • numpy.matlib + • numpy.matrixlib.defmatrix + • numpy.polynomial.polyutils + • numpy.testing._private.utils + • os + • packaging._manylinux + • pathlib + • pkg_resources + • pkgutil + • psutil._common + • pydoc + • pyparsing.core + • pyparsing.util + • random + • runpy + • setuptools._distutils._msvccompiler + • setuptools._distutils.command.bdist + • setuptools._distutils.compilers.C.base + • setuptools._distutils.compilers.C.cygwin + • setuptools._distutils.compilers.C.msvc + • setuptools._distutils.dep_util + • setuptools._distutils.dist + • setuptools._distutils.extension + • setuptools._distutils.log + • setuptools._distutils.spawn + • setuptools._distutils.sysconfig + • setuptools._distutils.util + • setuptools._distutils.version + • setuptools._vendor.backports.tarfile + • setuptools._vendor.jaraco.context + • setuptools._vendor.jaraco.functools + • setuptools._vendor.more_itertools.more + • setuptools._vendor.packaging._manylinux + • setuptools.command.bdist_wheel + • setuptools.warnings + • shlex + • smtplib + • sre_parse + • ssl + • subprocess + • sysconfig + • tarfile + • tempfile + • threading + • tomli._parser + • tornado.ioloop + • tornado.platform.asyncio + • tornado.web + • tornado.websocket + • typing_extensions + • unittest.case + • unittest.loader + • unittest.runner + • urllib.parse + • urllib.request + • wheel.vendored.packaging._manylinux + • winerror + • xml.dom.pulldom + • xml.etree.ElementTree + • zipfile + +
+ +
+ + + +
+ + webbrowser +SourceModule
+imports: + copy + • getopt + • glob + • os + • pwd + • shlex + • shutil + • socket + • subprocess + • sys + • tempfile + • threading + +
+
+imported by: + matplotlib.backends.backend_webagg + • pydoc + +
+ +
+ +
+ + wheel +Package
+imports: + __future__ + • wheel + +
+
+imported by: + wheel + • wheel.cli + • wheel.cli.convert + • wheel.macosx_libfile + • wheel.metadata + • wheel.util + • wheel.vendored + • wheel.wheelfile + +
+ +
+ +
+ + wheel.cli +Package
+imports: + __future__ + • argparse + • os + • sys + • wheel + • wheel.cli.convert + • wheel.cli.pack + • wheel.cli.tags + • wheel.cli.unpack + +
+ + +
+ +
+ + wheel.cli.convert +SourceModule
+imports: + __future__ + • abc + • collections + • collections.abc + • email.message + • email.parser + • email.policy + • glob + • os.path + • pathlib + • re + • textwrap + • wheel + • wheel.cli + • wheel.metadata + • wheel.vendored.packaging.tags + • wheel.wheelfile + • zipfile + +
+
+imported by: + wheel.cli + +
+ +
+ +
+ + wheel.cli.pack +SourceModule
+imports: + __future__ + • email.generator + • email.parser + • email.policy + • os.path + • re + • wheel.cli + • wheel.wheelfile + +
+
+imported by: + wheel.cli + +
+ +
+ +
+ + wheel.cli.tags +SourceModule
+imports: + __future__ + • collections.abc + • email.parser + • email.policy + • itertools + • os + • wheel.cli + • wheel.wheelfile + +
+
+imported by: + wheel.cli + +
+ +
+ +
+ + wheel.cli.unpack +SourceModule
+imports: + __future__ + • pathlib + • wheel.cli + • wheel.wheelfile + +
+
+imported by: + wheel.cli + +
+ +
+ +
+ + wheel.macosx_libfile +SourceModule
+imports: + __future__ + • ctypes + • io + • os + • sys + • typing + • wheel + +
+
+imported by: + setuptools.command.bdist_wheel + +
+ +
+ +
+ + wheel.metadata +SourceModule
+imports: + __future__ + • email.message + • email.parser + • functools + • itertools + • os.path + • re + • textwrap + • typing + • wheel + • wheel.vendored.packaging.requirements + +
+
+imported by: + wheel.cli.convert + +
+ +
+ +
+ + wheel.util +SourceModule
+imports: + __future__ + • base64 + • logging + • wheel + +
+
+imported by: + wheel.wheelfile + +
+ +
+ +
+ + wheel.vendored +Package
+imports: + wheel + +
+
+imported by: + wheel.vendored.packaging + +
+ +
+ + + +
+ + wheel.vendored.packaging._elffile +SourceModule
+imports: + enum + • os + • struct + • typing + • wheel.vendored.packaging + +
+ + +
+ +
+ + wheel.vendored.packaging._manylinux +SourceModule
+imports: + _manylinux + • collections + • contextlib + • ctypes + • functools + • os + • re + • sys + • typing + • warnings + • wheel.vendored.packaging + • wheel.vendored.packaging._elffile + +
+ + +
+ + + + + +
+ + wheel.vendored.packaging._structures +SourceModule
+imports: + wheel.vendored.packaging + +
+
+imported by: + wheel.vendored.packaging.version + +
+ +
+ + + + + + + + + + + + + + + +
+ + wheel.wheelfile +SourceModule
+imports: + __future__ + • csv + • hashlib + • io + • os.path + • re + • stat + • time + • typing + • typing_extensions + • wheel + • wheel.cli + • wheel.util + • zipfile + +
+ + +
+ +
+ + win32api C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\win32\win32api.pyd
+imported by: + win32evtlogutil + +
+ +
+ +
+ + win32con +SourceModule
+imported by: + win32evtlogutil + +
+ +
+ +
+ + win32evtlog C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\win32\win32evtlog.pyd
+imported by: + logging.handlers + • win32evtlogutil + +
+ +
+ +
+ + win32evtlogutil +SourceModule
+imports: + win32api + • win32con + • win32evtlog + • winerror + +
+
+imported by: + logging.handlers + +
+ +
+ +
+ + win32pdh C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\win32\win32pdh.pyd
+imported by: + numpy.testing._private.utils + +
+ +
+ +
+ + winerror +SourceModule
+imports: + warnings + +
+
+imported by: + win32evtlogutil + +
+ +
+ + + +
+ + xml +Package
+imports: + xml.sax.expatreader + • xml.sax.xmlreader + +
+
+imported by: + xml.dom + • xml.etree + • xml.parsers + • xml.sax + +
+ +
+ +
+ + xml.dom +Package
+imports: + xml + • xml.dom.domreg + • xml.dom.minidom + • xml.dom.pulldom + • xml.dom.xmlbuilder + +
+ + +
+ +
+ + xml.dom.NodeFilter +SourceModule
+imports: + xml.dom + +
+
+imported by: + xml.dom.expatbuilder + • xml.dom.xmlbuilder + +
+ +
+ +
+ + xml.dom.domreg +SourceModule
+imports: + os + • sys + • xml.dom + • xml.dom.minidom + +
+
+imported by: + xml.dom + • xml.dom.minidom + +
+ +
+ +
+ + xml.dom.expatbuilder +SourceModule + + +
+ +
+ + xml.dom.minicompat +SourceModule
+imports: + xml.dom + +
+
+imported by: + xml.dom.minidom + +
+ +
+ +
+ + xml.dom.minidom +SourceModule +
+imported by: + defusedxml.minidom + • xml.dom + • xml.dom.domreg + • xml.dom.expatbuilder + • xml.dom.pulldom + +
+ +
+ +
+ + xml.dom.pulldom +SourceModule
+imports: + io + • warnings + • xml.dom + • xml.dom.minidom + • xml.sax + • xml.sax.handler + +
+
+imported by: + defusedxml.pulldom + • xml.dom + • xml.dom.minidom + +
+ +
+ +
+ + xml.dom.xmlbuilder +SourceModule
+imports: + copy + • posixpath + • urllib.parse + • urllib.request + • xml.dom + • xml.dom.NodeFilter + • xml.dom.expatbuilder + +
+
+imported by: + xml.dom + • xml.dom.expatbuilder + • xml.dom.minidom + +
+ +
+ +
+ + xml.etree +Package
+imports: + xml + • xml.etree + • xml.etree.ElementPath + • xml.etree.ElementTree + +
+ + +
+ +
+ + xml.etree.ElementInclude +SourceModule
+imports: + copy + • urllib.parse + • xml.etree + • xml.etree.ElementTree + +
+
+imported by: + _elementtree + +
+ +
+ +
+ + xml.etree.ElementPath +SourceModule
+imports: + re + • xml.etree + +
+
+imported by: + _elementtree + • xml.etree + • xml.etree.ElementTree + +
+ +
+ +
+ + xml.etree.ElementTree +SourceModule
+imports: + _elementtree + • collections + • collections.abc + • contextlib + • io + • pyexpat + • re + • sys + • warnings + • xml.etree + • xml.etree.ElementPath + • xml.parsers + • xml.parsers.expat + +
+ + +
+ +
+ + xml.etree.cElementTree +SourceModule
+imports: + xml.etree + • xml.etree.ElementTree + +
+
+imported by: + _elementtree + • defusedxml.cElementTree + +
+ +
+ +
+ + xml.parsers +Package
+imports: + xml + • xml.parsers.expat + +
+ + +
+ +
+ + xml.parsers.expat +SourceModule
+imports: + pyexpat + • sys + • xml.parsers + +
+ + +
+ +
+ + xml.sax +Package
+imports: + 'org.python' + • io + • os + • sys + • xml + • xml.sax + • xml.sax._exceptions + • xml.sax.expatreader + • xml.sax.handler + • xml.sax.saxutils + • xml.sax.xmlreader + +
+ + +
+ +
+ + xml.sax._exceptions +SourceModule
+imports: + 'java.lang' + • sys + • xml.sax + +
+
+imported by: + xml.sax + • xml.sax.expatreader + • xml.sax.xmlreader + +
+ +
+ +
+ + xml.sax.expatreader +SourceModule
+imports: + _weakref + • sys + • weakref + • xml.parsers + • xml.parsers.expat + • xml.sax + • xml.sax._exceptions + • xml.sax.handler + • xml.sax.saxutils + • xml.sax.xmlreader + +
+
+imported by: + defusedxml.expatreader + • xml + • xml.sax + +
+ +
+ +
+ + xml.sax.handler +SourceModule
+imports: + xml.sax + +
+
+imported by: + xml.dom.pulldom + • xml.sax + • xml.sax.expatreader + • xml.sax.saxutils + • xml.sax.xmlreader + +
+ +
+ +
+ + xml.sax.saxutils +SourceModule
+imports: + codecs + • io + • os + • sys + • urllib.parse + • urllib.request + • xml.sax + • xml.sax.handler + • xml.sax.xmlreader + +
+
+imported by: + xml.sax + • xml.sax.expatreader + • xml.sax.xmlreader + +
+ +
+ +
+ + xml.sax.xmlreader +SourceModule
+imports: + xml.sax + • xml.sax._exceptions + • xml.sax.handler + • xml.sax.saxutils + +
+
+imported by: + xml + • xml.sax + • xml.sax.expatreader + • xml.sax.saxutils + +
+ +
+ +
+ + xmlrpc +Package
+imports: + xmlrpc.server + +
+
+imported by: + defusedxml.xmlrpc + • xmlrpc.client + • xmlrpc.server + +
+ +
+ +
+ + xmlrpc.client +SourceModule
+imports: + base64 + • datetime + • decimal + • errno + • gzip + • http.client + • io + • sys + • time + • urllib.parse + • xml.parsers + • xml.parsers.expat + • xmlrpc + +
+ + +
+ +
+ + xmlrpc.server +SourceModule
+imports: + datetime + • fcntl + • functools + • html + • http.server + • inspect + • os + • pydoc + • re + • socketserver + • sys + • traceback + • xmlrpc + • xmlrpc.client + +
+
+imported by: + defusedxml.xmlrpc + • xmlrpc + +
+ +
+ +
+ + xmlrpclib +MissingModule
+imported by: + defusedxml.xmlrpc + +
+ +
+ +
+ + yaml +Package
+imports: + io + • yaml.cyaml + • yaml.dumper + • yaml.error + • yaml.events + • yaml.loader + • yaml.nodes + • yaml.tokens + +
+ + +
+ +
+ + yaml._yaml C:\Users\steven\.conda\envs\mic_v2\lib\site-packages\yaml\_yaml.cp310-win_amd64.pyd
+imports: + yaml + +
+
+imported by: + yaml.cyaml + +
+ +
+ +
+ + yaml.composer +SourceModule
+imports: + yaml + • yaml.error + • yaml.events + • yaml.nodes + +
+
+imported by: + yaml.loader + +
+ +
+ +
+ + yaml.constructor +SourceModule
+imports: + base64 + • binascii + • collections.abc + • datetime + • re + • sys + • types + • yaml + • yaml.error + • yaml.nodes + +
+
+imported by: + yaml.cyaml + • yaml.loader + +
+ +
+ +
+ + yaml.cyaml +SourceModule
+imports: + yaml + • yaml._yaml + • yaml.constructor + • yaml.representer + • yaml.resolver + • yaml.serializer + +
+
+imported by: + yaml + +
+ +
+ +
+ + yaml.dumper +SourceModule
+imports: + yaml + • yaml.emitter + • yaml.representer + • yaml.resolver + • yaml.serializer + +
+
+imported by: + yaml + +
+ +
+ +
+ + yaml.emitter +SourceModule
+imports: + yaml + • yaml.error + • yaml.events + +
+
+imported by: + yaml.dumper + +
+ +
+ +
+ + yaml.error +SourceModule
+imports: + yaml + +
+
+imported by: + yaml + • yaml.composer + • yaml.constructor + • yaml.emitter + • yaml.parser + • yaml.reader + • yaml.representer + • yaml.resolver + • yaml.scanner + • yaml.serializer + +
+ +
+ +
+ + yaml.events +SourceModule
+imports: + yaml + +
+
+imported by: + yaml + • yaml.composer + • yaml.emitter + • yaml.parser + • yaml.serializer + +
+ +
+ +
+ + yaml.loader +SourceModule
+imports: + yaml + • yaml.composer + • yaml.constructor + • yaml.parser + • yaml.reader + • yaml.resolver + • yaml.scanner + +
+
+imported by: + yaml + +
+ +
+ +
+ + yaml.nodes +SourceModule
+imports: + yaml + +
+
+imported by: + yaml + • yaml.composer + • yaml.constructor + • yaml.representer + • yaml.resolver + • yaml.serializer + +
+ +
+ +
+ + yaml.parser +SourceModule
+imports: + yaml + • yaml.error + • yaml.events + • yaml.scanner + • yaml.tokens + +
+
+imported by: + yaml.loader + +
+ +
+ +
+ + yaml.reader +SourceModule
+imports: + codecs + • re + • yaml + • yaml.error + +
+
+imported by: + yaml.loader + +
+ +
+ +
+ + yaml.representer +SourceModule
+imports: + base64 + • collections + • copyreg + • datetime + • types + • yaml + • yaml.error + • yaml.nodes + +
+
+imported by: + yaml.cyaml + • yaml.dumper + +
+ +
+ +
+ + yaml.resolver +SourceModule
+imports: + re + • yaml + • yaml.error + • yaml.nodes + +
+
+imported by: + yaml.cyaml + • yaml.dumper + • yaml.loader + +
+ +
+ +
+ + yaml.scanner +SourceModule
+imports: + yaml + • yaml.error + • yaml.tokens + +
+
+imported by: + yaml.loader + • yaml.parser + +
+ +
+ +
+ + yaml.serializer +SourceModule
+imports: + yaml + • yaml.error + • yaml.events + • yaml.nodes + +
+
+imported by: + yaml.cyaml + • yaml.dumper + +
+ +
+ +
+ + yaml.tokens +SourceModule
+imports: + yaml + +
+
+imported by: + yaml + • yaml.parser + • yaml.scanner + +
+ +
+ +
+ + zipfile +SourceModule
+imports: + argparse + • binascii + • bz2 + • contextlib + • importlib.util + • io + • itertools + • lzma + • os + • pathlib + • posixpath + • py_compile + • re + • shutil + • stat + • struct + • sys + • threading + • time + • warnings + • zlib + +
+ + +
+ +
+ + zipimport +SourceModule
+imports: + _frozen_importlib + • _frozen_importlib_external + • _imp + • _io + • _warnings + • importlib.readers + • marshal + • os + • sys + • time + • zlib + +
+
+imported by: + jinja2.loaders + • pkg_resources + • pkgutil + +
+ +
+ +
+ + zipp +AliasNode
+imports: + setuptools._vendor.zipp + +
+ + +
+ +
+ + zlib (builtin module) + +
+ + + diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/cs43198.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/cs43198.h new file mode 100644 index 0000000..0f31d2a --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/cs43198.h @@ -0,0 +1,107 @@ +#ifndef CS43198_H_ +#define CS43198_H_ + +// CS43198 I2C设备地址 +#define CS43198_I2C_DEVICE_ADDR 0x31 + +// CS43198寄存器地址定义 (24位地址格式) +// 根据配置分析文档中的实际地址映射 +// 格式:0x60,W,0x04 0x00 0x02 0x00 0x03 表示寄存器地址 0x040002,值为 0x03 + +// 中断相关寄存器 +#define CS43198_INT_STATUS1 0x0F0000 +#define CS43198_INT_STATUS2 0x0F0001 +#define CS43198_INT_ENABLE1 0x0F0010 +#define CS43198_INT_ENABLE2 0x0F0011 + +// XTAL相关寄存器 +#define CS43198_XTAL_START 0x020000 +#define CS43198_XTAL_BIAS 0x020052 + +// 电源控制寄存器 +#define CS43198_POWER_UP_CTRL 0x010006 +#define CS43198_POWER_UP_HP_CTRL 0x010010 +#define CS43198_POWER_CTRL 0x080032 + +// ASP (Audio Serial Port) 相关寄存器 +#define CS43198_ASP_SAMPLE_RATE 0x01000B +#define CS43198_ASP_SAMPLE_BIT_SIZE 0x01000C +#define CS43198_ASP_NUMERATOR_LSB 0x040010 +#define CS43198_ASP_NUMERATOR_MSB 0x040011 +#define CS43198_ASP_DENOMINATOR_LSB 0x040012 +#define CS43198_ASP_DENOMINATOR_MSB 0x040013 +#define CS43198_ASP_LRCK_HIGH_LSB 0x03001B +#define CS43198_ASP_LRCK_HIGH_MSB 0x03000A +#define CS43198_ASP_LRCK_PERIOD_LSB 0x040016 +#define CS43198_ASP_LRCK_PERIOD_MSB 0x040017 +#define CS43198_ASP_CLOCK 0x040018 +#define CS43198_ASP_FRAME 0x040019 +#define CS43198_ASP_CLOCK_CONFIG 0x040002 +#define CS43198_ASP_FRAME_CONFIG 0x030008 +#define CS43198_PLL_SET1 0x030001 +#define CS43198_ASP_CH1_LOCATION 0x050000 +#define CS43198_ASP_CH2_LOCATION 0x050001 +#define CS43198_ASP_CH1_SIZE_ENABLE 0x05000A +#define CS43198_ASP_CH2_SIZE_ENABLE 0x05000B + +// PCM相关寄存器 +#define CS43198_PCM_FILTER_OPTION 0x090000 +#define CS43198_PCM_VOLUME_B 0x090001 +#define CS43198_PCM_VOLUME_A 0x090002 +#define CS43198_PCM_SIGNAL_CTRL1 0x090003 +#define CS43198_PCM_SIGNAL_CTRL2 0x090004 + +// 静音控制寄存器 +#define CS43198_MUTE_CTRL1 0x070000 +#define CS43198_MUTE_CTRL2 0x070001 + +// DSD控制寄存器 +#define CS43198_DSD_CONTROL 0x070004 +#define CS43198_DSD_SIGNAL_CTRL3 0x070006 + +// 耳机输出相关寄存器 +#define CS43198_CLASS_H_CTRL 0x0B0000 +#define CS43198_HP_OUTPUT_LEVEL 0x080000 +#define CS43198_HP_DETECT_CTRL 0x070004 + +// 采样率常量 +#define CS43198_SR_44_1KHZ 0x01 +#define CS43198_SR_48KHZ 0x02 +#define CS43198_SR_88_2KHZ 0x03 +#define CS43198_SR_96KHZ 0x04 +#define CS43198_SR_176_4KHZ 0x05 +#define CS43198_SR_192KHZ 0x06 +#define CS43198_SR_352_8KHZ 0x07 +#define CS43198_SR_384KHZ 0x08 + +// 位深度常量 +#define CS43198_BIT_16 0x02 +#define CS43198_BIT_24 0x03 +#define CS43198_BIT_32 0x04 + +// DSD模式常量 +#define CS43198_DSD_64 0x13 +#define CS43198_DSD_128 0x17 +#define CS43198_DSD_256 0x1B +#define CS43198_DSD_512 0x1F + +// 音量控制常量 (0x00 = 0dB, 0xFF = -127.5dB) +#define CS43198_VOL_0DB 0x00 +#define CS43198_VOL_MUTE 0xFF + +// 辅助宏定义:判断是否为PCM采样率 +#define IS_PCM_SAMPLE_RATE(freq) \ + ((freq) == 44100 || (freq) == 48000 || (freq) == 88200 || (freq) == 96000 || \ + (freq) == 176400 || (freq) == 192000 || (freq) == 352800 || (freq) == 384000) + +// 辅助宏定义:判断是否为DSD采样率 +#define IS_DSD_SAMPLE_RATE(freq) \ + ((freq) == 2822400 || (freq) == 5644800 || (freq) == 11289600) + +// 辅助宏定义:将DSD频率转换为DSD模式 +#define DSD_FREQ_TO_MODE(freq) \ + ((freq) == 2822400 ? 64 : \ + (freq) == 5644800 ? 128 : \ + (freq) == 11289600 ? 256 : 64) + +#endif /* CS43198_H_ */ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/data_fade.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/data_fade.h new file mode 100644 index 0000000..727581d --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/data_fade.h @@ -0,0 +1,143 @@ +#ifndef _DATE_FADE_H__ +#define _DATE_FADE_H__ + +#define LEN_FADE_ (256) + +#if 0 +#define ZOOM_COEFFS (1000000) + +float gCf_fade600_in_coeffs[600]={ + 0.000000,0.001665,0.003328,0.004988,0.006644,0.008299,0.009950,0.011599,0.013245,0.014888,0.016529,0.018166,0.019801,0.021434,0.023063,0.024690,0.026314,0.027936,0.029554,0.031171, + 0.032784,0.034395,0.036003,0.037608,0.039211,0.040811,0.042408,0.044003,0.045595,0.047184,0.048771,0.050355,0.051936,0.053515,0.055091,0.056665,0.058235,0.059804,0.061369,0.062933, + 0.064493,0.066051,0.067606,0.069159,0.070709,0.072257,0.073801,0.075344,0.076884,0.078421,0.079956,0.081488,0.083017,0.084544,0.086069,0.087591,0.089110,0.090627,0.092141,0.093653, + 0.095163,0.096669,0.098174,0.099675,0.101175,0.102672,0.104166,0.105658,0.107147,0.108634,0.110118,0.111600,0.113080,0.114557,0.116031,0.117503,0.118973,0.120440,0.121905,0.123367, + 0.124827,0.126284,0.127739,0.129192,0.130642,0.132089,0.133535,0.134978,0.136418,0.137856,0.139292,0.140725,0.142156,0.143585,0.145011,0.146435,0.147856,0.149275,0.150692,0.152106, + 0.153518,0.154928,0.156335,0.157740,0.159143,0.160543,0.161941,0.163337,0.164730,0.166121,0.167509,0.168896,0.170280,0.171661,0.173041,0.174418,0.175793,0.177165,0.178536,0.179904, + 0.181269,0.182633,0.183994,0.185353,0.186709,0.188064,0.189416,0.190766,0.192113,0.193459,0.194802,0.196143,0.197481,0.198818,0.200152,0.201484,0.202814,0.204141,0.205466,0.206789, + 0.208110,0.209429,0.210746,0.212060,0.213372,0.214682,0.215990,0.217295,0.218599,0.219900,0.221199,0.222496,0.223791,0.225083,0.226374,0.227662,0.228948,0.230232,0.231514,0.232794, + 0.234072,0.235347,0.236620,0.237892,0.239161,0.240428,0.241693,0.242956,0.244216,0.245475,0.246731,0.247986,0.249238,0.250488,0.251736,0.252982,0.254227,0.255468,0.256708,0.257946, + 0.259182,0.260415,0.261647,0.262877,0.264104,0.265330,0.266553,0.267774,0.268994,0.270211,0.271426,0.272640,0.273851,0.275060,0.276267,0.277473,0.278676,0.279877,0.281076,0.282273, + 0.283469,0.284662,0.285853,0.287042,0.288230,0.289415,0.290598,0.291780,0.292959,0.294136,0.295312,0.296485,0.297657,0.298827,0.299994,0.301160,0.302324,0.303486,0.304645,0.305803, + 0.306959,0.308114,0.309266,0.310416,0.311564,0.312711,0.313855,0.314998,0.316139,0.317277,0.318414,0.319549,0.320683,0.321814,0.322943,0.324071,0.325196,0.326320,0.327442,0.328562, + 0.329680,0.330796,0.331911,0.333023,0.334134,0.335243,0.336350,0.337455,0.338558,0.339660,0.340759,0.341857,0.342953,0.344047,0.345140,0.346230,0.347319,0.348406,0.349491,0.350574, + 0.351656,0.352735,0.353813,0.354889,0.355964,0.357036,0.358107,0.359176,0.360243,0.361308,0.362372,0.363434,0.364494,0.365552,0.366609,0.367663,0.368716,0.369768,0.370817,0.371865, + 0.372911,0.373955,0.374998,0.376039,0.377078,0.378115,0.379151,0.380184,0.381217,0.382247,0.383276,0.384303,0.385328,0.386352,0.387374,0.388394,0.389412,0.390429,0.391444,0.392458, + 0.393469,0.394479,0.395488,0.396494,0.397499,0.398503,0.399504,0.400504,0.401503,0.402499,0.403494,0.404488,0.405479,0.406469,0.407458,0.408445,0.409430,0.410413,0.411395,0.412375, + 0.413354,0.414331,0.415306,0.416280,0.417252,0.418222,0.419191,0.420158,0.421124,0.422088,0.423050,0.424011,0.424970,0.425928,0.426884,0.427838,0.428791,0.429742,0.430692,0.431640, + 0.432586,0.433531,0.434475,0.435416,0.436356,0.437295,0.438232,0.439168,0.440102,0.441034,0.441965,0.442894,0.443822,0.444748,0.445673,0.446596,0.447517,0.448437,0.449356,0.450273, + 0.451188,0.452102,0.453015,0.453926,0.454835,0.455743,0.456649,0.457554,0.458457,0.459359,0.460259,0.461158,0.462056,0.462951,0.463846,0.464739,0.465630,0.466520,0.467408,0.468295, + 0.469181,0.470065,0.470947,0.471828,0.472708,0.473586,0.474462,0.475337,0.476211,0.477083,0.477954,0.478824,0.479691,0.480558,0.481423,0.482287,0.483149,0.484009,0.484869,0.485726, + 0.486583,0.487438,0.488291,0.489144,0.489994,0.490844,0.491691,0.492538,0.493383,0.494227,0.495069,0.495910,0.496749,0.497587,0.498424,0.499259,0.500093,0.500926,0.501757,0.502586, + 0.503415,0.504242,0.505067,0.505891,0.506714,0.507536,0.508356,0.509175,0.509992,0.510808,0.511623,0.512436,0.513248,0.514058,0.514868,0.515675,0.516482,0.517287,0.518091,0.518894, + 0.519695,0.520495,0.521293,0.522090,0.522886,0.523681,0.524474,0.525266,0.526056,0.526846,0.527633,0.528420,0.529205,0.529989,0.530772,0.531554,0.532334,0.533112,0.533890,0.534666, + 0.535441,0.536215,0.536987,0.537758,0.538528,0.539296,0.540063,0.540829,0.541594,0.542357,0.543119,0.543880,0.544640,0.545398,0.546155,0.546911,0.547665,0.548419,0.549171,0.549922, + 0.550671,0.551419,0.552166,0.552912,0.553657,0.554400,0.555142,0.555883,0.556622,0.557361,0.558098,0.558834,0.559568,0.560302,0.561034,0.561765,0.562495,0.563223,0.563951,0.564677, + 0.565402,0.566126,0.566848,0.567569,0.568289,0.569008,0.569726,0.570443,0.571158,0.571872,0.572585,0.573297,0.574007,0.574717,0.575425,0.576132,0.576838,0.577543,0.578246,0.578948, + 0.579650,0.580350,0.581048,0.581746,0.582443,0.583138,0.583832,0.584525,0.585217,0.585908,0.586597,0.587286,0.587973,0.588659,0.589344,0.590028,0.590711,0.591392,0.592073,0.592752, + 0.593430,0.594107,0.594783,0.595458,0.596132,0.596804,0.597476,0.598146,0.598815,0.599483,0.600150,0.600816,0.601481,0.602145,0.602807,0.603469,0.604129,0.604788,0.605446,0.606103, + 0.606759,0.607414,0.608068,0.608721,0.609372,0.610023,0.610672,0.611320,0.611968,0.612614,0.613259,0.613903,0.614546,0.615188,0.615829,0.616468,0.617107,0.617745,0.618381,0.619017, + 0.619651,0.620285,0.620917,0.621548,0.622178,0.622808,0.623436,0.624063,0.624689,0.625314,0.625938,0.626561,0.627183,0.627804,0.628423,0.629042,0.629660,0.630277,0.630892,0.631507, + }; + + + float gCf_fade600_out_coeffs[600]={ + 1.000000,0.998335,0.996672,0.995012,0.993356,0.991701,0.990050,0.988401,0.986755,0.985112,0.983471,0.981834,0.980199,0.978566,0.976937,0.975310,0.973686,0.972064,0.970446,0.968829, + 0.967216,0.965605,0.963997,0.962392,0.960789,0.959189,0.957592,0.955997,0.954405,0.952816,0.951229,0.949645,0.948064,0.946485,0.944909,0.943335,0.941765,0.940196,0.938631,0.937067, + 0.935507,0.933949,0.932394,0.930841,0.929291,0.927743,0.926199,0.924656,0.923116,0.921579,0.920044,0.918512,0.916983,0.915456,0.913931,0.912409,0.910890,0.909373,0.907859,0.906347, + 0.904837,0.903331,0.901826,0.900325,0.898825,0.897328,0.895834,0.894342,0.892853,0.891366,0.889882,0.888400,0.886920,0.885443,0.883969,0.882497,0.881027,0.879560,0.878095,0.876633, + 0.875173,0.873716,0.872261,0.870808,0.869358,0.867911,0.866465,0.865022,0.863582,0.862144,0.860708,0.859275,0.857844,0.856415,0.854989,0.853565,0.852144,0.850725,0.849308,0.847894, + 0.846482,0.845072,0.843665,0.842260,0.840857,0.839457,0.838059,0.836663,0.835270,0.833879,0.832491,0.831104,0.829720,0.828339,0.826959,0.825582,0.824207,0.822835,0.821464,0.820096, + 0.818731,0.817367,0.816006,0.814647,0.813291,0.811936,0.810584,0.809234,0.807887,0.806541,0.805198,0.803857,0.802519,0.801182,0.799848,0.798516,0.797186,0.795859,0.794534,0.793211, + 0.791890,0.790571,0.789254,0.787940,0.786628,0.785318,0.784010,0.782705,0.781401,0.780100,0.778801,0.777504,0.776209,0.774917,0.773626,0.772338,0.771052,0.769768,0.768486,0.767206, + 0.765928,0.764653,0.763380,0.762108,0.760839,0.759572,0.758307,0.757044,0.755784,0.754525,0.753269,0.752014,0.750762,0.749512,0.748264,0.747018,0.745773,0.744532,0.743292,0.742054, + 0.740818,0.739585,0.738353,0.737123,0.735896,0.734670,0.733447,0.732226,0.731006,0.729789,0.728574,0.727360,0.726149,0.724940,0.723733,0.722527,0.721324,0.720123,0.718924,0.717727, + 0.716531,0.715338,0.714147,0.712958,0.711770,0.710585,0.709402,0.708220,0.707041,0.705864,0.704688,0.703515,0.702343,0.701173,0.700006,0.698840,0.697676,0.696514,0.695355,0.694197, + 0.693041,0.691886,0.690734,0.689584,0.688436,0.687289,0.686145,0.685002,0.683861,0.682723,0.681586,0.680451,0.679317,0.678186,0.677057,0.675929,0.674804,0.673680,0.672558,0.671438, + 0.670320,0.669204,0.668089,0.666977,0.665866,0.664757,0.663650,0.662545,0.661442,0.660340,0.659241,0.658143,0.657047,0.655953,0.654860,0.653770,0.652681,0.651594,0.650509,0.649426, + 0.648344,0.647265,0.646187,0.645111,0.644036,0.642964,0.641893,0.640824,0.639757,0.638692,0.637628,0.636566,0.635506,0.634448,0.633391,0.632337,0.631284,0.630232,0.629183,0.628135, + 0.627089,0.626045,0.625002,0.623961,0.622922,0.621885,0.620849,0.619816,0.618783,0.617753,0.616724,0.615697,0.614672,0.613648,0.612626,0.611606,0.610588,0.609571,0.608556,0.607542, + 0.606531,0.605521,0.604512,0.603506,0.602501,0.601497,0.600496,0.599496,0.598497,0.597501,0.596506,0.595512,0.594521,0.593531,0.592542,0.591555,0.590570,0.589587,0.588605,0.587625, + 0.586646,0.585669,0.584694,0.583720,0.582748,0.581778,0.580809,0.579842,0.578876,0.577912,0.576950,0.575989,0.575030,0.574072,0.573116,0.572162,0.571209,0.570258,0.569308,0.568360, + 0.567414,0.566469,0.565525,0.564584,0.563644,0.562705,0.561768,0.560832,0.559898,0.558966,0.558035,0.557106,0.556178,0.555252,0.554327,0.553404,0.552483,0.551563,0.550644,0.549727, + 0.548812,0.547898,0.546985,0.546074,0.545165,0.544257,0.543351,0.542446,0.541543,0.540641,0.539741,0.538842,0.537944,0.537049,0.536154,0.535261,0.534370,0.533480,0.532592,0.531705, + 0.530819,0.529935,0.529053,0.528172,0.527292,0.526414,0.525538,0.524663,0.523789,0.522917,0.522046,0.521176,0.520309,0.519442,0.518577,0.517713,0.516851,0.515991,0.515131,0.514274, + 0.513417,0.512562,0.511709,0.510856,0.510006,0.509156,0.508309,0.507462,0.506617,0.505773,0.504931,0.504090,0.503251,0.502413,0.501576,0.500741,0.499907,0.499074,0.498243,0.497414, + 0.496585,0.495758,0.494933,0.494109,0.493286,0.492464,0.491644,0.490825,0.490008,0.489192,0.488377,0.487564,0.486752,0.485942,0.485132,0.484325,0.483518,0.482713,0.481909,0.481106, + 0.480305,0.479505,0.478707,0.477910,0.477114,0.476319,0.475526,0.474734,0.473944,0.473154,0.472367,0.471580,0.470795,0.470011,0.469228,0.468447,0.467666,0.466888,0.466110,0.465334, + 0.464559,0.463785,0.463013,0.462242,0.461472,0.460704,0.459937,0.459171,0.458406,0.457643,0.456881,0.456120,0.455360,0.454602,0.453845,0.453089,0.452334,0.451581,0.450829,0.450078, + 0.449329,0.448581,0.447834,0.447088,0.446343,0.445600,0.444858,0.444117,0.443378,0.442639,0.441902,0.441166,0.440432,0.439698,0.438966,0.438235,0.437505,0.436777,0.436049,0.435323, + 0.434598,0.433874,0.433152,0.432431,0.431711,0.430992,0.430274,0.429557,0.428842,0.428128,0.427415,0.426703,0.425993,0.425283,0.424575,0.423868,0.423162,0.422457,0.421754,0.421052, + 0.420350,0.419650,0.418952,0.418254,0.417557,0.416862,0.416168,0.415475,0.414783,0.414092,0.413403,0.412714,0.412027,0.411341,0.410656,0.409972,0.409289,0.408608,0.407927,0.407248, + 0.406570,0.405893,0.405217,0.404542,0.403868,0.403196,0.402524,0.401854,0.401185,0.400517,0.399850,0.399184,0.398519,0.397855,0.397193,0.396531,0.395871,0.395212,0.394554,0.393897, + 0.393241,0.392586,0.391932,0.391279,0.390628,0.389977,0.389328,0.388680,0.388032,0.387386,0.386741,0.386097,0.385454,0.384812,0.384171,0.383532,0.382893,0.382255,0.381619,0.380983, + 0.380349,0.379715,0.379083,0.378452,0.377822,0.377192,0.376564,0.375937,0.375311,0.374686,0.374062,0.373439,0.372817,0.372196,0.371577,0.370958,0.370340,0.369723,0.369108,0.368493, + }; + + int gCI_fade600_in_coeffs[600]={ + 0,1665,3327,4987,6644,8298,9950,11598,13244,14888,16528,18166,19801,21433,23063,24690,26314,27935,29554,31170, + 32783,34394,36002,37607,39210,40810,42407,44002,45594,47183,48770,50354,51936,53514,55091,56664,58235,59803,61369,62932, + 64493,66050,67606,69158,70708,72256,73801,75343,76883,78420,79955,81487,83017,84544,86068,87590,89110,90627,92141,93653, + 95162,96669,98173,99675,101174,102671,104165,105657,107147,108633,110118,111600,113079,114556,116031,117503,118972,120439,121904,123366, + 124826,126284,127739,129191,130641,132089,133534,134977,136418,137856,139292,140725,142156,143584,145011,146434,147856,149275,150691,152106, + 153518,154927,156335,157740,159142,160542,161940,163336,164729,166120,167509,168895,170279,171661,173040,174417,175792,177165,178535,179903, + 181269,182632,183993,185352,186709,188063,189415,190765,192113,193458,194801,196142,197481,198817,200151,201483,202813,204141,205466,206789, + 208110,209429,210745,212059,213372,214682,215989,217295,218598,219900,221199,222496,223790,225083,226373,227662,228948,230232,231514,232794, + 234071,235347,236620,237891,239160,240427,241692,242955,244216,245474,246731,247985,249238,250488,251736,252982,254226,255468,256708,257946, + 259181,260415,261647,262876,264104,265329,266553,267774,268993,270211,271426,272639,273850,275060,276267,277472,278675,279877,281076,282273, + 283468,284661,285853,287042,288229,289415,290598,291779,292959,294136,295311,296485,297656,298826,299994,301159,302323,303485,304645,305803, + 306959,308113,309265,310415,311564,312710,313855,314997,316138,317277,318414,319549,320682,321813,322943,324070,325196,326320,327441,328561, + 329679,330796,331910,333023,334133,335242,336349,337454,338558,339659,340759,341857,342953,344047,345139,346230,347318,348405,349490,350574, + 351655,352735,353813,354889,355963,357036,358106,359175,360242,361308,362371,363433,364493,365552,366608,367663,368716,369767,370817,371864, + 372910,373955,374997,376038,377077,378114,379150,380184,381216,382247,383275,384302,385328,386351,387373,388393,389412,390429,391444,392457, + 393469,394479,395487,396494,397499,398502,399504,400504,401502,402499,403494,404487,405479,406469,407457,408444,409429,410413,411395,412375, + 413353,414330,415306,416279,417251,418222,419191,420158,421123,422087,423050,424011,424970,425927,426883,427838,428790,429742,430691,431639, + 432586,433531,434474,435416,436356,437295,438232,439167,440101,441034,441964,442894,443821,444748,445672,446595,447517,448437,449355,450272, + 451188,452102,453014,453925,454834,455742,456649,457553,458457,459359,460259,461158,462055,462951,463845,464738,465629,466519,467408,468295, + 469180,470064,470946,471828,472707,473585,474462,475337,476211,477083,477954,478823,479691,480557,481422,482286,483148,484009,484868,485726, + 486582,487437,488291,489143,489994,490843,491691,492537,493383,494226,495068,495909,496749,497587,498423,499259,500093,500925,501756,502586, + 503414,504241,505067,505891,506714,507535,508355,509174,509991,510807,511622,512435,513247,514058,514867,515675,516482,517287,518091,518893, + 519694,520494,521293,522090,522886,523680,524473,525265,526056,526845,527633,528420,529205,529989,530772,531553,532333,533112,533889,534666, + 535441,536214,536986,537758,538527,539296,540063,540829,541594,542357,543119,543880,544639,545398,546155,546911,547665,548418,549170,549921, + 550671,551419,552166,552912,553656,554399,555141,555882,556622,557360,558097,558833,559568,560301,561033,561765,562494,563223,563950,564676, + 565401,566125,566848,567569,568289,569008,569726,570442,571158,571872,572585,573296,574007,574716,575425,576132,576837,577542,578246,578948, + 579649,580349,581048,581746,582442,583138,583832,584525,585217,585907,586597,587285,587973,588659,589344,590028,590710,591392,592072,592752, + 593430,594107,594783,595458,596131,596804,597475,598146,598815,599483,600150,600816,601480,602144,602807,603468,604128,604788,605446,606103, + 606759,607414,608067,608720,609372,610022,610672,611320,611967,612613,613258,613903,614545,615187,615828,616468,617107,617744,618381,619016, + 619651,620284,620916,621548,622178,622807,623435,624062,624688,625313,625937,626560,627182,627803,628423,629042,629659,630276,630892,631506 + }; + + int gCI_fade600_out_coeffs[600]={ + 1000000,998334,996672,995012,993355,991701,990049,988401,986755,985111,983471,981833,980198,978566,976936,975309,973685,972064,970445,968829, + 967216,965605,963997,962392,960789,959189,957592,955997,954405,952816,951229,949645,948063,946485,944909,943335,941764,940196,938630,937067, + 935507,933949,932393,930841,929291,927743,926198,924656,923116,921579,920044,918512,916982,915455,913931,912409,910889,909372,907858,906346, + 904837,903330,901826,900324,898825,897328,895834,894342,892852,891366,889881,888399,886920,885443,883968,882496,881027,879560,878095,876633, + 875173,873715,872260,870808,869358,867910,866465,865022,863581,862143,860708,859274,857843,856415,854989,853565,852143,850724,849308,847893, + 846481,845072,843664,842259,840857,839457,838059,836663,835270,833879,832490,831104,829720,828338,826959,825582,824207,822834,821464,820096, + 818730,817367,816006,814647,813290,811936,810584,809234,807886,806541,805198,803857,802518,801182,799848,798516,797186,795858,794533,793210, + 791889,790570,789254,787940,786627,785317,784010,782704,781401,780099,778800,777503,776209,774916,773626,772337,771051,769767,768485,767205, + 765928,764652,763379,762108,760839,759572,758307,757044,755783,754525,753268,752014,750761,749511,748263,747017,745773,744531,743291,742053, + 740818,739584,738352,737123,735895,734670,733446,732225,731006,729788,728573,727360,726149,724939,723732,722527,721324,720122,718923,717726, + 716531,715338,714146,712957,711770,710585,709401,708220,707040,705863,704688,703514,702343,701173,700005,698840,697676,696514,695354,694196, + 693040,691886,690734,689584,688435,687289,686144,685002,683861,682722,681585,680450,679317,678186,677056,675929,674803,673680,672558,671438, + 670320,669203,668089,666976,665866,664757,663650,662545,661441,660340,659240,658142,657046,655952,654860,653769,652681,651594,650509,649425, + 648344,647264,646186,645110,644036,642963,641893,640824,639757,638691,637628,636566,635506,634447,633391,632336,631283,630232,629182,628135, + 627089,626044,625002,623961,622922,621885,620849,619815,618783,617753,616724,615697,614671,613648,612626,611606,610587,609570,608555,607542, + 606530,605520,604512,603505,602500,601497,600495,599495,598497,597500,596505,595512,594520,593530,592542,591555,590570,589586,588605,587624, + 586646,585669,584693,583720,582748,581777,580809,579841,578876,577912,576949,575989,575029,574072,573116,572161,571209,570257,569308,568360, + 567413,566468,565525,564583,563643,562704,561767,560832,559898,558966,558035,557105,556178,555251,554327,553404,552482,551562,550644,549727, + 548811,547897,546985,546074,545165,544257,543350,542446,541542,540640,539740,538841,537944,537048,536154,535261,534370,533480,532591,531704, + 530819,529935,529053,528171,527292,526414,525537,524662,523788,522916,522045,521176,520308,519442,518577,517713,516851,515990,515131,514273, + 513417,512562,511708,510856,510005,509156,508308,507462,506617,505773,504931,504090,503250,502412,501576,500740,499906,499074,498243,497413, + 496585,495758,494932,494108,493285,492464,491644,490825,490008,489192,488377,487564,486752,485941,485132,484324,483518,482712,481908,481106, + 480305,479505,478706,477909,477113,476319,475526,474734,473943,473154,472366,471579,470794,470010,469227,468446,467666,466887,466110,465333, + 464559,463785,463013,462242,461472,460703,459936,459170,458406,457642,456880,456119,455360,454601,453844,453089,452334,451581,450829,450078, + 449328,448580,447833,447087,446343,445600,444858,444117,443377,442639,441902,441166,440431,439698,438966,438235,437505,436776,436049,435323, + 434598,433874,433151,432430,431710,430991,430273,429557,428842,428127,427414,426703,425992,425283,424574,423867,423162,422457,421753,421051, + 420350,419650,418951,418253,417557,416862,416167,415474,414782,414092,413402,412714,412026,411340,410655,409971,409289,408607,407927,407247, + 406569,405892,405216,404541,403868,403195,402524,401853,401184,400516,399849,399183,398519,397855,397192,396531,395871,395211,394553,393896, + 393240,392585,391932,391279,390627,389977,389327,388679,388032,387386,386741,386096,385454,384812,384171,383531,382892,382255,381618,380983, + 380348,379715,379083,378451,377821,377192,376564,375937,375311,374686,374062,373439,372817,372196,371576,370957,370340,369723,369107,368493 + }; +#endif + +#endif //_DATE_FADE_H__ \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_flash_interface.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_flash_interface.c new file mode 100644 index 0000000..bb322e6 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_flash_interface.c @@ -0,0 +1,273 @@ +// Copyright 2011-2023 XMOS LIMITED. +// This Software is subject to the terms of the XMOS Public Licence: Version 1. +#define DEBUG_PRINT_ENABLE 1 +#include +#include +#include +#include +#include +#include +#include "debug_print.h" + +#include "xua.h" + +#if HID_DFU_EN + +#ifndef DFU_FLASH_MAX_UPGRADE_SIZE +#define DFU_FLASH_MAX_UPGRADE_SIZE (2200 * 1024) +#endif + +#define DFU_FLASH_ERROR() + +static int dfu_flash_device_open = 0; +static fl_BootImageInfo dfu_factory_image; +static fl_BootImageInfo dfu_upgrade_image; + +static int dfu_upgrade_image_valid = 0; +static int dfu_current_flash_subpage_index = 0; +static unsigned char dfu_current_flash_page_data[256]; + +int dfu_flash_cmd_enable_ports() __attribute__ ((weak)); +int dfu_flash_cmd_enable_ports() { + return 0; +} + +int dfu_flash_cmd_disable_ports() __attribute__ ((weak)); +int dfu_flash_cmd_disable_ports() { + return 0; +} + +void DFUCustomFlashEnable() __attribute__ ((weak)); +void DFUCustomFlashEnable() +{ + return; +} + +void DFUCustomFlashDisable() __attribute__ ((weak)); +void DFUCustomFlashDisable() +{ + return; +} + +/* Returns non-zero for error */ +int dfu_flash_cmd_init(void) +{ + debug_printf("dfu_flash_cmd_init: dfu_flash_cmd_init\n"); + fl_BootImageInfo image; + + if (!dfu_flash_device_open) + { + if (dfu_flash_cmd_enable_ports()) + dfu_flash_device_open = 1; + debug_printf("dfu_flash_cmd_init: dfu_flash_device_open = 1\n"); + } + + if (!dfu_flash_device_open) + { + debug_printf("dfu_flash_cmd_init: dfu_flash_device_open = 0\n"); + return 1; + } + +#if (!XUA_QUAD_SPI_FLASH) + // Disable flash protection + fl_setProtection(0); +#endif + + if (fl_getFactoryImage(&image) != 0) + { + return 1; + } + + dfu_factory_image = image; + + if (fl_getNextBootImage(&image) == 0) + { + dfu_upgrade_image_valid = 1; + dfu_upgrade_image = image; + debug_printf("dfu_flash_cmd_init: dfu_upgrade_image_valid = 1\n"); + } + + debug_printf("dfu_flash_cmd_init: return 0\n"); + return 0; +} + +int dfu_flash_cmd_deinit(void) +{ + if (!dfu_flash_device_open) + return 0; + + dfu_flash_cmd_disable_ports(); + dfu_flash_device_open = 0; + return 0; +} + +int dfu_flash_cmd_read_page(unsigned char *data) +{ + if (!dfu_upgrade_image_valid) + { + *(unsigned int *)data = 1; + return 4; + } + + if (*(unsigned int *)data == 0) + { + fl_startImageRead(&dfu_upgrade_image); + } + + dfu_current_flash_subpage_index = 0; + + if (fl_readImagePage(dfu_current_flash_page_data) == 0) + { + *(unsigned int *)data = 0; + } + else + { + *(unsigned int *)data = 1; + } + return 4; +} + +int dfu_flash_cmd_read_page_data(unsigned char *data) +{ + unsigned char *page_data_ptr = &dfu_current_flash_page_data[dfu_current_flash_subpage_index * 64]; + memcpy(data, page_data_ptr, 64); + + dfu_current_flash_subpage_index++; + + return 64; +} + +static int begin_write() +{ + int result; + // TODO this will take a long time. To minimise the amount of time spent + // paused on this operation it would be preferable to move to this to a + // seperate command, e.g. start_write. + do + { + result = fl_startImageAdd(&dfu_factory_image, DFU_FLASH_MAX_UPGRADE_SIZE, 0); + } while (result > 0); + + if (result < 0) + { + DFU_FLASH_ERROR(); + } + return result; +} + +static int pages_written = 0; + +int dfu_flash_cmd_write_page(unsigned char *data) +{ + /* 改动原因:协议仅约定第一个字节为 flag(0=第一页,1=后续页,2=结束); + * 若用 *(unsigned int *)data 读取 4 字节,而调用处只设置 data[0]=0 且未清零 data[1..3], + * 则 flag 可能非 0,导致不进入 case 0,begin_write() 被跳过。改为仅用首字节。 */ + unsigned int flag = (unsigned int)data[0]; + if (flag == 0) + debug_printf("dfu_flash_cmd_write_page: flag = %d\n", flag); + + if (dfu_upgrade_image_valid) + { + debug_printf("dfu_flash_cmd_write_page: dfu_upgrade_image_valid = 1\n"); + return 0; + } + + switch (flag) + { + case 0: + // First page. + debug_printf("dfu_flash_cmd_write_page: begin_write\n"); + int result = begin_write(); + if (result < 0) + return result; + pages_written = 0; + // fallthrough + case 1: + // Do nothing. + break; + case 2: + // Termination. + if (fl_endWriteImage() != 0) + DFU_FLASH_ERROR(); + + // Sanity check + fl_BootImageInfo image = dfu_factory_image; + if (fl_getNextBootImage(&image) != 0) + DFU_FLASH_ERROR(); + break; + } + dfu_current_flash_subpage_index = 0; + + return 0; +} + +int dfu_flash_cmd_write_page_data(unsigned char *data) +{ + unsigned char *page_data_ptr = &dfu_current_flash_page_data[dfu_current_flash_subpage_index * 64]; + + if (dfu_upgrade_image_valid) + { + return 0; + } + + if (dfu_current_flash_subpage_index >= 4) + { + return 0; + } + + memcpy(page_data_ptr, data, 64); + + dfu_current_flash_subpage_index++; + + if (dfu_current_flash_subpage_index == 4) + { + if (fl_writeImagePage(dfu_current_flash_page_data) != 0) + DFU_FLASH_ERROR(); + pages_written++; + } + + return 0; +} + + +int dfu_flash_cmd_erase_all(void) +{ + fl_BootImageInfo tmp_image = dfu_upgrade_image; + + if (dfu_upgrade_image_valid) + { + if (fl_deleteImage(&dfu_upgrade_image) != 0) + { + DFU_FLASH_ERROR(); + } + + // Keep deleting all upgrade images + // TODO Perhaps using replace would be nicer... + while(1) + { + if (fl_getNextBootImage(&tmp_image) == 0) + { + if (fl_deleteImage(&tmp_image) != 0) + { + DFU_FLASH_ERROR(); + } + } + else + { + break; + } + } + + dfu_upgrade_image_valid = 0; + } + /* 改动原因:强制升级流程中,erase 后必须允许后续第一页写执行 begin_write(); + * 若仅在上面 if 块内清零,某些路径(如删除失败或 while 未正确退出)可能导致 + * dfu_upgrade_image_valid 仍为 1,write_page(flag=0) 会直接 return 0 而不调用 + * begin_write(),导致 begin_write 未执行。此处无条件清零,保证 erase 后下一 + * 次 write_page(0) 必定执行 begin_write。 */ + dfu_upgrade_image_valid = 0; + debug_printf("dfu_flash_cmd_erase_all: set dfu_upgrade_image_valid = 0\n"); + return 0; +} +#endif + diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_flash_interface.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_flash_interface.h new file mode 100644 index 0000000..500e8d4 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_flash_interface.h @@ -0,0 +1,34 @@ +// Copyright 2011-2021 XMOS LIMITED. +// This Software is subject to the terms of the XMOS Public Licence: Version 1. +#ifndef _dfu_flash_interface_h_ +#define _dfu_flash_interface_h_ + +int dfu_flash_cmd_init(void); +/** + * Prepare to write a page of a new upgrade image. + * The first word of data should be set to 0 if it is the first page, + * 1 for all other pages and 2 to terminate the write (no further data is sent). + */ +int dfu_flash_cmd_write_page(unsigned char []); +/** + * Provide upgrade image data. flash_cmd_write_page() must be called previously. + * Once a page of data has been provided it is written to the device. + */ +int dfu_flash_cmd_write_page_data(unsigned char []); +/** + * Read a page of data from the upgrade image. + * If the first word of data is 0 the page is read from the start of the + * upgrade image, otherwise the next page in the image will be read. + * On return the first word of data is written with 1 if there is nothing to + * read and 0 otherwise. + */ +int dfu_flash_cmd_read_page(unsigned char []); +/** + * Get data previously read by flash_cmd_read_page(). + */ +int dfu_flash_cmd_read_page_data(unsigned char []); +int dfu_flash_cmd_erase_all(void); +int dfu_flash_cmd_reboot(void); +int dfu_flash_cmd_init(void); +int dfu_flash_cmd_deinit(void); +#endif /*_dfu_flash_interface_h_*/ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_flashlib_user.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_flashlib_user.c new file mode 100644 index 0000000..b432a27 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_flashlib_user.c @@ -0,0 +1,129 @@ +// Copyright 2012-2023 XMOS LIMITED. +// This Software is subject to the terms of the XMOS Public Licence: Version 1. +#include "xua.h" +#if (XUA_DFU_EN == 1 || UAC1 == 1) +#include "uac_hwresources.h" +#include +#include +#if (XUA_QUAD_SPI_FLASH) +#include +#else +#include +#endif +#include + +#define settw(a,b) {__asm__ __volatile__("settw res[%0], %1": : "r" (a) , "r" (b));} +#define setc(a,b) {__asm__ __volatile__("setc res[%0], %1": : "r" (a) , "r" (b));} +#define setclk(a,b) {__asm__ __volatile__("setclk res[%0], %1": : "r" (a) , "r" (b));} +#define portin(a,b) {__asm__ __volatile__("in %0, res[%1]": "=r" (b) : "r" (a));} +#define portout(a,b) {__asm__ __volatile__("out res[%0], %1": : "r" (a) , "r" (b));} + +#ifdef DFU_FLASH_DEVICE + +#if (XUA_QUAD_SPI_FLASH) +/* Using specified flash device rather than all supported in tools */ +fl_QuadDeviceSpec dfu_flash_devices[] = {DFU_FLASH_DEVICE}; +#else +/* Using specified flash device rather than all supported in tools */ +fl_DeviceSpec dfu_flash_devices[] = {DFU_FLASH_DEVICE}; +#endif +#endif + +#if (XUA_QUAD_SPI_FLASH) +/* +typedef struct { + out port qspiCS; + out port qspiSCLK; + out buffered port:32 qspiSIO; + clock qspiClkblk; +} fl_QSPIPorts; +*/ +fl_QSPIPorts dfu_p_qflash = +{ + XS1_PORT_1B, + XS1_PORT_1C, + XS1_PORT_4B, + CLKBLK_FLASHLIB +}; +#else +fl_PortHolderStruct p_flash = +{ + XS1_PORT_1A, + XS1_PORT_1B, + XS1_PORT_1C, + XS1_PORT_1D, + CLKBLK_FLASHLIB +}; +#endif + +/* return 1 for opened ports successfully */ +int dfu_flash_cmd_enable_ports() +{ + int result = 0; +#if (XUA_QUAD_SPI_FLASH) + /* Ports not shared */ +#else + setc(p_flash.spiMISO, XS1_SETC_INUSE_OFF); + setc(p_flash.spiCLK, XS1_SETC_INUSE_OFF); + setc(p_flash.spiMOSI, XS1_SETC_INUSE_OFF); + setc(p_flash.spiSS, XS1_SETC_INUSE_OFF); + setc(p_flash.spiClkblk, XS1_SETC_INUSE_OFF); + + setc(p_flash.spiMISO, XS1_SETC_INUSE_ON); + setc(p_flash.spiCLK, XS1_SETC_INUSE_ON); + setc(p_flash.spiMOSI, XS1_SETC_INUSE_ON); + setc(p_flash.spiSS, XS1_SETC_INUSE_ON); + setc(p_flash.spiClkblk, XS1_SETC_INUSE_ON); + setc(p_flash.spiClkblk, XS1_SETC_INUSE_ON); + + setclk(p_flash.spiMISO, XS1_CLKBLK_REF); + setclk(p_flash.spiCLK, XS1_CLKBLK_REF); + setclk(p_flash.spiMOSI, XS1_CLKBLK_REF); + setclk(p_flash.spiSS, XS1_CLKBLK_REF); + + setc(p_flash.spiMISO, XS1_SETC_BUF_BUFFERS); + setc(p_flash.spiMOSI, XS1_SETC_BUF_BUFFERS); + + settw(p_flash.spiMISO, 8); + settw(p_flash.spiMOSI, 8); +#endif + +#ifdef DFU_FLASH_DEVICE +#if (XUA_QUAD_SPI_FLASH) + result = fl_connectToDevice(&dfu_p_qflash, dfu_flash_devices, sizeof(dfu_flash_devices) / sizeof(fl_QuadDeviceSpec)); +#else + result = fl_connectToDevice(&dfu_p_flash, dfu_flash_devices, sizeof(dfu_flash_devices) / sizeof(fl_DeviceSpec)); +#endif +#else + /* Use default flash list */ +#if (XUA_QUAD_SPI_FLASH) + result = fl_connect(&dfu_p_qflash); +#else + result = fl_connect(&dfu_p_flash); +#endif +#endif + if (!result) + { + /* All okay.. */ + return 1; + } + else + { + return 0; + } +} + +int dfu_flash_cmd_disable_ports() +{ + fl_disconnect(); + +#if (!XUA_QUAD_SPI_FLASH) + setc(p_flash.spiMISO, XS1_SETC_INUSE_OFF); + setc(p_flash.spiCLK, XS1_SETC_INUSE_OFF); + setc(p_flash.spiMOSI, XS1_SETC_INUSE_OFF); + setc(p_flash.spiSS, XS1_SETC_INUSE_OFF); +#endif + + return 1; +} +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_upgrade.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_upgrade.c new file mode 100644 index 0000000..5de77a6 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_upgrade.c @@ -0,0 +1,796 @@ +// Copyright 2026 Shanling. +// HID固件升级实现文件 +// 改动原因:实现通过HID协议进行固件升级的完整功能 + +#define DEBUG_PRINT_ENABLE 1 +#include "dfu_upgrade.h" +#include "user_func.h" +#include "dfu_flash_interface.h" +#include +#include +#include "debug_print.h" + +#if HID_DFU_EN +// 外部函数声明 +extern void hidSetChangePending(unsigned int id); +extern unsigned char check_sum(unsigned char *pbuf, unsigned len); +extern void device_reboot(void); + +// 全局变量 +extern unsigned char g_hid_pass_data[64]; // HID主动上报数据缓冲区 +extern unsigned g_firmware_upgrade_mcu_notify; // 固件升级状态通知 MCU:1=开始 2=结束成功 3=结束(中止/失败) +extern unsigned g_in_fw_upgrade; // 是否处于固件升级中,START=1 END/ABORT=0 + +// 升级状态(静态全局变量) +static upgrade_status_t g_upgrade_status; + +// 全局标志:第一页写命令是否已执行(不依赖于升级状态) +// 改动原因:ERASE命令可能在START命令之前执行,需要独立跟踪第一页写命令的执行状态 +static uint8_t g_first_page_write_executed = 0; +// 全局标志:是否已执行dfu_flash_cmd_erase_all(不依赖于升级状态) +// 改动原因:避免重复擦除,保证与DFU一致的顺序(先擦除,再begin_write) +static uint8_t g_flash_erased = 0; + +// 调试打印函数:以16进制形式打印数据包 +// 改动原因:添加调试打印功能,方便查看收到的命令和上报的响应 +static void debug_print_hex(const char *prefix, const uint8_t *data, uint16_t len, uint16_t max_bytes) +{ +#if 0 + if (data == NULL || len == 0) { + debug_printf("%s: (empty data)\n", prefix); + return; + } + + // 限制打印长度 + uint16_t print_len = (len > max_bytes) ? max_bytes : len; + + // 改动原因:优化打印性能,使用静态缓冲区一次性构建字符串,减少debug_printf调用次数 + // 64字节数据需要64个%02X,加上空格,最多需要 64*3 = 192字节,加上前缀和换行,总共约256字节 + static char hex_buffer[320]; // 静态缓冲区,避免每次分配 + char *buf_ptr = hex_buffer; + int remaining = sizeof(hex_buffer); + + // 构建前缀 + int prefix_len = debug_printf(buf_ptr, remaining, "%s: ", prefix); + if (prefix_len < 0 || prefix_len >= remaining) { + debug_printf("%s: (buffer overflow)\n", prefix); + return; + } + buf_ptr += prefix_len; + remaining -= prefix_len; + + // 构建16进制数据字符串 + for (uint16_t i = 0; i < print_len && remaining > 4; i++) { + int written = debug_printf(buf_ptr, remaining, "%02X ", data[i]); + if (written < 0 || written >= remaining) break; + buf_ptr += written; + remaining -= written; + } + + // 添加截断提示(如果需要) + if (len > max_bytes && remaining > 30) { + debug_printf(buf_ptr, remaining, "... (total %d bytes, showing first %d)", len, max_bytes); + } + + // 一次性打印整个字符串 + debug_printf("%s\n", hex_buffer); +#endif +} + +// 初始化固件升级模块 +// 改动原因:初始化升级状态机和缓冲区,确保系统处于可升级状态 +void firmware_upgrade_init(void) +{ + memset(&g_upgrade_status, 0, sizeof(upgrade_status_t)); + g_upgrade_status.state = UPGRADE_IDLE; + g_upgrade_status.expected_block_num = 0; + debug_printf("Firmware upgrade module initialized\n"); +} + +// 获取当前升级状态 +// 改动原因:供外部查询当前升级状态,用于状态管理和调试 +upgrade_state_t firmware_upgrade_get_state(void) +{ + return g_upgrade_status.state; +} + +// 重置升级状态 +// 改动原因:升级完成或中止后重置状态,准备下一次升级 +void firmware_upgrade_reset(void) +{ + memset(&g_upgrade_status, 0, sizeof(upgrade_status_t)); + g_upgrade_status.state = UPGRADE_IDLE; + g_upgrade_status.expected_block_num = 0; + g_upgrade_status.first_page_written = 0; // 重置第一页写标志 + // 改动原因:重置升级流程相关标志,确保下一次升级从干净状态开始 + g_first_page_write_executed = 0; + g_flash_erased = 0; +} + +// 发送固件升级响应(主动上报) +// 改动原因:通过HID主动上报机制发送响应,参考audiohw.xc中的音量上报实现 +// 使用g_hid_pass_data全局数组存储响应数据,然后调用hidSetChangePending触发主动上报 +void send_firmware_upgrade_response(uint8_t cmd, uint8_t *response_data, uint16_t data_len) +{ + // 构建响应数据包 + g_hid_pass_data[0] = 0x77; // 同步头 + g_hid_pass_data[1] = cmd; // 命令码 + + // 复制响应数据 + if (response_data != NULL && data_len > 0) { + uint16_t copy_len = (data_len < 61) ? data_len : 61; + memcpy(&g_hid_pass_data[2], response_data, copy_len); + } + + // 其余字节填充为0 + for (int i = 2 + data_len; i < 63; i++) { + g_hid_pass_data[i] = 0x00; + } + + // 改动原因:先触发主动上报,再打印调试信息,确保响应及时发送 + // 通知HID系统有数据变化,触发主动上报(优先执行,减少延迟) + hidSetChangePending(0x1); + + // 改动原因:添加调试打印,显示上报的响应数据(16进制格式) + // 注意:g_hid_pass_data是63字节(不包括Report ID),但HID实际发送的是64字节(包括Report ID 0x01) + // 为了完整显示,我们需要构建完整的64字节数据包 + // 注意:打印操作移到hidSetChangePending之后,避免打印延迟影响响应发送 + uint8_t full_packet[64]; + full_packet[0] = 0x01; // Report ID + memcpy(&full_packet[1], g_hid_pass_data, 63); // 复制63字节数据 + + char prefix[64]; + //debug_printf(prefix, sizeof(prefix), "[Device Report] Response (0x%02X)", cmd); + //debug_print_hex(prefix, full_packet, 64, 64); + + //debug_printf("Firmware upgrade response sent: cmd=0x%02x\n", cmd); +} + +// 处理START命令 +// 改动原因:初始化固件升级流程,设置固件大小、版本号,准备Flash写入 +unsigned char handle_firmware_upgrade_start(uint8_t data[], uint16_t len) +{ + uint8_t response[64] = {0}; + + // 检查状态 + if (g_upgrade_status.state != UPGRADE_IDLE) { + debug_printf("Firmware upgrade error: not in IDLE state (current: %d)\n", g_upgrade_status.state); + response[0] = STATUS_FAIL; // 状态码:失败 + send_firmware_upgrade_response(FIRMWARE_UPGRADE_START, response, 1); + return STATUS_FAIL; + } + + // 改动原因:去掉固件版本号和升级标志位,所有实现都是强制升级方式 + // 解析固件大小(4字节小端序) + uint32_t firmware_size = data[2] | (data[3] << 8) | (data[4] << 16) | (data[5] << 24); + + //debug_printf("Firmware upgrade START: size=%lu (force upgrade mode)\n", firmware_size); + + debug_printf("g_first_page_write_executed: %d\n", g_first_page_write_executed); + + // 验证固件大小 + if (firmware_size == 0 || firmware_size > FLASH_MAX_UPGRADE_SIZE) { + debug_printf("Firmware upgrade error: invalid size %lu\n", firmware_size); + response[0] = STATUS_SIZE_INVALID; // 状态码:大小无效 + send_firmware_upgrade_response(FIRMWARE_UPGRADE_START, response, 1); + return STATUS_SIZE_INVALID; + } + + // 页对齐处理(向上取整到256字节) + uint32_t aligned_size = ((firmware_size + FLASH_PAGE_SIZE - 1) / FLASH_PAGE_SIZE) * FLASH_PAGE_SIZE; + + // 初始化Flash接口(参考DFU_OpenFlash实现) + if (dfu_flash_cmd_init() != 0) { + debug_printf("Firmware upgrade error: flash init failed\n"); + response[0] = STATUS_FAIL; // 状态码:失败 + send_firmware_upgrade_response(FIRMWARE_UPGRADE_START, response, 1); + return STATUS_FAIL; + } + + // 改动原因:所有实现都是强制升级方式,自动擦除现有upgrade image + // 为了与DFU顺序一致(先擦除,再begin_write),若已擦除则跳过 + if (g_first_page_write_executed == 0 && g_flash_erased == 0) { + debug_printf("Force upgrade: erasing existing upgrade image\n"); + dfu_flash_cmd_erase_all(); + g_flash_erased = 1; + } else { + debug_printf("Force upgrade: erase skipped (already erased or begin_write started)\n"); + } + + // 更新升级状态 + g_upgrade_status.state = UPGRADE_PREPARING; + g_upgrade_status.firmware_size = aligned_size; + g_upgrade_status.total_blocks = (aligned_size + MAX_DATA_BLOCK_SIZE - 1) / MAX_DATA_BLOCK_SIZE; + g_upgrade_status.received_blocks = 0; + g_upgrade_status.expected_block_num = 0; + // 改动原因:去掉固件版本号字段,不再存储 + g_upgrade_status.error_code = 0; + + // 初始化页缓冲区 + memset(g_upgrade_status.page_buf.buffer, 0, FLASH_PAGE_SIZE); + g_upgrade_status.page_buf.offset = 0; + g_upgrade_status.page_buf.total_pages = aligned_size / FLASH_PAGE_SIZE; + g_upgrade_status.page_buf.written_pages = 0; + + // 改动原因:在START命令中判断是否已执行过第一页写命令(可能在ERASE命令中已执行) + // 如果已执行过,就不重复执行,避免浪费12秒时间 + if (g_first_page_write_executed == 0) { + // 第一页写命令尚未执行,现在执行 + debug_printf("Firmware upgrade: executing first page write command (flag=0) in START...\n"); + unsigned char cmd_data[16]; + memset(cmd_data, 0, sizeof(cmd_data)); + cmd_data[0] = 0; // flag=0表示第一页,会调用begin_write()初始化Flash写入 + if (dfu_flash_cmd_write_page(cmd_data) != 0) { + /* 改动原因:begin_write 失败时必须上报 STATUS_FAIL,并重置状态为 IDLE,便于主机重试; + * 不重置会导致下次 START 因“非 IDLE”而继续报错。 */ + debug_printf("Firmware upgrade error: first page write command failed (begin_write error)\n"); + dfu_flash_cmd_deinit(); + g_upgrade_status.state = UPGRADE_IDLE; + response[0] = STATUS_FAIL; // 状态码:失败 + send_firmware_upgrade_response(FIRMWARE_UPGRADE_START, response, 1); + return STATUS_FAIL; + } + g_first_page_write_executed = 1; // 标记第一页写命令已执行 + debug_printf("Firmware upgrade: first page write command completed (takes ~12s)\n"); + } else { + // 第一页写命令已在ERASE命令中执行过,跳过 + debug_printf("Firmware upgrade: first page write command already executed in ERASE, skipping %d\n", g_first_page_write_executed); + } + // 同步更新升级状态中的标志 + g_upgrade_status.first_page_written = 1; + + //debug_printf("Firmware upgrade ready: total_blocks=%d, total_pages=%d\n", + // g_upgrade_status.total_blocks, g_upgrade_status.page_buf.total_pages); + + // 构建响应数据包 + response[0] = STATUS_SUCCESS; // 状态码:成功 + response[1] = (aligned_size >> 0) & 0xFF; // 实际分配的Flash大小(小端序) + response[2] = (aligned_size >> 8) & 0xFF; + response[3] = (aligned_size >> 16) & 0xFF; + response[4] = (aligned_size >> 24) & 0xFF; + response[5] = (g_upgrade_status.total_blocks >> 0) & 0xFF; // 总块数(小端序) + response[6] = (g_upgrade_status.total_blocks >> 8) & 0xFF; + + // 发送响应 + send_firmware_upgrade_response(FIRMWARE_UPGRADE_START, response, 7); + /* 改动原因:通知 MCU 固件升级已开始,便于 MCU 显示/提示 */ + g_firmware_upgrade_mcu_notify = 1; + g_in_fw_upgrade = 1; + return STATUS_SUCCESS; +} + +// 处理DATA命令 +// 改动原因:接收固件数据块,验证Checksum和块序号,写入Flash缓冲区 +unsigned char handle_firmware_upgrade_data(uint8_t data[], uint16_t len) +{ + uint8_t response[64] = {0}; + + // 检查状态 + if (g_upgrade_status.state != UPGRADE_PREPARING && g_upgrade_status.state != UPGRADE_TRANSFERRING) { + debug_printf("Firmware upgrade error: not in PREPARING or TRANSFERRING state (current: %d)\n", g_upgrade_status.state); + response[0] = STATUS_FAIL; // 状态码:失败 + send_firmware_upgrade_response(FIRMWARE_UPGRADE_DATA, response, 1); + return STATUS_FAIL; + } + + // 解析块序号(2字节小端序) + uint16_t block_num = data[2] | (data[3] << 8); + + // 解析数据长度 + uint8_t data_len = data[4]; + + // 改动原因:数据长度固定为57字节,必须严格验证 + if (data_len != MAX_DATA_BLOCK_SIZE) { + debug_printf("Firmware upgrade error: invalid data length %d (must be %d)\n", data_len, MAX_DATA_BLOCK_SIZE); + response[0] = STATUS_SIZE_INVALID; // 状态码:数据长度错误 + send_firmware_upgrade_response(FIRMWARE_UPGRADE_DATA, response, 1); + return STATUS_SIZE_INVALID; + } + + // 验证块序号 + if (block_num != g_upgrade_status.expected_block_num) { + debug_printf("Firmware upgrade error: block number mismatch (expected: %d, got: %d)\n", + g_upgrade_status.expected_block_num, block_num); + response[0] = STATUS_BLOCK_NUM_ERROR; // 状态码:块序号错误 + response[1] = (g_upgrade_status.expected_block_num >> 0) & 0xFF; // 期望的块序号 + response[2] = (g_upgrade_status.expected_block_num >> 8) & 0xFF; + send_firmware_upgrade_response(FIRMWARE_UPGRADE_DATA, response, 3); + return STATUS_BLOCK_NUM_ERROR; + } + + // 验证Checksum(参考user_func.c中的check_sum实现) + // Checksum范围:同步头 + 命令码 + 块序号 + 数据长度 + 数据 + uint8_t received_checksum = data[5 + data_len]; + uint8_t calculated_checksum = check_sum(data, 5 + data_len); + + if (received_checksum != calculated_checksum) { + debug_printf("Firmware upgrade error: checksum mismatch (expected: 0x%02x, got: 0x%02x)\n", + calculated_checksum, received_checksum); + response[0] = STATUS_CHECKSUM_ERROR; // 状态码:Checksum错误 + send_firmware_upgrade_response(FIRMWARE_UPGRADE_DATA, response, 1); + return STATUS_CHECKSUM_ERROR; + } + + // 切换到传输状态(如果当前是准备状态) + if (g_upgrade_status.state == UPGRADE_PREPARING) { + g_upgrade_status.state = UPGRADE_TRANSFERRING; + //debug_printf("Firmware upgrade: entering TRANSFERRING state\n"); + + // 第一个数据块时擦除(仅当尚未擦除),保证与DFU顺序一致 + if (block_num == 0) { + if (g_first_page_write_executed == 0 && g_flash_erased == 0) { + debug_printf("Firmware upgrade: erasing existing upgrade image\n"); + dfu_flash_cmd_erase_all(); + g_flash_erased = 1; + } else { + debug_printf("Firmware upgrade: erase skipped (already erased or begin_write started)\n"); + } + } + } + + // 将数据写入Flash缓冲区 + uint16_t buf_offset = g_upgrade_status.page_buf.offset; + uint16_t remaining = FLASH_PAGE_SIZE - buf_offset; + uint16_t to_copy = (data_len < remaining) ? data_len : remaining; + + memcpy(&g_upgrade_status.page_buf.buffer[buf_offset], &data[5], to_copy); + g_upgrade_status.page_buf.offset += to_copy; + + // 如果缓冲区满,写入Flash + if (g_upgrade_status.page_buf.offset >= FLASH_PAGE_SIZE) { + // 参考flash_interface.c的实现 + unsigned char cmd_data[16]; + + // 改动原因:第一页写命令已在START命令中执行,这里只需要使用flag=1写入后续页 + // 这样可以避免在DATA命令中执行第一页写命令(需要12秒),减少DATA命令的处理时间 + if (g_upgrade_status.page_buf.written_pages == 0) { + // 第一页:已经在START命令中执行了flag=0,这里只需要写入数据 + // 不需要再次调用dfu_flash_cmd_write_page(flag=0),直接写入数据即可 + debug_printf("Firmware upgrade: writing first page data (flag=0 already executed in START)\n"); + } else { + // 后续页:使用flag=1 + cmd_data[0] = 1; // flag=1表示后续页 + dfu_flash_cmd_write_page(cmd_data); + } + + // 分4次写入子页数据(每次64字节) + for (int i = 0; i < 4; i++) { + dfu_flash_cmd_write_page_data(&g_upgrade_status.page_buf.buffer[i * 64]); + } + + g_upgrade_status.page_buf.written_pages++; + g_upgrade_status.page_buf.offset = 0; + + //debug_printf("Firmware upgrade: page %d/%d written\n", + // g_upgrade_status.page_buf.written_pages, g_upgrade_status.page_buf.total_pages); + } + + // 如果数据块跨页,处理剩余部分 + if (to_copy < data_len) { + uint16_t remaining_data = data_len - to_copy; + memcpy(&g_upgrade_status.page_buf.buffer[0], &data[5 + to_copy], remaining_data); + g_upgrade_status.page_buf.offset = remaining_data; + } + + // 更新状态 + g_upgrade_status.received_blocks++; + g_upgrade_status.expected_block_num++; + + // 改动原因:删除已写入页数和总页数字段,只返回状态码和已确认的块序号 + // 构建响应数据包 + response[0] = STATUS_SUCCESS; // 状态码:成功 + response[1] = (block_num >> 0) & 0xFF; // 已确认的块序号(小端序) + response[2] = (block_num >> 8) & 0xFF; + + // 发送响应 + send_firmware_upgrade_response(FIRMWARE_UPGRADE_DATA, response, 3); + + return STATUS_SUCCESS; +} + +// 处理END命令 +// 改动原因:完成固件升级,填充最后一页,调用fl_endWriteImage,验证镜像完整性 +unsigned char handle_firmware_upgrade_end(uint8_t data[], uint16_t len) +{ + uint8_t response[64] = {0}; + + // 检查状态 + if (g_upgrade_status.state != UPGRADE_TRANSFERRING) { + debug_printf("Firmware upgrade error: not in TRANSFERRING state (current: %d)\n", g_upgrade_status.state); + response[0] = STATUS_FAIL; // 状态码:失败 + send_firmware_upgrade_response(FIRMWARE_UPGRADE_END, response, 1); + return STATUS_FAIL; + } + + // 切换到完成中状态 + g_upgrade_status.state = UPGRADE_COMPLETING; + + // 解析固件总大小(用于验证) + uint32_t firmware_size = data[2] | (data[3] << 8) | (data[4] << 16) | (data[5] << 24); + + debug_printf("Firmware upgrade END: firmware_size=%lu\n", firmware_size); + + // 填充最后一页(如果有剩余数据) + if (g_upgrade_status.page_buf.offset > 0) { + // 填充剩余部分为0 + for (uint16_t i = g_upgrade_status.page_buf.offset; i < FLASH_PAGE_SIZE; i++) { + g_upgrade_status.page_buf.buffer[i] = 0x00; + } + + // 写入最后一页 + unsigned char cmd_data[16]; + cmd_data[0] = 1; // flag=1表示后续页 + dfu_flash_cmd_write_page(cmd_data); + + // 分4次写入子页数据 + for (int i = 0; i < 4; i++) { + dfu_flash_cmd_write_page_data(&g_upgrade_status.page_buf.buffer[i * 64]); + } + + g_upgrade_status.page_buf.written_pages++; + + debug_printf("Firmware upgrade: last page written (total pages: %d)\n", + g_upgrade_status.page_buf.written_pages); + } + + // 完成镜像写入(参考dfu_flash_cmd_write_page的flag=2) + unsigned char cmd_data[16]; + cmd_data[0] = 2; // flag=2表示终止写入 + int result = dfu_flash_cmd_write_page(cmd_data); + + if (result != 0) { + debug_printf("Firmware upgrade error: flash write termination failed\n"); + g_upgrade_status.state = UPGRADE_ERROR; + g_upgrade_status.error_code = STATUS_FAIL; + response[0] = STATUS_FAIL; // 状态码:失败 + send_firmware_upgrade_response(FIRMWARE_UPGRADE_END, response, 1); + return STATUS_FAIL; + } + + // 镜像验证由DFU Flash库自动完成(dfu_flash_cmd_write_page内部) + debug_printf("Firmware upgrade: image verification passed\n"); + + // 切换到完成状态 + g_upgrade_status.state = UPGRADE_COMPLETED; + + // 改动原因:删除已写入的总块数和总页数字段,只返回状态码 + // 构建响应数据包 + response[0] = STATUS_SUCCESS; // 状态码:成功 + + // 发送响应 + send_firmware_upgrade_response(FIRMWARE_UPGRADE_END, response, 1); + debug_printf("Firmware upgrade completed successfully\n"); + /* 改动原因:通知 MCU 固件升级已正常结束 */ + g_firmware_upgrade_mcu_notify = 2; + g_in_fw_upgrade = 0; + g_upgrade_status.state = UPGRADE_IDLE; + return STATUS_SUCCESS; +} + +// 处理STATUS命令 +// 改动原因:查询当前升级状态和进度,支持断点续传和进度显示 +unsigned char handle_firmware_upgrade_status(uint8_t data[], uint16_t len) +{ + uint8_t response[64] = {0}; + + // 构建响应数据包 + response[0] = (uint8_t)g_upgrade_status.state; // 升级状态 + response[1] = (g_upgrade_status.received_blocks >> 0) & 0xFF; // 已接收的块数 + response[2] = (g_upgrade_status.received_blocks >> 8) & 0xFF; + response[3] = (g_upgrade_status.total_blocks >> 0) & 0xFF; // 总块数 + response[4] = (g_upgrade_status.total_blocks >> 8) & 0xFF; + response[5] = (g_upgrade_status.page_buf.written_pages >> 0) & 0xFF; // 已写入的页数 + response[6] = (g_upgrade_status.page_buf.written_pages >> 8) & 0xFF; + response[7] = (g_upgrade_status.page_buf.total_pages >> 0) & 0xFF; // 总页数 + response[8] = (g_upgrade_status.page_buf.total_pages >> 8) & 0xFF; + + // 已传输的字节数 + uint32_t bytes_transferred = g_upgrade_status.received_blocks * MAX_DATA_BLOCK_SIZE; + response[9] = (bytes_transferred >> 0) & 0xFF; + response[10] = (bytes_transferred >> 8) & 0xFF; + response[11] = (bytes_transferred >> 16) & 0xFF; + response[12] = (bytes_transferred >> 24) & 0xFF; + + // 总字节数 + response[13] = (g_upgrade_status.firmware_size >> 0) & 0xFF; + response[14] = (g_upgrade_status.firmware_size >> 8) & 0xFF; + response[15] = (g_upgrade_status.firmware_size >> 16) & 0xFF; + response[16] = (g_upgrade_status.firmware_size >> 24) & 0xFF; + + // 错误码 + response[17] = g_upgrade_status.error_code; + + // 发送响应 + send_firmware_upgrade_response(FIRMWARE_UPGRADE_STATUS, response, 18); + + return STATUS_SUCCESS; +} + +// 处理ABORT命令 +// 改动原因:中止固件升级流程,清理资源,可选择是否擦除已写入数据 +unsigned char handle_firmware_upgrade_abort(uint8_t data[], uint16_t len) +{ + uint8_t response[64] = {0}; + + // 解析清理标志 + uint8_t erase_flag = data[2]; + + debug_printf("Firmware upgrade ABORT: erase_flag=0x%02x\n", erase_flag); + + // 如果设置了擦除标志,擦除已写入的数据 + if (erase_flag == 0x01) { + debug_printf("Firmware upgrade: erasing written data\n"); + dfu_flash_cmd_erase_all(); + } + + // 关闭Flash接口 + dfu_flash_cmd_deinit(); + + // 重置升级状态 + firmware_upgrade_reset(); + g_upgrade_status.state = UPGRADE_ABORTED; + + // 构建响应数据包 + response[0] = STATUS_SUCCESS; // 状态码:成功 + + // 发送响应 + send_firmware_upgrade_response(FIRMWARE_UPGRADE_ABORT, response, 1); + /* 改动原因:通知 MCU 固件升级已中止/失败 */ + g_firmware_upgrade_mcu_notify = 3; + g_in_fw_upgrade = 0; + // 重置为IDLE状态 + g_upgrade_status.state = UPGRADE_IDLE; + return STATUS_SUCCESS; +} + +// 处理ERASE命令 +// 改动原因:擦除Flash中的现有upgrade image,为新固件腾出空间,并执行第一页写命令 +unsigned char handle_firmware_upgrade_erase(uint8_t data[], uint16_t len) +{ + uint8_t response[64] = {0}; + + debug_printf("Firmware upgrade ERASE: erasing all upgrade images\n"); + + // 初始化Flash接口 + if (dfu_flash_cmd_init() != 0) { + debug_printf("Firmware upgrade error: flash init failed\n"); + response[0] = STATUS_FAIL; // 状态码:失败 + send_firmware_upgrade_response(FIRMWARE_UPGRADE_ERASE, response, 1); + return STATUS_FAIL; + } + + // 擦除所有upgrade image(避免重复擦除) + if (g_first_page_write_executed == 0 && g_flash_erased == 0) { + dfu_flash_cmd_erase_all(); + g_flash_erased = 1; + } else { + debug_printf("Firmware upgrade ERASE: erase skipped (already erased or begin_write started)\n"); + } + + dfu_flash_cmd_deinit(); + + // 构建响应数据包 + response[0] = STATUS_SUCCESS; // 状态码:成功 + + // 发送响应 + send_firmware_upgrade_response(FIRMWARE_UPGRADE_ERASE, response, 1); + + return STATUS_SUCCESS; +} + +// 固件升级主处理函数 +// 改动原因:处理所有HID固件升级命令,分发到相应的处理函数 +// 参数: +// - data: HID数据包(63字节,不包括Report ID) +// - len: 数据长度 +// 返回值:0=成功,非0=失败 +unsigned char process_firmware_upgrade_cmd(uint8_t data[], uint16_t len) +{ + // 检查同步头 + if (data[0] != 0x77) { + debug_printf("Firmware upgrade error: invalid sync header 0x%02x\n", data[0]); + return STATUS_FAIL; + } + + // 提取命令码 + uint8_t cmd = data[1]; + + // 改动原因:添加调试打印,显示收到的命令数据(16进制格式) + // 注意:data是63字节(不包括Report ID),但HID实际接收的是64字节(包括Report ID 0x01) + // 为了完整显示,我们需要构建完整的64字节数据包 + uint8_t full_packet[64]; + full_packet[0] = 0x01; // Report ID + memcpy(&full_packet[1], data, (len < 63) ? len : 63); // 复制数据 + + char prefix[64]; + debug_printf(prefix, sizeof(prefix), "[Device Receive] Command (0x%02X)", cmd); + debug_print_hex(prefix, full_packet, 64, 64); + + debug_printf("Firmware upgrade command: 0x%02x\n", cmd); + + // 根据命令码分发处理 + switch (cmd) { + case FIRMWARE_UPGRADE_START: + return handle_firmware_upgrade_start(data, len); + + case FIRMWARE_UPGRADE_DATA: + return handle_firmware_upgrade_data(data, len); + + case FIRMWARE_UPGRADE_END: + return handle_firmware_upgrade_end(data, len); + + case FIRMWARE_UPGRADE_STATUS: + return handle_firmware_upgrade_status(data, len); + + case FIRMWARE_UPGRADE_ABORT: + return handle_firmware_upgrade_abort(data, len); + + case FIRMWARE_UPGRADE_ERASE: + return handle_firmware_upgrade_erase(data, len); + + case DEVICE_REBOOT: + return handle_device_reboot(data, len); + + default: + debug_printf("Firmware upgrade error: unknown command 0x%02x\n", cmd); + return STATUS_FAIL; + } +} + +#endif + +#if UART_DFU_EN + +// ====================== UART DFU 友好接口实现 ====================== +// 改动原因:为 UART 串口升级提供不依赖 g_hid_pass_data 的接口, +// 内部仍然构造 HID 风格的数据包并调用上述 handle_* 函数, +// 但通过 g_upgrade_status 等内部状态将结果以参数形式返回给 UART 层。 + +// UART 版 START:输入固件原始大小,返回对齐后的大小和总块数 +unsigned char uart_firmware_upgrade_start(uint32_t firmware_size, + uint32_t *aligned_size_out, + uint16_t *total_blocks_out) +{ + uint8_t hid_data[63] = {0}; + + // 构造与 HID 升级 START 相同的数据布局: + // [0]=0x77, [1]=FIRMWARE_UPGRADE_START, [2..5]=firmware_size + hid_data[0] = 0x77; + hid_data[1] = FIRMWARE_UPGRADE_START; + hid_data[2] = (firmware_size >> 0) & 0xFF; + hid_data[3] = (firmware_size >> 8) & 0xFF; + hid_data[4] = (firmware_size >> 16) & 0xFF; + hid_data[5] = (firmware_size >> 24) & 0xFF; + + unsigned char status = handle_firmware_upgrade_start(hid_data, 63); + + if (status == STATUS_SUCCESS) { + if (aligned_size_out != NULL) { + *aligned_size_out = g_upgrade_status.firmware_size; + } + if (total_blocks_out != NULL) { + *total_blocks_out = g_upgrade_status.total_blocks; + } + } + + return status; +} + +// UART 版 DATA:输入块号和数据,返回状态码和“确认的块号” +unsigned char uart_firmware_upgrade_data(uint16_t block_num, + uint8_t data_len, + const uint8_t *data, + uint16_t *confirmed_block_out) +{ + uint8_t hid_data[63] = {0}; + + // 构造 HID DATA 报文: + // [0]=0x77, [1]=FIRMWARE_UPGRADE_DATA, [2..3]=block_num, [4]=data_len, [5..]=data, [5+len]=checksum + hid_data[0] = 0x77; + hid_data[1] = FIRMWARE_UPGRADE_DATA; + hid_data[2] = (uint8_t)((block_num >> 0) & 0xFF); + hid_data[3] = (uint8_t)((block_num >> 8) & 0xFF); + hid_data[4] = data_len; + + if (data != NULL && data_len > 0) { + uint8_t copy_len = (data_len > MAX_DATA_BLOCK_SIZE) ? MAX_DATA_BLOCK_SIZE : data_len; + memcpy(&hid_data[5], data, copy_len); + } + + // 计算 checksum(同步头+命令码+块序号+长度+数据) + uint8_t checksum = check_sum(hid_data, (unsigned)(5 + data_len)); + hid_data[5 + data_len] = checksum; + + unsigned char status = handle_firmware_upgrade_data(hid_data, (uint16_t)(5 + data_len + 1)); + + if (confirmed_block_out != NULL) { + if (status == STATUS_SUCCESS) { + // 成功时,确认块号即为当前块号 + *confirmed_block_out = block_num; + } else if (status == STATUS_BLOCK_NUM_ERROR) { + // 序号错误时,返回期望的块号,便于上位机打印“期望块号” + *confirmed_block_out = g_upgrade_status.expected_block_num; + } else { + *confirmed_block_out = block_num; + } + } + + return status; +} + +// UART 版 END:结束升级,写入最后一页并终止 Flash 写入 +unsigned char uart_firmware_upgrade_end(uint32_t firmware_size) +{ + uint8_t hid_data[63] = {0}; + + hid_data[0] = 0x77; + hid_data[1] = FIRMWARE_UPGRADE_END; + hid_data[2] = (firmware_size >> 0) & 0xFF; + hid_data[3] = (firmware_size >> 8) & 0xFF; + hid_data[4] = (firmware_size >> 16) & 0xFF; + hid_data[5] = (firmware_size >> 24) & 0xFF; + + return handle_firmware_upgrade_end(hid_data, 63); +} + +// UART 版 STATUS:从 g_upgrade_status 中读取当前状态和进度 +unsigned char uart_firmware_upgrade_status(uint8_t *state_out, + uint16_t *received_blocks_out, + uint16_t *total_blocks_out, + uint16_t *written_pages_out, + uint16_t *total_pages_out, + uint32_t *bytes_transferred_out, + uint32_t *firmware_size_out, + uint8_t *error_code_out) +{ + if (state_out != NULL) { + *state_out = (uint8_t)g_upgrade_status.state; + } + if (received_blocks_out != NULL) { + *received_blocks_out = g_upgrade_status.received_blocks; + } + if (total_blocks_out != NULL) { + *total_blocks_out = g_upgrade_status.total_blocks; + } + if (written_pages_out != NULL) { + *written_pages_out = g_upgrade_status.page_buf.written_pages; + } + if (total_pages_out != NULL) { + *total_pages_out = g_upgrade_status.page_buf.total_pages; + } + if (bytes_transferred_out != NULL) { + *bytes_transferred_out = (uint32_t)g_upgrade_status.received_blocks * (uint32_t)MAX_DATA_BLOCK_SIZE; + } + if (firmware_size_out != NULL) { + *firmware_size_out = g_upgrade_status.firmware_size; + } + if (error_code_out != NULL) { + *error_code_out = g_upgrade_status.error_code; + } + + return STATUS_SUCCESS; +} + +// UART 版 ABORT:中止升级 +unsigned char uart_firmware_upgrade_abort(uint8_t erase_flag) +{ + uint8_t hid_data[63] = {0}; + + hid_data[0] = 0x77; + hid_data[1] = FIRMWARE_UPGRADE_ABORT; + hid_data[2] = erase_flag; + + return handle_firmware_upgrade_abort(hid_data, 63); +} + +// UART 版 ERASE:擦除现有 upgrade image +unsigned char uart_firmware_upgrade_erase(void) +{ + uint8_t hid_data[63] = {0}; + + hid_data[0] = 0x77; + hid_data[1] = FIRMWARE_UPGRADE_ERASE; + + return handle_firmware_upgrade_erase(hid_data, 63); +} +#endif \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_upgrade.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_upgrade.h new file mode 100644 index 0000000..1d7cbd5 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_upgrade.h @@ -0,0 +1,153 @@ +// Copyright 2026 Shanling. +// HID固件升级头文件 +// 改动原因:实现通过HID协议进行固件升级的功能,提供高效、稳定、安全的升级方案 + +#ifndef _DFU_UPGRADE_H_ +#define _DFU_UPGRADE_H_ + +#include + +// 固件升级命令定义 +#define FIRMWARE_UPGRADE_START 0xA7 // 开始固件升级 +#define FIRMWARE_UPGRADE_DATA 0xA8 // 传输固件数据块 +#define FIRMWARE_UPGRADE_END 0xA9 // 结束固件升级 +#define FIRMWARE_UPGRADE_STATUS 0xAA // 获取升级状态 +#define FIRMWARE_UPGRADE_ABORT 0xAB // 中止固件升级 +#define FIRMWARE_UPGRADE_ERASE 0xAC // 擦除现有升级镜像 +#define DEVICE_REBOOT 0xAE // 设备重启(通用命令,不仅限于固件升级) + +// 升级状态定义 +typedef enum { + UPGRADE_IDLE = 0x00, // 空闲状态,未开始升级 + UPGRADE_PREPARING = 0x01, // 准备状态,已调用START + UPGRADE_TRANSFERRING = 0x02, // 传输状态,正在接收数据 + UPGRADE_COMPLETING = 0x03, // 完成中,正在写入最后一页 + UPGRADE_COMPLETED = 0x04, // 已完成,升级成功 + UPGRADE_ERROR = 0x05, // 错误状态,升级失败 + UPGRADE_ABORTED = 0x06 // 已中止,升级被中止 +} upgrade_state_t; + +// 状态码定义 +#define STATUS_SUCCESS 0x00 // 成功 +#define STATUS_FAIL 0x01 // 失败 +#define STATUS_SPACE_INSUFFICIENT 0x02 // Flash空间不足 +#define STATUS_SIZE_INVALID 0x03 // 大小无效 +#define STATUS_BLOCK_NUM_ERROR 0x04 // 块序号错误 +#define STATUS_CHECKSUM_ERROR 0x05 // Checksum错误 +#define STATUS_DATA_INCOMPLETE 0x06 // 数据不完整 +#define STATUS_VERSION_INVALID 0x08 // 版本号无效 +#define STATUS_SIZE_MISMATCH 0x09 // 大小不匹配 + +// Flash参数 +#define FLASH_PAGE_SIZE 256 // Flash页大小 +// 改动原因:修正最大数据块大小,HID数据包63字节(不包括Report ID) +// 数据包格式:同步头(1) + 命令码(1) + 块序号(2) + 数据长度(1) + 数据(N) + Checksum(1) +// 所以最大数据长度 = 63 - 5(头部) - 1(Checksum) = 57字节 +#define MAX_DATA_BLOCK_SIZE 57 // 最大数据块大小(63字节HID数据包 - 5字节头部 - 1字节Checksum) +#define FLASH_MAX_UPGRADE_SIZE (2000 * 1024) // 最大固件大小1400KB + +// 页缓冲区结构 +typedef struct { + uint8_t buffer[FLASH_PAGE_SIZE]; // Flash页缓冲区 + uint16_t offset; // 当前偏移 + uint16_t total_pages; // 总页数 + uint16_t written_pages; // 已写入页数 +} page_buffer_t; + +// 升级状态结构 +typedef struct { + upgrade_state_t state; // 当前状态 + uint32_t firmware_size; // 固件总大小 + uint16_t total_blocks; // 总块数 + uint16_t received_blocks; // 已接收块数 + uint16_t expected_block_num; // 期望的块序号 + // 改动原因:去掉固件版本号字段,不再存储版本号 + uint8_t error_code; // 错误码 + page_buffer_t page_buf; // 页缓冲区 + uint8_t first_page_written; // 第一页写命令是否已执行(0=未执行,1=已执行) +} upgrade_status_t; + +// 固件升级主处理函数 +// 改动原因:处理HID固件升级命令,支持START、DATA、END等命令 +// 参数: +// - data: HID数据包(63字节,不包括Report ID) +// - len: 数据长度 +// 返回值:0=成功,非0=失败 +unsigned char process_firmware_upgrade_cmd(uint8_t data[], uint16_t len); + +/* 改动原因:声明 DFU channel 转发函数,供 eq.c (process_send_params) 调用, + * 将 HID 固件升级命令通过 streaming channel 转发到 uart_handler 处理。 + * 实现在 audiohw.xc 中。 */ +void dfu_chan_forward(unsigned char data[], unsigned len); + +// 各个固件升级命令的独立处理函数 +// 改动原因:在eq.c中为每个命令添加独立处理,支持HID一条一条指令发送 +// 参数: +// - data: HID数据包(63字节,不包括Report ID) +// - len: 数据长度 +// 返回值:0=成功,非0=失败(状态码) +unsigned char handle_firmware_upgrade_start(uint8_t data[], uint16_t len); +unsigned char handle_firmware_upgrade_data(uint8_t data[], uint16_t len); +unsigned char handle_firmware_upgrade_end(uint8_t data[], uint16_t len); +unsigned char handle_firmware_upgrade_status(uint8_t data[], uint16_t len); +unsigned char handle_firmware_upgrade_abort(uint8_t data[], uint16_t len); +unsigned char handle_firmware_upgrade_erase(uint8_t data[], uint16_t len); + +// 发送固件升级响应(主动上报) +// 改动原因:通过HID主动上报机制发送响应,与音量上报机制一致 +// 参数: +// - cmd: 命令码 +// - response_data: 响应数据 +// - data_len: 响应数据长度 +void send_firmware_upgrade_response(uint8_t cmd, uint8_t *response_data, uint16_t data_len); + +// 初始化固件升级模块 +// 改动原因:初始化升级状态和缓冲区 +void firmware_upgrade_init(void); + +// 获取当前升级状态 +// 改动原因:供外部查询当前升级状态 +upgrade_state_t firmware_upgrade_get_state(void); + +// 重置升级状态 +// 改动原因:升级完成或中止后重置状态 +void firmware_upgrade_reset(void); + +// ====================== UART DFU 友好接口 ====================== +// 改动原因:为 UART 串口升级提供不依赖 g_hid_pass_data 的接口, +// 内部仍然复用 HID DFU 的状态机和 Flash 写入流程。 +// +// 这些函数只操作内部的 g_upgrade_status,并通过参数返回需要的字段, +// 方便 user_uart.xc 根据 UART 协议打包响应。 + +// UART 版 START:输入固件原始大小,返回对齐后的大小和总块数 +unsigned char uart_firmware_upgrade_start(uint32_t firmware_size, + uint32_t *aligned_size_out, + uint16_t *total_blocks_out); + +// UART 版 DATA:输入块号和数据,返回状态码和“确认的块号”(成功时等于块号,序号错误时为期望块号) +unsigned char uart_firmware_upgrade_data(uint16_t block_num, + uint8_t data_len, + const uint8_t *data, + uint16_t *confirmed_block_out); + +// UART 版 END:结束升级,写入最后一页并终止 Flash 写入 +unsigned char uart_firmware_upgrade_end(uint32_t firmware_size); + +// UART 版 STATUS:直接从 g_upgrade_status 中读取当前状态和进度 +unsigned char uart_firmware_upgrade_status(uint8_t *state_out, + uint16_t *received_blocks_out, + uint16_t *total_blocks_out, + uint16_t *written_pages_out, + uint16_t *total_pages_out, + uint32_t *bytes_transferred_out, + uint32_t *firmware_size_out, + uint8_t *error_code_out); + +// UART 版 ABORT:中止升级,可选择是否擦除已写入数据 +unsigned char uart_firmware_upgrade_abort(uint8_t erase_flag); + +// UART 版 ERASE:擦除现有 upgrade image 并执行 begin_write 初始化 +unsigned char uart_firmware_upgrade_erase(void); + +#endif // _DFU_UPGRADE_H_ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/aizip_dnr.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/aizip_dnr.h new file mode 100644 index 0000000..d666da9 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/aizip_dnr.h @@ -0,0 +1,55 @@ +#ifndef AZP_H_ +#define AZP_H_ + + +#include "stdint.h" + +typedef enum +{ + errAZP_NoError = 0, // No error + errAZP_NotReady, // Not ready + errAZP_InvalidParam, // Invalid parameter + errAZP_InvalidLicense, // Invalid license + errAZP_BufferOverflow, // Buffer overflow + errAZP_BufferTooSmall, // Buffer too small +} AZP_STATUS; + +typedef struct +{ + int8_t *buffer1; // Pointer to the first buffer + int8_t *buffer2; // Pointer to the second buffer + int32_t buffer1_size; // Size of the first buffer + int32_t buffer2_size; // Size of the second buffer + int32_t sample_rate; // Sample rate, only support 16000Hz +} azp_dnr_param_t; + +/// @brief DNR initialization +/// @param param Configuration parameters +/// @return License status +/// @brief DNR initialization +/// @param param Configuration parameters +/// @return License status +AZP_STATUS AI_DNR_init(azp_dnr_param_t *param); + +/// @brief DNR processing +/// @param audio Q31 input and output +/// @return License status +AZP_STATUS AI_DNR_Processing(int32_t *audio); + +/// @brief Get version number +/// @return If not licensed, returns NULL +char *AI_DNR_Version(); + +/// @brief Get the size of the working buffers +/// @param buf_size Size of the first buffer +/// @param buf_size2 Size of the second buffer +void getBufferSize(int32_t *buf_size, int32_t *buf_size2); + +/// @brief Set the noise reduction depth +/// @param dB Range (-200 to 0 dB) +/// -200: Maximum noise reduction +/// 0: No noise reduction +void setNoisy_mix_factor(float dB); + + +#endif // AZP_H_ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp.c new file mode 100644 index 0000000..1f2a3c2 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp.c @@ -0,0 +1,52 @@ +// Copyright 2016-2021 XMOS LIMITED. +// This Software is subject to the terms of the XMOS Public Licence: Version 1. + +#if UART_DEBUG || DEBUG_MEMORY_LOG_ENABLED +#define DEBUG_PRINT_ENABLE 1 +#endif + +#include +#include +#include "ringbuf.h" +#include +#include +#include "dnr_dsp_buf.h" +#include "xc_ptr.h" +#include "debug_print.h" + +unsigned g_dsp_eof = 0; +void dnr_exchange_buffer(int32_t *data) { + static unsigned buff_index = 0; + write_to_sample_in_buf(data[1], buff_index, 0); + read_from_sample_out_buf(&data[1],buff_index, 0); + data[0] = data[1]; + + buff_index++; +#if DNR_11MS + if (buff_index == 128) + { +#else + if (buff_index == 512) + { +#endif + buf_slot_rotate(); + buff_index = 0; + SET_SHARED_GLOBAL(g_dsp_eof, 1); + } +} + + +void Aizip_DNR_init(void); + +void dnr_dsp_proc_task(void) +{ + Aizip_DNR_init(); + while(1) { + unsigned dsp_eof = 0; + GET_SHARED_GLOBAL(dsp_eof, g_dsp_eof); + if (dsp_eof) { + SET_SHARED_GLOBAL(g_dsp_eof, 0); + start_dsp_processing(); + } + } +} diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp_buf.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp_buf.c new file mode 100644 index 0000000..6fa18b1 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp_buf.c @@ -0,0 +1,95 @@ +// Copyright 2011-2023 XMOS LIMITED. +// +// This Software is subject to the terms of the XMOS Public Licence: Version 1. + +#if UART_DEBUG || DEBUG_MEMORY_LOG_ENABLED +#define DEBUG_PRINT_ENABLE 1 +#endif + +#include +#include +#include +#include +#include +#include +#include "dnr_dsp_buf.h" +#include "aizip_dnr.h" +#include "debug_print.h" +#include "flash.h" + +//for AGC +//static agc_stage_ctx_t DWORD_ALIGNED agc_stage_state = {}; + +static unsigned __attribute__((aligned (4))) dsp_dnr_frame_buf[BUF_SLOT_NUM][DSP_CH_NUM][DNR_DSP_FRAME_SIZE]; + +unsigned sample_in_buf_slot=0; +unsigned processing_buf_slot=2; +unsigned sample_out_buf_slot=1; + + +void dsp_buf_init() +{ + sample_in_buf_slot=0; + sample_out_buf_slot=1; + processing_buf_slot=2; +} + +static void buf_slot_inc(unsigned* buf_slot_input) +{ + if(*buf_slot_input == BUF_SLOT_NUM-1){ + *buf_slot_input = 0; + } + else{ + *buf_slot_input = *buf_slot_input+1; + } +} + +void buf_slot_rotate() +{ + buf_slot_inc(&sample_in_buf_slot); + buf_slot_inc(&sample_out_buf_slot); + buf_slot_inc(&processing_buf_slot); +} + +void write_to_sample_in_buf(unsigned data, unsigned index, unsigned ch) +{ + dsp_dnr_frame_buf[sample_in_buf_slot][ch][index]=data; +} + +void read_from_sample_out_buf(unsigned* read_data, unsigned index, unsigned ch) +{ + *read_data = dsp_dnr_frame_buf[sample_out_buf_slot][ch][index]; +} +#if DNR_11MS +int8_t buffer[4208] __attribute__((aligned(4))); +int8_t buffer2[31136] __attribute__((aligned(4))); +#else +int8_t buffer[21416] __attribute__((aligned(4))); +int8_t buffer2[31712] __attribute__((aligned(4))); +#endif +azp_dnr_param_t pram = { + .buffer1 = buffer, + .buffer1_size = sizeof(buffer), + .buffer2 = buffer2, + .buffer2_size = sizeof(buffer2), + .sample_rate = 48000}; + +unsigned dnr_init_flag = 0; +void Aizip_DNR_init(void) +{ + delay_microseconds(10000); + // setFlashPortPins(XS1_PORT_1B,XS1_PORT_1C,XS1_PORT_4B, XS1_CLKBLK_3); + + int sta = AI_DNR_init(&pram); + dnr_init_flag = 1; + debug_printf("AI_DNR_init status %d\n", sta); +} + +void start_dsp_processing(void) +{ + float level = -200; + + setNoisy_mix_factor(level); + + AI_DNR_Processing((int32_t *)&dsp_dnr_frame_buf[processing_buf_slot][0][0]); +} diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp_buf.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp_buf.h new file mode 100644 index 0000000..61d2edd --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp_buf.h @@ -0,0 +1,39 @@ +// Copyright 2011-2023 XMOS LIMITED. +// This Software is subject to the terms of the XMOS Public Licence: Version 1. +#ifndef __DNR_DSP_BUF_H__ +#define __DNR_DSP_BUF_H__ + +#include +#include +#include +#include +#include +#include +#include +#if DNR_11MS +#define DNR_DSP_FRAME_SIZE 128 +#else +#define DNR_DSP_FRAME_SIZE 512 +#endif +#define BUF_SLOT_NUM 3 //one for input, one for output, one for processing +#define DSP_CH_NUM 2 + +#if __XC__ +extern "C" { +#endif + +void dnr_set_chan(chanend_t dnr_tile0_c, chanend_t dnr_tile1_c); + +void dsp_buf_init(); +void buf_slot_rotate(); +void write_to_sample_in_buf(unsigned data, unsigned index, unsigned ch); +void read_from_sample_out_buf(unsigned* read_data, unsigned index, unsigned ch); + +void start_dsp_processing(void); +void Aizip_DNR_init(void); + +#if __XC__ +} //extern c +#endif +#endif //RINGBUFFER_H + diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/flash.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/flash.h new file mode 100644 index 0000000..9679c5b --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/flash.h @@ -0,0 +1,5 @@ +#ifndef __FLASH_H__ +#define __FLASH_H__ +#include "stdint.h" +void setFlashPortPins(uint32_t cs,uint32_t sclk,uint32_t sio,uint32_t clkblk); +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libbr.a b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libbr.a new file mode 100644 index 0000000..15131a2 Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libbr.a differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libbr2.a b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libbr2.a new file mode 100644 index 0000000..797e59e Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libbr2.a differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libbr_1023_-3db_new.a b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libbr_1023_-3db_new.a new file mode 100644 index 0000000..4a646c0 Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libbr_1023_-3db_new.a differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libbr_1023_-3db_new_2.a b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libbr_1023_-3db_new_2.a new file mode 100644 index 0000000..15afa4a Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libbr_1023_-3db_new_2.a differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libdnr_11ms.a b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libdnr_11ms.a new file mode 100644 index 0000000..0e8849f Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libdnr_11ms.a differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libdnr_50ms.a b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libdnr_50ms.a new file mode 100644 index 0000000..95c9d60 Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libdnr_50ms.a differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libxmos_fps.a b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libxmos_fps.a new file mode 100644 index 0000000..41563b4 Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libxmos_fps.a differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/ringbuf.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/ringbuf.h new file mode 100644 index 0000000..943584f --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/ringbuf.h @@ -0,0 +1,45 @@ +// Copyright 2011-2023 XMOS LIMITED. +// This Software is subject to the terms of the XMOS Public Licence: Version 1. +#ifndef __RINGBUF_H__ +#define __RINGBUF_H__ + +#include +#include +#include +#include +#include + +#if __XC__ +extern "C" { +#endif + +#define FRAME_SIZE 120 //101623 - from 256 to 120 + +#define RF_CHAN_NUM 2 //stereo. Multichannel uses NUM_USB_CHAN_OUT + // +#define RB_SIZE FRAME_SIZE*RF_CHAN_NUM*16 //2 channel, 32-bit, 16 frame +#define RB_MASK (RB_SIZE - 1) + + +extern uint32_t r_buffer[RB_SIZE]; + +typedef struct { + uint32_t * buf_addr; + int next_empty; + int next_data; + int full; + int empty; +} ring_buffer_t; + +void rb_init(void); +void rb_put_word(uint32_t data); +uint32_t rb_get_word(void); +int rb_is_full(void); +int rb_is_empty(void); + +#if __XC__ +} //extern c +#endif + +#endif //RINGBUFFER_H + diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dsp_core0.xc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dsp_core0.xc new file mode 100644 index 0000000..03757cd --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dsp_core0.xc @@ -0,0 +1,196 @@ +#if DEBUG_MEMORY_LOG_ENABLED +#define DEBUG_PRINT_ENABLE 1 +#else +#define DEBUG_PRINT_ENABLE 0 +#endif +#include +#include +#include +#include +#include "xmath/filter.h" +#include "stdio.h" +#include "xc_ptr.h" +#include "eq.h" +#include "share_buffer.h" +#include "debug_print.h" +#include "eq_flash_storage.h" + +#if 0 +#define DPRINTF(...) printf(__VA_ARGS__) +#else +#define DPRINTF(...) +#endif + +#define LEN_FADE_ (2024) + + // EQ Flash存储初始化标志 +int eq_flash_initialized = 0; +extern unsigned int is_mode_changed(void); +extern void change_eq_mode(unsigned sample_freq); +extern unsigned g_samfreq; +extern void clear_eq_status(unsigned sample_freq, unsigned ch_no); +extern unsigned int g_request_eq_mode; +extern unsigned int g_eq_enable; // 改动原因:添加EQ使能开关外部声明,用于初始化时检查EQ状态 +extern unsigned int g_saved_eq_mode; // 改动原因:添加保存模式外部声明,用于初始化时设置保存的模式 +extern void debug_print_eq_params(unsigned sample_freq); +extern uint32_t get_reference_time(void); +extern void update_eq_post_gain(void); + +#pragma unsafe arrays +void dsp_core0(void) +{ + unsigned t0,t1; + static int audio_in_samples[2]; // idx 0: input_samples + static int audio_out_samples[2]; // idx 0: input_samples + static unsigned int usb_to_dsp_ratio = 1; + static int buffer_in_active = 0; + static int buffer_out_active = 0; + static unsigned int sample_freq; + unsigned b_fade_in = 0; + unsigned u_in_step; + unsigned b_fade_out = 0; + unsigned u_out_step; + + // EQ Flash存储初始化标志 + + delay_milliseconds(100); + + +#if EQ_EN + + uint32_t time = get_reference_time(), time2; + // EQ Flash存储初始化 - 只在第一次运行时执行 + if (eq_flash_initialized == 0) { + // 延迟更长时间,确保QSPI Flash完全初始化 + debug_printf("Initializing EQ Flash storage system\n"); + + // 初始化EQ Flash存储系统 + if (eq_flash_init() == 0) { + debug_printf("EQ Flash storage initialized successfully\n"); + init_mode_info(); + eq_load_gain_and_names(); + // 检查Flash中是否有EQ参数数据 + debug_printf("Loading EQ parameters from Flash using simplified storage\n"); + // 简化加载逻辑:每个模式只加载一次,会自动应用到所有采样率和通道 + int loaded_modes = 0; + + for (int mode = EQ_USER_MODE_MIN; mode <= EQ_USER_MODE_MAX; mode++) { + if (eq_load_all_params_and_calculate_coefficients(44100, mode) == 0) { + loaded_modes++; + debug_printf("Loaded mode %d parameters from Flash (applied to all sample rates and channels)\n", mode); + } + } + debug_printf("Loaded %d EQ modes from Flash successfully\n", loaded_modes); + + // 从mode info里获取gain值,并相应的赋值到eq数组的post gain + update_eq_post_gain(); + // 从Flash加载并设置当前EQ模式和使能状态 + // 改动原因:修复EQ开关逻辑问题,确保从Flash加载模式时正确设置g_saved_eq_mode和g_eq_enable + // eq_flash_load_current_mode()会同时加载模式并设置g_eq_enable + int saved_mode_result = eq_flash_load_current_mode(); + + // 改动原因:确保g_eq_enable被正确加载,无论模式加载是否成功 + // eq_flash_load_current_mode()已经设置了g_eq_enable,这里读取确认 + unsigned int eq_enable = g_eq_enable; + + if (saved_mode_result >= 0 && saved_mode_result <= 9) { + uint8_t saved_mode = (uint8_t)saved_mode_result; + debug_printf("Loaded current EQ mode %d and enable %d from Flash\n", saved_mode, eq_enable); + + // 改动原因:将eq_enable独立为全局开关,所有模式共用一个开关 + // 无论EQ是否启用,都设置到Flash中保存的模式,eq_enable只控制EQ处理开关 + g_saved_eq_mode = saved_mode; + SET_SHARED_GLOBAL(g_request_eq_mode, saved_mode); + debug_printf("EQ initialization: Set mode to %d from Flash, EQ enable: %d (global switch, independent of mode)\n", + saved_mode, eq_enable); + } else { + // Flash加载失败时,使用默认模式0,EQ默认禁用 + // 改动原因:如果模式加载失败,确保g_eq_enable也被设置为默认值0 + g_saved_eq_mode = 0; + SET_SHARED_GLOBAL(g_request_eq_mode, 0); + g_eq_enable = 0; + eq_flash_save_eq_enable(0); + eq_enable = 0; // 同步本地变量 + debug_printf("Failed to load EQ mode from Flash, using default mode 0, EQ disabled (enable: %d)\n", eq_enable); + } + + } else { + debug_printf("Failed to initialize EQ Flash storage system, continuing without Flash storage\n"); + // 即使Flash初始化失败,也标记为已初始化,避免重复尝试 + // 系统将继续运行,只是不使用Flash存储功能 + } + + eq_single_param_database_init(); + time2 = get_reference_time(); + debug_printf("EQ Flash storage initialized time %lu\n", time2 - time); + eq_flash_initialized = 1; + } + + while (1) + { + if(is_ring_buffer_empty(0) && is_ring_buffer_empty(1)) + { + // delay_microseconds(1); + } + else + { + sample_freq = g_samfreq; + audio_in_samples[0] = read_from_ring_buffer(0); + audio_in_samples[1] = read_from_ring_buffer(1); + + if (is_mode_changed() && b_fade_out == 0 && b_fade_in == 0) + { + + debug_printf("mode changed ====================== \n"); + //debug_print_eq_params(sample_freq); + b_fade_out=1; + u_out_step=1; + } + + + audio_out_samples[0] = handler_eq_filter(sample_freq, 0, audio_in_samples[0]); + audio_out_samples[1] = handler_eq_filter(sample_freq, 1, audio_in_samples[1]); + + + if(b_fade_out) + { + audio_out_samples[0] /= LEN_FADE_; + audio_out_samples[0] *= (LEN_FADE_-u_out_step) ; + + audio_out_samples[1] /= LEN_FADE_; + audio_out_samples[1] *= (LEN_FADE_-u_out_step) ; + + ++u_out_step; + } + + if(b_fade_out == 1 && u_out_step == LEN_FADE_){ + b_fade_out = 0; + change_eq_mode(sample_freq); + clear_eq_status(sample_freq, 0); + clear_eq_status(sample_freq, 1); + clear_ring_buffer(0); + clear_ring_buffer(1); + b_fade_in=1; + u_in_step=1; + } + + + if (b_fade_in) + { + audio_out_samples[0] /= LEN_FADE_; + audio_out_samples[0] *= (u_in_step) ; + + audio_out_samples[1] /= LEN_FADE_; + audio_out_samples[1] *= (u_in_step); + + if(++u_in_step >= LEN_FADE_){ + b_fade_in = 0; + } + } + + write_to_ring_buffer(2, audio_out_samples[0]); + write_to_ring_buffer(3, audio_out_samples[1]); + } + } +#endif +} diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dsp_wrapper.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dsp_wrapper.c new file mode 100644 index 0000000..f07a547 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dsp_wrapper.c @@ -0,0 +1,164 @@ +#if UART_DEBUG || DEBUG_MEMORY_LOG_ENABLED +#define DEBUG_PRINT_ENABLE 1 +#endif +#include "debug_print.h" +#include "xc_ptr.h" +#include "eq.h" +#include "share_buffer.h" +#if !UAC1 + +unsigned int last_sample_freq = 0; + +void UserBufferManagementInit(unsigned sampFreq) +{ +#if EQ_EN + if (last_sample_freq != sampFreq) + { + last_sample_freq = sampFreq; + if (sampFreq <= 192000) + { + init_eq_data(sampFreq); + clear_all_ring_buffers(); + } + } +#endif +} + +inline unsigned is_silence(const unsigned samps[], int len) +{ + // -30dB阈值:20*log10(threshold/max_value) = -30 + // threshold = max_value * 10^(-30/20) = max_value * 0.0316 + // 对于32位有符号整数,max_value = 2^31-1 ≈ 0x7FFFFFFF + // threshold ≈ 0x7FFFFFFF * 0.0316 ≈ 0x04000000 + const unsigned int SILENCE_THRESHOLD = 0x10100; // 0x30000; // 0x0246b4e3; -35 // 0x04000000; // 约-30dB +#if OPT || COAX + for (int i = 0; i < len; ++i) { + // 正确的绝对值计算:使用条件运算符 + unsigned int abs_val; + if (samps[i] & 0x80000000) { + // 负数:取反加1 + abs_val = ~samps[i] + 1; + } else { + // 正数:直接使用 + abs_val = samps[i]; + } + + // 检查是否超过静音阈值 + if (abs_val > SILENCE_THRESHOLD) { + //static int count = 0; + //count++; + // if (count % 1000000 == 0) + // debug_printf("abs_val %08x, %08x\n", abs_val, samps[i]); + return 0; // 不是静音 + } + } +#else + for (int i = 0; i < len; ++i) { + if (samps[i] != 0x00000000 ) + return 0; + } +#endif + return 1; // 是静音 +} + +extern unsigned g_samfreq; +int amp_muted = 0; + +extern void mute_dac(void); +void unmute_dac(void); +void unmute_spdif_led(void); +void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[]) +{ + static unsigned mute_count = 0; + static unsigned unmute_count = 0; + static unsigned mute_threshold = 200000; // 静音阈值 + static unsigned unmute_threshold = 1000; // 取消静音阈值,可根据实际调整 + static unsigned unmute_delay = 1000; + static unsigned old_samfreq = 0; + unsigned samfreq; + GET_SHARED_GLOBAL(samfreq, g_samfreq); + if (samfreq <= 192000) + { + if (samfreq != old_samfreq) + { + old_samfreq = samfreq; + mute_count = 0; + unmute_count = 0; + mute_threshold = samfreq / 2; + unmute_threshold = samfreq / 50; + unmute_delay = samfreq / 200; + amp_muted = 1; + debug_printf("samFreq %d and mute\n", samfreq); + #if !OPT && !COAX + mute_dac(); + #else + mute_dac(); + #endif + } + + if (is_silence(sampsFromUsbToAudio, 2)) + { + mute_count++; + if ((mute_count > unmute_delay) && (unmute_count != 0)) + { + unmute_count = 0; + debug_printf("mute_count %d\n", mute_count); + } + if (mute_count >= mute_threshold && !amp_muted) { + //mute_amp(); + amp_muted = 1; + #if !OPT && !COAX + // sampsFromUsbToAudio[0] = 0; + // sampsFromUsbToAudio[1] = 0; + // mute_dac(); + #else + //mute_dac(); + #endif + //debug_printf("AMP Muted\n"); + } + } + else + { + unmute_count++; + if (unmute_count > unmute_delay) + { + mute_count = 0; + debug_printf("unmute_count %d\n", unmute_count); + } + if (unmute_count >= unmute_threshold) { + //unmute_amp(); + amp_muted = 0; + #if !OPT && !COAX + unmute_dac(); + #else + unmute_dac(); + unmute_spdif_led(); + #endif + //debug_printf("AMP Unmuted\n"); + } + } +#if EQ_EN + + unsigned eq_enable; + GET_SHARED_GLOBAL(eq_enable, g_eq_enable); + if (eq_enable == 0) + { + return; + } + else + { + write_to_ring_buffer(0, sampsFromUsbToAudio[0]); + write_to_ring_buffer(1, sampsFromUsbToAudio[1]); + + sampsFromUsbToAudio[0] = read_from_ring_buffer(2); + sampsFromUsbToAudio[1] = read_from_ring_buffer(3); + } +#endif + } + else + { + mute_count = 0; + unmute_count = 0; + } +} +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq.c new file mode 100644 index 0000000..c64344f --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq.c @@ -0,0 +1,4138 @@ +#if DEBUG_MEMORY_LOG_ENABLED +#define DEBUG_PRINT_ENABLE 0 +#else +#define DEBUG_PRINT_ENABLE 0 +#endif +#include "debug_print.h" +#include "xc_ptr.h" +#include // 添加offsetof宏支持 +#include // 添加数学函数支持 +#include +#include "version.h" + +#if 0 // DEBUG_PRINT_ENABLE +#define DPRINTF(...) printf(__VA_ARGS__) +#else +#define DPRINTF(...) +#endif + +void device_reboot(void); +extern void SetRoleSwitchFlag(unsigned mode); +extern unsigned g_3d_fps; +unsigned g_log_switch = 1; + +// 常量定义 +#define EQ_DISABLED_MODE 10 // 禁用EQ的模式编号 + +#include "xmath/filter.h" +#include "eq.h" +#include +#include +#include +#if !UAC1 +#include "eq_params_44100.h" + +// 改动原因:进一步优化EQ参数存储策略,所有采样率共用44100Hz数组 +// 参数在所有采样率下是相同的,只有系数需要根据采样率动态计算 +// 切换采样率时,直接使用44100Hz数组的参数,重新计算系数即可 +/** + * @brief 获取指定采样率的EQ数组指针(统一使用44100Hz数组) + * @param sample_rate 采样率 + * @return EQ数组指针,始终返回44100Hz数组 + * + * 改动原因:所有采样率共用44100Hz数组,参数相同,系数根据采样率动态计算 + */ +static inline eq_mode_data_t (*get_eq_array_ptr_common(uint32_t sample_rate))[NUM_EQ_MODES][NUM_EQ_CHANS] { + // 所有采样率都使用44100Hz数组(参数源) + // 注意:切换采样率时需要重新计算系数 + return &sEQ_data_44100HZ; +} +#include "eq_coefficient_calculator.h" +#include "biquad_standalone.h" +#include "eq_flash_storage.h" +#endif +#include "user_func.h" // 改动原因:包含check_sum函数声明,用于uart_checksum宏定义 +#include "dfu_upgrade.h" // 改动原因:包含固件升级函数声明,用于处理HID固件升级命令 +#include "roleswitchflag.h" +static struct { + bool is_read_device_params_request; // 设备参数读取请求标志 +} device_params_request = {0}; +static struct { + bool is_get_led_info_request; // GET_LED_INFO请求标志 + bool is_get_led_switch_request; // GET_LED_SWITCH请求标志 + bool is_set_led_switch_request; // SET_LED_SWITCH请求标志(用于响应) + bool is_get_led_status_request; // GET_LED_STATUS请求标志 + bool is_get_led_count_request; // GET_LED_COUNT请求标志 + uint8_t led_index; // LED索引 +} led_request = {0}; +static struct { + bool is_get_uac_mode_info_request; // GET_UAC_MODE_INFO请求标志 + bool is_get_current_uac_mode_request; // GET_CURRENT_UAC_MODE请求标志 +} uac_request = {0}; + +#if EQ_EN + +#if 0 +void print_float(float value, int precision) +{ + // 处理负数 + if (value < 0) { + DPRINTF('-'); + value = -value; + } + + // 整数部分 + int32_t int_part = (int32_t)value; + DPRINTF("%d", int_part); + + // 打印小数点 + DPRINTF('.'); + + // 小数部分 + float frac = value - (float)int_part; + for (int i = 0; i < precision; i++) { + frac *= 10.0f; + int digit = (int)frac; + DPRINTF("%d", digit); + frac -= digit; + } +} + +#else + +void print_float(float value, int precision) +{ +} + +#endif + +unsigned int g_current_eq_mode = 0; +unsigned int g_request_eq_mode = 8; +unsigned int g_new_eq_mode = 9; +unsigned int g_eq_sample_rate = 0; +unsigned int g_force_eq_mode_change = 0; +unsigned int g_force_request_eq_mode_change = 0; +unsigned int g_eq_enable = 0; // EQ使能开关,1=启用,0=禁用,默认启用 +unsigned int g_saved_eq_mode = 9; // 保存之前的EQ模式,用于恢复,默认bypass模式 + +eq_mode_data_t eq_hid_params; + +// 全局模式信息存储 - 只存储NUM_EQ_MODES条信息 +eq_mode_info_t g_mode_info = {0}; + +static struct { + uint32_t sample_rate; + uint8_t mode; + uint8_t eq_index; + bool is_read_request; + bool is_read_mode_request; + uint8_t read_mode_request_mode; // 改动原因:添加0x8B命令的mode参数存储,0xFF表示获取当前模式,0-9表示获取指定模式 + bool is_read_device_info_request; + bool is_reset_eq_params_request; + bool is_read_mode_count_request; // 新增:获取模式总数请求标志 + bool is_set_and_save_mode_request; // 新增:设置并保存模式请求标志 + bool is_read_volume_request; // 改动原因:添加读取音量请求标志,用于EQ命令中的GET_VOLUME (0x94) + bool is_set_eq_enable_request; // 改动原因:添加设置EQ使能请求标志,用于SET_EQ_ENABLE (0x9D) + bool is_get_eq_enable_request; // 改动原因:添加获取EQ使能请求标志,用于GET_EQ_ENABLE (0x9E) + uint8_t eq_enable_value; // 改动原因:添加EQ使能值存储,用于SET_EQ_ENABLE命令 + bool is_read_sample_format_request; // 改动原因:添加读取采样率和格式请求标志,用于GET_SAMPLE_FORMAT (0x9F) + bool is_get_gain_mode_request; // 改动原因:添加获取增益模式请求标志,用于GET_GAIN_MODE (0xA1) + bool is_get_filter_mode_request; // 改动原因:添加获取滤波器模式请求标志,用于GET_FILTER_MODE (0xA3) + bool is_get_game_mode_request; // 改动原因:添加获取游戏模式请求标志,用于GET_GAME_MODE (0xA5) + bool is_get_firmware_version_request; // 改动原因:添加获取固件版本请求标志,用于GET_FIRMWARE_VERSION (0xA6) + bool is_get_mute_switch_request; // 改动原因:添加获取静音开关请求标志,用于GET_MUTE_SWITCH (0xB2),值由MCU通过UART 0x5F返回 + bool is_get_listen_switch_request; // 改动原因:添加获取监听开关请求标志,用于GET_LISTEN_SWITCH (0xB4),直接读 g_adc_loop + int32_t post_gain_db; +} read_request = {0}; + +static const int32_t attenuation_lookup_table[255] = { +0x46CB697E, // 0 37.0 +0x42D59AB2, // 1 36.5 +0x3F18820D, // 2 36.0 +0x3B90F36C, // 3 35.5 +0x383BF01B, // 4 35.0 +0x3516A44B, // 5 34.5 +0x321E64A7, // 6 34.0 +0x2F50AC17, // 7 33.5 +0x2CAB1996, // 8 33.0 +0x2A2B6E34, // 9 32.5 +0x27CF8B27, // 10 32.0 +0x25957003, // 11 31.5 +0x237B3907, // 12 31.0 +0x217F1D80, // 13 30.5 +0x1F9F6E49, // 14 30.0 +0x1DDA945A, // 15 29.5 +0x1C2F0F70, // 16 29.0 +0x1A9B74C6, // 17 28.5 +0x191E6DE4, // 18 28.0 +0x17B6B778, // 19 27.5 +0x16632049, // 20 27.0408 +0x1522882D, // 21 26.5 +0x13F3DF1C, // 22 26.0 +0x12D62444, // 23 25.5 +0x11C86531, // 24 25.0 +0x10C9BD00, // 25 24.5 +0x0FD9539A, // 26 24.0 +0x0EF65CFF, // 27 23.5 +0x0E20189A, // 28 23.0 +0x0D55D09B, // 29 22.5 +0x0C96D95B, // 30 22.0 +0x0BE290D1, // 31 21.5 +0x0B385E03, // 32 21.0 +0x0A97B085, // 33 20.5 +0x0A000000, // 34 20.0 +0x0970CBBC, // 35 19.5 +0x08E99A36, // 36 19.0 +0x0869F8B8, // 37 18.5 +0x07F17AF3, // 38 18.0 +0x077FBAAB, // 39 17.5 +0x07145759, // 40 17.0 +0x06AEF5DE, // 41 16.5 +0x064F4034, // 42 16.0 +0x05F4E524, // 43 15.5 +0x059F9802, // 44 15.0 +0x054F106D, // 45 14.5 +0x05030A10, // 46 14.0 +0x04BB4468, // 47 13.5 +0x0477828F, // 48 13.0 +0x04378B05, // 49 12.5 +0x03FB2783, // 50 12.0 +0x03C224CD, // 51 11.5 +0x038C5280, // 52 11.0 +0x035982F3, // 53 10.5 +0x03298B07, // 54 10.0 +0x02FC4209, // 55 9.5 +0x02D1818B, // 56 9.0 +0x02A92547, // 57 8.5 +0x02830AFD, // 58 8.0 +0x025F1258, // 59 7.5 +0x023D1CD4, // 60 7.0 +0x021D0D9E, // 61 6.5 +0x01FEC982, // 62 6.0 +0x01E236D3, // 63 5.5 +0x01C73D51, // 64 5.0 +0x01ADC619, // 65 4.5 +0x0195BB8F, // 66 4.0 +0x017F094C, // 67 3.5 +0x01699C0F, // 68 3.0 +0x015561A9, // 69 2.5 +0x014248EF, // 70 2.0 +0x013041AE, // 71 1.5 +0x011F3C99, // 72 1.0 +0x010F2B40, // 73 0.5 +0x01000000, // 74 0.0 +}; + +static const int32_t attenuation_lookup_table_minus[255] = { +0x01000000, // 74 0.0 +0x00F1ADF9, // 75 -0.5 +0x00E42905, // 76 -1.0 +0x00D765AC, // 77 -1.5 +0x00CB5918, // 78 -2.0 +0x00BFF911, // 79 -2.5 +0x00B53BEF, // 80 -3.0 +0x00AB1896, // 81 -3.5 +0x00A1866B, // 82 -4.0 +0x00987D50, // 83 -4.5 +0x008FF599, // 84 -5.0 +0x0087E80A, // 85 -5.5 +0x00804DCE, // 86 -6.0 +0x00792070, // 87 -6.5 +0x007259DB, // 88 -7.0 +0x006BF44D, // 89 -7.5 +0x0065EA59, // 90 -8.0 +0x006036E1, // 91 -8.5 +0x005AD50C, // 92 -9.0 +0x0055C04B, // 93 -9.5 +0x0050F44D, // 94 -10.0 +0x004C6D00, // 95 -10.5 +0x0048268D, // 96 -11.0 +0x00441D53, // 97 -11.5 +0x00404DE6, // 98 -12.0 +0x003CB508, // 99 -12.5 +0x00394FAE, // 100 -13.0 +0x00361AF6, // 101 -13.5 +0x00331426, // 102 -14.0 +0x003038AE, // 103 -14.5 +0x002D8621, // 104 -15.0 +0x002AFA35, // 105 -15.5 +0x002892C1, // 106 -16.0 +0x00264DBA, // 107 -16.5 +0x00242934, // 108 -17.0 +0x0022235D, // 109 -17.5 +0x00203A7E, // 110 -18.0 +0x001E6CF7, // 111 -18.5 +0x001CB942, // 112 -19.0 +0x001B1DEC, // 113 -19.5 +0x00199999, // 114 -20.0 +0x00182AFF, // 115 -20.5 +0x0016D0E6, // 116 -21.0 +0x00158A2A, // 117 -21.5 +0x001455B5, // 118 -22.0 +0x00133281, // 119 -22.5 +0x00121F97, // 120 -23.0 +0x00111C0F, // 121 -23.5 +0x0010270A, // 122 -24.0 +0x000F3FBB, // 123 -24.5 +0x000E655C, // 124 -25.0 +0x000D9734, // 125 -25.5 +0x000CD494, // 126 -26.0 +0x000C1CD8, // 127 -26.5 +0x000B6F62, // 128 -27.0 +0x000ACBA1, // 129 -27.5 +0x000A3108, // 130 -28.0 +0x00099F16, // 131 -28.5 +0x0009154E, // 132 -29.0 +0x0008933A, // 133 -29.5 +0x0008186E, // 134 -30.0 +0x0007A480, // 135 -30.5 +0x0007370E, // 136 -31.0 +0x0006CFBB, // 137 -31.5 +0x00066E30, // 138 -32.0 +0x0006121A, // 139 -32.5 +0x0005BB2B, // 140 -33.0 +0x00056918, // 141 -33.5 +0x00051B9D, // 142 -34.0 +0x0004D277, // 143 -34.5 +0x00048D69, // 144 -35.0 +0x00044C38, // 145 -35.5 +0x00040EAC, // 146 -36.0 +0x0003D492, // 147 -36.5 +0x00039DB8, // 148 -37.0 +0x000369EF, // 149 -37.5 +0x0003390C, // 150 -38.0 +0x00030AE5, // 151 -38.5 +0x0002DF53, // 152 -39.0 +0x0002B631, // 153 -39.5 +0x00028F5C, // 154 -40.0 +0x00026AB3, // 155 -40.5 +0x00024817, // 156 -41.0 +0x0002276A, // 157 -41.5 +0x00020892, // 158 -42.0 +0x0001EB73, // 159 -42.5 +0x0001CFF5, // 160 -43.0 +0x0001B601, // 161 -43.5 +0x00019D81, // 162 -44.0 +0x0001865F, // 163 -44.5 +0x00017089, // 164 -45.0 +0x00015BEB, // 165 -45.5 +0x00014875, // 166 -46.0 +0x00013615, // 167 -46.5 +0x000124BD, // 168 -47.0 +0x0001145C, // 169 -47.5 +0x000104E7, // 170 -48.0 +0x0000F64F, // 171 -48.5 +0x0000E887, // 172 -49.0 +0x0000DB85, // 173 -49.5 +0x0000CF3E, // 174 -50.0 +0x0000C3A6, // 175 -50.5 +0x0000B8B4, // 176 -51.0 +0x0000AE5F, // 177 -51.5 +0x0000A49E, // 178 -52.0 +0x00009B69, // 179 -52.5 +0x000092B7, // 180 -53.0 +0x00008A82, // 181 -53.5 +0x000082C2, // 182 -54.0 +0x00007B72, // 183 -54.5 +0x0000748A, // 184 -55.0 +0x00006E05, // 185 -55.5 +0x000067DE, // 186 -56.0 +0x0000620E, // 187 -56.5 +0x00005C92, // 188 -57.0 +0x00005764, // 189 -57.5 +0x00005281, // 190 -58.0 +0x00004DE3, // 191 -58.5 +0x00004988, // 192 -59.0 +0x0000456B, // 193 -59.5 +0x00004189, // 194 -60.0 +0x00003DDE, // 195 -60.5 +0x00003A68, // 196 -61.0 +0x00003724, // 197 -61.5 +0x0000340E, // 198 -62.0 +0x00003125, // 199 -62.5 +0x00002E65, // 200 -63.0 +0x00002BCC, // 201 -63.5 +0x00002959, // 202 -64.0 +0x00002709, // 203 -64.5 +0x000024DA, // 204 -65.0 +0x000022CA, // 205 -65.5 +0x000020D8, // 206 -66.0 +0x00001F02, // 207 -66.5 +0x00001D46, // 208 -67.0 +0x00001BA2, // 209 -67.5 +0x00001A17, // 210 -68.0 +0x000018A1, // 211 -68.5 +0x00001740, // 212 -69.0 +0x000015F3, // 213 -69.5 +0x000014B9, // 214 -70.0 +0x00001390, // 215 -70.5 +0x00001278, // 216 -71.0 +0x0000116F, // 217 -71.5 +0x00001076, // 218 -72.0 +0x00000F8A, // 219 -72.5 +0x00000EAB, // 220 -73.0 +0x00000DD9, // 221 -73.5 +0x00000D13, // 222 -74.0 +0x00000C58, // 223 -74.5 +0x00000BA7, // 224 -75.0 +0x00000B00, // 225 -75.5 +0x00000A63, // 226 -76.0 +0x000009CE, // 227 -76.5 +0x00000941, // 228 -77.0 +0x000008BD, // 229 -77.5 +0x00000840, // 230 -78.0 +0x000007C9, // 231 -78.5 +0x0000075A, // 232 -79.0 +0x000006F1, // 233 -79.5 +0x0000068D, // 234 -80.0 +0x0000062F, // 235 -80.5 +0x000005D7, // 236 -81.0 +0x00000583, // 237 -81.5 +0x00000534, // 238 -82.0 +0x000004EA, // 239 -82.5 +0x000004A3, // 240 -83.0 +0x00000461, // 241 -83.5 +0x00000422, // 242 -84.0 +0x000003E7, // 243 -84.5 +0x000003AF, // 244 -85.0 +0x0000037A, // 245 -85.5 +0x00000348, // 246 -86.0 +0x00000319, // 247 -86.5 +0x000002ED, // 248 -87.0 +0x000002C3, // 249 -87.5 +0x0000029B, // 250 -88.0 +0x00000276, // 251 -88.5 +0x00000253, // 252 -89.0 +0x00000231, // 253 -89.5 +0x00000212, // 254 -90.0 +0x00000000 // 255 -90.5 +}; + +static inline int get_gain_q24(int input, unsigned multipler){ + int result; + long long intermediate; + intermediate = (long long) input * (long long) multipler; +#if 0 + result = (int)(intermediate >> (24)); +#else + intermediate = intermediate >> 24; + + if (intermediate > INT32_MAX) { + intermediate = INT32_MAX; + } + else if (intermediate < INT32_MIN) { + intermediate = INT32_MIN; + } + + result = (int)(intermediate); +#endif + return result; +} + +static inline int32_t clamp_post_gain(int32_t gain) { + // 限制gain范围:0 >= gain >= -50 + if (gain > 0) { + debug_printf("Warning: gain %d > 0, clamping to 0\n", gain); + return 0; + } else if (gain < -50) { + debug_printf("Warning: gain %d < -50, clamping to -50\n", gain); + return -50; + } + return gain; +} +// 应用增益或衰减 (Q24格式) +static inline int32_t apply_gain(int32_t sample, int32_t gain_db) { + int32_t result; + int32_t attenuation = 0; + + if (gain_db <= 0) { + // 衰减:使用查找表 + int32_t index = -gain_db; // 将负dB值转换为正索引 + if (index > 91) index = 91; // 限制最大衰减为-90dB + attenuation = attenuation_lookup_table_minus[index * 2]; + } else { + int32_t index = 74 - gain_db * 2; + attenuation = attenuation_lookup_table[index]; + + } + if (attenuation != 0) { + result = get_gain_q24(sample, attenuation); + } + else { + result = sample; + } + + return result; +} + +/** + * @brief 设置采样率标记(所有采样率共用44100Hz数组) + * @param sample_rate 目标采样率 + * @param mode 模式号 + * @return 成功返回0,失败返回-1 + * + * 改动原因:所有采样率共用44100Hz数组,参数相同,只需要设置sample_rate标记 + * 系数会根据采样率动态计算,不需要复制参数 + */ +#if !UAC1 +static int copy_params_from_44100(uint32_t sample_rate, uint8_t mode) { + if (mode >= NUM_EQ_MODES) { + debug_printf("Error: Invalid mode %d in copy_params_from_44100\n", mode); + return -1; + } + + // 改动原因:所有采样率共用44100Hz数组,只需要设置sample_rate标记 + // 参数已经存储在44100Hz数组中,不需要复制 + for (int ch = 0; ch < NUM_EQ_CHANS; ch++) { + sEQ_data_44100HZ[mode][ch].sample_rate = sample_rate; + // 重置total_bshift(将在计算系数时更新) + sEQ_data_44100HZ[mode][ch].total_bshift = 0; + } + + debug_printf("Set sample rate to %dHz for mode %d (using 44100Hz array)\n", sample_rate, mode); + return 0; +} + +/** + * @brief 动态计算当前模式所有band的系数 + * @param sample_rate 采样率 + * @param mode EQ模式 (0-9) + * @return 成功返回0,失败返回-1 + * + * 根据process_send_params函数中0x8d命令的逻辑,实现当前模式所有band的系数计算 + * 如果是bypass类型,直接赋值bypass系数,不计算bshift + * 正确计算total_bshift作为所有非bypass滤波器bshift的累加 + * + * 改动原因:在计算系数前,先从44100Hz统一参数源复制参数到当前采样率 + */ +int calculate_current_mode_coefficients(uint32_t sample_rate, uint8_t mode) { + debug_printf("calculate_current_mode_coefficients: sample_rate=%d, mode=%d\n", sample_rate, mode); + + // 改动原因:在计算系数前,先从44100Hz统一参数源复制参数到当前采样率 + // 确保所有采样率的参数都从统一源同步 + if (copy_params_from_44100(sample_rate, mode) != 0) { + debug_printf("Warning: Failed to copy params from 44100Hz, continuing with existing params\n"); + } + + if (mode >= NUM_EQ_MODES) { + debug_printf("Error: Invalid mode %d (max: %d)\n", mode, NUM_EQ_MODES - 1); + return -1; + } + + // 改动原因:所有采样率共用44100Hz数组 + eq_mode_data_t *eq_data = &sEQ_data_44100HZ[mode][0]; + eq_mode_data_t *eq_data_2 = &sEQ_data_44100HZ[mode][1]; + + if (eq_data == NULL || eq_data_2 == NULL) { + debug_printf("Error: eq_data pointer is NULL\n"); + return -1; + } + + // 重置total_bshift + int total_bshift = 0; + + // 遍历所有band,计算系数 + for (int band_index = 0; band_index < MAX_EQ_BANDS; band_index++) { + filter_params_t *band = &eq_data->bands[band_index]; + + // 检查参数有效性 + if (isnan(band->fc) || isnan(band->q) || isnan(band->bw) || isnan(band->gain)) { + debug_printf("Warning: Invalid parameters for band %d, using bypass\n", band_index); + band->type = FILTER_TYPE_BYPASS; + band->fc = 1000.0f; + band->q = 0.707f; + band->bw = 1.0f; + band->gain = 0.0f; + } + + q2_30 coeffs[5]; + int calculated_bshift = 0; + + // 根据滤波器类型计算系数 + if (band->type == FILTER_TYPE_BYPASS) { + // bypass类型:直接设置bypass系数,不累加bshift + coeffs[0] = 1 << 30; // b0 = 1.0 in Q30 + coeffs[1] = 0; // b1 = 0 + coeffs[2] = 0; // b2 = 0 + coeffs[3] = 0; // a1 = 0 + coeffs[4] = 0; // a2 = 0 + calculated_bshift = 0; + + debug_printf("Band %d: BYPASS - coeffs set to bypass values, bshift=0\n", band_index); + } else { + // 非bypass类型:调用系数计算函数 + if (eq_calculate_coefficients_from_params(band, sample_rate, coeffs, &calculated_bshift) != 0) { + debug_printf("Error: Failed to calculate coefficients for band %d, using bypass\n", band_index); + // 计算失败,使用bypass + coeffs[0] = 1 << 30; + coeffs[1] = 0; + coeffs[2] = 0; + coeffs[3] = 0; + coeffs[4] = 0; + calculated_bshift = 0; + } else { + debug_printf("Band %d: Type=%d, fc=%.2f, q=%.3f, gain=%.2f, bshift=%d\n", + band_index, band->type, band->fc, band->q, band->gain, calculated_bshift); + debug_printf("fc: "); + print_float(band->fc, 6); + debug_printf("q: "); + print_float(band->q, 6); + debug_printf("bw: "); + print_float(band->bw, 6); + debug_printf("gain: "); + print_float(band->gain, 6); + } + + // 累加非bypass滤波器的bshift + total_bshift += calculated_bshift; + } + + // 存储计算出的系数到两个通道 + for (int i = 0; i < 5; i++) { + eq_data->filter.coef[i][band_index] = coeffs[i]; + eq_data_2->filter.coef[i][band_index] = coeffs[i]; + } + // 同步band参数到第二个通道 + memcpy(&eq_data_2->bands[band_index], band, sizeof(filter_params_t)); + } + + // 更新total_bshift + eq_data->total_bshift = total_bshift; + eq_data_2->total_bshift = total_bshift; + + debug_printf("Mode %d coefficients calculated successfully, total_bshift=%d\n", mode, total_bshift); + + return 0; +} + +// Initialize EQ data for the specified sample rate +uint32_t init_eq_data(unsigned sample_freq) { + g_eq_sample_rate = sample_freq; + debug_printf("init_eq_data %d\n", g_eq_sample_rate); + + // 初始化模式信息 + + // 从Flash加载增益和模式名称 + + // 初始化单参数存储数据库 + + // Clear EQ status for all sample rates, modes, and channels + for (int ch = 0; ch < NUM_EQ_CHANS; ch++) { + // Clear status for various sample rates + clear_eq_status(sample_freq, ch); + } + + // 改动原因:优化EQ参数存储策略,从44100Hz统一参数源复制参数到当前采样率 + // 然后为所有模式计算系数,确保参数同步 + debug_printf("Initializing EQ parameters from 44100Hz source for sample rate %d Hz\n", sample_freq); + + // 为所有模式复制参数并计算系数 + for (int mode = 0; mode < NUM_EQ_MODES; mode++) { + // 从44100Hz复制参数到当前采样率 + if (copy_params_from_44100(sample_freq, mode) == 0) { + // 计算系数 + if (calculate_current_mode_coefficients(sample_freq, mode) == 0) { + debug_printf("Successfully initialized mode %d for sample rate %d Hz\n", mode, sample_freq); + } else { + debug_printf("Warning: Failed to calculate coefficients for mode %d\n", mode); + } + } else { + debug_printf("Warning: Failed to copy params for mode %d\n", mode); + } + } + + debug_printf("EQ initialization completed for sample rate %d Hz\n", sample_freq); + + return 1; +} + +void update_eq_post_gain(void) { + for (int mode = EQ_USER_MODE_MIN; mode <= EQ_USER_MODE_MAX; mode++) { + // 改动原因:限制gain范围到0到-50dB,确保从g_mode_info读取的gain值在有效范围内 + int32_t gain = clamp_post_gain(g_mode_info.mode_gains[mode]); + if (gain != g_mode_info.mode_gains[mode]) { + debug_printf("Warning: mode %d gain %d clamped to %d in update_eq_post_gain\n", mode, g_mode_info.mode_gains[mode], gain); + g_mode_info.mode_gains[mode] = gain; // 更新存储的值 + } + + // 改动原因:所有采样率共用44100Hz数组,直接更新即可 + if (sEQ_data_44100HZ[mode][0].post_gain_db != gain) { + sEQ_data_44100HZ[mode][0].post_gain_db = gain; + sEQ_data_44100HZ[mode][1].post_gain_db = gain; + } + } +} +#endif +unsigned int is_mode_changed(void) +{ + if ((g_current_eq_mode != g_new_eq_mode) || (g_force_eq_mode_change == 1)) + { + //debug_printf("request mode changed from %d to %d force_mode %d\n", g_new_eq_mode, g_current_eq_mode, g_force_eq_mode_change); + g_force_eq_mode_change = 0; + return 1; + } + + return 0; +} + +void change_eq_mode(unsigned sample_freq) +{ + if (calculate_current_mode_coefficients(sample_freq, g_new_eq_mode) == 0) { + debug_printf("Successfully change eq mode to %d\n", g_new_eq_mode); + } else { + debug_printf("Warning: Failed to change eq mode to %d\n", g_new_eq_mode); + } + g_current_eq_mode = g_new_eq_mode; +} + +unsigned int is_eq_disabled(void) +{ + // 改动原因:将eq_enable独立为全局开关,所有模式共用一个开关 + // 直接检查g_eq_enable,不再依赖模式判断 + return (g_eq_enable == 0); +} + +void clear_eq_status(unsigned sample_freq, unsigned ch_no) { +#if !UAC1 + int n; + debug_printf("clear_eq_status %d %d\n", sample_freq, ch_no); + if(is_eq_disabled()) + { + return; + } + + // 改动原因:所有采样率共用44100Hz数组 + eq_mode_data_t (*eq_data)[NUM_EQ_MODES][NUM_EQ_CHANS] = &sEQ_data_44100HZ; + + // Clear status for the specified sample rate, mode, and channel + for (n = 0; n < MAX_EQ_BANDS + 1; n++) { + (*eq_data)[g_current_eq_mode][ch_no].filter.state[0][n] = 0; + (*eq_data)[g_current_eq_mode][ch_no].filter.state[1][n] = 0; + } +#endif +} + +// 复位EQ参数函数 +uint8_t reset_eq_params(uint8_t mode) { + debug_printf("Resetting EQ params for mode %d\n", mode); +#if !UAC1 + // 检查模式号有效性 + if (mode != 0xFF && mode >= NUM_EQ_MODES) { + debug_printf("Error: Invalid mode %d\n", mode); + return 0x01; // 失败 + } + + // 删除Flash中的EQ参数文件 + delete_flash_eq_params(mode); + + // 删除Flash中的增益和模式名称文件(只删除相应模式的数据) + // 改动原因:修改为按模式删除,只删除指定模式的增益和名称,而不是删除所有文件 + delete_flash_gain_and_names(mode); + + // 恢复头文件预设参数 + restore_default_eq_params(mode); + + // 恢复默认模式信息 + init_mode_info(); + + debug_printf("EQ params reset successful for mode %d\n", mode); +#endif + return 0x00; // 成功 +} + +// 数据修复函数 - 修复损坏的EQ数据 +static void repair_eq_data(eq_mode_data_t *eq_data) { + if (eq_data == NULL) return; + + // 修复bands数组 + for (int i = 0; i < MAX_EQ_BANDS; i++) { + filter_params_t *band = &eq_data->bands[i]; + + // 检查并修复float字段 + if (isnan(band->fc) || isinf(band->fc) || band->fc < 0 || band->fc > 100000) { + band->fc = 1000.0f; + } + if (isnan(band->q) || isinf(band->q) || band->q < 0 || band->q > 100) { + band->q = 0.707f; + } + if (isnan(band->bw) || isinf(band->bw) || band->bw < 0 || band->bw > 100) { + band->bw = 1.0f; + } + if (isnan(band->gain) || isinf(band->gain) || band->gain < -100 || band->gain > 100) { + band->gain = 0.0f; + } + + // 修复索引和类型 + band->index = i; + if (band->type > FILTER_TYPE_HIGHSHELF) { + band->type = FILTER_TYPE_BYPASS; + } + } + + // 修复其他字段 + if (eq_data->sample_rate == 0 || eq_data->sample_rate > 200000) { + eq_data->sample_rate = 48000; // 默认采样率 + } + + // 修复total_bshift和post_gain_db + if (eq_data->total_bshift < -32 || eq_data->total_bshift > 32) { + eq_data->total_bshift = 0; + } + // 改动原因:修改post_gain_db范围检查为0到-50dB,与gain范围限制保持一致 + if (eq_data->post_gain_db > 0 || eq_data->post_gain_db < -50) { + debug_printf("Warning: post_gain_db %d out of range (0 to -50dB), clamping\n", eq_data->post_gain_db); + eq_data->post_gain_db = clamp_post_gain(eq_data->post_gain_db); + } +} + +void debug_print_eq_mode(eq_mode_data_t *eq_data) { + debug_printf("*******************************\n"); + + DPRINTF("Total bshift: 0x%d\n", eq_data->total_bshift); + DPRINTF("Post gain: 0x%d\n", eq_data->post_gain_db); + + DPRINTF("Filter Parameters:\n"); + for (int i = 0; i < MAX_EQ_BANDS; i++) { + filter_params_t *band = &eq_data->bands[i]; + + // 添加指针有效性检查 + if (band == NULL) { + DPRINTF(" Band %d: ERROR - band pointer is NULL\n", i); + continue; + } + + DPRINTF(" Band %d:\n", i); + DPRINTF(" Index: %d\n", band->index); + + // Print filter type + DPRINTF(" Type: "); + switch(band->type) { + case FILTER_TYPE_BYPASS: + DPRINTF("Bypass\n"); + break; + case FILTER_TYPE_ALLPASS: + DPRINTF("All Pass\n"); + break; + case FILTER_TYPE_PEAKING: + DPRINTF("Peaking\n"); + break; + case FILTER_TYPE_LOWPASS: + DPRINTF("Low Pass\n"); + break; + case FILTER_TYPE_HIGHPASS: + DPRINTF("High Pass\n"); + break; + case FILTER_TYPE_BANDPASS: + DPRINTF("Band Pass\n"); + break; + case FILTER_TYPE_BANDSTOP: + DPRINTF("Band Stop\n"); + break; + case FILTER_TYPE_NOTCH: + DPRINTF("Notch\n"); + break; + case FILTER_TYPE_CONST_Q: + DPRINTF("Constant Q\n"); + break; + case FILTER_TYPE_LOWSHELF: + DPRINTF("Low Shelf\n"); + break; + case FILTER_TYPE_HIGHSHELF: + DPRINTF("High Shelf\n"); + break; + default: + DPRINTF("Unknown Type (%d)\n", band->type); + } + + // 安全的浮点打印方法 - 避免%f崩溃 + DPRINTF(" fc="); + print_float(band->fc, 6); + DPRINTF(" q="); + print_float(band->q, 6); + DPRINTF(" bw="); + print_float(band->bw, 6); + DPRINTF(" gain="); + print_float(band->gain, 6); + } + + DPRINTF(" Filter Coefficients:\n"); + DPRINTF(" Biquad Count: %d\n", eq_data->filter.biquad_count); + + // Print coefficients with sign handling + for (int i = 0; i < 5; i++) { + DPRINTF(" Coefficient Group %d: ", i); + for (int j = 0; j < MAX_EQ_BANDS; j++) { + int32_t coeff = eq_data->filter.coef[i][j]; + if (coeff < 0) { + DPRINTF("-0x%08x ", -coeff); + } else { + DPRINTF("0x%08x ", coeff); + } + } + DPRINTF("\n"); + } + DPRINTF("*******************************\n"); +} + +int32_t handler_eq_filter(unsigned sample_freq, uint32_t ch, int32_t new_sample) { + int32_t temp_sample = new_sample; + +#if !UAC1 + + if(is_eq_disabled()) + { + return temp_sample; + } + + + if (ch < NUM_EQ_CHANS) { + // 改动原因:所有采样率共用44100Hz数组 + eq_mode_data_t (*eq_data)[NUM_EQ_MODES][NUM_EQ_CHANS] = &sEQ_data_44100HZ; + + // 应用增益或衰减 (Q24格式) + // 改动原因:修改post_gain_db范围检查为0到-50dB,确保只处理有效范围内的gain值 + int32_t post_gain = (*eq_data)[g_current_eq_mode][ch].post_gain_db; + if (post_gain <= 0 && post_gain >= -50) { + DPRINTF("post_gain_db: %d\n", post_gain); + temp_sample = apply_gain(temp_sample, post_gain); + } else if (post_gain != 0) { + // 如果gain超出范围,记录警告但不应用 + debug_printf("Warning: post_gain_db %d out of range (0 to -50dB), skipping gain application\n", post_gain); + } + + static unsigned int count = 0; + count++; + if (count % 100000 == 0) { + debug_printf("post_gain: %d\n", post_gain); + } + + temp_sample = temp_sample >> 1; //Q30 + + // 应用均衡器滤波 + temp_sample = filter_biquads_s32(&(*eq_data)[g_current_eq_mode][ch].filter, 1, temp_sample); + + // 应用bshift补偿 + unsigned int bshift = (*eq_data)[g_current_eq_mode][ch].total_bshift; + + // Q2.30 -> Q31,溢出保护 + if (temp_sample > (INT32_MAX >> (bshift + 1))) { + temp_sample = INT32_MAX; + } else if (temp_sample < (INT32_MIN >> (bshift + 1))) { + temp_sample = INT32_MIN; + } else { + temp_sample = temp_sample << (bshift + 1); + } + } + +#endif + return temp_sample; +} + + + +void debug_print_eq_params(unsigned sample_freq) { + unsigned mode = g_current_eq_mode; + + // 改动原因:使用公用数组,通过函数获取对应采样率的数组指针 + eq_mode_data_t (*eq_data)[NUM_EQ_MODES][NUM_EQ_CHANS] = get_eq_array_ptr_common(sample_freq); + + if (eq_data == NULL) { + debug_printf("Error: Unsupported sample rate %u\n", sample_freq); + return; + } + + // 修复可能损坏的数据 + for (int ch = 0; ch < NUM_EQ_CHANS; ch++) { + repair_eq_data(&(*eq_data)[mode][ch]); + } + + debug_printf("===== EQ Parameters Debug Info =====\n"); + debug_printf("Sample Rate: %u Hz, Mode: %u\n", sample_freq, mode); + + for (int ch = 0; ch < NUM_EQ_CHANS; ch++) { + DPRINTF("\nChannel %d:\n", ch); + DPRINTF("Total bshift: 0x%d\n", (*eq_data)[mode][ch].total_bshift); + DPRINTF("Post gain: 0x%d\n", (*eq_data)[mode][ch].post_gain_db); + + DPRINTF("Filter Parameters:\n"); + for (int i = 0; i < MAX_EQ_BANDS; i++) { + filter_params_t *band = &(*eq_data)[mode][ch].bands[i]; + + // 添加指针有效性检查 + if (band == NULL) { + DPRINTF(" Band %d: ERROR - band pointer is NULL\n", i); + continue; + } + + // 检查指针是否在有效内存范围内 + uintptr_t band_addr = (uintptr_t)band; + uintptr_t eq_data_addr = (uintptr_t)eq_data; + size_t eq_data_size = sizeof(eq_mode_data_t); + + DPRINTF(" Band %d:\n", i); + DPRINTF(" Index: %d\n", band->index); + + // Print filter type + DPRINTF(" Type: "); + switch(band->type) { + case FILTER_TYPE_BYPASS: + DPRINTF("Bypass\n"); + break; + case FILTER_TYPE_ALLPASS: + DPRINTF("All Pass\n"); + break; + case FILTER_TYPE_PEAKING: + DPRINTF("Peaking\n"); + break; + case FILTER_TYPE_LOWPASS: + DPRINTF("Low Pass\n"); + break; + case FILTER_TYPE_HIGHPASS: + DPRINTF("High Pass\n"); + break; + case FILTER_TYPE_BANDPASS: + DPRINTF("Band Pass\n"); + break; + case FILTER_TYPE_BANDSTOP: + DPRINTF("Band Stop\n"); + break; + case FILTER_TYPE_NOTCH: + DPRINTF("Notch\n"); + break; + case FILTER_TYPE_CONST_Q: + DPRINTF("Constant Q\n"); + break; + case FILTER_TYPE_LOWSHELF: + DPRINTF("Low Shelf\n"); + break; + case FILTER_TYPE_HIGHSHELF: + DPRINTF("High Shelf\n"); + break; + default: + DPRINTF("Unknown Type (%d)\n", band->type); + } + DPRINTF(" fc="); + print_float(band->fc, 6); + DPRINTF(", q="); + print_float(band->q, 6); + DPRINTF(", bw="); + print_float(band->bw, 6); + DPRINTF(", gain="); + print_float(band->gain, 6); + DPRINTF("\n"); + } + + DPRINTF(" Filter Coefficients:\n"); + DPRINTF(" Biquad Count: %d\n", (*eq_data)[mode][ch].filter.biquad_count); + + // Print coefficients with sign handling + for (int i = 0; i < 5; i++) { + DPRINTF(" Coefficient Group %d: ", i); + for (int j = 0; j < MAX_EQ_BANDS; j++) { + int32_t coeff = (*eq_data)[mode][ch].filter.coef[i][j]; + if (coeff < 0) { + DPRINTF("-0x%08x ", -coeff); + } else { + DPRINTF("0x%08x ", coeff); + } + } + DPRINTF("\n"); + } + } + DPRINTF("===== Debug Info End =====\n"); +} + + +#endif + + +unsigned key_program = 0; + +extern uint32_t get_reference_time(void); +extern unsigned short XUA_Endpoint0_getProductId(); +extern unsigned short XUA_Endpoint0_getVendorId(); +extern char* XUA_Endpoint0_getProductStr(); +extern char* XUA_Endpoint0_getVendorStr(); +extern char* XUA_Endpoint0_getSerialStr(); +extern unsigned g_request_volume_set; + +void get_device_info(unsigned char *response) { +#if XUA_USB_EN == 1 + // 产品ID (1字节,小端序,位置3-4) + response[2] = (uint8_t)(XUA_Endpoint0_getProductId() & 0xFF); + response[3] = (uint8_t)((XUA_Endpoint0_getProductId() >> 8) & 0xFF); + + // 厂商ID (1字节,小端序,位置5-6) + response[4] = (uint8_t)(XUA_Endpoint0_getVendorId() & 0xFF); + response[5] = (uint8_t)((XUA_Endpoint0_getVendorId() >> 8) & 0xFF); + + // 产品字符串 (15字节,UTF-8编码,位置7-22) + memcpy(&response[6], XUA_Endpoint0_getProductStr(), 16); + + // 厂商字符串 (15字节,UTF-8编码,位置23-38) + memcpy(&response[22], XUA_Endpoint0_getVendorStr(), 16); + + // 序列号字符串 (15字节,UTF-8编码,位置39-54) + memcpy(&response[38], XUA_Endpoint0_getSerialStr(), 16); + + debug_printf("Device info - PID: -1x%04x, VID: 0x%04x, Product: '%s', Vendor: '%s', Serial: '%s'\n", + XUA_Endpoint0_getProductId(), XUA_Endpoint0_getVendorId(), + XUA_Endpoint0_getProductStr(), XUA_Endpoint0_getVendorStr(), XUA_Endpoint0_getSerialStr()); +#endif +} + + + + +void program_key(unsigned char *, signed int); +unsigned char process_send_params(uint8_t data[], uint16_t len) { + if (len < 60) { + debug_printf("Error: Data length is not 40 bytes, actual length=%d\n", len); + return false; + } + + if (data[0] == 0x77 && data[1] == 0x5B && key_program == 0) + { + key_program = 1; + program_key(data, len); + } + +#if EQ_EN + // Check sync header + if (data[0] != 0x77) { + debug_printf("Error: Invalid sync header 1: 0x%02x\n", data[0]); + return false; + } + +#if !UAC1 + // Process read request (0x8E) - GET_EQ_PARAMS + if (data[1] == 0x8E) { + debug_printf("Received read request (GET_EQ_PARAMS)\n"); + // Get mode value + read_request.mode = data[2]; + // Get EQ index + read_request.eq_index = data[3]; + read_request.is_read_request = true; + + debug_printf("Read request - Mode: %d, EQ index: %d\n", read_request.mode, read_request.eq_index); + } + + if (data[1] == 0x8a) + { + if (data[2] > EQ_MODE_MAX ) { + return false; + } + // 改动原因:0x8A只改变当前模式(临时),不保存到Flash,掉电后会丢失 + // eq_enable是全局开关,与模式切换独立,可以在任何enable状态下切换模式 + SET_SHARED_GLOBAL(g_request_eq_mode, data[2]); + debug_printf("Received set mode command (0x8A), switching to mode %d (temporary, not saved to Flash)\n", data[2]); + debug_printf("EQ enable state: %d (independent of mode), saved startup mode: %d (set by 0x92)\n", + g_eq_enable, g_saved_eq_mode); + return true; + } + + // 处理读取EQ模式信息命令 (0x8B) - GET_EQ_MODE + // 改动原因:添加mode参数支持,0xFF表示获取当前模式,0-9表示获取指定模式信息 + if (data[1] == 0x8b) { + uint8_t mode = data[2]; + debug_printf("Received read EQ mode command (GET_EQ_MODE), mode: 0x%02x\n", mode); + + // 验证mode参数:0xFF表示获取当前模式,0-9表示获取指定模式 + if (mode == 0xFF) { + // 获取当前模式信息 + debug_printf("Mode=0xFF, will return current mode info\n"); + read_request.is_read_mode_request = true; + read_request.read_mode_request_mode = 0xFF; + } else if (mode <= EQ_MODE_MAX) { + // 获取指定模式信息 + debug_printf("Mode=%d, will return specified mode info\n", mode); + read_request.is_read_mode_request = true; + read_request.read_mode_request_mode = mode; + } else { + debug_printf("Error: Invalid mode value 0x%02x (valid: 0-9 or 0xFF)\n", mode); + return false; + } + return true; + } + // 处理设置EQ整体增益和名称命令 (0x8C) - SET_MODE_GAIN_AND_NAME + if (data[1] == 0x8c) { + eq_mode_data_t *eq_data = NULL; + eq_mode_data_t *eq_data_2 = NULL; + debug_printf("Received set EQ overall gain and name command (SET_MODE_GAIN_AND_NAME)\n"); + + // 获取模式值 + uint8_t mode = data[2]; + + if (mode < EQ_USER_MODE_MIN || mode > EQ_USER_MODE_MAX ) { + return false; + } + // 获取增益值 (4字节,范围0到-50dB) + uint32_t gain = (uint32_t)data[3] | ((uint32_t)data[4] << 8) | ((uint32_t)data[5] << 16) | ((uint32_t)data[6] << 24); + + // 改动原因:限制gain范围到0到-50dB,防止超出范围的值导致异常 + int32_t new_gain = clamp_post_gain((int32_t)gain); + if (new_gain != (int32_t)gain) { + debug_printf("Gain value %d clamped to %d (range: 0 to -50dB)\n", (int32_t)gain, new_gain); + } + + // 获取模式名称 (16字节,UTF-8编码) + char mode_name[17] = {0}; // 16字节 + 1个null终止符 + memcpy(mode_name, &data[7], 16); + mode_name[16] = '\0'; // 确保null终止 + + debug_printf("EQ overall gain: %d dB, mode name: '%s' for mode %d\n", new_gain, mode_name, mode); + + // 获取44100采样率下该模式的当前gain值,判断是否有变化 + int32_t current_gain_44100 = sEQ_data_44100HZ[mode][0].post_gain_db; + bool gain_changed = (current_gain_44100 != new_gain); + + if (gain_changed) { + debug_printf("Gain changed from %d to %d, will mark dirty\n", current_gain_44100, new_gain); + } else { + debug_printf("Gain unchanged (%d), skip marking dirty\n", current_gain_44100); + } + + // 获取当前模式名称,判断是否有变化 + char current_name[16] = {0}; + strncpy(current_name, g_mode_info.mode_names[mode], 15); + current_name[15] = '\0'; + + // 检查新名称是否全空(全0或全空格) + bool name_is_empty = true; + if (mode_name[0] != '\0') { + // 检查是否全是空格 + for (int i = 0; i < 16 && mode_name[i] != '\0'; i++) { + if (mode_name[i] != ' ') { + name_is_empty = false; + break; + } + } + } + // 如果第一个字符就是\0,name_is_empty保持为true + + // 比较名称是否有变化 + bool name_changed = (strncmp(current_name, mode_name, 15) != 0); + + if (name_is_empty) { + debug_printf("Mode name is empty, skip saving\n"); + } else if (name_changed) { + debug_printf("Name changed from '%s' to '%s', will mark dirty\n", current_name, mode_name); + } else { + debug_printf("Name unchanged ('%s'), skip marking dirty\n", current_name); + } + + + if (!name_is_empty && name_changed) { + set_mode_name(mode, mode_name); + eq_mark_name_dirty(); // 只有变化且非空时才标记脏 + debug_printf("Marked mode %d as dirty for Flash sync (name update)\n", mode); + } + + if (gain_changed) { + // 设置EQ整体增益到所有采样率的指定模式 + uint32_t all_sample_rates[] = {44100, 48000, 88200, 96000, 176400, 192000}; + int num_rates = sizeof(all_sample_rates) / sizeof(all_sample_rates[0]); + + // 改动原因:所有采样率共用44100Hz数组,直接更新即可 + if (mode < NUM_EQ_MODES) { + sEQ_data_44100HZ[mode][0].post_gain_db = new_gain; + sEQ_data_44100HZ[mode][1].post_gain_db = new_gain; + debug_printf("Set EQ overall gain to %d dB for mode %d (applied to all sample rates)\n", new_gain, mode); + } + + set_mode_gain(mode, new_gain); + eq_mark_gain_dirty(); // 只有变化时才标记脏 + debug_printf("Marked mode %d as dirty for Flash sync (gain update)\n", mode); + } + + return true; + } + + // 处理获取设备信息命令 (0x8F) - GET_DEVICE_INFO + if (data[1] == 0x8f) { + debug_printf("Received get device info command (GET_DEVICE_INFO)\n"); + // 设置读取请求,返回设备信息 + read_request.is_read_device_info_request = true; + return true; + } + + // 处理复位EQ参数命令 (0x90) - RESET_EQ_PARAMS + if (data[1] == 0x90) { + debug_printf("Received reset EQ params command (RESET_EQ_PARAMS)\n"); + + // 获取模式号 + uint8_t mode = data[2]; + debug_printf("Reset mode: %d (0xFF = all modes)\n", mode); + + // 立即执行复位操作并保存状态 + // 改动原因:复位操作应该在收到命令时立即执行,而不是在读取响应时执行 + // 这样可以避免在读取响应时重复执行耗时操作,提高响应效率 + reset_eq_params(mode); + + // 设置读取请求标志,读取时只返回保存的状态 + read_request.is_reset_eq_params_request = true; + read_request.mode = mode; + return true; + } + + if (data[1] == 0x91) + { + debug_printf("Received get EQ mode count command (GET_EQ_MODE_COUNT)\n"); + // 设置读取请求,返回EQ模式总数 + read_request.is_read_mode_count_request = true; + return true; + } + + // 处理设置并保存EQ模式命令 (0x92) - SET_AND_SAVE_EQ_MODE + if (data[1] == 0x92) { + debug_printf("Received set and save EQ mode command (SET_AND_SAVE_EQ_MODE)\n"); + read_request.is_set_and_save_mode_request = true; + + // 获取模式值 + uint8_t mode = data[2]; + + // 验证模式值范围 + if (mode > EQ_MODE_MAX ) { + debug_printf("Error: Invalid mode %d (valid range: 0-9)\n", mode); + read_request.mode = 0xFF; // 使用0xFF表示失败 + return true; + } + + debug_printf("Setting and saving EQ mode to %d\n", mode); + + // 设置当前模式 + SET_SHARED_GLOBAL(g_request_eq_mode, mode); + + // 更新保存的模式(用于0x9D启用时恢复) + g_saved_eq_mode = mode; + + // 保存到Flash(只保存模式,不影响使能状态) + eq_flash_save_current_mode(mode); + debug_printf("Successfully saved EQ mode %d to Flash (startup mode)\n", mode); + read_request.mode = mode; + + return true; + } + + // 处理设置音量命令 (0x93) - SET_VOLUME + // 改动原因:直接设置g_dac_vol全局变量,参考SET_DAC_VOLUME的实现方式,音量级别范围改为0-255 + if (data[1] == 0x93) { + debug_printf("Received set volume command (SET_VOLUME)\n"); + // 获取音量级别 + uint8_t volume_level = data[2]; + + debug_printf("Setting volume level to %d\n", volume_level); + + // 改动原因:直接设置g_dac_vol,与SET_DAC_VOLUME命令实现方式一致 + extern unsigned g_dac_vol; + SET_SHARED_GLOBAL(g_dac_vol, volume_level); + + debug_printf("Volume level (g_dac_vol) set successfully to %d\n", volume_level); + return true; + } + + // 处理读取音量命令 (0x94) - GET_VOLUME + // 改动原因:在EQ命令中添加读取音量功能,参照HID_DEVICE_PARAMS_PROTOCOL.md中的音量命令实现 + if (data[1] == 0x94) { + debug_printf("Received get volume command (GET_VOLUME)\n"); + // 设置读取请求标志 + read_request.is_read_volume_request = true; + return true; + } + + // 处理获取LED信息命令 (0x95) - GET_LED_INFO + // 改动原因:添加LED信息查询命令,返回LED索引和名称 + if (data[1] == 0x95) { + debug_printf("Received get LED info command (GET_LED_INFO)\n"); + uint8_t led_index = data[2]; + if (led_index > 7) { + debug_printf("Error: Invalid LED index %d (must be 0-7)\n", led_index); + return false; + } + led_request.is_get_led_info_request = true; + led_request.led_index = led_index; + return true; + } + + // 处理设置LED开关命令 (0x96) - SET_LED_SWITCH + // 改动原因:参考SET_LED_MODE,设置g_led_mode的值,0=关,1=开 + if (data[1] == 0x96) { + debug_printf("Received set LED switch command (SET_LED_SWITCH)\n"); + uint8_t led_index = data[2]; + uint8_t led_switch = data[3]; + + if (led_index > 7) { + debug_printf("Error: Invalid LED index %d (must be 0-7)\n", led_index); + return false; + } + if (led_switch > 1) { + debug_printf("Error: Invalid LED switch value %d (must be 0-1)\n", led_switch); + return false; + } + + // 改动原因:参考SET_LED_MODE,设置g_led_mode的值,0=关,1=开 + extern unsigned g_led_mode; + SET_SHARED_GLOBAL(g_led_mode, led_switch); + + debug_printf("LED switch (g_led_mode) set to: %s (index: %d)\n", led_switch ? "ON" : "OFF", led_index); + + // 设置SET命令的响应标志 + // 改动原因:SET_LED_SWITCH的响应格式与GET_LED_SWITCH不同,返回状态码 + led_request.is_set_led_switch_request = true; + led_request.led_index = led_index; + return true; + } + + // 处理获取LED开关命令 (0x97) - GET_LED_SWITCH + // 改动原因:添加LED开关查询命令,返回当前LED开关状态 + if (data[1] == 0x97) { + debug_printf("Received get LED switch command (GET_LED_SWITCH)\n"); + uint8_t led_index = data[2]; + if (led_index > 7) { + debug_printf("Error: Invalid LED index %d (must be 0-7)\n", led_index); + return false; + } + led_request.is_get_led_switch_request = true; + led_request.led_index = led_index; + return true; + } + + // 处理获取LED状态命令 (0x98) - GET_LED_STATUS + // 改动原因:添加LED状态查询命令,返回LED RGB颜色和状态 + if (data[1] == 0x98) { + debug_printf("Received get LED status command (GET_LED_STATUS)\n"); + uint8_t led_index = data[2]; + if (led_index > 7) { + debug_printf("Error: Invalid LED index %d (must be 0-7)\n", led_index); + return false; + } + led_request.is_get_led_status_request = true; + led_request.led_index = led_index; + return true; + } + + // 处理获取LED总数命令 (0x99) - GET_LED_COUNT + // 改动原因:添加LED总数查询命令,返回设备支持的LED总数 + if (data[1] == 0x99) { + debug_printf("Received get LED count command (GET_LED_COUNT)\n"); + led_request.is_get_led_count_request = true; + return true; + } +#endif + // 处理获取UAC模式信息命令 (0x9A) - GET_UAC_MODE_INFO + // 改动原因:添加UAC模式信息查询命令,返回UAC模式总数和模式名称列表 + if (data[1] == 0x9A) { + debug_printf("Received get UAC mode info command (GET_UAC_MODE_INFO)\n"); + uac_request.is_get_uac_mode_info_request = true; + return true; + } + + // 处理设置UAC模式命令 (0x9B) - SET_UAC_MODE + // 改动原因:HID 0x9B命令通过UART 0x51命令透传给MCU处理 + if (data[1] == 0x9B) { + debug_printf("Received set UAC mode command (SET_UAC_MODE) via HID 0x9B\n"); + + // 获取UAC模式值 + uint8_t uac_mode = data[2]; + + // 验证模式值范围 + if (uac_mode > 1) { + debug_printf("Error: Invalid UAC mode %d (must be 0-1, 0=UAC2.0, 1=UAC1.0)\n", uac_mode); + return true; + } + + debug_printf("HID 0x9B: Setting UAC mode to %s, forwarding to MCU via UART 0x51\n", + uac_mode == 0 ? "UAC2.0" : "UAC1.0"); + + // 改动原因:HID 0x9B命令通过UART 0x51命令透传给MCU + // 调用UART 0x51命令处理函数,将命令透传给MCU + process_uart_set_uac_mode(uac_mode); + + // 改动原因:SET_UAC_MODE命令不返回响应,MCU处理后会重启设备 + return true; + } + + // 处理设置输入源模式命令 (0xB0) - SET_INPUT_SOURCE + // 改动原因:同0x9B类似,添加HID命令设置USB/OPT/COAX,收到后通过串口0x5D透传给MCU + if (data[1] == 0xB0) { + debug_printf("Received set input source command (SET_INPUT_SOURCE) via HID 0xB0\n"); + + // 输入源模式值:0=USB, 1=OPT, 2=COAX + uint8_t input_source = data[2]; + + if (input_source > 2) { + debug_printf("Error: Invalid input source %d (must be 0-2, 0=USB, 1=OPT, 2=COAX)\n", input_source); + return true; + } + + debug_printf("HID 0xB0: Setting input source to %s, forwarding to MCU via UART 0x5D\n", + input_source == 0 ? "USB" : (input_source == 1 ? "OPT" : "COAX")); + + // 改动原因:HID 0xB0通过UART 0x5D透传给MCU,由MCU执行输入源切换 + process_uart_set_input_source(input_source); + + // 本命令不返回HID响应,与0x9B一致 + return true; + } + + // 处理设置静音开关命令 (0xB1) - SET_MUTE_SWITCH + // 改动原因:同0xB0类似,0=关 1=开,收到后通过串口0x5E透传给MCU + if (data[1] == 0xB1) { + debug_printf("Received set mute switch command (SET_MUTE_SWITCH) via HID 0xB1\n"); + uint8_t mute = data[2]; + if (mute > 1) { + debug_printf("Error: Invalid mute value %d (must be 0 or 1, 0=关 1=开)\n", mute); + return true; + } + debug_printf("HID 0xB1: Setting mute switch to %s, forwarding to MCU via UART 0x5E\n", mute ? "开" : "关"); + process_uart_set_mute_switch(mute); + return true; + } + + // 处理获取静音开关命令 (0xB2) - GET_MUTE_SWITCH + // 改动原因:通过串口向MCU发送0x5F请求,MCU返回静音值后由读报告返回给主机 + if (data[1] == 0xB2) { + debug_printf("Received get mute switch command (GET_MUTE_SWITCH) via HID 0xB2\n"); + read_request.is_get_mute_switch_request = true; + return true; + } + + // 处理设置监听开关命令 (0xB3) - SET_LISTEN_SWITCH + // 改动原因:0=关 1=开,通过串口 0x60 透传给 MCU,与 0xB0/0xB1 一致 + if (data[1] == 0xB3) { + uint8_t listen = data[2]; + if (listen > 1) { + debug_printf("Error: Invalid listen switch %d (must be 0 or 1, 0=关 1=开)\n", listen); + return true; + } + debug_printf("Received set listen switch command (SET_LISTEN_SWITCH) via HID 0xB3, forwarding to MCU via UART 0x60\n"); + process_uart_set_listen_switch(listen); + return true; + } + + // 处理获取监听开关命令 (0xB4) - GET_LISTEN_SWITCH + // 改动原因:直接获取 g_adc_loop 的值返回,不经过串口 + if (data[1] == 0xB4) { + debug_printf("Received get listen switch command (GET_LISTEN_SWITCH) via HID 0xB4\n"); + read_request.is_get_listen_switch_request = true; + return true; + } + + // 处理获取当前UAC模式命令 (0x9C) - GET_CURRENT_UAC_MODE + // 改动原因:添加当前UAC模式查询命令,返回当前UAC模式值和名称 + if (data[1] == 0x9C) { + debug_printf("Received get current UAC mode command (GET_CURRENT_UAC_MODE)\n"); + uac_request.is_get_current_uac_mode_request = true; + return true; + } + + // 处理设置EQ使能开关命令 (0x9D) - SET_EQ_ENABLE + // 改动原因:添加EQ使能开关功能,禁用时保存当前模式,启用时恢复之前模式 + if (data[1] == 0x9D) { + uint8_t enable = data[2]; // 0=OFF禁用, 1=ON启用 + debug_printf("Received set EQ enable command (SET_EQ_ENABLE), enable: %d\n", enable); + + if (enable > 1) { + debug_printf("Error: Invalid EQ enable value %d (must be 0 or 1)\n", enable); + return false; + } + + // 改动原因:将eq_enable独立为全局开关,所有模式共用一个开关 + // 在任何模式下调整enable,都会影响所有模式,不改变当前模式 + g_eq_enable = enable; + + // 只保存EQ使能状态到Flash,不影响已保存的模式(0x92保存的模式) + eq_flash_save_eq_enable(enable); + + unsigned int current_mode; + GET_SHARED_GLOBAL(current_mode, g_request_eq_mode); + debug_printf("EQ enable set to %d (global switch, affects all modes), current mode: %d, saved startup mode: %d\n", + enable, current_mode, g_saved_eq_mode); + + read_request.is_set_eq_enable_request = true; + read_request.eq_enable_value = enable; + return true; + } + + // 处理获取EQ使能开关命令 (0x9E) - GET_EQ_ENABLE + // 改动原因:添加获取EQ使能开关状态功能 + if (data[1] == 0x9E) { + debug_printf("process_send_params: received GET_EQ_ENABLE (0x9E) command\n"); + debug_printf("process_send_params: setting is_get_eq_enable_request=true\n"); + read_request.is_get_eq_enable_request = true; + debug_printf("process_send_params: GET_EQ_ENABLE command processed, returning true\n"); + return true; + } + + // 处理获取采样率和格式命令 (0x9F) - GET_SAMPLE_FORMAT + // 改动原因:添加采样率和格式查询命令,返回当前采样率和DSD模式(已去掉DAC采样分辨率) + if (data[1] == 0x9F) { + debug_printf("Received get sample format command (GET_SAMPLE_FORMAT)\n"); + read_request.is_read_sample_format_request = true; + return true; + } + + // 处理设置增益模式命令 (0xA0) - SET_GAIN_MODE + // 改动原因:添加独立的增益模式设置命令,使用EQ协议帧头0x77,与设备参数命令分离 + if (data[1] == 0xA0) { + debug_printf("Received set gain mode command (SET_GAIN_MODE)\n"); + uint8_t gain_mode = data[2]; + + // 参数验证 + if (gain_mode > 1) { + debug_printf("Error: Invalid gain_mode %d (must be 0-1)\n", gain_mode); + return false; + } + + // 设置请求变量(使用SHARED_GLOBAL宏) + extern unsigned g_request_gain_mode; + SET_SHARED_GLOBAL(g_request_gain_mode, gain_mode); + + debug_printf("Gain mode set request: %d (0=低阻, 1=高阻)\n", gain_mode); + return true; + } + + // 处理获取增益模式命令 (0xA1) - GET_GAIN_MODE + // 改动原因:添加独立的增益模式读取命令,使用EQ协议帧头0x77 + if (data[1] == 0xA1) { + debug_printf("Received get gain mode command (GET_GAIN_MODE)\n"); + read_request.is_get_gain_mode_request = true; + return true; + } + + // 处理设置滤波器模式命令 (0xA2) - SET_FILTER_MODE + // 改动原因:添加独立的滤波器模式设置命令,使用EQ协议帧头0x77,与设备参数命令分离 + if (data[1] == 0xA2) { + debug_printf("Received set filter mode command (SET_FILTER_MODE)\n"); + uint8_t filter_mode = data[2]; + + // 参数验证 + // 改动原因:支持8种滤波器模式(0-7),与g_filter_map[8]数组定义一致 + if (filter_mode > 7) { + debug_printf("Error: Invalid filter_mode %d (must be 0-7)\n", filter_mode); + return false; + } + + // 设置请求变量(使用SHARED_GLOBAL宏) + extern unsigned g_request_filter_mode; + SET_SHARED_GLOBAL(g_request_filter_mode, filter_mode); + + debug_printf("Filter mode set request: %d (0-7: 8种滤波器模式)\n", filter_mode); + return true; + } + + // 处理获取滤波器模式命令 (0xA3) - GET_FILTER_MODE + // 改动原因:添加独立的滤波器模式读取命令,使用EQ协议帧头0x77 + if (data[1] == 0xA3) { + debug_printf("Received get filter mode command (GET_FILTER_MODE)\n"); + read_request.is_get_filter_mode_request = true; + return true; + } + + // 处理设置游戏模式命令 (0xA4) - SET_GAME_MODE + // 改动原因:HID 0xA4命令通过UART 0x5A命令透传给MCU处理 + if (data[1] == 0xA4) { + debug_printf("Received set game mode command (SET_GAME_MODE) via HID 0xA4\n"); + uint8_t game_mode = data[2]; + + // 参数验证 + if (game_mode > 2) { + debug_printf("Error: Invalid game_mode %d (must be 0-2)\n", game_mode); + return false; + } + + debug_printf("HID 0xA4: Setting game mode to %d, forwarding to MCU via UART 0x5A\n", game_mode); + + // 改动原因:HID 0xA4命令通过UART 0x5A命令透传给MCU + // 调用UART 0x5A命令处理函数,将命令透传给MCU + process_uart_set_game_mode(game_mode); + + return true; + } + + // 处理获取游戏模式命令 (0xA5) - GET_GAME_MODE + // 改动原因:添加独立的游戏模式读取命令,使用EQ协议帧头0x77 + if (data[1] == 0xA5) { + debug_printf("Received get game mode command (GET_GAME_MODE)\n"); + read_request.is_get_game_mode_request = true; + return true; + } + + // 处理获取固件版本命令 (0xA6) - GET_FIRMWARE_VERSION + // 改动原因:添加独立的固件版本读取命令,使用EQ协议帧头0x77,参考user_uart.xc中的FW_VERSION实现 + if (data[1] == 0xA6) { + debug_printf("Received get firmware version command (GET_FIRMWARE_VERSION)\n"); + read_request.is_get_firmware_version_request = true; + return true; + } + // 处理设置log打印开关命令 (0x70) - SET_LOG_SWITCH + // 改动原因:添加0x70命令,用全局变量g_log_switch记录开关状态(0=关闭 1=开启),debug_printf 据此决定是否输出 + if (data[1] == 0x70) { + uint8_t on = data[2]; + if (on > 1) { + debug_printf("Error: Invalid log switch %d (must be 0 or 1)\n", on); + return false; + } + g_log_switch = on; + debug_printf("Log switch set to %d (0=off, 1=on)\n", on); + return true; + } + + if (data[1] == 0x8d) + { +#if !UAC1 + debug_printf("Received set EQ filter parameters command (SET_EQ_PARAMS)\n"); + + // Get mode value (跳过report_id字节) + uint8_t mode = data[2]; + debug_printf("Received mode: %d\n", mode); + + // 改动原因:eq_enable是全局开关,与模式切换独立 + // 可以在任何enable状态下修改模式参数,不影响EQ处理状态 + + // 检查模式是否允许修改:只允许修改用户模式(6-8),不允许修改预设模式(0-5)和bypass模式(9) + // 改动原因:保护预设参数不被修改,只允许用户修改用户自定义模式参数 + if (mode < EQ_USER_MODE_MIN || mode > EQ_USER_MODE_MAX) { + debug_printf("Error: Cannot modify EQ parameters for mode %d. Only user modes (%d-%d) can be modified.\n", + mode, EQ_USER_MODE_MIN, EQ_USER_MODE_MAX); + return false; + } + + uint8_t band_index = data[3]; // 位置从7移到3 + debug_printf("Received filter index: %d\n", band_index); + + if (band_index >= MAX_EQ_BANDS) + { + debug_printf("Error: Filter index out of range: %d (max: %d)\n", band_index, MAX_EQ_BANDS - 1); + return false; + } + + // 改动原因:优化EQ参数存储策略,统一参数源为44100Hz + // 先更新44100Hz的参数(统一参数源),然后通过copy_params_from_44100同步到其他采样率 + // 解析新参数(只解析一次,避免重复解析) + filter_params_t new_params; + memset(&new_params, 0, sizeof(filter_params_t)); + new_params.index = band_index; + new_params.type = (filter_type_t)data[4]; + + // 解析浮点参数(小端序) + uint32_t fc_bytes = data[5] | (data[6] << 8) | (data[7] << 16) | (data[8] << 24); + memcpy(&new_params.fc, &fc_bytes, 4); + uint32_t q_bytes = data[9] | (data[10] << 8) | (data[11] << 16) | (data[12] << 24); + memcpy(&new_params.q, &q_bytes, 4); + uint32_t bw_bytes = data[13] | (data[14] << 8) | (data[15] << 16) | (data[16] << 24); + memcpy(&new_params.bw, &bw_bytes, 4); + uint32_t gain_bytes = data[17] | (data[18] << 8) | (data[19] << 16) | (data[20] << 24); + memcpy(&new_params.gain, &gain_bytes, 4); + + DPRINTF("Parsed new params: fc=%.2f, q=%.3f, bw=%.2f, gain=%.2f\n", + new_params.fc, new_params.q, new_params.bw, new_params.gain); + + // 检查参数有效性 + if ((isnan(new_params.fc) || isnan(new_params.q) || isnan(new_params.bw) || isnan(new_params.gain)) || new_params.fc == 0) { + debug_printf("Error: Invalid float values detected!\n"); + return false; + } + + // 只更新44100Hz统一参数源 + eq_mode_data_t *eq_data_44100 = &sEQ_data_44100HZ[mode][0]; + filter_params_t *band_44100 = &eq_data_44100->bands[band_index]; + + // 检查参数是否变化 + if (eq_single_params_different(band_44100, &new_params)) { + debug_printf("Parameter changed for mode %d, band %d, updating 44100Hz source\n", mode, band_index); + + // 更新44100Hz的参数(统一参数源) + band_44100->type = new_params.type; + band_44100->fc = new_params.fc; + band_44100->q = new_params.q; + band_44100->bw = new_params.bw; + band_44100->gain = new_params.gain; + + // 同步到第二个通道 + eq_mode_data_t *eq_data_44100_ch1 = &sEQ_data_44100HZ[mode][1]; + filter_params_t *band_44100_ch1 = &eq_data_44100_ch1->bands[band_index]; + memcpy(band_44100_ch1, band_44100, sizeof(filter_params_t)); + + // 改动原因:当EQ禁用时,不设置强制模式切换标志,避免实际切换模式 + if (g_eq_enable == 1) { + SET_SHARED_GLOBAL(g_force_request_eq_mode_change, 1); + } else { + debug_printf("EQ disabled: Parameter updated for saved mode %d (not switching current mode)\n", mode); + } + + // 同步参数到所有其他采样率 + uint32_t all_sample_rates[] = {48000, 88200, 96000, 176400, 192000}; + int num_rates = sizeof(all_sample_rates) / sizeof(all_sample_rates[0]); + + for (int rate_idx = 0; rate_idx < num_rates; rate_idx++) { + uint32_t fs = all_sample_rates[rate_idx]; + // 复制参数到目标采样率 + if (copy_params_from_44100(fs, mode) == 0) { + // 计算系数 + calculate_current_mode_coefficients(fs, mode); + debug_printf("Synced params and calculated coefficients for %dHz\n", fs); + } + } + + // 计算44100Hz的系数 + calculate_current_mode_coefficients(44100, mode); + + // 改动原因:标记参数已修改,需要同步到Flash + // 使用eq_process_single_param_change处理参数变化并标记为脏 + if (eq_process_single_param_change(44100, mode, 0, band_index, band_44100) == 0) { + debug_printf("Successfully processed parameter change for 44100Hz channel 0\n"); + } else { + debug_printf("Error processing parameter change for 44100Hz channel 0\n"); + } + + // 标记模式为脏,需要同步到Flash + eq_flash_mark_dirty(mode); + debug_printf("Marked mode %d as dirty for Flash sync\n", mode); + + debug_printf("Parameter update completed for mode %d, band %d\n", mode, band_index); + } else { + debug_printf("Parameter unchanged for mode %d, band %d\n", mode, band_index); + } +#endif + return true; + } +#if 0 + // 旧代码已重构,以下代码不再使用 + uint32_t all_sample_rates[] = {44100, 48000, 88200, 96000, 176400, 192000}; + int num_rates = sizeof(all_sample_rates) / sizeof(all_sample_rates[0]); + + for (int rate_idx = 0; rate_idx < num_rates; rate_idx++) { + uint32_t fs = all_sample_rates[rate_idx]; + + // 查找对应采样率和模式的eq参数数组 + eq_mode_data_t *eq_data = NULL; + eq_mode_data_t *eq_data_2 = NULL; + if (fs == 44100) { + eq_data = &sEQ_data_44100HZ[mode][0]; + eq_data_2 = &sEQ_data_44100HZ[mode][1]; + } else { + // 改动原因:所有采样率共用44100Hz数组 + eq_data = &sEQ_data_44100HZ[mode][0]; + eq_data_2 = &sEQ_data_44100HZ[mode][1]; + } + + // 检查指针有效性和mode范围 + if (eq_data != NULL && eq_data_2 != NULL && mode < NUM_EQ_MODES) { + // 更新对应band的参数到eq参数数组 + filter_params_t *band = &eq_data->bands[band_index]; + filter_params_t new_params; + // 初始化结构体 + memset(&new_params, 0, sizeof(filter_params_t)); + new_params.index = band_index; + new_params.type = (filter_type_t)data[4]; // 位置从8移到4 + + // 打印原始数据字节 + DPRINTF(" Raw data bytes: "); + for (int i = 0; i < 25; i++) { + DPRINTF("%02x ", data[i]); + } + DPRINTF("\n"); + + // 手动组合字节解析小端序浮点数 + // Python发送小端序: 44 16 00 00 (600.0) + // C接收小端序: 00 00 16 44,需要按小端序解析 + // fc: 00 00 16 44 -> 0x44160000 + uint32_t fc_bytes = data[5] | (data[6] << 8) | (data[7] << 16) | (data[8] << 24); + memcpy(&new_params.fc, &fc_bytes, 4); + DPRINTF("fc: "); + print_float(new_params.fc, 6); + + + // q: cd cc cc 3e -> 0x3ecccccd (小端序) + uint32_t q_bytes = data[9] | (data[10] << 8) | (data[11] << 16) | (data[12] << 24); + memcpy(&new_params.q, &q_bytes, 4); + DPRINTF("q: "); + print_float(new_params.q, 6); + + // bw: 00 00 80 3f -> 0x3f800000 + uint32_t bw_bytes = data[13] | (data[14] << 8) | (data[15] << 16) | (data[16] << 24); + memcpy(&new_params.bw, &bw_bytes, 4); + DPRINTF("bw: "); + print_float(new_params.bw, 6); + + // gain: 00 00 10 c1 -> 0xc1100000 + uint32_t gain_bytes = data[17] | (data[18] << 8) | (data[19] << 16) | (data[20] << 24); + memcpy(&new_params.gain, &gain_bytes, 4); + DPRINTF("gain: "); + print_float(new_params.gain, 6); + DPRINTF("\n"); + // 双通道也要同步 + + + // 检查参数有效性 + if ((isnan(new_params.fc) || isnan(new_params.q) || isnan(new_params.bw) || isnan(new_params.gain)) || new_params.fc == 0) { + DPRINTF(" ERROR: Invalid float values detected!\n"); + return false; + } + + if (eq_single_params_different(band, &new_params)) { + DPRINTF(" Single parameter changed for sample rate %d Hz, adding to database\n", fs); + band->type = new_params.type; + band->fc = new_params.fc; + band->q = new_params.q; + band->bw = new_params.bw; + band->gain = new_params.gain; + // 改动原因:当EQ禁用时,不设置强制模式切换标志,避免实际切换模式 + if (g_eq_enable == 1) { + SET_SHARED_GLOBAL(g_force_request_eq_mode_change, 1); + } else { + debug_printf("EQ disabled: Parameter updated for saved mode %d (not switching current mode)\n", mode); + } + } + else + { + DPRINTF(" Single parameter unchanged for sample rate %d Hz, no action needed\n", fs); + continue; + } + + // 自动计算并存储系数到eq参数数组 + q2_30 coeffs[5]; + int calculated_bshift; + #if 1 + DPRINTF(" Calculating coefficients for sample rate %d Hz, type=%d, fc=", fs, new_params.type); + print_float(new_params.fc, 6); + eq_data->bands[band_index].fc = new_params.fc; + DPRINTF(", q="); + print_float(new_params.q, 6); + eq_data->bands[band_index].q = new_params.q; + DPRINTF(", bw="); + print_float(new_params.bw, 6); + eq_data->bands[band_index].bw = new_params.bw; + DPRINTF(", gain="); + print_float(new_params.gain, 6); + eq_data->bands[band_index].gain = new_params.gain; + DPRINTF("\n"); + #endif + + if (fs == 44100) { + if (eq_process_single_param_change(fs, mode, 0, band_index, band) == 0) { + debug_printf("Successfully processed 0x8d single parameter change for 44100Hz channel 0\n"); + } else { + debug_printf("Error processing 0x8d single parameter change for 44100Hz channel 0\n"); + } + + // 标记参数已修改,需要同步到Flash + eq_flash_mark_dirty(mode); + debug_printf("Marked mode %d as dirty for Flash sync\n", mode); + } + } else { + debug_printf("Error: eq_data pointer NULL or mode out of range (mode=%d, fs=%d)\n", mode, fs); + } + } + + debug_printf("Parameter processing completed for all sample rates\n"); + } +#endif // #if 0 + +#endif // #if EQ_EN (for process_send_params EQ commands section starting at line 1228) + +/* 改动原因:仅将 FIRMWARE_UPGRADE_START(0xA7) 转发到 AudioHwRemote2 执行; + * 其余固件升级命令(DATA/END/STATUS/ABORT/ERASE) 在 process_send_params 内直接调用 handle_* 处理,不再转发。 */ +#if HID_DFU_EN + if (data[1] == FIRMWARE_UPGRADE_START) { + dfu_chan_forward(data, len); + return true; + } + if (data[1] >= FIRMWARE_UPGRADE_DATA && data[1] <= FIRMWARE_UPGRADE_ERASE) { + unsigned char result; + if (data[1] == FIRMWARE_UPGRADE_DATA) + result = handle_firmware_upgrade_data(data, len); + else if (data[1] == FIRMWARE_UPGRADE_END) + result = handle_firmware_upgrade_end(data, len); + else if (data[1] == FIRMWARE_UPGRADE_STATUS) + result = handle_firmware_upgrade_status(data, len); + else if (data[1] == FIRMWARE_UPGRADE_ABORT) + result = handle_firmware_upgrade_abort(data, len); + else + result = handle_firmware_upgrade_erase(data, len); + (void)result; + return true; + } +#endif + + if (data[1] == DEVICE_REBOOT) { // 0xAE - 设备重启(通用命令) + // 改动原因:将固件升级专用的REBOOT命令改为通用的设备重启命令 + debug_printf("Received device REBOOT command (0xAE)\n"); + + device_reboot(); + while(1); + return true; + } + return true; +} + +#if EQ_EN +// ==================== 串口EQ命令处理函数 ==================== + +/** + * @brief 处理串口EQ模式设置 (0x30) + * @param mode EQ模式值 (0-9) + * @return 处理结果 + */ +uint8_t process_uart_set_eq_mode(uint8_t mode) +{ + debug_printf("UART SET_EQ_MODE: mode=%d\n", mode); + + // 验证模式值范围 + if (mode > EQ_MODE_MAX ) { + debug_printf("Invalid EQ mode: %d\n", mode); + return 0x01; // 失败 + } + + // 设置EQ模式 + SET_SHARED_GLOBAL(g_request_eq_mode, mode); + debug_printf("EQ mode set to: %d\n", mode); + + return 0x00; // 成功 +} + +/** + * @brief UART校验和计算函数,直接复用user_func.c的check_sum函数 + */ +#define uart_checksum(pbuf, len) check_sum((unsigned char *)(pbuf), (unsigned)(len)) + +/** + * @brief 处理串口获取EQ模式信息 (0x31) + * @param response 响应数据缓冲区 + * @param response_size 响应缓冲区大小 + * @return 响应数据长度 + */ +uint8_t process_uart_get_eq_mode(uint8_t *response, uint8_t response_size) +{ +#if !UAC1 + if (response_size < 22) { + debug_printf("Response buffer too small\n"); + return 0; + } + + uint8_t current_mode; + int32_t mode_gain = 0; + char mode_name[16] = {0}; + + GET_SHARED_GLOBAL(current_mode, g_request_eq_mode); + + // 获取模式增益和名称 + if (current_mode < NUM_EQ_MODES) { + // 从44100Hz数据中获取模式增益 + eq_mode_data_t (*eq_data)[NUM_EQ_MODES][NUM_EQ_CHANS] = &sEQ_data_44100HZ; + mode_gain = (*eq_data)[current_mode][0].post_gain_db; + + // 从全局模式信息中获取模式名称 + memcpy(mode_name, g_mode_info.mode_names[current_mode], 16); + } + + debug_printf("UART GET_EQ_MODE: mode=%d, gain=%d, name=%s\n", current_mode, mode_gain, mode_name); + + // 构建响应数据 (串口格式: 55 AA 00 31 15 ...) + response[0] = 0x55; // 帧头1 + response[1] = 0xAA; // 帧头2 + response[2] = 0x00; // 版本 + response[3] = GET_EQ_MODE; // 命令码 + response[4] = 0x15; // 数据长度 (21字节) + + response[5] = current_mode; // 模式值 + response[6] = (mode_gain >> 0) & 0xFF; // 增益值 (小端序) + response[7] = (mode_gain >> 8) & 0xFF; + response[8] = (mode_gain >> 16) & 0xFF; + response[9] = (mode_gain >> 24) & 0xFF; + + // 复制模式名称 + for (int i = 0; i < 16; i++) { + response[10 + i] = mode_name[i]; + } + + // 计算校验和 + uint8_t checksum_pos = 26; + response[checksum_pos] = uart_checksum(response, checksum_pos); +#endif + + return 27; // 总长度 +} + +/** + * @brief 处理串口设置模式增益和名称 (0x32) + * @param data 接收到的数据包 + * @return 处理结果 + */ +uint8_t process_uart_set_mode_gain_and_name(uint8_t *data) +{ +#if !UAC1 + uint8_t mode = data[5]; // 串口数据位置 + int32_t gain = (data[9] << 24) | (data[8] << 16) | (data[7] << 8) | data[6]; // 小端序 + char mode_name[16] = {0}; + bool name_is_empty = true; + bool gain_changed = false; + bool name_changed = false; + + // 复制模式名称 + for (int i = 0; i < 16; i++) { + mode_name[i] = data[10 + i]; + } + + debug_printf("UART SET_MODE_GAIN_AND_NAME: mode=%d, gain=%d, name=%s\n", mode, gain, mode_name); + + // 验证模式值范围 + if (mode > EQ_MODE_MAX ) { + debug_printf("Invalid EQ mode: %d\n", mode); + return 0x01; // 失败 + } + + // 检查模式是否允许修改:只允许修改用户模式(6-8),不允许修改预设模式(0-5)和bypass模式(9) + // 改动原因:保护预设参数不被修改,只允许用户修改用户自定义模式参数 + if (mode < EQ_USER_MODE_MIN || mode > EQ_USER_MODE_MAX) { + debug_printf("Error: Cannot modify EQ gain/name for mode %d. Only user modes (%d-%d) can be modified.\n", + mode, EQ_USER_MODE_MIN, EQ_USER_MODE_MAX); + return 0x01; // 失败 + } + + // 设置模式增益和名称(只处理用户模式) + if (mode < NUM_EQ_MODES) { + // 获取44100采样率下该模式的当前gain值,判断是否有变化 + int32_t current_gain_44100 = sEQ_data_44100HZ[mode][0].post_gain_db; + bool gain_changed = (current_gain_44100 != gain); + + if (gain_changed) { + debug_printf("UART: Gain changed from %d to %d, will mark dirty\n", current_gain_44100, gain); + } else { + debug_printf("UART: Gain unchanged (%d), skip marking dirty\n", current_gain_44100); + } + + // 获取当前模式名称,判断是否有变化 + char current_name[16] = {0}; + strncpy(current_name, g_mode_info.mode_names[mode], 15); + current_name[15] = '\0'; + + // 检查新名称是否全空(全0或全空格) + if (mode_name[0] != '\0') { + // 检查是否全是空格 + for (int i = 0; i < 16 && mode_name[i] != '\0'; i++) { + if (mode_name[i] != ' ') { + name_is_empty = false; + break; + } + } + } + // 如果第一个字符就是\0,name_is_empty保持为true + + // 比较名称是否有变化 + name_changed = (strncmp(current_name, mode_name, 15) != 0); + + if (name_is_empty) { + debug_printf("UART: Mode name is empty, skip saving\n"); + } else if (name_changed) { + debug_printf("UART: Name changed from '%s' to '%s', will mark dirty\n", current_name, mode_name); + } else { + debug_printf("UART: Name unchanged ('%s'), skip marking dirty\n", current_name); + } + + // 设置到所有采样率的EQ数据中 + // 改动原因:限制gain范围到0到-50dB,确保所有post_gain_db都在有效范围内 + int32_t clamped_gain = clamp_post_gain(gain); + if (clamped_gain != gain) { + debug_printf("UART: Gain value %d clamped to %d (range: 0 to -50dB)\n", gain, clamped_gain); + } + uint32_t all_sample_rates[] = {44100, 48000, 88200, 96000, 176400, 192000}; + // 改动原因:所有采样率共用44100Hz数组,直接更新即可 + sEQ_data_44100HZ[mode][0].post_gain_db = clamped_gain; + sEQ_data_44100HZ[mode][1].post_gain_db = clamped_gain; + + // 设置到全局模式信息中(根据判断结果决定是否标记脏标志) + // 改动原因:使用限制后的gain值,确保存储的gain值在有效范围内 + set_mode_gain(mode, clamped_gain); + eq_mark_gain_dirty(); // 只有变化时才标记脏 + } + + if (!name_is_empty && name_changed) { + set_mode_name(mode, mode_name); + eq_mark_name_dirty(); // 只有变化且非空时才标记脏 + } +#endif + return 0x00; // 成功 +} + +/** + * @brief 处理串口设置EQ参数 (0x33) + * @param data 接收到的数据包 + * @return 处理结果 + */ +uint8_t process_uart_set_eq_params(uint8_t *data) +{ + uint8_t result = 0x00; +#if !UAC1 + uint8_t mode = data[5]; // 模式值 + uint8_t band_index = data[6]; // 滤波器索引 + uint8_t filter_type = data[7]; // 滤波器类型 + float fc, q, bw, gain; + + // 检查模式是否允许修改:只允许修改用户模式(6-8),不允许修改预设模式(0-5)和bypass模式(9) + // 改动原因:保护预设参数不被UART修改,只允许用户通过UART修改用户自定义模式参数 + if (mode < EQ_USER_MODE_MIN || mode > EQ_USER_MODE_MAX) { + debug_printf("UART Error: Cannot modify EQ parameters for mode %d. Only user modes (%d-%d) can be modified.\n", + mode, EQ_USER_MODE_MIN, EQ_USER_MODE_MAX); + return 0x01; // 失败 + } + // 解析浮点参数 (小端序) + fc = *(float*)(&data[8]); + q = *(float*)(&data[12]); + bw = *(float*)(&data[16]); + gain = *(float*)(&data[20]); + + DPRINTF("mode: %d, band_index: %d, filter_type: %d\n", mode, band_index, filter_type); + DPRINTF("fc: "); + print_float(fc, 6); + DPRINTF("q: "); + print_float(q, 6); + DPRINTF("bw: "); + print_float(bw, 6); + print_float(gain, 6); + DPRINTF("gain: "); + print_float(gain, 6); + DPRINTF("\n"); + + // 验证参数范围(band_index检查) + if ((mode > (EQ_MODE_MAX - 1)) || (band_index >= MAX_EQ_BANDS)) { + debug_printf("Invalid parameters: mode=%d, band=%d\n", mode, band_index); + return 0x01; // 失败 + } + + // 使用现有的参数处理逻辑 + // 构建临时数据包,调用现有的HID处理函数 + uint8_t temp_data[60]; + temp_data[0] = 0x77; // 同步头 + temp_data[1] = 0x8D; // HID命令码 + temp_data[2] = mode; + temp_data[3] = band_index; + temp_data[4] = filter_type; + + // 复制浮点参数 + memcpy(&temp_data[5], &fc, 4); + memcpy(&temp_data[9], &q, 4); + memcpy(&temp_data[13], &bw, 4); + memcpy(&temp_data[17], &gain, 4); + + // 调用现有的HID处理函数 + if (process_send_params(temp_data, 60) == false) { + result = 0x01; // 失败 + } + + +#endif + return result; +} + +/** + * @brief 处理串口获取EQ参数 (0x34) + * @param data 请求数据包 + * @param response 响应数据缓冲区 + * @param response_size 响应缓冲区大小 + * @return 响应数据长度 + */ +uint8_t process_uart_get_eq_params(uint8_t *data, uint8_t *response, uint8_t response_size) +{ +#if !UAC1 + if (response_size < 27) { + debug_printf("Response buffer too small\n"); + return 0; + } + + uint8_t mode = data[5]; // 模式值 + uint8_t band_index = data[6]; // EQ索引 + + debug_printf("UART GET_EQ_PARAMS: mode=%d, band=%d\n", mode, band_index); + + // 验证参数范围 + if (mode > (EQ_MODE_MAX - 1) || band_index > 7) { + debug_printf("Invalid parameters: mode=%d, band=%d\n", mode, band_index); + return 0; + } + + // 构建响应数据 (串口格式: 55 AA 00 44 13 ...) + // 改动原因:使用枚举名称替代数字命令码,提高代码可读性和维护性 + response[0] = 0x55; // 帧头1 + response[1] = 0xAA; // 帧头2 + response[2] = 0x00; // 版本 + response[3] = GET_EQ_PARAMS; // 命令码 + response[4] = 0x13; // 数据长度 (19字节: 1字节模式 + 1字节索引 + 1字节类型 + 4个float参数共16字节) + + response[5] = mode; + response[6] = band_index; + + // 从EQ数据中读取参数 + // 选择对应的EQ数据数组 (使用44100Hz,因为串口设置参数时主要存储到44100Hz) + eq_mode_data_t (*eq_data)[NUM_EQ_MODES][NUM_EQ_CHANS] = NULL; + // 优先使用44100Hz数据,因为串口设置参数时主要存储到44100Hz + eq_data = &sEQ_data_44100HZ; + debug_printf("Using 44100Hz data for UART read (g_eq_sample_rate=%d)\n", g_eq_sample_rate); + + if (eq_data != NULL && mode < NUM_EQ_MODES) { + // 复制滤波器参数 + filter_params_t *band = &(*eq_data)[mode][0].bands[band_index]; + response[7] = band->type; + + // 复制浮点参数 + memcpy(&response[8], &band->fc, 4); + memcpy(&response[12], &band->q, 4); + memcpy(&response[16], &band->bw, 4); + memcpy(&response[20], &band->gain, 4); + DPRINTF("mode: %d, band_index: %d\n", mode, band_index); + DPRINTF("fc: "); + print_float(band->fc, 6); + DPRINTF("q: "); + print_float(band->q, 6); + DPRINTF("bw: "); + print_float(band->bw, 6); + DPRINTF("gain: "); + print_float(band->gain, 6); + DPRINTF("\n"); + + } else { + // 返回默认值 + response[7] = 0x00; // 滤波器类型 + float default_fc = 1000.0f; + float default_q = 0.707f; + float default_bw = 1.0f; + float default_gain = 0.0f; + memcpy(&response[8], &default_fc, 4); + memcpy(&response[12], &default_q, 4); + memcpy(&response[16], &default_bw, 4); + memcpy(&response[20], &default_gain, 4); + } + + // 计算校验和 + // 改动原因:数据长度是19字节(0x13),所以校验和位置应该是5(头部) + 19(数据) = 24 + uint8_t checksum_pos = 24; + response[checksum_pos] = uart_checksum(response, checksum_pos); +#endif + return 25; // 总长度:5(头部) + 19(数据) + 1(校验和) = 25 +} + +/** + * @brief 处理串口复位EQ参数 (0x35) + * @param data 接收到的数据包 + * @return 处理结果 + */ +/** + * @brief 处理串口获取EQ模式总数 (0x36) + * @param response 响应缓冲区 + * @param response_size 响应缓冲区大小 + * @return 响应数据长度 + */ +uint8_t process_uart_get_eq_mode_count(uint8_t *response, uint8_t response_size) +{ + if (response_size < 9) { + debug_printf("Response buffer too small\n"); + return 0; + } + + // 模式总数:预定义模式(0-5) + 用户模式(6-8) = 9,不包含禁用模式(10) + uint8_t mode_count = 9; + // 预定义模式数量:0-5共6个预设模式 + uint8_t preset_mode_count = 6; // EQ_PRESET_MODE_MAX + 1 = 5 + 1 = 6 + + debug_printf("UART GET_EQ_MODE_COUNT: count=%d, preset_count=%d\n", mode_count, preset_mode_count); + + // 构建响应数据 (串口格式: 55 AA 00 47 02 ...) + // 改动原因:使用枚举名称替代数字命令码,提高代码可读性和维护性 + response[0] = 0x55; // 帧头1 + response[1] = 0xAA; // 帧头2 + response[2] = 0x00; // 版本 + response[3] = GET_EQ_MODE_COUNT; // 命令码 + response[4] = 0x02; // 数据长度 (2字节) + response[5] = mode_count; // 模式总数 + response[6] = preset_mode_count; // 预定义模式数量 + + // 计算校验和 + uint8_t checksum_pos = 7; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + return 8; // 总长度 +} +/** + * @brief 处理串口设置并保存EQ模式 (0x37) + * @param data 接收到的数据包 + * @return 状态码 (0x00=成功, 0x01=失败) + */ +uint8_t process_uart_set_and_save_eq_mode(uint8_t *data) +{ + uint8_t mode = data[5]; // 模式值 + uint8_t status = 0x00; // 成功 + + debug_printf("UART SET_AND_SAVE_EQ_MODE: mode=%d\n", mode); + + // 验证模式值范围 + if (mode > EQ_MODE_MAX ) { + debug_printf("Error: Invalid mode %d (valid range: 0-9)\n", mode); + return 0x01; // 失败 + } + + // 设置当前模式 + g_request_eq_mode = mode; + SET_SHARED_GLOBAL(g_request_eq_mode, mode); + + // 保存到Flash + int result = eq_flash_save_current_mode(mode); + if (result != 0) { + debug_printf("Failed to save EQ mode %d to Flash\n", mode); + status = 0x01; // 失败 + } else { + debug_printf("Successfully set and saved EQ mode %d to Flash\n", mode); + } + + return status; +} + + +#define LED_RED 0b01011111 // 修改:清除最高位,只保留低7位 +#define LED_GREEN 0b01101111 // 修改:清除最高位,只保留低7位 +#define LED_BLUE 0b00111111 // 修改:清除最高位,只保留低7位 + +uint8_t process_uart_reset_eq_params(uint8_t *data) +{ + uint8_t mode = data[5]; // 模式号 + uint8_t status = 0x00; // 成功 + + debug_printf("UART RESET_EQ_PARAMS: mode=%d\n", mode); + + // 验证模式值范围 + if (mode > (EQ_MODE_MAX - 1) && mode != 0xFF) { + debug_printf("Invalid EQ mode: %d\n", mode); + status = 0x01; // 失败 + } else { + // 调用复位函数 + uint8_t result = reset_eq_params(mode); + if (result != 0x00) { + status = 0x01; // 失败 + } + } + + return status; +} + +// 标记增益和模式名称为脏(延迟保存) +extern void eq_mark_gain_dirty(void); +extern void eq_mark_name_dirty(void); + +// 设置模式增益函数 +void set_mode_gain(uint8_t mode, int32_t gain) { + if (mode >= NUM_EQ_MODES) { + debug_printf("Error: Invalid mode %d\n", mode); + return; + } + + // 改动原因:限制gain范围到0到-50dB,确保存储的gain值在有效范围内 + int32_t clamped_gain = clamp_post_gain(gain); + if (clamped_gain != gain) { + debug_printf("Warning: gain %d clamped to %d (range: 0 to -50dB) for mode %d\n", gain, clamped_gain, mode); + } + + // 设置模式增益 + g_mode_info.mode_gains[mode] = clamped_gain; + + debug_printf("Set mode %d: gain=%d dB\n", mode, clamped_gain); + + // 注意:不在这里自动标记脏标志,由调用者根据实际情况决定是否标记 +} + +// 设置模式名称函数 +void set_mode_name(uint8_t mode, const char* name) { + if (mode >= NUM_EQ_MODES || name == NULL) { + debug_printf("Error: Invalid mode %d or null name\n", mode); + return; + } + + // 设置模式名称 + strncpy(g_mode_info.mode_names[mode], name, 15); + g_mode_info.mode_names[mode][15] = '\0'; // 确保null终止 + + debug_printf("Set mode %d: name='%s'\n", mode, name); + + // 注意:不在这里自动标记脏标志,由调用者根据实际情况决定是否标记 +} + +// 获取模式增益函数 +void get_mode_gain(uint8_t mode, int32_t* gain) { + if (mode >= NUM_EQ_MODES || gain == NULL) { + debug_printf("Error: Invalid parameters for mode %d\n", mode); + return; + } + + *gain = g_mode_info.mode_gains[mode]; + + debug_printf("Get mode %d: gain=%d dB\n", mode, *gain); +} + +// 获取模式名称函数 +void get_mode_name(uint8_t mode, char* name) { + if (mode >= NUM_EQ_MODES || name == NULL) { + debug_printf("Error: Invalid parameters for mode %d\n", mode); + return; + } + + strncpy(name, g_mode_info.mode_names[mode], 15); + name[15] = '\0'; // 确保null终止 + + debug_printf("Get mode %d: name='%s'\n", mode, name); +} + +// 初始化模式信息函数 +void init_mode_info(void) { + // 初始化默认模式名称 + const char* default_names[NUM_EQ_MODES] = { + "JAZZ", "POP", "ROCK", "CLASIC", "R&B", + "3A Game", "FPS", "user 1", "user 2", "user3" + }; + + // 初始化默认增益(0dB) + for (int i = 0; i < NUM_EQ_MODES; i++) { + g_mode_info.mode_gains[i] = 0; + strncpy(g_mode_info.mode_names[i], default_names[i], 15); + g_mode_info.mode_names[i][15] = '\0'; + } + + debug_printf("Mode info initialized with %d modes\n", NUM_EQ_MODES); +} + +#endif + +void get_key_ret(uint8_t *buffer); +// 改动原因:声明外部全局变量,用于音量和LED状态变化的HID上报 +// Process read parameter request - Get bands and coeffs data from eq_hid_params +unsigned char process_read_params(uint8_t response[]) { + // debug_printf("Start processing read parameter request\n"); + +#if EQ_EN + // 处理读取当前EQ模式的请求 (0x8B) - GET_EQ_MODE + if (read_request.is_read_mode_request == true) { + debug_printf("Building 0x8B response data:\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0x8B; // Sync header 2 + + // 确定要返回的模式值 + uint8_t target_mode; + if (read_request.read_mode_request_mode == 0xFF) { + // 获取当前模式(eq_enable是全局开关,不影响模式返回) + unsigned int current_mode; + GET_SHARED_GLOBAL(current_mode, g_request_eq_mode); + target_mode = current_mode; + debug_printf("Mode=0xFF, returning current mode: %d (EQ enable: %d, independent)\n", target_mode, g_eq_enable); + } else { + // 获取指定模式 + target_mode = read_request.read_mode_request_mode; + debug_printf("Mode=%d, returning specified mode info\n", target_mode); + } + + // 模式值 + response[2] = target_mode; + + // 改动原因:检查模式是否在有效范围内(0-9),如果是禁用模式(10)或超出范围,返回全0 + if (target_mode >= EQ_DISABLED_MODE || target_mode > EQ_MODE_MAX) { + debug_printf("Mode %d is disabled or invalid, returning all zeros\n", target_mode); + // 返回全0 + memset(&response[3], 0, 20); // 整体增益(4字节) + 模式名称(16字节) = 20字节 + } else { + // 获取指定模式的整体增益 (从当前采样率获取) + int32_t target_post_gain = 0; + if (target_mode < NUM_EQ_MODES) { + // 根据当前采样率选择对应的EQ数据数组 + // 改动原因:使用公用数组,通过函数获取对应采样率的数组指针 + eq_mode_data_t (*eq_data)[NUM_EQ_MODES][NUM_EQ_CHANS] = get_eq_array_ptr_common(g_eq_sample_rate); + + if (eq_data != NULL) { + target_post_gain = (*eq_data)[target_mode][0].post_gain_db; + debug_printf("Reading post_gain from mode %d: %d dB\n", target_mode, target_post_gain); + } + } + + // 整体增益 (4字节,位置3-6) - 根据简化协议修正位置 + response[3] = (uint8_t)(target_post_gain & 0xFF); + response[4] = (uint8_t)((target_post_gain >> 8) & 0xFF); + response[5] = (uint8_t)((target_post_gain >> 16) & 0xFF); + response[6] = (uint8_t)((target_post_gain >> 24) & 0xFF); + + // 模式名称 (16字节,UTF-8编码,位置7-22) + if (target_mode < NUM_EQ_MODES) { + memcpy(&response[7], g_mode_info.mode_names[target_mode], 16); + } else { + // 如果模式超出范围,填充0 + memset(&response[7], 0, 16); + } + } + + + read_request.is_read_mode_request = false; // Clear read request flag + read_request.read_mode_request_mode = 0; // Clear mode parameter + return true; + } + + // 处理获取设备信息的请求 (0x8F) - GET_DEVICE_INFO + if (read_request.is_read_device_info_request == true) { + debug_printf("Building 0x8F response data:\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0x8F; // Sync header 2 + + get_device_info(response); + + read_request.is_read_device_info_request = false; // Clear read request flag + return true; + } + + // 处理复位EQ参数的请求 (0x90) - RESET_EQ_PARAMS + if (read_request.is_reset_eq_params_request == true) { + debug_printf("Building 0x90 response data:\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0x90; // Sync header 2 + + // 只返回之前保存的状态,不再执行复位操作 + // 改动原因:复位操作已在收到命令时执行并保存状态,这里只需返回保存的状态码 + if (read_request.mode != 0xFF && read_request.mode >= EQ_PRESET_MODE_MIN && read_request.mode <= EQ_USER_MODE_MAX) { + response[3] = 0x01; // 失败 + } else { + response[3] = 0x00; // 成功 + } + + read_request.is_reset_eq_params_request = false; // Clear read request flag + return true; + } + + // 处理获取EQ模式总数的请求 (0x91) - GET_EQ_MODE_COUNT + if (read_request.is_read_mode_count_request == true) { + debug_printf("Building 0x91 response data:\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0x91; // Sync header 2 + + // 模式总数:预定义模式(0-5) + 用户模式(6-8) = 9,不包含禁用模式(10) + // 注意:NUM_EQ_MODES = 10,但实际可用模式是0-8共9个(不包含禁用模式10) + uint8_t mode_count = NUM_EQ_MODES; // 固定返回10 + response[2] = mode_count; + + // 预定义模式数量:0-6共7个预设模式 + uint8_t preset_mode_count = EQ_PRESET_MODE_MAX + 1; + response[3] = preset_mode_count; + + debug_printf("EQ mode count: %d, preset mode count: %d (preset modes 0-5 + user modes 6-8, excluding disabled mode 10)\n", + mode_count, preset_mode_count); + + read_request.is_read_mode_count_request = false; // Clear read request flag + return true; + } + + // 处理设置并保存EQ模式的请求 (0x92) - SET_AND_SAVE_EQ_MODE + if (read_request.is_set_and_save_mode_request == true) { + debug_printf("Building 0x92 response data:\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0x92; // Sync header 2 + + // 状态码:0x00=成功, 0x01=失败 + uint8_t status = (read_request.mode == 0xFF) ? 0x01 : 0x00; + response[2] = status; + + if (status == 0x00) { + debug_printf("EQ mode %d set and saved successfully\n", read_request.mode); + } else { + debug_printf("Failed to set and save EQ mode\n"); + } + + read_request.is_set_and_save_mode_request = false; // Clear read request flag + return true; + } + // 处理读取音量请求 (0x94) - GET_VOLUME + // 改动原因:在EQ命令中添加读取音量响应,参照HID_DEVICE_PARAMS_PROTOCOL.md中的音量命令实现 + if (read_request.is_read_volume_request == true) { + debug_printf("Building 0x94 response data (GET_VOLUME):\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0x94; // Sync header 2 + + // 改动原因:直接读取g_dac_vol,与SET_DAC_VOLUME命令实现方式一致 + extern unsigned g_dac_vol; + unsigned dac_vol; + GET_SHARED_GLOBAL(dac_vol, g_dac_vol); + + // 当前音量级别 (1字节,位置2,范围0-255) + response[2] = (uint8_t)dac_vol; + + debug_printf("Current volume level (g_dac_vol): %d\n", dac_vol); + + // 其余字节填充为0 + for (int i = 3; i < 63; i++) { + response[i] = 0x00; + } + + read_request.is_read_volume_request = false; // Clear read request flag + return true; + } + + // 处理获取LED信息请求 (0x95) - GET_LED_INFO + // 改动原因:添加LED信息查询响应,返回LED索引和名称 + if (led_request.is_get_led_info_request == true) { + debug_printf("Building 0x95 response data (GET_LED_INFO):\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0x95; // Sync header 2 + + // LED索引 + response[2] = led_request.led_index; + + // LED名称 (16字节,UTF-8编码) + // 当前设备只有1个LED,索引为0,名称为"Main LED" + const char* led_name = "Main LED"; + memcpy(&response[3], led_name, strlen(led_name)); + // 剩余字节填充为0 + + debug_printf("LED info - Index: %d, Name: %s\n", led_request.led_index, led_name); + + // 其余字节填充为0 + for (int i = 3 + strlen(led_name); i < 63; i++) { + response[i] = 0x00; + } + + led_request.is_get_led_info_request = false; // Clear request flag + return true; + } + + // 处理获取LED开关请求 (0x97) - GET_LED_SWITCH + // 改动原因:参考SET_LED_MODE,读取g_led_mode的值,0=关,1=开 + if (led_request.is_get_led_switch_request == true) { + debug_printf("Building 0x97 response data (GET_LED_SWITCH):\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0x97; // Sync header 2 + + // LED索引 + response[2] = led_request.led_index; + + // 改动原因:参考SET_LED_MODE,读取g_led_mode的值,0=关,1=开 + extern unsigned g_led_mode; + unsigned led_mode; + GET_SHARED_GLOBAL(led_mode, g_led_mode); + + // LED开关状态 (0=OFF, 1=ON) + response[3] = (uint8_t)led_mode; + + debug_printf("LED switch (g_led_mode) - Index: %d, Switch: %s\n", led_request.led_index, led_mode ? "ON" : "OFF"); + + // 其余字节填充为0 + for (int i = 4; i < 63; i++) { + response[i] = 0x00; + } + + led_request.is_get_led_switch_request = false; // Clear request flag + return true; + } + + // 处理设置LED开关响应 (0x96) - SET_LED_SWITCH响应 + // 改动原因:SET_LED_SWITCH命令需要返回状态码,使用独立的响应处理 + if (led_request.is_set_led_switch_request == true) { + debug_printf("Building 0x96 response data (SET_LED_SWITCH):\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0x96; // Sync header 2 + + // 状态码 (0x00=成功, 0x01=失败) + // 由于SET命令已经在process_send_params中执行,这里直接返回成功 + response[2] = 0x00; // 成功 + + debug_printf("LED switch set response - Status: Success\n"); + + // 其余字节填充为0 + for (int i = 3; i < 63; i++) { + response[i] = 0x00; + } + + led_request.is_set_led_switch_request = false; // Clear request flag + return true; + } + + // 处理获取LED总数请求 (0x99) - GET_LED_COUNT + // 改动原因:添加LED总数查询响应,返回设备支持的LED总数 + if (led_request.is_get_led_count_request == true) { + debug_printf("Building 0x99 response data (GET_LED_COUNT):\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0x99; // Sync header 2 + + // LED总数(当前设备只有1个LED) + uint8_t led_count = 1; + response[2] = led_count; + + debug_printf("LED count: %d\n", led_count); + + // 其余字节填充为0 + for (int i = 3; i < 63; i++) { + response[i] = 0x00; + } + + led_request.is_get_led_count_request = false; // Clear request flag + return true; + } + + // 处理获取LED状态请求 (0x98) - GET_LED_STATUS + // 改动原因:添加LED状态查询响应,返回LED RGB颜色和状态 + if (led_request.is_get_led_status_request == true) { + debug_printf("Building 0x98 response data (GET_LED_STATUS):\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0x98; // Sync header 2 + + // LED索引 + response[2] = led_request.led_index; + + // 改动原因:根据音频格式判断LED颜色,PCM=绿灯,DOP/DSD=蓝灯 + // 读取音频类型 + extern unsigned g_audio_type; + unsigned audio_type; + GET_SHARED_GLOBAL(audio_type, g_audio_type); + + // 根据音频格式判断LED颜色 + // PCM (audio_type=0): 绿灯 RGB(0, 255, 0) + // DOP (audio_type=1): 蓝灯 RGB(0, 0, 255) + // DSD (audio_type=5): 蓝灯 RGB(0, 0, 255) + uint8_t r = 0, g = 0, b = 0; + + if (audio_type == 0) { + // PCM: 绿灯 + g = 255; + b = 0; + } else if (audio_type == 1 || audio_type == 5) { + // DOP (1) 或 DSD (5): 蓝灯 + g = 0; + b = 255; + } else { + // 其他格式:默认关闭 + g = 0; + b = 0; + } + + response[3] = (uint8_t)r; // R颜色值 + response[4] = (uint8_t)g; // G颜色值 + response[5] = (uint8_t)b; // B颜色值 + + // 获取LED状态(需要在audiohw.xc中声明get_led_status函数) + // 由于get_led_status在XC文件中,这里根据当前状态判断 + extern unsigned g_playback_format, g_audio_type, g_gain_mode, g_uac_mode, g_3d_fps; + unsigned playback_format, gain_mode, uac_mode, game_mode; + GET_SHARED_GLOBAL(playback_format, g_playback_format); + GET_SHARED_GLOBAL(audio_type, g_audio_type); + GET_SHARED_GLOBAL(gain_mode, g_gain_mode); + GET_SHARED_GLOBAL(uac_mode, g_uac_mode); + GET_SHARED_GLOBAL(game_mode, g_3d_fps); + + // 改动原因:根据g_led_mode判断LED状态,0=关闭,1=开启 + extern unsigned g_led_mode; + unsigned led_mode; + GET_SHARED_GLOBAL(led_mode, g_led_mode); + + uint8_t led_status = 0; // LED_STATUS_OFF + unsigned is_blinking = 0; + unsigned is_fast_blinking = 0; + + // 如果LED开关关闭,直接返回关闭状态 + if (led_mode == 0) { + led_status = 0; // LED_STATUS_OFF + } else { + led_status = 1; // LED_STATUS_SOLID + } + + response[6] = led_status; // LED状态 + + debug_printf("LED status - Index: %d, RGB: (%d,%d,%d), Status: %d\n", + led_request.led_index, r, g, b, led_status); + + // 其余字节填充为0 + for (int i = 7; i < 63; i++) { + response[i] = 0x00; + } + + led_request.is_get_led_status_request = false; // Clear request flag + return true; + } + + // 处理获取UAC模式信息请求 (0x9A) - GET_UAC_MODE_INFO + // 改动原因:添加UAC模式信息查询响应,返回UAC模式总数和模式名称列表 + if (uac_request.is_get_uac_mode_info_request == true) { + debug_printf("Building 0x9A response data (GET_UAC_MODE_INFO):\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0x9A; // Sync header 2 + + // UAC模式总数(当前为2:UAC2.0和UAC1.0) + uint8_t uac_mode_count = 2; + response[2] = uac_mode_count; + + // 模式0名称:UAC2.0 (8字节) + const char* mode0_name = "UAC2.0"; + memcpy(&response[3], mode0_name, strlen(mode0_name)); + // 剩余字节填充为0 + + // 模式1名称:UAC1.0 (8字节) + const char* mode1_name = "UAC1.0"; + memcpy(&response[11], mode1_name, strlen(mode1_name)); + // 剩余字节填充为0 + + // 其余字节填充为0 + for (int i = 19; i < 63; i++) { + response[i] = 0x00; + } + + debug_printf("UAC mode info - Count: %d, Mode0: '%s', Mode1: '%s'\n", + uac_mode_count, mode0_name, mode1_name); + + uac_request.is_get_uac_mode_info_request = false; // Clear request flag + return true; + } + + // 改动原因:SET_UAC_MODE命令不返回响应,已移除响应处理逻辑 + + // 处理获取当前UAC模式请求 (0x9C) - GET_CURRENT_UAC_MODE + // 改动原因:添加当前UAC模式查询响应,返回当前UAC模式值和名称 + if (uac_request.is_get_current_uac_mode_request == true) { + debug_printf("Building 0x9C response data (GET_CURRENT_UAC_MODE):\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0x9C; // Sync header 2 + + // 读取当前UAC模式 + extern unsigned g_uac_mode; + unsigned current_uac_mode; + GET_SHARED_GLOBAL(current_uac_mode, g_uac_mode); + + // 转换为协议格式:0=UAC2.0, 1=UAC1.0 + // g_uac_mode: 2=UAC2.0, 1=UAC1.0 + uint8_t uac_mode_value = (current_uac_mode == 1) ? 1 : 0; // 1=UAC1.0, 其他=UAC2.0(0) + response[2] = uac_mode_value; + + // 当前UAC模式名称 (8字节) + const char* current_mode_name = (uac_mode_value == 0) ? "UAC2.0" : "UAC1.0"; + memcpy(&response[3], current_mode_name, strlen(current_mode_name)); + // 剩余字节填充为0 + + // 其余字节填充为0 + for (int i = 11; i < 63; i++) { + response[i] = 0x00; + } + + debug_printf("Current UAC mode - Value: %d (%s), Name: '%s'\n", + uac_mode_value, uac_mode_value == 0 ? "UAC2.0" : "UAC1.0", current_mode_name); + + uac_request.is_get_current_uac_mode_request = false; // Clear request flag + return true; + } + + // 处理设置EQ使能开关请求 (0x9D) - SET_EQ_ENABLE + // 改动原因:0x9D命令只涉及eq_enable的修改,只返回状态码和使能状态,不返回模式信息 + if (read_request.is_set_eq_enable_request == true) { + debug_printf("Building 0x9D response data (SET_EQ_ENABLE):\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0x9D; // Sync header 2 + + // 状态码:0x00=成功, 0x01=失败 + response[2] = 0x00; // 成功 + + // 当前EQ使能状态(全局开关,所有模式共用) + response[3] = g_eq_enable; + + // 其余字节填充为0 + for (int i = 4; i < 63; i++) { + response[i] = 0x00; + } + + debug_printf("EQ enable set - Status: 0x00, Enable: %d (global switch)\n", g_eq_enable); + + read_request.is_set_eq_enable_request = false; // Clear request flag + return true; + } + + // 处理获取EQ使能开关请求 (0x9E) - GET_EQ_ENABLE + // 改动原因:0x9E命令只返回eq_enable状态,不返回模式信息,保持命令功能单一 + if (read_request.is_get_eq_enable_request == true) { + debug_printf("process_read_params: processing GET_EQ_ENABLE (0x9E) request\n"); + debug_printf("process_read_params: g_eq_enable=%d\n", g_eq_enable); + + response[0] = 0x77; // Sync header 1 + response[1] = 0x9E; // Sync header 2 + + // EQ使能开关状态(全局开关,所有模式共用) + response[2] = g_eq_enable; + + // 其余字节填充为0 + for (int i = 3; i < 63; i++) { + response[i] = 0x00; + } + + debug_printf("process_read_params: GET_EQ_ENABLE response built, response[0-2]: %02X %02X %02X\n", + response[0], response[1], response[2]); + debug_printf("EQ enable status - Enable: %d (global switch)\n", g_eq_enable); + + read_request.is_get_eq_enable_request = false; // Clear request flag + return true; + } + + // 处理获取采样率和格式请求 (0x9F) - GET_SAMPLE_FORMAT + // 改动原因:添加采样率和格式查询响应,返回当前采样率和DSD模式(已去掉DAC采样分辨率) + if (read_request.is_read_sample_format_request == true) { + debug_printf("Building 0x9F response data (GET_SAMPLE_FORMAT):\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0x9F; // Sync header 2 + + // 读取全局变量(使用SHARED_GLOBAL宏) + extern unsigned g_samfreq, g_dsd_mode; + unsigned samfreq, dsd_mode; + GET_SHARED_GLOBAL(samfreq, g_samfreq); + GET_SHARED_GLOBAL(dsd_mode, g_dsd_mode); + + // 采样率(32位,小端序,位置2-5) + response[2] = (uint8_t)(samfreq & 0xFF); + response[3] = (uint8_t)((samfreq >> 8) & 0xFF); + response[4] = (uint8_t)((samfreq >> 16) & 0xFF); + response[5] = (uint8_t)((samfreq >> 24) & 0xFF); + + // DSD模式(1字节,位置6) + response[6] = (uint8_t)dsd_mode; + + debug_printf("Sample format - samFreq: %d, dsdMode: %d\n", + samfreq, dsd_mode); + + // 其余字节填充为0 + for (int i = 7; i < 63; i++) { + response[i] = 0x00; + } + + read_request.is_read_sample_format_request = false; // Clear request flag + return true; + } + + // 处理获取增益模式请求 (0xA1) - GET_GAIN_MODE + // 改动原因:添加获取增益模式响应,返回当前增益模式值 + if (read_request.is_get_gain_mode_request == true) { + debug_printf("Building 0xA1 response data (GET_GAIN_MODE):\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0xA1; // Sync header 2 + + // 读取全局变量(使用SHARED_GLOBAL宏) + extern unsigned g_gain_mode; + unsigned gain_mode; + GET_SHARED_GLOBAL(gain_mode, g_gain_mode); + + // 当前增益模式 (1字节,位置2) + response[2] = (uint8_t)gain_mode; + + debug_printf("Current gain mode: %d (0=低阻, 1=高阻)\n", gain_mode); + + // 其余字节填充为0 + for (int i = 3; i < 63; i++) { + response[i] = 0x00; + } + + read_request.is_get_gain_mode_request = false; // Clear read request flag + return true; + } + + // 处理获取滤波器模式请求 (0xA3) - GET_FILTER_MODE + // 改动原因:添加获取滤波器模式响应,返回当前滤波器模式值 + if (read_request.is_get_filter_mode_request == true) { + debug_printf("Building 0xA3 response data (GET_FILTER_MODE):\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0xA3; // Sync header 2 + + // 读取全局变量(使用SHARED_GLOBAL宏) + extern unsigned g_filter_mode; + unsigned filter_mode; + GET_SHARED_GLOBAL(filter_mode, g_filter_mode); + + // 当前滤波器模式 (1字节,位置2) + response[2] = (uint8_t)filter_mode; + + debug_printf("Current filter mode: %d (0-6: 7种滤波器模式)\n", filter_mode); + + // 其余字节填充为0 + for (int i = 3; i < 63; i++) { + response[i] = 0x00; + } + + read_request.is_get_filter_mode_request = false; // Clear read request flag + return true; + } + + // 处理获取游戏模式请求 (0xA5) - GET_GAME_MODE + // 改动原因:添加获取游戏模式响应,返回当前游戏模式值 + if (read_request.is_get_game_mode_request == true) { + debug_printf("Building 0xA5 response data (GET_GAME_MODE):\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0xA5; // Sync header 2 + + // 读取全局变量(使用SHARED_GLOBAL宏) + extern unsigned g_3d_fps; + unsigned game_mode; + GET_SHARED_GLOBAL(game_mode, g_3d_fps); + + // 当前游戏模式 (1字节,位置2) +#if UAC2 == 1 + response[2] = 0; +#else + response[2] = (uint8_t)game_mode; +#endif + + debug_printf("Current game mode: %d (0=无音效, 1=FPS, 2=虚拟7.1)\n", game_mode); + + // 其余字节填充为0 + for (int i = 3; i < 63; i++) { + response[i] = 0x00; + } + + read_request.is_get_game_mode_request = false; // Clear read request flag + return true; + } + + // 处理获取固件版本请求 (0xA6) - GET_FIRMWARE_VERSION + // 改动原因:添加获取固件版本响应,返回BCD格式的版本号(主版本、次版本、修订版本),参考user_uart.xc中的FW_VERSION实现 + if (read_request.is_get_firmware_version_request == true) { + debug_printf("Building 0xA6 response data (GET_FIRMWARE_VERSION):\n"); + response[0] = 0x77; // Sync header 1 + response[1] = 0xA6; // Sync header 2 + + // 读取固件版本号(BCD格式),参考user_uart.xc:414-418的实现 + // BCD_DEVICE_J: 主版本号 + // BCD_DEVICE_M: 次版本号 + // BCD_DEVICE_N: 修订版本号 + response[2] = (uint8_t)BCD_DEVICE_J; // 主版本号 + response[3] = (uint8_t)BCD_DEVICE_M; // 次版本号 + response[4] = (uint8_t)BCD_DEVICE_N; // 修订版本号 + + debug_printf("Firmware version: %d.%d.%d (BCD format: 0x%02X 0x%02X 0x%02X)\n", + BCD_DEVICE_J, BCD_DEVICE_M, BCD_DEVICE_N, + BCD_DEVICE_J, BCD_DEVICE_M, BCD_DEVICE_N); + + // 其余字节填充为0 + for (int i = 5; i < 63; i++) { + response[i] = 0x00; + } + + read_request.is_get_firmware_version_request = false; // Clear read request flag + return true; + } + + // 处理获取静音开关请求 (0xB2) - GET_MUTE_SWITCH + // 改动原因:与0xB4一致,直接读 g_mute_switch 返回(由 UART 0x5F/0x61 或 c3_fps sync 0x0E 更新) + if (read_request.is_get_mute_switch_request == true) { + unsigned mute_sw; + extern unsigned g_mute_switch; + GET_SHARED_GLOBAL(mute_sw, g_mute_switch); + response[0] = 0x77; + response[1] = 0xB2; + response[2] = (uint8_t)(mute_sw & 0xFF); + for (int i = 3; i < 63; i++) response[i] = 0x00; + read_request.is_get_mute_switch_request = false; + debug_printf("Building 0xB2 response (GET_MUTE_SWITCH), g_mute_switch=%u\n", mute_sw); + return true; + } + + // 处理获取监听开关请求 (0xB4) - GET_LISTEN_SWITCH + // 改动原因:直接读取 g_adc_loop 返回,不经过串口 + if (read_request.is_get_listen_switch_request == true) { + unsigned adc_loop; + extern unsigned g_adc_loop; + GET_SHARED_GLOBAL(adc_loop, g_adc_loop); + response[0] = 0x77; + response[1] = 0xB4; + response[2] = (uint8_t)(adc_loop & 0xFF); // 0=关 1=开 + for (int i = 3; i < 63; i++) response[i] = 0x00; + read_request.is_get_listen_switch_request = false; + debug_printf("Building 0xB4 response (GET_LISTEN_SWITCH), g_adc_loop=%u\n", adc_loop); + return true; + } + + if (read_request.is_read_request == true) { +#if !UAC1 + debug_printf("Read request information:\n"); + debug_printf(" Mode: %d\n", read_request.mode); + debug_printf(" EQ index: %d\n", read_request.eq_index); + + // 检查EQ索引范围 + if (read_request.eq_index >= MAX_EQ_BANDS) { + debug_printf("Error: EQ index out of range: %d (max: %d)\n", read_request.eq_index, MAX_EQ_BANDS - 1); + return false; + } + + // Build response data + debug_printf("Building response data: %d\n", g_eq_sample_rate); + response[0] = 0x77; // Sync header 1 + response[1] = 0x8E; // Sync header 2 + + response[2] = read_request.mode; // Mode + debug_printf(" Mode: %d\n", read_request.mode); + response[3] = read_request.eq_index & 0xFF; // EQ index + debug_printf("read EQ index: %d\n", read_request.eq_index); + + // 改动原因:检查模式是否在有效范围内(0-9),如果是禁用模式(10)或超出范围,返回全0 + if (read_request.mode >= EQ_DISABLED_MODE || read_request.mode > EQ_MODE_MAX) { + debug_printf("Mode %d is disabled or invalid, returning all zeros\n", read_request.mode); + // 返回全0 + response[4] = 0; // Filter type + memset(&response[5], 0, 16); // 所有参数(fc, q, bw, gain)都设为0 + } else { + // 选择对应的EQ数据数组 (使用44100Hz,因为串口设置参数时主要存储到44100Hz) + eq_mode_data_t (*eq_data)[NUM_EQ_MODES][NUM_EQ_CHANS] = NULL; + // 优先使用44100Hz数据,因为串口设置参数时主要存储到44100Hz + eq_data = &sEQ_data_44100HZ; + debug_printf("Using 44100Hz data for HID read (g_eq_sample_rate=%d)\n", g_eq_sample_rate); + + // Copy filter parameters from the correct EQ data array + filter_params_t *band = &(*eq_data)[read_request.mode][0].bands[read_request.eq_index]; + response[4] = band->type; + debug_printf(" Filter type: 0x%02x\n", band->type); + + // Copy parameters - 直接写入float值 (位置调整) + memcpy(&response[5], &band->fc, 4); + memcpy(&response[9], &band->q, 4); + memcpy(&response[13], &band->bw, 4); + memcpy(&response[17], &band->gain, 4); + } + + // 简化版本不包含系数,只包含基本参数 + + #if DEBUG_PRINT_ENABLE == 1 + DPRINTF(" Filter parameters:\n"); + DPRINTF(" fc : %08x Hz\n", band->fc); + DPRINTF(" Q : %08x\n", band->q); + DPRINTF(" bw : %08x Hz\n", band->bw); + DPRINTF(" gain : %08x dB\n", band->gain); + #endif + + // Copy coefficients + read_request.is_read_request = false; // Clear read request flag + debug_printf("Parameter read processing completed\n"); + + return true; +#endif + } +#endif +#if 1 + if (key_program == 1) + { + key_program = 0; + debug_printf("Key program completed\n"); + get_key_ret(response); + return true; + } +#endif + return false; +} + +/** + * @brief 处理串口获取设备信息命令 (0x35) + * @param response 响应数据缓冲区 + * @param response_size 响应缓冲区大小 + * @return 响应数据长度 + * @note 改动原因:实现GET_DEVICE_INFO命令,返回PID、VID、产品字符串等信息,参考get_device_info函数实现 + */ +uint8_t process_uart_get_device_info(uint8_t *response, uint8_t response_size) +{ + if (response_size < 58) { + debug_printf("Response buffer too small for device info\n"); + return 0; + } + +#if XUA_USB_EN == 1 + // 从USB描述符获取设备信息 + uint16_t pid = XUA_Endpoint0_getProductId(); + uint16_t vid = XUA_Endpoint0_getVendorId(); + const char* product_str = XUA_Endpoint0_getProductStr(); + const char* vendor_str = XUA_Endpoint0_getVendorStr(); + const char* serial_str = XUA_Endpoint0_getSerialStr(); + + debug_printf("UART GET_DEVICE_INFO: PID=0x%04x, VID=0x%04x\n", pid, vid); + + // 构建响应数据 (串口格式: 55 AA 00 35 30 ...) + response[0] = 0x55; // 帧头1 + response[1] = 0xAA; // 帧头2 + response[2] = 0x00; // 版本 + response[3] = GET_DEVICE_INFO; // 命令码 + response[4] = 0x34; // 数据长度 (52字节: 4字节pid+vid + 16字节产品 + 16字节厂商 + 16字节序列号) + + // PID和VID (小端序) + response[5] = (pid >> 0) & 0xFF; + response[6] = (pid >> 8) & 0xFF; + response[7] = (vid >> 0) & 0xFF; + response[8] = (vid >> 8) & 0xFF; + + // 产品字符串 (16字节,UTF-8编码) + memset(&response[9], 0, 16); + if (product_str != NULL) { + size_t len = strlen(product_str); + if (len > 16) len = 16; + memcpy(&response[9], product_str, len); + } + + // 厂商字符串 (16字节,UTF-8编码) + memset(&response[25], 0, 16); + if (vendor_str != NULL) { + size_t len = strlen(vendor_str); + if (len > 16) len = 16; + memcpy(&response[25], vendor_str, len); + } + + // 序列号字符串 (16字节,UTF-8编码) + memset(&response[41], 0, 16); + if (serial_str != NULL) { + size_t len = strlen(serial_str); + if (len > 16) len = 16; + memcpy(&response[41], serial_str, len); + } +#endif + // 计算校验和(使用统一的uart_checksum函数) + uint8_t checksum_pos = 57; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + return 58; // 总长度 +} + +// ========== UART与HID协议转换辅助函数 ========== +// 改动原因:直接复用HID的process_send_params和process_read_params,最大化代码复用 + + + +/** + * @brief 辅助函数:将UART SET命令转换为HID格式并调用process_send_params + * @param hid_cmd HID命令码 + * @param data 命令数据 + * @param data_len 数据长度 + * @return HID处理结果 + */ +static inline uint8_t call_hid_send_params(uint8_t hid_cmd, const uint8_t *data, uint8_t data_len) { + uint8_t hid_packet[64] = {0}; + hid_packet[0] = 0x77; // HID sync header + hid_packet[1] = hid_cmd; + if (data && data_len > 0) { + memcpy(&hid_packet[2], data, data_len); + } + return process_send_params(hid_packet, 63); +} + +/** + * @brief 辅助函数:调用HID的process_read_params并提取数据 + * @param hid_cmd HID命令码 + * @param setup_data 设置请求所需的数据 + * @param setup_data_len 设置数据长度 + * @param out_data 输出数据缓冲区 + * @param out_data_size 输出数据缓冲区大小 + * @return 输出数据长度 + * @note 改动原因:对于所有读取命令,都需要先调用process_send_params设置请求标志,即使setup_data为空 + */ +static inline uint8_t call_hid_read_params(uint8_t hid_cmd, const uint8_t *setup_data, uint8_t setup_data_len, + uint8_t *out_data, uint8_t out_data_size) { + debug_printf("call_hid_read_params: start, hid_cmd=0x%02X, setup_data_len=%d, out_data_size=%d\n", + hid_cmd, setup_data_len, out_data_size); + + // 改动原因:对于所有读取命令,都需要先调用process_send_params设置请求标志 + // 即使setup_data为空,也需要发送一个包含命令码的HID数据包来设置读取请求标志 + uint8_t hid_setup[64] = {0}; + hid_setup[0] = 0x77; + hid_setup[1] = hid_cmd; + if (setup_data && setup_data_len > 0) { + debug_printf("call_hid_read_params: sending setup request with data, hid_cmd=0x%02X\n", hid_cmd); + memcpy(&hid_setup[2], setup_data, setup_data_len); + } else { + debug_printf("call_hid_read_params: sending setup request without data, hid_cmd=0x%02X\n", hid_cmd); + } + uint8_t send_result = process_send_params(hid_setup, 63); + debug_printf("call_hid_read_params: process_send_params returned %d\n", send_result); + + // 读取响应 + uint8_t hid_response[63] = {0}; + uint8_t read_result = process_read_params(hid_response); + debug_printf("call_hid_read_params: process_read_params returned %d\n", read_result); + + if (read_result) { + debug_printf("call_hid_read_params: response data first 8 bytes: "); + for (int i = 0; i < 8 && i < 63; i++) { + debug_printf("%02X ", hid_response[i]); + } + debug_printf("\n"); + + // 验证响应命令码 + if (hid_response[0] == 0x77 && hid_response[1] == hid_cmd) { + debug_printf("call_hid_read_params: response validation success, extracting data\n"); + // 提取数据部分(跳过0x77和命令码) + uint8_t payload_len = (out_data_size < 61) ? out_data_size : 61; + memcpy(out_data, &hid_response[2], payload_len); + debug_printf("call_hid_read_params: successfully extracted %d bytes\n", payload_len); + return payload_len; + } else { + debug_printf("call_hid_read_params: response validation failed - expected: 0x77 0x%02X, actual: 0x%02X 0x%02X\n", + hid_cmd, hid_response[0], hid_response[1]); + } + } else { + debug_printf("call_hid_read_params: process_read_params returned false, no response data\n"); + } + return 0; +} + +// ========== UART命令包装函数(复用HID实现) ========== + +/** + * @brief 处理串口获取LED信息命令 (0x3B) + * @param led_index LED索引 + * @param response 响应数据缓冲区 + * @param response_size 响应缓冲区大小 + * @return 响应数据长度 + * @note 改动原因:实现GET_LED_INFO命令,读取LED索引和名称,参考process_read_params中0x95命令的实现 + */ +uint8_t process_uart_get_led_info(uint8_t led_index, uint8_t *response, uint8_t response_size) +{ + if (response_size < 23) { + debug_printf("Response buffer too small for LED info\n"); + return 0; + } + + // LED名称,当前设备只有1个LED,索引为0,名称为"Main LED" + const char* led_name = "Main LED"; + + debug_printf("UART GET_LED_INFO: led_index=%d\n", led_index); + + // 构建响应数据 + response[0] = 0x55; // 帧头1 + response[1] = 0xAA; // 帧头2 + response[2] = 0x00; // 版本 + response[3] = GET_LED_INFO; // 命令码 + response[4] = 0x11; // 数据长度 (17字节) + response[5] = led_index; + + // LED名称 (16字节,UTF-8编码) + memset(&response[6], 0, 16); + size_t len = strlen(led_name); + if (len > 16) len = 16; + memcpy(&response[6], led_name, len); + + // 计算校验和 + uint8_t checksum_pos = 22; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + return 23; +} + +/** + * @brief 处理串口设置LED开关命令 (0x4C) + * @note 改动原因:参考SET_LED_MODE,直接设置g_led_mode的值,0=关,1=开 + */ +uint8_t process_uart_set_led_switch(uint8_t led_index, uint8_t led_switch) +{ + // 改动原因:参考SET_LED_MODE,直接设置g_led_mode的值,0=关,1=开 + extern unsigned g_led_mode; + SET_SHARED_GLOBAL(g_led_mode, led_switch); + debug_printf("UART SET_LED_SWITCH: led_index=%d, switch=%d (set g_led_mode)\n", led_index, led_switch); + return 0; // 成功 +} + +/** + * @brief 处理串口获取LED开关命令 (0x4D) + * @note 改动原因:参考SET_LED_MODE,直接读取g_led_mode的值,0=关,1=开 + */ +uint8_t process_uart_get_led_switch(uint8_t led_index, uint8_t *response, uint8_t response_size) +{ + if (response_size < 8) return 0; + + // 改动原因:参考SET_LED_MODE,直接读取g_led_mode的值,0=关,1=开 + extern unsigned g_led_mode; + unsigned led_mode; + GET_SHARED_GLOBAL(led_mode, g_led_mode); + + // 构建UART响应 + response[0] = 0x55; + response[1] = 0xAA; + response[2] = 0x00; + response[3] = GET_LED_SWITCH; + response[4] = 0x02; + response[5] = led_index; + response[6] = (uint8_t)led_mode; // LED开关状态 + + uint8_t checksum_pos = 7; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + debug_printf("UART GET_LED_SWITCH: led_index=%d, switch=%d (from g_led_mode)\n", led_index, led_mode); + return 8; +} + +/** + * @brief 处理串口获取LED状态命令 (0x3E) + * @param led_index LED索引 + * @param response 响应数据缓冲区 + * @param response_size 响应缓冲区大小 + * @return 响应数据长度 + * @note 改动原因:实现GET_LED_STATUS命令,读取LED RGB颜色和状态,参考process_read_params中0x98命令的实现 + */ +uint8_t process_uart_get_led_status(uint8_t led_index, uint8_t *response, uint8_t response_size) +{ + if (response_size < 11) { + debug_printf("Response buffer too small for LED status\n"); + return 0; + } + + // 改动原因:根据音频格式判断LED颜色,PCM=绿灯,DOP/DSD=蓝灯 + // 读取音频类型 + extern unsigned g_audio_type; + unsigned audio_type; + GET_SHARED_GLOBAL(audio_type, g_audio_type); + + // 根据音频格式判断LED颜色 + // PCM (audio_type=0): 绿灯 RGB(0, 255, 0) + // DOP (audio_type=1): 蓝灯 RGB(0, 0, 255) + // DSD (audio_type=5): 蓝灯 RGB(0, 0, 255) + uint8_t r = 0, g = 0, b = 0; + + if (audio_type == 0) { + // PCM: 绿灯 + g = 255; + b = 0; + } else if (audio_type == 1 || audio_type == 5) { + // DOP (1) 或 DSD (5): 蓝灯 + g = 0; + b = 255; + } else { + // 其他格式:默认关闭 + g = 0; + b = 0; + } + + // 获取LED状态(参考process_read_params中0x98的实现) + extern unsigned g_playback_format, g_audio_type, g_gain_mode, g_uac_mode, g_3d_fps; + unsigned playback_format, gain_mode, uac_mode, game_mode; + GET_SHARED_GLOBAL(playback_format, g_playback_format); + GET_SHARED_GLOBAL(audio_type, g_audio_type); + GET_SHARED_GLOBAL(gain_mode, g_gain_mode); + GET_SHARED_GLOBAL(uac_mode, g_uac_mode); + GET_SHARED_GLOBAL(game_mode, g_3d_fps); + + // 改动原因:根据g_led_mode判断LED状态,0=关闭,1=开启 + extern unsigned g_led_mode; + unsigned led_mode; + GET_SHARED_GLOBAL(led_mode, g_led_mode); + + uint8_t led_status = 0; // LED_STATUS_OFF + unsigned is_blinking = 0; + unsigned is_fast_blinking = 0; + + // 如果LED开关关闭,直接返回关闭状态 + if (led_mode == 0) { + led_status = 0; // LED_STATUS_OFF + } else { + led_status = 1; // LED_STATUS_SOLID + } + + debug_printf("UART GET_LED_STATUS: led_index=%d, RGB=(%d,%d,%d), status=%d\n", + led_index, r, g, b, led_status); + + // 构建响应数据 + response[0] = 0x55; // 帧头1 + response[1] = 0xAA; // 帧头2 + response[2] = 0x00; // 版本 + // 改动原因:使用枚举名称替代数字命令码,提高代码可读性和维护性 + response[3] = GET_LED_STATUS; // 命令码 + response[4] = 0x05; // 数据长度 + response[5] = led_index; + response[6] = r; + response[7] = g; + response[8] = b; + response[9] = led_status; + + // 计算校验和 + uint8_t checksum_pos = 10; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + return 11; +} + +/** + * @brief 处理串口获取LED总数命令 (0x3F) + * @param response 响应数据缓冲区 + * @param response_size 响应缓冲区大小 + * @return 响应数据长度 + * @note 改动原因:实现GET_LED_COUNT命令,返回LED总数 + */ +uint8_t process_uart_get_led_count(uint8_t *response, uint8_t response_size) +{ + if (response_size < 7) { + debug_printf("Response buffer too small for LED count\n"); + return 0; + } + + uint8_t led_count = 1; // 当前设备只有1个LED + + debug_printf("UART GET_LED_COUNT: count=%d\n", led_count); + + // 构建响应数据 + response[0] = 0x55; // 帧头1 + response[1] = 0xAA; // 帧头2 + response[2] = 0x00; // 版本 + response[3] = GET_LED_COUNT; // 命令码 + response[4] = 0x01; // 数据长度 + response[5] = led_count; + + // 计算校验和 + uint8_t checksum_pos = 6; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + return 7; +} + +/** + * @brief 处理串口获取UAC模式信息命令 (0x40) + * @param response 响应数据缓冲区 + * @param response_size 响应缓冲区大小 + * @return 响应数据长度 + * @note 改动原因:实现GET_UAC_MODE_INFO命令,返回UAC模式总数和名称列表 + */ +uint8_t process_uart_get_uac_mode_info(uint8_t *response, uint8_t response_size) +{ + if (response_size < 23) { + debug_printf("Response buffer too small for UAC mode info\n"); + return 0; + } + + uint8_t uac_mode_count = 2; + char mode0_name[8] = "UAC2.0"; + char mode1_name[8] = "UAC1.0"; + + debug_printf("UART GET_UAC_MODE_INFO\n"); + + // 构建响应数据 + response[0] = 0x55; // 帧头1 + response[1] = 0xAA; // 帧头2 + response[2] = 0x00; // 版本 + response[3] = GET_UAC_MODE_INFO; // 命令码 + response[4] = 0x11; // 数据长度 (17字节) + response[5] = uac_mode_count; + + // 模式0名称 (8字节) + for (int i = 0; i < 8; i++) { + response[6 + i] = mode0_name[i]; + } + + // 模式1名称 (8字节) + for (int i = 0; i < 8; i++) { + response[14 + i] = mode1_name[i]; + } + + // 计算校验和 + uint8_t checksum_pos = 22; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + return 23; +} + +/** + * @brief 处理串口设置UAC模式命令 (0x51) + * @param uac_mode UAC模式值 (0=UAC2.0, 1=UAC1.0) + * @note 改动原因:UART 0x51命令将UAC模式设置请求透传给MCU处理,MCU负责执行模式切换和设备重启 + */ +void process_uart_set_uac_mode(uint8_t uac_mode) +{ + debug_printf("UART SET_UAC_MODE (0x51): uac_mode=%d, forwarding to MCU\n", uac_mode); + + // 参数验证 + if (uac_mode > 1) { + debug_printf("Error: Invalid UAC mode %d (must be 0-1)\n", uac_mode); + return; + } + + // 改动原因:构建UART 0x51数据包并透传给MCU + // UART数据包格式:0x55 0xAA 0x00 0x51 [长度] [UAC模式值] [校验和] + uint8_t uart_packet[7]; + uart_packet[0] = 0x55; // 帧头1 + uart_packet[1] = 0xAA; // 帧头2 + uart_packet[2] = 0x00; // 版本 + uart_packet[3] = 0x51; // 命令码 (SET_UAC_MODE) + uart_packet[4] = 0x01; // 数据长度 + uart_packet[5] = uac_mode; // UAC模式值 + + // 计算校验和(帧头到数据末尾所有字节的累加和取低8位) + uint8_t checksum = 0; + for (int i = 0; i < 6; i++) { + checksum += uart_packet[i]; + } + uart_packet[6] = checksum; // 校验和 + + // 改动原因:通过xmos_printf将UART数据包透传给MCU + // 声明xmos_printf函数(在user_uart.xc中定义) + extern int xmos_printf(unsigned char *data, unsigned char len); + + // 发送UART数据包给MCU + int result = xmos_printf(uart_packet, 7); + if (result == 7) { + debug_printf("UART 0x51 packet forwarded to MCU successfully: mode=%d (%s)\n", + uac_mode, uac_mode == 0 ? "UAC2.0" : "UAC1.0"); + } else { + debug_printf("Error: Failed to forward UART 0x51 packet to MCU (result=%d)\n", result); + } + + // 改动原因:MCU接收到0x51命令后会处理UAC模式切换和设备重启,XMOS设备无需执行重启操作 +} + +/** + * @brief 处理串口设置输入源模式命令 (0x5D) + * @param input_source 输入源模式值 (0=USB, 1=OPT, 2=COAX) + * @note 改动原因:HID 0xB0收到后构建UART 0x5D包透传给MCU,由MCU执行输入源(USB/OPT/COAX)切换 + */ +void process_uart_set_input_source(uint8_t input_source) +{ + debug_printf("UART SET_INPUT_SOURCE (0x5D): input_source=%d, forwarding to MCU\n", input_source); + + if (input_source > 2) { + debug_printf("Error: Invalid input source %d (must be 0-2, 0=USB, 1=OPT, 2=COAX)\n", input_source); + return; + } + + // 改动原因:构建UART 0x5D数据包并透传给MCU,格式与0x51一致 + // 数据包格式:0x55 0xAA 0x00 0x5D [长度] [输入源模式值] [校验和] + uint8_t uart_packet[7]; + uart_packet[0] = 0x55; // 帧头1 + uart_packet[1] = 0xAA; // 帧头2 + uart_packet[2] = 0x00; // 版本 + uart_packet[3] = 0x5D; // 命令码 (SET_INPUT_SOURCE) + uart_packet[4] = 0x01; // 数据长度 + uart_packet[5] = input_source; // 输入源模式值 (0=USB, 1=OPT, 2=COAX) + + uint8_t checksum = 0; + for (int i = 0; i < 6; i++) { + checksum += uart_packet[i]; + } + uart_packet[6] = checksum; + + extern int xmos_printf(unsigned char *data, unsigned char len); + int result = xmos_printf(uart_packet, 7); + if (result == 7) { + debug_printf("UART 0x5D packet forwarded to MCU: input_source=%d (%s)\n", + input_source, input_source == 0 ? "USB" : (input_source == 1 ? "OPT" : "COAX")); + } else { + debug_printf("Error: Failed to forward UART 0x5D packet to MCU (result=%d)\n", result); + } +} + +/** + * @brief 处理串口设置静音开关命令 (0x5E) + * @param mute 静音开关值 (0=关,1=开) + * @note 改动原因:HID 0xB1收到后构建UART 0x5E包透传给MCU + */ +void process_uart_set_mute_switch(uint8_t mute) +{ + debug_printf("UART SET_MUTE_SWITCH (0x5E): mute=%d, forwarding to MCU\n", mute); + if (mute > 1) { + debug_printf("Error: Invalid mute %d (must be 0 or 1)\n", mute); + return; + } + uint8_t uart_packet[7]; + uart_packet[0] = 0x55; + uart_packet[1] = 0xAA; + uart_packet[2] = 0x00; + uart_packet[3] = 0x5E; + uart_packet[4] = 0x01; + uart_packet[5] = mute; + uint8_t checksum = 0; + for (int i = 0; i < 6; i++) checksum += uart_packet[i]; + uart_packet[6] = checksum; + extern int xmos_printf(unsigned char *data, unsigned char len); + int result = xmos_printf(uart_packet, 7); + if (result == 7) + debug_printf("UART 0x5E forwarded to MCU: mute=%d (%s)\n", mute, mute ? "开" : "关"); + else + debug_printf("Error: Failed to forward UART 0x5E (result=%d)\n", result); +} + +/** + * @brief 处理串口设置监听开关命令 (0x60) + * @param listen 监听开关值 (0=关,1=开),对应 g_adc_loop + * @note 改动原因:HID 0xB3 收到后构建 UART 0x60 包透传给 MCU;读命令 0xB4 仍直接读 g_adc_loop 不经过串口 + */ +void process_uart_set_listen_switch(uint8_t listen) +{ + debug_printf("UART SET_LISTEN_SWITCH (0x60): listen=%d, forwarding to MCU\n", listen); + if (listen > 1) { + debug_printf("Error: Invalid listen %d (must be 0 or 1)\n", listen); + return; + } + uint8_t uart_packet[7]; + uart_packet[0] = 0x55; + uart_packet[1] = 0xAA; + uart_packet[2] = 0x00; + uart_packet[3] = 0x60; // 命令码 (SET_LISTEN_SWITCH) + uart_packet[4] = 0x01; + uart_packet[5] = listen; + uint8_t checksum = 0; + for (int i = 0; i < 6; i++) checksum += uart_packet[i]; + uart_packet[6] = checksum; + extern int xmos_printf(unsigned char *data, unsigned char len); + int result = xmos_printf(uart_packet, 7); + if (result == 7) + debug_printf("UART 0x60 forwarded to MCU: listen=%d (%s)\n", listen, listen ? "开" : "关"); + else + debug_printf("Error: Failed to forward UART 0x60 (result=%d)\n", result); +} + + +/** + * @brief 处理串口获取当前UAC模式命令 (0x52) + * @note 改动原因:直接调用HID的process_read_params (0x9C),完全复用代码 + */ +uint8_t process_uart_get_current_uac_mode(uint8_t *response, uint8_t response_size) +{ + if (response_size < 15) return 0; + + // 调用HID获取UAC模式 + uint8_t hid_data[61]; + uint8_t len = call_hid_read_params(0x9C, NULL, 0, hid_data, sizeof(hid_data)); + + if (len >= 9) { + uint8_t uac_mode = hid_data[0]; + + // 构建UART响应(命令码应为0x52,不是0x42) + response[0] = 0x55; // 帧头1 + response[1] = 0xAA; // 帧头2 + response[2] = 0x00; + response[3] = GET_CURRENT_UAC_MODE; + response[4] = 0x09; // 数据长度 (9字节) + response[5] = uac_mode; // UAC模式值 + memcpy(&response[6], &hid_data[1], 8); // 模式名称 (8字节) + + uint8_t checksum_pos = 14; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + debug_printf("UART GET_CURRENT_UAC_MODE (0x52): mode=%d (from HID 0x9C)\n", uac_mode); + return 15; + } + return 0; +} + +/** + * @brief 处理串口设置EQ使能命令 (0x43) + * @note 改动原因:直接调用HID的process_send_params (0x9D),完全复用代码 + */ +uint8_t process_uart_set_eq_enable(uint8_t enable) +{ + debug_printf("UART SET_EQ_ENABLE: enable=%d (calling HID 0x9D)\n", enable); + return call_hid_send_params(0x9D, &enable, 1) ? 0 : 1; +} + +/** + * @brief 构建EQ使能设置响应 (0x43响应) + * @note 改动原因:直接调用HID读取当前状态,完全复用代码 + */ +uint8_t process_uart_get_eq_enable_response(uint8_t result, uint8_t enable, uint8_t *response, uint8_t response_size) +{ + if (response_size < 8) return 0; + + // 调用HID获取EQ使能状态 + uint8_t hid_data[61]; + uint8_t len = call_hid_read_params(0x9E, NULL, 0, hid_data, sizeof(hid_data)); + uint8_t current_enable = (len > 0) ? hid_data[0] : enable; + + // 构建UART响应 + response[0] = 0x55; + response[1] = 0xAA; + response[2] = 0x00; + response[3] = SET_EQ_ENABLE; + response[4] = 0x02; + response[5] = result; + response[6] = current_enable; + + uint8_t checksum_pos = 7; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + debug_printf("UART SET_EQ_ENABLE response: status=0x%02X, enable=%d (from HID 0x9E)\n", result, current_enable); + return 8; +} + +/** + * @brief 处理串口获取EQ使能命令 (0x44) + * @note 改动原因:直接调用HID的process_read_params (0x9E),完全复用代码 + */ +uint8_t process_uart_get_eq_enable(uint8_t *response, uint8_t response_size) +{ + debug_printf("UART GET_EQ_ENABLE: start processing, response_size=%d\n", response_size); + + if (response_size < 7) { + debug_printf("UART GET_EQ_ENABLE: error - response buffer too small (%d < 7)\n", response_size); + return 0; + } + + // 调用HID获取EQ使能 + debug_printf("UART GET_EQ_ENABLE: calling call_hid_read_params(0x9E)\n"); + uint8_t hid_data[61]; + uint8_t len = call_hid_read_params(0x9E, NULL, 0, hid_data, sizeof(hid_data)); + debug_printf("UART GET_EQ_ENABLE: call_hid_read_params returned len=%d\n", len); + + if (len > 0) { + uint8_t eq_enable = hid_data[0]; + debug_printf("UART GET_EQ_ENABLE: read eq_enable=%d from HID\n", eq_enable); + + // 构建UART响应 + response[0] = 0x55; + response[1] = 0xAA; + response[2] = 0x00; + response[3] = GET_EQ_ENABLE; + response[4] = 0x01; + response[5] = eq_enable; + + uint8_t checksum_pos = 6; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + debug_printf("UART GET_EQ_ENABLE: response built, length=7, data: "); + for (int i = 0; i < 7; i++) { + debug_printf("%02X ", response[i]); + } + debug_printf("\n"); + debug_printf("UART GET_EQ_ENABLE: enable=%d (from HID 0x9E)\n", eq_enable); + return 7; + } else { + debug_printf("UART GET_EQ_ENABLE: error - call_hid_read_params returned len=0, cannot get EQ enable status\n"); + } + return 0; +} + +/** + * @brief 处理串口获取采样格式命令 (0x45) + * @note 改动原因:直接调用HID的process_read_params (0x9F),完全复用代码 + */ +uint8_t process_uart_get_sample_format(uint8_t *response, uint8_t response_size) +{ + if (response_size < 11) return 0; + + // 调用HID获取采样格式 + uint8_t hid_data[61]; + uint8_t len = call_hid_read_params(0x9F, NULL, 0, hid_data, sizeof(hid_data)); + + if (len >= 5) { + // HID返回:[rate_0, rate_1, rate_2, rate_3, dsd_mode, ...] + uint32_t sample_rate = hid_data[0] | (hid_data[1] << 8) | (hid_data[2] << 16) | (hid_data[3] << 24); + uint8_t dsd_mode = hid_data[4]; + + // 构建UART响应 + response[0] = 0x55; + response[1] = 0xAA; + response[2] = 0x00; + response[3] = GET_SAMPLE_FORMAT; + response[4] = 0x05; + response[5] = hid_data[0]; + response[6] = hid_data[1]; + response[7] = hid_data[2]; + response[8] = hid_data[3]; + response[9] = dsd_mode; + + uint8_t checksum_pos = 10; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + debug_printf("UART GET_SAMPLE_FORMAT: sample_rate=%d, dsd_mode=%d (from HID 0x9F)\n", sample_rate, dsd_mode); + return 11; + } + return 0; +} + +/** + * @brief 处理串口设置增益模式命令 (0x46) + * @note 改动原因:直接调用HID的process_send_params (0xA0),完全复用代码 + */ +uint8_t process_uart_set_gain_mode(uint8_t gain_mode) +{ + debug_printf("UART SET_GAIN_MODE: gain_mode=%d (calling HID 0xA0)\n", gain_mode); + return call_hid_send_params(0xA0, &gain_mode, 1) ? 0 : 1; +} + +/** + * @brief 处理串口获取增益模式命令 (0x47) + * @note 改动原因:直接调用HID的process_read_params (0xA1),完全复用代码 + */ +uint8_t process_uart_get_gain_mode(uint8_t *response, uint8_t response_size) +{ + if (response_size < 7) return 0; + + // 调用HID获取增益模式 + uint8_t hid_data[61]; + uint8_t len = call_hid_read_params(0xA1, NULL, 0, hid_data, sizeof(hid_data)); + + if (len > 0) { + uint8_t gain_mode = hid_data[0]; + + // 构建UART响应 + response[0] = 0x55; + response[1] = 0xAA; + response[2] = 0x00; + response[3] = GET_GAIN_MODE; + response[4] = 0x01; + response[5] = gain_mode; + + uint8_t checksum_pos = 6; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + debug_printf("UART GET_GAIN_MODE: gain_mode=%d (from HID 0xA1)\n", gain_mode); + return 7; + } + return 0; +} + +/** + * @brief 处理串口设置滤波器模式命令 (0x48) + * @note 改动原因:直接调用HID的process_send_params (0xA2),完全复用代码 + */ +uint8_t process_uart_set_filter_mode(uint8_t filter_mode) +{ + debug_printf("UART SET_FILTER_MODE: filter_mode=%d (calling HID 0xA2)\n", filter_mode); + return call_hid_send_params(0xA2, &filter_mode, 1) ? 0 : 1; +} + +/** + * @brief 处理串口获取滤波器模式命令 (0x49) + * @note 改动原因:直接调用HID的process_read_params (0xA3),完全复用代码 + */ +uint8_t process_uart_get_filter_mode(uint8_t *response, uint8_t response_size) +{ + if (response_size < 7) return 0; + + // 调用HID获取滤波器模式 + uint8_t hid_data[61]; + uint8_t len = call_hid_read_params(0xA3, NULL, 0, hid_data, sizeof(hid_data)); + + if (len > 0) { + uint8_t filter_mode = hid_data[0]; + + // 构建UART响应 + response[0] = 0x55; + response[1] = 0xAA; + response[2] = 0x00; + response[3] = GET_FILTER_MODE; + response[4] = 0x01; + response[5] = filter_mode; + + uint8_t checksum_pos = 6; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + debug_printf("UART GET_FILTER_MODE: filter_mode=%d (from HID 0xA3)\n", filter_mode); + return 7; + } + return 0; +} + +/** + * @brief 处理串口设置游戏模式命令 (0x5A) + * @param game_mode 游戏模式值 (0=无音效, 1=FPS, 2=虚拟7.1) + * @note 改动原因:UART 0x5A命令将游戏模式设置请求透传给MCU处理,MCU负责执行模式设置和参数保存 + */ +void process_uart_set_game_mode(uint8_t game_mode) +{ + debug_printf("UART SET_GAME_MODE (0x5A): game_mode=%d, forwarding to MCU\n", game_mode); + + // 参数验证 + if (game_mode > 2) { + debug_printf("Error: Invalid game_mode %d (must be 0-2)\n", game_mode); + return; + } + + // 改动原因:构建UART 0x5A数据包并透传给MCU + // UART数据包格式:0x55 0xAA 0x00 0x5A [长度] [游戏模式值] [校验和] + uint8_t uart_packet[7]; + uart_packet[0] = 0x55; // 帧头1 + uart_packet[1] = 0xAA; // 帧头2 + uart_packet[2] = 0x00; // 版本 + uart_packet[3] = 0x5A; // 命令码 (SET_GAME_MODE) + uart_packet[4] = 0x01; // 数据长度 + uart_packet[5] = game_mode; // 游戏模式值 + + // 计算校验和(帧头到数据末尾所有字节的累加和取低8位) + uint8_t checksum = 0; + for (int i = 0; i < 6; i++) { + checksum += uart_packet[i]; + } + uart_packet[6] = checksum; // 校验和 + + // 改动原因:通过xmos_printf将UART数据包透传给MCU + // 声明xmos_printf函数(在user_uart.xc中定义) + extern int xmos_printf(unsigned char *data, unsigned char len); + + // 发送UART数据包给MCU + int result = xmos_printf(uart_packet, 7); + if (result == 7) { + debug_printf("UART 0x5A packet forwarded to MCU successfully: game_mode=%d (0=无音效, 1=FPS, 2=虚拟7.1)\n", + game_mode); + } else { + debug_printf("Error: Failed to forward UART 0x5A packet to MCU (result=%d)\n", result); + } + + // 改动原因:MCU接收到0x5A命令后会处理游戏模式设置和参数保存,XMOS设备无需执行额外操作 +} + +/** + * @brief 处理串口获取游戏模式命令 (0x4B) + * @note 改动原因:直接调用HID的process_read_params (0xA5),完全复用代码 + */ +uint8_t process_uart_get_game_mode(uint8_t *response, uint8_t response_size) +{ + if (response_size < 7) return 0; + + // 调用HID获取游戏模式 + uint8_t hid_data[61]; + uint8_t len = call_hid_read_params(0xA5, NULL, 0, hid_data, sizeof(hid_data)); + + if (len > 0) { + uint8_t game_mode = hid_data[0]; + + // 构建UART响应 + response[0] = 0x55; + response[1] = 0xAA; + response[2] = 0x00; + response[3] = GET_GAME_MODE; + response[4] = 0x01; + response[5] = game_mode; + + uint8_t checksum_pos = 6; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + debug_printf("UART GET_GAME_MODE: game_mode=%d (from HID 0xA5)\n", game_mode); + return 7; + } + return 0; +} + +/** + * @brief 处理串口获取固件版本命令 (0x4C) + * @param response 响应数据缓冲区 + * @param response_size 响应缓冲区大小 + * @return 响应数据长度 + * @note 改动原因:实现GET_FIRMWARE_VERSION命令,读取固件版本号,参考process_read_params中0xA6命令和user_uart.xc中FW_VERSION的实现 + */ +uint8_t process_uart_get_firmware_version(uint8_t *response, uint8_t response_size) +{ + if (response_size < 9) { + debug_printf("Response buffer too small for firmware version\n"); + return 0; + } + + // 从版本宏定义获取固件版本号(BCD格式) + // 需要在头文件中包含version.h或xua_conf_default.h + #ifndef BCD_DEVICE_J + #define BCD_DEVICE_J 1 + #endif + #ifndef BCD_DEVICE_M + #define BCD_DEVICE_M 0 + #endif + #ifndef BCD_DEVICE_N + #define BCD_DEVICE_N 0 + #endif + + uint8_t major = (uint8_t)BCD_DEVICE_J; // 主版本号 + uint8_t minor = (uint8_t)BCD_DEVICE_M; // 次版本号 + uint8_t revision = (uint8_t)BCD_DEVICE_N; // 修订版本号 + + debug_printf("UART GET_FIRMWARE_VERSION: %d.%d.%d (BCD format: 0x%02X 0x%02X 0x%02X)\n", + major, minor, revision, major, minor, revision); + + // 构建响应数据 + response[0] = 0x55; // 帧头1 + response[1] = 0xAA; // 帧头2 + response[2] = 0x00; // 版本 + response[3] = GET_FIRMWARE_VERSION; // 命令码 + response[4] = 0x03; // 数据长度 + response[5] = major; + response[6] = minor; + response[7] = revision; + + // 计算校验和 + uint8_t checksum_pos = 8; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + return 9; +} diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq.h new file mode 100644 index 0000000..b9cf4a5 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq.h @@ -0,0 +1,201 @@ +#ifndef __HEADER_EQ_HANDLER__ +#define __HEADER_EQ_HANDLER__ + +#pragma once + +#include "xmath/xmath.h" +#include +#include + +#define NUM_EQ_MODES 10 +#define NUM_EQ_CHANS 2 +#define MAX_EQ_BANDS 8 +#define EQ_DISABLED_MODE 10 // 禁用EQ的模式编号 +#define EQ_PRESET_MODE_MIN 0 // 预设模式最小编号 +#define EQ_PRESET_MODE_MAX 6 // 预设模式最大编号(preset1-preset6) +#define EQ_USER_MODE_MIN 7 // 用户模式最小编号 +#define EQ_USER_MODE_MAX 9 // 用户模式最大编号(user 1-4) +#define EQ_MODE_MAX (NUM_EQ_MODES) // 模式最大编号(user 1-4) + + +// Filter type definition +typedef enum { + FILTER_TYPE_BYPASS = 0x00, + FILTER_TYPE_ALLPASS = 0x01, + FILTER_TYPE_PEAKING = 0x02, + FILTER_TYPE_LOWPASS = 0x03, + FILTER_TYPE_HIGHPASS = 0x04, + FILTER_TYPE_BANDPASS = 0x05, + FILTER_TYPE_BANDSTOP = 0x06, + FILTER_TYPE_NOTCH = 0x07, + FILTER_TYPE_CONST_Q = 0x08, + FILTER_TYPE_LOWSHELF = 0x09, + FILTER_TYPE_HIGHSHELF = 0x0A +} filter_type_t; + + +// Filter parameter structure +typedef struct { + float fc; // Center frequency (Hz) + float q; // Q value + float bw; // Bandwidth (Hz) + float gain; // Gain (dB) + uint8_t index; // Filter index + filter_type_t type; // Filter type + uint8_t padding[2]; // 添加填充字节确保结构体对齐到4字节边界 +} filter_params_t; + +// Filter biquad structure for runtime calculation +typedef struct { + int32_t coef[5][8]; // 5×8×4 = 160字节 +} filter_biquad_s32_coef_t; + +// 注意:以下结构体定义暂时注释,因为它们可能在其他文件中定义 +// 如果需要使用,请确保包含相应的头文件 + +// 优化后的Flash存储结构 - 只存储非默认滤波器 +typedef struct { + uint8_t active_bands_count; // 实际使用的滤波器数量 + filter_params_t active_bands[MAX_EQ_BANDS]; // 只存储非bypass的滤波器 +} eq_flash_data_t; + +// 单个EQ参数变化记录结构(优化版) +typedef struct { + uint32_t sample_rate; // 采样率 + uint8_t mode; // 模式 + uint8_t channel; // 通道 + uint8_t band_index; // 滤波器索引 + filter_params_t params; // 单个滤波器参数(不包含系数) + uint32_t timestamp; // 时间戳 + uint8_t is_dirty; // 脏标志 +} __attribute__((packed)) eq_single_param_t; + +// 单参数存储数据库 +typedef struct { + eq_single_param_t params[MAX_EQ_BANDS * 8 * 2]; // 最多存储8个模式×2通道的所有参数 + uint16_t param_count; // 当前参数数量 + uint16_t max_params; // 最大参数数量 + uint32_t last_save_time; // 最后保存时间 +} eq_single_param_database_t; + +// 设备信息结构体 +typedef struct { + char mode_names[NUM_EQ_MODES][16]; // 模式名称数组,每个16字节 + int32_t mode_gains[NUM_EQ_MODES]; // 模式增益数组,每个4字节 +} __attribute__((packed)) eq_mode_info_t; + +// Define EQ data structure for each sample rate +typedef struct { + unsigned sample_rate; // Sample rate + int32_t total_bshift; + int32_t post_gain_db; + filter_params_t bands[MAX_EQ_BANDS]; // Filter parameters + filter_biquad_s32_t filter; // Filter data (运行时计算) +} __attribute__((packed)) eq_mode_data_t; + + +uint32_t init_eq_data(unsigned sample_freq); + +void clear_eq_status(unsigned sample_freq, unsigned ch_no); + +int32_t handler_eq_filter( unsigned sample_freq, uint32_t ch, int32_t new_sample); + +void init_eq_hid_params(void); + +// EQ参数处理函数 - 用于串口接收的EQ参数转换和存储 +int process_eq_params_from_uart(uint8_t eq_mode, uint8_t eq_index, uint32_t sample_rate, float coefficients[5]); + +// 模式信息处理函数 +#ifdef __XC__ +// 独立的增益和名称设置/获取函数 +void set_mode_gain(uint8_t mode, int32_t gain); +void set_mode_name(uint8_t mode, const char* unsafe name); +void get_mode_gain(uint8_t mode, int32_t* unsafe gain); +void get_mode_name(uint8_t mode, char* unsafe name); +uint8_t process_uart_set_eq_mode(uint8_t mode); +uint8_t process_uart_get_eq_mode(uint8_t * unsafe response, uint8_t response_size); +uint8_t process_uart_set_mode_gain_and_name(uint8_t * unsafe data); +uint8_t process_uart_set_eq_params(uint8_t * unsafe data); +uint8_t process_uart_get_eq_params(uint8_t * unsafe data, uint8_t * unsafe response, uint8_t response_size); +uint8_t process_uart_reset_eq_params(uint8_t * unsafe data); +uint8_t process_uart_get_eq_mode_count(uint8_t * unsafe response, uint8_t response_size); +uint8_t process_uart_set_and_save_eq_mode(uint8_t * unsafe data); +uint8_t process_uart_get_device_info(uint8_t * unsafe response, uint8_t response_size); +uint8_t process_uart_set_volume(uint8_t volume); +uint8_t process_uart_get_volume(uint8_t * unsafe response, uint8_t response_size); +uint8_t process_uart_get_led_info(uint8_t led_index, uint8_t * unsafe response, uint8_t response_size); +uint8_t process_uart_set_led_switch(uint8_t led_index, uint8_t led_switch); +uint8_t process_uart_get_led_switch(uint8_t led_index, uint8_t * unsafe response, uint8_t response_size); +uint8_t process_uart_get_led_status(uint8_t led_index, uint8_t * unsafe response, uint8_t response_size); +uint8_t process_uart_get_led_count(uint8_t * unsafe response, uint8_t response_size); +uint8_t process_uart_get_uac_mode_info(uint8_t * unsafe response, uint8_t response_size); +void process_uart_set_uac_mode(uint8_t uac_mode); +void process_uart_set_input_source(uint8_t input_source); // 设置输入源(0=USB,1=OPT,2=COAX),HID 0xB0透传MCU +void process_uart_set_mute_switch(uint8_t mute); // 设置静音开关(0=关,1=开),HID 0xB1透传MCU +void process_uart_set_listen_switch(uint8_t listen); // 设置监听开关(0=关,1=开),HID 0xB3透传MCU +void process_uart_send_get_mute_request(void); // 向MCU发送0x5F获取静音请求 +uint8_t process_uart_get_current_uac_mode(uint8_t * unsafe response, uint8_t response_size); +uint8_t process_uart_set_eq_enable(uint8_t enable); +uint8_t process_uart_get_eq_enable_response(uint8_t result, uint8_t enable, uint8_t * unsafe response, uint8_t response_size); +uint8_t process_uart_get_eq_enable(uint8_t * unsafe response, uint8_t response_size); +uint8_t process_uart_get_sample_format(uint8_t * unsafe response, uint8_t response_size); +uint8_t process_uart_set_gain_mode(uint8_t gain_mode); +uint8_t process_uart_get_gain_mode(uint8_t * unsafe response, uint8_t response_size); +uint8_t process_uart_set_filter_mode(uint8_t filter_mode); +uint8_t process_uart_get_filter_mode(uint8_t * unsafe response, uint8_t response_size); +void process_uart_set_game_mode(uint8_t game_mode); +uint8_t process_uart_get_game_mode(uint8_t * unsafe response, uint8_t response_size); +uint8_t process_uart_get_firmware_version(uint8_t * unsafe response, uint8_t response_size); + +#else +// 独立的增益和名称设置/获取函数 +void set_mode_gain(uint8_t mode, int32_t gain); +void set_mode_name(uint8_t mode, const char* name); +void get_mode_gain(uint8_t mode, int32_t* gain); +void get_mode_name(uint8_t mode, char* name); +uint8_t process_uart_set_eq_mode(uint8_t mode); +uint8_t process_uart_get_eq_mode(uint8_t *response, uint8_t response_size); +uint8_t process_uart_set_mode_gain_and_name(uint8_t *data); +uint8_t process_uart_set_eq_params(uint8_t *data); +uint8_t process_uart_get_eq_params(uint8_t *data, uint8_t *response, uint8_t response_size); +uint8_t process_uart_reset_eq_params(uint8_t *data); +uint8_t process_uart_get_eq_mode_count(uint8_t *response, uint8_t response_size); +uint8_t process_uart_set_and_save_eq_mode(uint8_t *data); +uint8_t process_uart_get_device_info(uint8_t *response, uint8_t response_size); +uint8_t process_uart_set_volume(uint8_t volume); +uint8_t process_uart_get_volume(uint8_t *response, uint8_t response_size); +uint8_t process_uart_get_led_info(uint8_t led_index, uint8_t *response, uint8_t response_size); +uint8_t process_uart_set_led_switch(uint8_t led_index, uint8_t led_switch); +uint8_t process_uart_get_led_switch(uint8_t led_index, uint8_t *response, uint8_t response_size); +uint8_t process_uart_get_led_status(uint8_t led_index, uint8_t *response, uint8_t response_size); +uint8_t process_uart_get_led_count(uint8_t *response, uint8_t response_size); +uint8_t process_uart_get_uac_mode_info(uint8_t *response, uint8_t response_size); +void process_uart_set_uac_mode(uint8_t uac_mode); +void process_uart_set_input_source(uint8_t input_source); // 设置输入源(0=USB,1=OPT,2=COAX),HID 0xB0透传MCU +void process_uart_set_mute_switch(uint8_t mute); // 设置静音开关(0=关,1=开),HID 0xB1透传MCU +void process_uart_set_listen_switch(uint8_t listen); // 设置监听开关(0=关,1=开),HID 0xB3透传MCU +void process_uart_send_get_mute_request(void); // 向MCU发送0x5F获取静音请求 +uint8_t process_uart_get_current_uac_mode(uint8_t *response, uint8_t response_size); +uint8_t process_uart_set_eq_enable(uint8_t enable); +uint8_t process_uart_get_eq_enable_response(uint8_t result, uint8_t enable, uint8_t *response, uint8_t response_size); +uint8_t process_uart_get_eq_enable(uint8_t *response, uint8_t response_size); +uint8_t process_uart_get_sample_format(uint8_t *response, uint8_t response_size); +uint8_t process_uart_set_gain_mode(uint8_t gain_mode); +uint8_t process_uart_get_gain_mode(uint8_t *response, uint8_t response_size); +uint8_t process_uart_set_filter_mode(uint8_t filter_mode); +uint8_t process_uart_get_filter_mode(uint8_t *response, uint8_t response_size); +void process_uart_set_game_mode(uint8_t game_mode); +uint8_t process_uart_get_game_mode(uint8_t *response, uint8_t response_size); +uint8_t process_uart_get_firmware_version(uint8_t *response, uint8_t response_size); + + +#endif +void init_mode_info(void); + +uint8_t reset_eq_params(uint8_t mode); + +// 动态系数计算函数声明 +int calculate_current_mode_coefficients(uint32_t sample_rate, uint8_t mode); + +// 串口EQ命令处理函数声明 +#endif //__HEADER_EQ_HANDLER__ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_coefficient_calculator.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_coefficient_calculator.c new file mode 100644 index 0000000..d59c1f5 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_coefficient_calculator.c @@ -0,0 +1,181 @@ +#define DEBUG_PRINT_ENABLE 0 +#include "eq_coefficient_calculator.h" +#include "biquad_standalone.h" +#include + +extern void print_float(float value, int precision); + +#if 0 // DEBUG_PRINT_ENABLE +#define DPRINTF(...) printf(__VA_ARGS__) +#else +#define DPRINTF(...) +#endif + + +// 系数计算函数 +int eq_calculate_coefficients_from_params(filter_params_t *params, + uint32_t sample_rate, + q2_30 coeffs[5], + int *bshift) { + + if (!params || !coeffs || !bshift) { + return -1; + } + + #if 1 // DEBUG_PRINT_ENABLE == 1 + DPRINTF("eq_calculate_coefficients_from_params\n"); + DPRINTF("params->type: %d\n", params->type); + DPRINTF("params->fc: "); + print_float(params->fc, 6); + DPRINTF(", q="); + print_float(params->q, 6); + DPRINTF(", bw="); + print_float(params->bw, 6); + DPRINTF(", gain="); + print_float(params->gain, 6); + DPRINTF("\n"); + #endif + + // 根据滤波器类型调用相应的biquad计算函数 + switch (params->type) { + case FILTER_TYPE_BYPASS: + eq_biquad_bypass(coeffs); + *bshift = 0; + break; + + case FILTER_TYPE_LOWPASS: + eq_biquad_lowpass(coeffs, + params->fc, + (float)sample_rate, + params->q); + *bshift = 0; + break; + + case FILTER_TYPE_HIGHPASS: + eq_biquad_highpass(coeffs, + params->fc, + (float)sample_rate, + params->q); + *bshift = 0; + break; + + case FILTER_TYPE_BANDPASS: + eq_biquad_bandpass(coeffs, + params->fc, + (float)sample_rate, + params->bw); + *bshift = 0; + break; + + case FILTER_TYPE_BANDSTOP: + eq_biquad_bandstop(coeffs, + params->fc, + (float)sample_rate, + params->bw); + *bshift = 0; + break; + + case FILTER_TYPE_NOTCH: + eq_biquad_notch(coeffs, + params->fc, + (float)sample_rate, + params->q); + *bshift = 0; + break; + + case FILTER_TYPE_ALLPASS: + eq_biquad_allpass(coeffs, + params->fc, + (float)sample_rate, + params->q); + *bshift = 0; + break; + + case FILTER_TYPE_PEAKING: + *bshift = eq_biquad_peaking(coeffs, + params->fc, + (float)sample_rate, + params->q, + params->gain); + break; + + case FILTER_TYPE_CONST_Q: + *bshift = eq_biquad_const_q(coeffs, + params->fc, + (float)sample_rate, + params->q, + params->gain); + break; + + case FILTER_TYPE_LOWSHELF: + *bshift = eq_biquad_lowshelf(coeffs, + params->fc, + (float)sample_rate, + params->q, + params->gain); + break; + + case FILTER_TYPE_HIGHSHELF: + *bshift = eq_biquad_highshelf(coeffs, + params->fc, + (float)sample_rate, + params->q, + params->gain); + break; + + default: + // 默认使用bypass + eq_biquad_bypass(coeffs); + *bshift = 0; + break; + } + + #if 1 //DEBUG_PRINT_ENABLE == 1 + DPRINTF("--------------------------------\n"); + for(int i = 0; i < 5; i++) { + if (coeffs[i] < 0) { + DPRINTF("coeffs[%d]: -0x%08x\n", i, (unsigned int)(-coeffs[i])); + } else { + DPRINTF("coeffs[%d]: 0x%08x\n", i, (unsigned int)coeffs[i]); + } + } + DPRINTF("--------------------------------\n"); + #endif + + return 0; +} + +// 批量计算所有滤波器的系数 +int eq_calculate_all_coefficients(eq_mode_data_t *eq_data, + uint32_t sample_rate) { + + if (!eq_data) { + return -1; + } + + int total_bshift = 0; + + // 计算每个滤波器的系数 + for (int i = 0; i < MAX_EQ_BANDS; i++) { + q2_30 coeffs[5]; + int bshift; + + if (eq_calculate_coefficients_from_params(&eq_data->bands[i], + sample_rate, coeffs, &bshift) == 0) { + // 存储计算出的系数 + for (int j = 0; j < 5; j++) { + eq_data->filter.coef[j][i] = coeffs[j]; + } + total_bshift += bshift; + } + } + + // 更新总bshift + eq_data->total_bshift = total_bshift; + + #if DEBUG_PRINT_ENABLE == 1 + DPRINTF("total_bshift: %d\n", total_bshift); + #endif + + return 0; +} diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_coefficient_calculator.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_coefficient_calculator.h new file mode 100644 index 0000000..9539cd4 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_coefficient_calculator.h @@ -0,0 +1,17 @@ +#ifndef EQ_COEFFICIENT_CALCULATOR_H +#define EQ_COEFFICIENT_CALCULATOR_H + +#include "eq.h" +#include "biquad_standalone.h" + +// 系数计算函数 +int eq_calculate_coefficients_from_params(filter_params_t *params, + uint32_t sample_rate, + q2_30 coeffs[5], + int *bshift); + +// 批量计算所有滤波器的系数 +int eq_calculate_all_coefficients(eq_mode_data_t *eq_data, + uint32_t sample_rate); + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_designer_new.py b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_designer_new.py new file mode 100644 index 0000000..8d06433 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_designer_new.py @@ -0,0 +1,4261 @@ +from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, + QHBoxLayout, QPushButton, QComboBox, QLabel, + QScrollArea, QSplitter, QGroupBox, QFormLayout, + QDoubleSpinBox, QCheckBox, QLineEdit, QSpinBox, + QMessageBox, QMenuBar, QMenu, QFileDialog, QProgressBar) +from PySide6.QtCore import Qt, QObject, Signal, Slot, QTimer +import numpy as np +import matplotlib +# 设置字体为支持中文的字体 +matplotlib.rcParams['font.family'] = ['Microsoft YaHei', 'SimHei', 'SimSun'] +import matplotlib.pyplot as plt +from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg +from matplotlib.figure import Figure +import json +from pathlib import Path +import os +import hid # 添加hidapi导入 +import logging # 添加logging模块 +import struct # 添加struct模块用于float打包/解包 + +# 定义日志级别 +LOG_LEVEL_ERROR = 0 # 错误信息 +LOG_LEVEL_WARN = 1 # 警告信息 +LOG_LEVEL_INFO = 2 # 一般信息 +LOG_LEVEL_DEBUG = 3 # 调试信息 +LOG_LEVEL_VERBOSE = 4 # 详细信息 + +# 日志级别名称映射 +LOG_LEVEL_NAMES = { + LOG_LEVEL_ERROR: "错误", + LOG_LEVEL_WARN: "警告", + LOG_LEVEL_INFO: "信息", + LOG_LEVEL_DEBUG: "调试", + LOG_LEVEL_VERBOSE: "详细" +} + +def log_message(level, message, current_level=LOG_LEVEL_INFO): + """打印日志信息 + Args: + level: 消息的日志级别 + message: 要打印的消息 + current_level: 当前的日志级别设置 + """ + if level <= current_level: + prefix = f"[{LOG_LEVEL_NAMES[level]}]" + print(f"{prefix} {message}") + +# 导入滤波器计算器 +from filter_utils import (BiquadFilterCalculator, make_biquad_bypass, make_biquad_lowpass, + make_biquad_highpass, make_biquad_bandpass, make_biquad_bandstop, + make_biquad_notch, make_biquad_allpass, make_biquad_peaking, + make_biquad_constant_q, make_biquad_lowshelf, make_biquad_highshelf) + +# 常量定义 +MAX_EQ_BANDS = 8 # 最大EQ滤波器数量 (0-7) +NUM_EQ_MODES = 10 # EQ模式数量 +EQ_DISABLED_MODE = 10 # 禁用EQ的模式编号 + +# HID 固件升级命令码(使用命令名代替裸命令码) +FIRMWARE_UPGRADE_START = 0xA7 # 开始固件升级 +FIRMWARE_UPGRADE_DATA = 0xA8 # 传输固件数据块 +FIRMWARE_UPGRADE_END = 0xA9 # 结束固件升级 +FIRMWARE_UPGRADE_STATUS = 0xAA # 获取升级状态 +FIRMWARE_UPGRADE_ABORT = 0xAB # 中止固件升级 +FIRMWARE_UPGRADE_ERASE = 0xAC # 擦除现有升级镜像 +DEVICE_REBOOT = 0xAE # 设备重启(通用命令) + +class BandFilter(QGroupBox): + """单个滤波器带控件""" + def __init__(self, band_id, parent=None): + super().__init__(f"滤波器 {band_id}", parent) + self.band_id = band_id + self.parent_window = parent + self.calculator = BiquadFilterCalculator() # 创建滤波器计算器实例 + + layout = QFormLayout() + + # 启用/禁用复选框 - 默认启用但隐藏 + self.enabled = QCheckBox() + self.enabled.setChecked(True) + #self.enabled.hide() # 隐藏复选框 + + # 滤波器类型选择 - 默认为全通 + self.filter_type = QComboBox() + self.filter_type.addItems([ + "bypass滤波器", # 新增bypass类型 + "全通滤波器", "峰值滤波器", "低通滤波器", "高通滤波器", + "带通滤波器", "带阻滤波器", "陷波滤波器", "恒定Q值滤波器", + "低架滤波器", "高架滤波器" + ]) + self.filter_type.setCurrentText("bypass滤波器") # 设置默认值为bypass + self.filter_type.currentTextChanged.connect(self.on_filter_type_changed) + layout.addRow("类型:", self.filter_type) + + # 中心频率 + self.fc = QSpinBox() + self.fc.setRange(20, 96000) + self.fc.setValue(1000) + self.fc.setSuffix(" Hz") + self.fc.valueChanged.connect(self.on_parameter_changed) + layout.addRow("频率:", self.fc) + + # Q值 + self.Q = QDoubleSpinBox() + self.Q.setRange(0.01, 100) + self.Q.setValue(0.707) + self.Q.setSingleStep(0.1) + self.Q.valueChanged.connect(self.on_parameter_changed) + layout.addRow("Q值:", self.Q) + + # 带宽 + self.bw = QSpinBox() + self.bw.setRange(1, 192000) + self.bw.setValue(1) + self.bw.valueChanged.connect(self.on_parameter_changed) + layout.addRow("带宽:", self.bw) + + # 增益 + self.gain = QDoubleSpinBox() + self.gain.setRange(-80, 80) + self.gain.setValue(0) + self.gain.setSuffix(" dB") + self.gain.valueChanged.connect(self.on_parameter_changed) + layout.addRow("增益:", self.gain) + + # 添加bshift显示 + self.bshift_label = QLabel("bshift: 0") + #layout.addRow("bshift:", self.bshift_label) + self.bshift_label.hide() + + # 系数显示 + self.coeffs_label = QLineEdit() + self.coeffs_label.setReadOnly(True) # 设置为只读 + self.coeffs_label.setMinimumWidth(300) # 设置最小宽度 + self.coeffs_label.setStyleSheet(""" + QLineEdit { + background-color: #f0f0f0; + border: 1px solid #cccccc; + padding: 2px; + font-family: monospace; + } + """) + self.coeffs_label.setText("Coefficients: Not calculated") + self.coeffs_label.setToolTip("Filter coefficients in Q30 format") + #layout.addRow("系数:", self.coeffs_label) + self.coeffs_label.hide() + + self.setLayout(layout) + + # 初始化时更新系数 + if self.parent_window and self.parent_window.show_qshift_debug: + self.update_coefficients() + + def on_filter_type_changed(self): + """当滤波器类型改变时更新参数显示""" + filter_type = self.filter_type.currentText() + + # 隐藏所有参数 + self.fc.hide() + self.Q.hide() + self.bw.hide() + self.gain.hide() + + # 根据滤波器类型显示相应参数 + if filter_type in ["峰值滤波器", "低通滤波器", "高通滤波器", "陷波滤波器", + "全通滤波器", "恒定Q值滤波器", "低架滤波器", "高架滤波器"]: + self.fc.show() + self.Q.show() + if filter_type in ["峰值滤波器", "恒定Q值滤波器", "低架滤波器", "高架滤波器"]: + self.gain.show() + elif filter_type in ["带通滤波器", "带阻滤波器"]: + self.fc.show() + self.bw.show() + + elif filter_type == "bypass滤波器": + pass + + self.on_parameter_changed() + + def on_parameter_changed(self): + """当参数改变时更新系数和响应曲线""" + if self.parent_window and self.parent_window.show_qshift_debug: + self.update_coefficients() + if self.parent_window: + self.parent_window.update_eq_curve() + + def update_coefficients(self): + """更新滤波器系数""" + if not self.enabled.isChecked(): + if self.parent_window and self.parent_window.show_qshift_debug: + log_message(LOG_LEVEL_DEBUG, f"滤波器 {self.band_id} 已禁用,bshift = 0", self.parent_window.log_level) + return + + try: + fs = float(self.parent_window.sample_rate.currentText()) + coeffs = self.calculate_coefficients(fs) + + # 只有在显示系数时才更新显示 + if self.parent_window and self.parent_window.show_qshift_debug and coeffs is not None: + # 反转 b1 和 b2 的符号用于显示 + display_coeffs = [ + coeffs[0], # a0 + coeffs[1], # a1 + coeffs[2], # a2 + -coeffs[3], # b1 符号取反 + -coeffs[4] # b2 符号取反 + ] + + # 计算并更新bshift + bshift = self.calculate_bshift(display_coeffs) + + # 计算缩放后的系数 + scale_factor = 2 ** (-bshift) + + # 更新系数显示 + self.coeffs_label.setText( + f"Coefficients: {display_coeffs[0]:.16f}, {display_coeffs[1]:.16f}, " + f"{display_coeffs[2]:.16f}, {display_coeffs[3]:.16f}, {display_coeffs[4]:.16f}\n" + f"Scaled: {display_coeffs[0] * scale_factor:.16f}, {display_coeffs[1] * scale_factor:.16f}, " + f"{display_coeffs[2] * scale_factor:.16f}, {display_coeffs[3] * scale_factor:.16f}, {display_coeffs[4] * scale_factor:.16f}" + ) + + except Exception as e: + if self.parent_window and self.parent_window.show_qshift_debug: + self.coeffs_label.setText("Coefficients: Calculation error") + self.bshift_label.setText("bshift: 0") + + def calculate_coefficients(self, fs): + """计算滤波器系数""" + try: + filter_type = self.filter_type.currentText() + + # 定义filter_calculator支持的类型 + calculator_types = { + "峰值滤波器": "peak", + "低通滤波器": "lowpass", + "高通滤波器": "highpass", + "带通滤波器": "bandpass", + "陷波滤波器": "notch", + "低架滤波器": "lowshelf", + "高架滤波器": "highshelf" + } + + # 如果是filter_calculator支持的类型,使用filter_calculator + if filter_type in calculator_types: + coeffs = self.calculator.calculate( + calculator_types[filter_type], + self.fc.value(), + fs, + self.Q.value(), + self.gain.value(), + self.bw.value() if filter_type in ['bandpass', 'bandstop'] else None + ) + return [coeffs['a0'], coeffs['a1'], coeffs['a2'], coeffs['b1'], coeffs['b2']] + + # 对于不支持的类型,使用biquad.py中的算法 + if filter_type == "全通滤波器": + coeffs = make_biquad_allpass(fs, self.fc.value(), self.Q.value()) + elif filter_type == "带阻滤波器": + coeffs = make_biquad_bandstop(fs, self.fc.value(), self.bw.value()) + elif filter_type == "恒定Q值滤波器": + coeffs = make_biquad_constant_q(fs, self.fc.value(), self.Q.value(), self.gain.value()) + elif filter_type == "bypass滤波器": + coeffs = make_biquad_bypass(fs) + else: + # 如果都不支持,使用bypass + coeffs = make_biquad_bypass(fs) + + return coeffs + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"计算系数时出错: {str(e)}", self.parent_window.log_level if self.parent_window else LOG_LEVEL_ERROR) + return None + + def get_parameters(self): + """获取当前参数""" + params = { + "enabled": self.enabled.isChecked(), + "type": self.filter_type.currentText(), + "fc": self.fc.value(), + "Q": self.Q.value(), + "bw": self.bw.value(), + "gain": self.gain.value() + } + return params + + def set_parameters(self, params): + """设置滤波器参数""" + try: + # 设置启用状态 + self.enabled.setChecked(params.get("enabled", True)) + + # 设置滤波器类型 + filter_type = params.get("type", "全通滤波器") + self.filter_type.setCurrentText(filter_type) + + # 设置频率 + self.fc.setValue(params.get("fc", 1000)) + + # 设置Q值 + self.Q.setValue(params.get("Q", 0.707)) + + # 设置带宽 + self.bw.setValue(params.get("bw", 1)) + + # 设置增益 + self.gain.setValue(params.get("gain", 0)) + + # 更新显示 + self.on_parameter_changed() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置滤波器参数时出错: {str(e)}", self.parent_window.log_level if self.parent_window else LOG_LEVEL_ERROR) + + def calculate_bshift(self, coeffs): + """根据最大b系数的二进制位宽自动计算bshift(与_get_bshift一致,直接返回bshift)""" + if not self.enabled.isChecked(): + if self.parent_window and self.parent_window.show_qshift_debug: + log_message(LOG_LEVEL_DEBUG, f"滤波器 {self.band_id} 已禁用,bshift = 0", self.parent_window.log_level) + return 0 + b_coeffs = coeffs[:3] + max_b = max(abs(x) for x in b_coeffs) + if self.parent_window and self.parent_window.show_qshift_debug: + log_message(LOG_LEVEL_DEBUG, f"滤波器 {self.band_id} b系数最大值: {max_b:.6f}", self.parent_window.log_level) + if max_b != 0: + bshift = int(np.floor(np.log2(max_b))) + else: + bshift = 0 + bshift = bshift if bshift >= 0 else 0 + if self.parent_window and self.parent_window.show_qshift_debug: + log_message(LOG_LEVEL_DEBUG, f"滤波器 {self.band_id} bshift={bshift}", self.parent_window.log_level) + self.bshift_label.setText(f"bshift: {bshift}") + return bshift + + def get_bshift(self): + """获取当前滤波器的bshift""" + coeffs = self.calculate_coefficients(float(self.parent_window.sample_rate.currentText())) + if coeffs is None: + return 0 + bshift = self.calculate_bshift(coeffs) + return bshift + + def get_scale_factor(self): + """获取当前滤波器的scale_factor(由bshift计算)""" + bshift = self.get_bshift() + scale_factor = 2 ** (-bshift) + return scale_factor + +class MplCanvas(FigureCanvasQTAgg): + def __init__(self, parent=None, width=5, height=4, dpi=100): + fig = Figure(figsize=(width, height), dpi=dpi) + self.axes = fig.subplots(1, 1) # 改为1行1列 + + # 更新标题为中文 + fig.suptitle("PEQ响应曲线") + + # 设置子图属性 + self.axes.set_xscale('log') + self.axes.set_xlabel('频率 (Hz)') + self.axes.set_ylabel('增益 (dB)') + self.axes.grid(True, which='both', linestyle='-', alpha=0.3) + self.axes.set_xlim(20, 20000) + self.axes.set_ylim(-30, 30) + + super().__init__(fig) + + def update_plot(self, f, h, fs): + """更新响应曲线""" + try: + # 计算幅度响应 + h_db = 20 * np.log10(np.abs(h)) + + # 清除当前图形 + self.axes.clear() + + # 绘制新的响应曲线 + self.axes.semilogx(f, h_db, 'b-', linewidth=2, label='总响应') + + # 设置x轴范围为20Hz到采样率的一半 + x_max = fs / 2 + self.axes.set_xlim([20, x_max]) + + # 设置x轴刻度 + x_ticks = [20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000] + if x_max > 20000: + x_ticks.extend([40000, 80000]) + self.axes.set_xticks(x_ticks) + + # 设置网格 + self.axes.grid(True, which='both', linestyle='-', alpha=0.3) + + # 更新y轴和x轴标签 + self.axes.set_ylim([-30, 30]) + self.axes.set_ylabel("幅度 (dB)") + self.axes.set_xlabel("频率 (Hz)") + + # 添加图例 + self.axes.legend(prop={'family': ['Microsoft YaHei', 'SimHei', 'SimSun']}) + + # 重绘图形 + self.draw() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"更新响应曲线时出错: {str(e)}", self.parent_window.log_level if self.parent_window else LOG_LEVEL_ERROR) + +class EQDesigner(QMainWindow): + def __init__(self): + super().__init__() + self.setWindowTitle("EQ参数设计器") + self.setMinimumSize(1200, 800) + + # 添加控制是否显示系数的变量 + self.show_qshift_debug = False # 默认不显示qshift调试信息 + self.current_mode = 0 # 初始化当前模式为0 + self.total_bshift = 0 # 初始化total_bshift为0 + self.log_level = LOG_LEVEL_VERBOSE # 设置默认日志级别 + + # 创建菜单栏 + # 改动原因:添加菜单栏,包含视图菜单用于隐藏/显示左侧面板的各组 + self.create_menu_bar() + + # 创建主窗口部件 + main_widget = QWidget() + self.setCentralWidget(main_widget) + + # 创建主布局 + main_layout = QHBoxLayout(main_widget) + + # 创建分割器 + splitter = QSplitter(Qt.Horizontal) + + # 左侧控制面板 + left_panel = QWidget() + left_layout = QVBoxLayout(left_panel) + left_layout.setContentsMargins(5, 5, 5, 5) # 设置边距 + + # 创建左侧面板内容的滚动区域,让所有内容都能滚动查看 + # 改动原因:解决左侧面板内容太多显示不下的问题,添加滚动条让所有内容都能查看 + left_scroll = QScrollArea() + left_scroll.setWidgetResizable(True) + left_scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) # 需要时显示水平滚动条 + left_scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) # 需要时显示垂直滚动条 + + # 创建左侧内容容器 + left_content = QWidget() + left_content_layout = QVBoxLayout(left_content) + left_content_layout.setContentsMargins(5, 5, 5, 5) + + # 滤波器带滚动区域(仅用于滤波器带的滚动) + # 改动原因:增加滤波器参数的空间,设置最小高度以确保有足够的显示空间 + bands_scroll = QScrollArea() + bands_scroll.setWidgetResizable(True) + bands_scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) + bands_scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) + bands_scroll.setMinimumHeight(400) # 设置最小高度400像素,给滤波器参数更多显示空间 + self.bands_widget = QWidget() + self.bands_layout = QVBoxLayout(self.bands_widget) + bands_scroll.setWidget(self.bands_widget) + left_content_layout.addWidget(bands_scroll) + + # 采样率选择 + sample_rate_layout = QHBoxLayout() + sample_rate_layout.addWidget(QLabel("采样率:")) + self.sample_rate = QComboBox() + self.sample_rate.addItems(["44100"]) # 只保留44100Hz,其他采样率使用相同参数 + self.sample_rate.currentTextChanged.connect(self.on_sample_rate_changed) + sample_rate_layout.addWidget(self.sample_rate) + left_content_layout.addLayout(sample_rate_layout) + + # 添加调试选项 + debug_layout = QHBoxLayout() + self.debug_checkbox = QCheckBox("显示bshift调试信息") + self.debug_checkbox.stateChanged.connect(self.on_debug_changed) + self.debug_checkbox.hide() + debug_layout.addWidget(self.debug_checkbox) + + # 添加日志级别选择 + log_level_layout = QHBoxLayout() + self.debug_label = QLabel("调试信息:") + self.debug_label.hide() + log_level_layout.addWidget(self.debug_label) + self.log_level_combo = QComboBox() + self.log_level_combo.addItems(["错误", "警告", "信息", "调试", "详细"]) + self.log_level_combo.setCurrentIndex(2) # 默认选择"信息"级别 + self.log_level_combo.currentIndexChanged.connect(self.on_log_level_changed) + self.log_level_combo.hide() + + log_level_layout.addWidget(self.log_level_combo) + debug_layout.addLayout(log_level_layout) + left_content_layout.addLayout(debug_layout) + + # 添加设备选择下拉框 + device_layout = QHBoxLayout() + device_layout.addWidget(QLabel("USB设备:")) + self.device_combo = QComboBox() + print(self.device_combo) + device_layout.addWidget(self.device_combo) + refresh_button = QPushButton("获取设备") + refresh_button.clicked.connect(self.refresh_devices) + device_layout.addWidget(refresh_button) + left_content_layout.addLayout(device_layout) + + # 保存各组引用,用于菜单控制可见性 + # 改动原因:保存各组引用,以便在菜单中控制可见性,EQ参数相关的组(bands_scroll和param_group)要始终显示 + self.ui_groups = {} + + # 添加设备信息显示组 + device_info_group = QGroupBox("设备信息") + self.ui_groups['device_info'] = device_info_group # 保存引用 + device_info_layout = QFormLayout(device_info_group) + + # 设备信息显示标签 + self.device_pid_label = QLabel("PID: 未知") + self.device_vid_label = QLabel("VID: 未知") + self.device_product_label = QLabel("产品: 未知") + self.device_vendor_label = QLabel("厂商: 未知") + self.device_serial_label = QLabel("序列号: 未知") + + device_info_layout.addRow("产品ID:", self.device_pid_label) + device_info_layout.addRow("厂商ID:", self.device_vid_label) + device_info_layout.addRow("产品名称:", self.device_product_label) + device_info_layout.addRow("厂商名称:", self.device_vendor_label) + device_info_layout.addRow("序列号:", self.device_serial_label) + + # 获取设备信息按钮 + self.get_device_info_btn = QPushButton("获取设备信息") + self.get_device_info_btn.clicked.connect(self.on_get_device_info) + device_info_layout.addRow(self.get_device_info_btn) + + left_content_layout.addWidget(device_info_group) + + + # 添加音效模式设置组 + mode_group = QGroupBox("音效模式设置") + self.ui_groups['mode'] = mode_group # 保存引用 + mode_layout = QFormLayout(mode_group) + self.mode_label = QLabel("音效模式:") + self.mode_combo = QComboBox() + self.mode_combo.addItems(["预设模式1", "预设模式2", "预设模式3", "预设模式4", "预设模式5", "预设模式6", "用户模式1", "用户模式2", "用户模式3", "bypass", "禁用EQ"]) + self.mode_combo.currentIndexChanged.connect(self.on_mode_changed) + mode_layout.addRow(self.mode_label, self.mode_combo) + + # 模式名称编辑 + self.mode_name_label = QLabel("模式名称:") + self.mode_name_edit = QLineEdit() + self.mode_name_edit.setMaxLength(15) # 限制16字节,但显示15个字符 + self.mode_name_edit.setPlaceholderText("输入模式名称(最多15个字符)") + self.mode_name_edit.textChanged.connect(self.on_mode_name_changed) + mode_layout.addRow(self.mode_name_label, self.mode_name_edit) + + # 切换音效模式按钮(只发送0x8A命令) + self.switch_mode_btn = QPushButton("切换音效模式") + self.switch_mode_btn.clicked.connect(self.on_switch_mode) + self.switch_mode_btn.hide() + mode_layout.addRow(self.switch_mode_btn) + + # 获取音效模式按钮(只处理0x8B命令) + # 改动原因:移除hide()调用,让按钮显示出来,方便用户获取当前模式 + self.get_mode_btn = QPushButton("获取当前音效模式") + self.get_mode_btn.clicked.connect(self.on_get_mode) + mode_layout.addRow(self.get_mode_btn) + + # 设置并保存音效模式按钮(发送0x92命令) + self.set_and_save_mode_btn = QPushButton("设置并保存音效模式") + self.set_and_save_mode_btn.clicked.connect(self.on_set_and_save_mode) + mode_layout.addRow(self.set_and_save_mode_btn) + + left_content_layout.addWidget(mode_group) + + # 添加音效参数配置组(EQ参数相关,可通过菜单隐藏) + # 改动原因:将音效参数配置组也添加到ui_groups中,使其可以通过菜单隐藏/显示 + param_group = QGroupBox("音效参数配置") + self.ui_groups['param'] = param_group # 保存引用,用于菜单控制可见性 + param_layout = QVBoxLayout(param_group) + + # 配置音效参数按钮 + self.config_params_btn = QPushButton("配置音效参数") + self.config_params_btn.clicked.connect(self.on_config_params) + param_layout.addWidget(self.config_params_btn) + + # 读取音效参数按钮 + self.read_params_btn = QPushButton("读取音效参数") + self.read_params_btn.hide() + self.read_params_btn.clicked.connect(self.on_read_params) + param_layout.addWidget(self.read_params_btn) + + # 设置整体增益按钮 + self.set_gain_btn = QPushButton("设置整体增益") + self.set_gain_btn.clicked.connect(self.on_set_gain) + param_layout.addWidget(self.set_gain_btn) + + # 复位EQ参数按钮 + self.reset_eq_btn = QPushButton("复位EQ参数") + self.reset_eq_btn.clicked.connect(self.on_reset_eq_params) + param_layout.addWidget(self.reset_eq_btn) + + # 获取EQ模式总数按钮 + self.get_mode_count_btn = QPushButton("获取EQ模式总数") + self.get_mode_count_btn.clicked.connect(self.on_get_mode_count) + param_layout.addWidget(self.get_mode_count_btn) + + left_content_layout.addWidget(param_group) + + # 添加音量控制组 + volume_group = QGroupBox("音量控制") + self.ui_groups['volume'] = volume_group # 保存引用 + volume_layout = QFormLayout(volume_group) + + # 音量级别显示和设置 + volume_control_layout = QHBoxLayout() + self.volume_label = QLabel("音量级别:") + self.volume_spin = QSpinBox() + self.volume_spin.setRange(0, 60) + self.volume_spin.setValue(60) + self.volume_spin.setSuffix(" (0=最小, 60=最大)") + volume_control_layout.addWidget(self.volume_label) + volume_control_layout.addWidget(self.volume_spin) + volume_layout.addRow(volume_control_layout) + + # 设置音量按钮 + self.set_volume_btn = QPushButton("设置音量") + self.set_volume_btn.clicked.connect(self.on_set_volume) + volume_layout.addRow(self.set_volume_btn) + + # 读取音量按钮 + self.get_volume_btn = QPushButton("读取音量") + self.get_volume_btn.clicked.connect(self.on_get_volume) + volume_layout.addRow(self.get_volume_btn) + + # 读取采样率和格式按钮 + self.get_sample_format_btn = QPushButton("读取采样率和格式") + self.get_sample_format_btn.clicked.connect(self.on_get_sample_format) + volume_layout.addRow(self.get_sample_format_btn) + + left_content_layout.addWidget(volume_group) + + # 添加设备模式控制组(增益模式、滤波器模式、游戏模式) + device_mode_group = QGroupBox("设备模式控制") + self.ui_groups['device_mode'] = device_mode_group # 保存引用 + device_mode_layout = QFormLayout(device_mode_group) + + # 增益模式 + gain_control_layout = QHBoxLayout() + self.gain_mode_combo = QComboBox() + self.gain_mode_combo.addItem("低阻模式 (0)", 0) + self.gain_mode_combo.addItem("高阻模式 (1)", 1) + gain_control_layout.addWidget(QLabel("增益模式:")) + gain_control_layout.addWidget(self.gain_mode_combo) + device_mode_layout.addRow(gain_control_layout) + + gain_btn_layout = QHBoxLayout() + self.set_gain_mode_btn = QPushButton("设置增益模式") + self.set_gain_mode_btn.clicked.connect(self.on_set_gain_mode) + self.get_gain_mode_btn = QPushButton("读取增益模式") + self.get_gain_mode_btn.clicked.connect(self.on_get_gain_mode) + gain_btn_layout.addWidget(self.set_gain_mode_btn) + gain_btn_layout.addWidget(self.get_gain_mode_btn) + device_mode_layout.addRow(gain_btn_layout) + + # 滤波器模式 + # 改动原因:添加第8种滤波器模式,支持0-7共8种模式 + filter_control_layout = QHBoxLayout() + self.filter_mode_combo = QComboBox() + self.filter_mode_combo.addItem("Minimum Phase filter (default) (0)", 0) + self.filter_mode_combo.addItem("Linear Phase Apodizing Fast Roll-off filter (1)", 1) + self.filter_mode_combo.addItem("Linear phase fast roll-off filter (2)", 2) + self.filter_mode_combo.addItem("Linear Phase Fast Roll-off low-ripple filter (3)", 3) + self.filter_mode_combo.addItem("Linear phase slow roll-off filter (4)", 4) + self.filter_mode_combo.addItem("Minimum phase fast roll-off filter (5)", 5) + self.filter_mode_combo.addItem("Minimum phase slow roll-off filter (6)", 6) + self.filter_mode_combo.addItem("Minimum Phase Fast Roll-Off Low Dispersion (7)", 7) + filter_control_layout.addWidget(QLabel("滤波器模式:")) + filter_control_layout.addWidget(self.filter_mode_combo) + device_mode_layout.addRow(filter_control_layout) + + filter_btn_layout = QHBoxLayout() + self.set_filter_mode_btn = QPushButton("设置滤波器模式") + self.set_filter_mode_btn.clicked.connect(self.on_set_filter_mode) + self.get_filter_mode_btn = QPushButton("读取滤波器模式") + self.get_filter_mode_btn.clicked.connect(self.on_get_filter_mode) + filter_btn_layout.addWidget(self.set_filter_mode_btn) + filter_btn_layout.addWidget(self.get_filter_mode_btn) + device_mode_layout.addRow(filter_btn_layout) + + # 游戏模式 + game_control_layout = QHBoxLayout() + self.game_mode_combo = QComboBox() + self.game_mode_combo.addItem("无音效 (0)", 0) + self.game_mode_combo.addItem("FPS模式 (1)", 1) + self.game_mode_combo.addItem("虚拟7.1 (2)", 2) + game_control_layout.addWidget(QLabel("游戏模式:")) + game_control_layout.addWidget(self.game_mode_combo) + device_mode_layout.addRow(game_control_layout) + + game_btn_layout = QHBoxLayout() + self.set_game_mode_btn = QPushButton("设置游戏模式") + self.set_game_mode_btn.clicked.connect(self.on_set_game_mode) + self.get_game_mode_btn = QPushButton("读取游戏模式") + self.get_game_mode_btn.clicked.connect(self.on_get_game_mode) + game_btn_layout.addWidget(self.set_game_mode_btn) + game_btn_layout.addWidget(self.get_game_mode_btn) + device_mode_layout.addRow(game_btn_layout) + + # 固件版本按钮 + firmware_btn_layout = QHBoxLayout() + self.get_firmware_version_btn = QPushButton("获取固件版本") + self.get_firmware_version_btn.clicked.connect(self.on_get_firmware_version) + firmware_btn_layout.addWidget(self.get_firmware_version_btn) + device_mode_layout.addRow(firmware_btn_layout) + + left_content_layout.addWidget(device_mode_group) + + # Log控制组(0x70 SET_LOG_SWITCH,0=关闭 1=开启),便于在视图菜单中显示/隐藏 + log_group = QGroupBox("Log控制") + self.ui_groups['log_switch'] = log_group + log_layout = QFormLayout(log_group) + log_control_layout = QHBoxLayout() + self.log_switch_combo = QComboBox() + self.log_switch_combo.addItem("关闭log (0)", 0) + self.log_switch_combo.addItem("开启log (1)", 1) + log_control_layout.addWidget(QLabel("Log打印:")) + log_control_layout.addWidget(self.log_switch_combo) + log_layout.addRow(log_control_layout) + self.set_log_switch_btn = QPushButton("设置log开关") + self.set_log_switch_btn.clicked.connect(self.on_set_log_switch) + log_layout.addRow(self.set_log_switch_btn) + left_content_layout.addWidget(log_group) + # 添加LED控制组 + led_group = QGroupBox("LED控制") + self.ui_groups['led'] = led_group # 保存引用 + led_layout = QFormLayout(led_group) + + # LED索引选择 + led_index_layout = QHBoxLayout() + self.led_index_label = QLabel("LED索引:") + self.led_index_spin = QSpinBox() + self.led_index_spin.setRange(0, 7) + self.led_index_spin.setValue(0) + led_index_layout.addWidget(self.led_index_label) + led_index_layout.addWidget(self.led_index_spin) + led_layout.addRow(led_index_layout) + + # LED开关 + led_switch_layout = QHBoxLayout() + self.led_switch_label = QLabel("LED开关:") + self.led_switch_combo = QComboBox() + self.led_switch_combo.addItems(["OFF (关闭)", "ON (开启)"]) + self.led_switch_combo.setCurrentIndex(1) # 默认开启 + led_switch_layout.addWidget(self.led_switch_label) + led_switch_layout.addWidget(self.led_switch_combo) + led_layout.addRow(led_switch_layout) + + # LED信息显示 + self.led_info_label = QLabel("LED信息: 未获取") + led_layout.addRow("LED信息:", self.led_info_label) + + # LED状态显示 + self.led_status_label = QLabel("LED状态: 未获取") + led_layout.addRow("LED状态:", self.led_status_label) + + # LED控制按钮 + led_buttons_layout = QVBoxLayout() + + # 获取LED信息按钮 + self.get_led_info_btn = QPushButton("获取LED信息") + self.get_led_info_btn.clicked.connect(self.on_get_led_info) + led_buttons_layout.addWidget(self.get_led_info_btn) + + # 设置LED开关按钮 + self.set_led_switch_btn = QPushButton("设置LED开关") + self.set_led_switch_btn.clicked.connect(self.on_set_led_switch) + led_buttons_layout.addWidget(self.set_led_switch_btn) + + # 获取LED开关按钮 + self.get_led_switch_btn = QPushButton("获取LED开关") + self.get_led_switch_btn.clicked.connect(self.on_get_led_switch) + led_buttons_layout.addWidget(self.get_led_switch_btn) + + # 获取LED状态按钮 + self.get_led_status_btn = QPushButton("获取LED状态") + self.get_led_status_btn.clicked.connect(self.on_get_led_status) + led_buttons_layout.addWidget(self.get_led_status_btn) + + # 获取LED总数按钮 + self.get_led_count_btn = QPushButton("获取LED总数") + self.get_led_count_btn.clicked.connect(self.on_get_led_count) + led_buttons_layout.addWidget(self.get_led_count_btn) + + led_layout.addRow(led_buttons_layout) + + left_content_layout.addWidget(led_group) + + # 添加UAC控制组 + uac_group = QGroupBox("UAC模式控制") + self.ui_groups['uac'] = uac_group # 保存引用 + uac_layout = QFormLayout(uac_group) + + # UAC模式选择 + uac_mode_layout = QHBoxLayout() + self.uac_mode_label = QLabel("UAC模式:") + self.uac_mode_combo = QComboBox() + self.uac_mode_combo.addItems(["UAC2.0", "UAC1.0"]) + self.uac_mode_combo.setCurrentIndex(0) # 默认UAC2.0 + uac_mode_layout.addWidget(self.uac_mode_label) + uac_mode_layout.addWidget(self.uac_mode_combo) + uac_layout.addRow(uac_mode_layout) + + # 当前UAC模式显示 + self.current_uac_mode_label = QLabel("当前UAC模式: 未获取") + uac_layout.addRow("当前模式:", self.current_uac_mode_label) + + # UAC控制按钮 + uac_buttons_layout = QVBoxLayout() + + # 获取UAC模式信息按钮 + self.get_uac_mode_info_btn = QPushButton("获取UAC模式信息") + self.get_uac_mode_info_btn.clicked.connect(self.on_get_uac_mode_info) + uac_buttons_layout.addWidget(self.get_uac_mode_info_btn) + + # 设置UAC模式按钮 + self.set_uac_mode_btn = QPushButton("设置UAC模式") + self.set_uac_mode_btn.clicked.connect(self.on_set_uac_mode) + uac_buttons_layout.addWidget(self.set_uac_mode_btn) + + # 获取当前UAC模式按钮 + self.get_current_uac_mode_btn = QPushButton("获取当前UAC模式") + self.get_current_uac_mode_btn.clicked.connect(self.on_get_current_uac_mode) + uac_buttons_layout.addWidget(self.get_current_uac_mode_btn) + + uac_layout.addRow(uac_buttons_layout) + + left_content_layout.addWidget(uac_group) + + # 添加输入源控制组(HID 0xB0 → UART 0x5D 透传MCU,设置 USB/OPT/COAX) + input_source_group = QGroupBox("输入源控制") + self.ui_groups['input_source'] = input_source_group + input_source_layout = QFormLayout(input_source_group) + self.input_source_label = QLabel("输入源:") + self.input_source_combo = QComboBox() + self.input_source_combo.addItems(["USB", "OPT", "COAX"]) + self.input_source_combo.setCurrentIndex(0) + input_source_layout.addRow(self.input_source_label, self.input_source_combo) + self.set_input_source_btn = QPushButton("设置输入源") + self.set_input_source_btn.clicked.connect(self.on_set_input_source) + input_source_layout.addRow(self.set_input_source_btn) + left_content_layout.addWidget(input_source_group) + + # 添加静音开关控制组(HID 0xB1 设置 / 0xB2 获取,UART 0x5E/0x5F 透传MCU) + mute_switch_group = QGroupBox("静音开关") + self.ui_groups['mute_switch'] = mute_switch_group + mute_switch_layout = QFormLayout(mute_switch_group) + self.mute_switch_label = QLabel("静音开关:") + self.mute_switch_combo = QComboBox() + self.mute_switch_combo.addItems(["关", "开"]) + self.mute_switch_combo.setCurrentIndex(0) + mute_switch_layout.addRow(self.mute_switch_label, self.mute_switch_combo) + self.current_mute_label = QLabel("当前状态: 未获取") + mute_switch_layout.addRow("当前状态:", self.current_mute_label) + mute_switch_btn_layout = QHBoxLayout() + self.set_mute_switch_btn = QPushButton("设置静音开关") + self.set_mute_switch_btn.clicked.connect(self.on_set_mute_switch) + self.get_mute_switch_btn = QPushButton("获取静音开关") + self.get_mute_switch_btn.clicked.connect(self.on_get_mute_switch) + mute_switch_btn_layout.addWidget(self.set_mute_switch_btn) + mute_switch_btn_layout.addWidget(self.get_mute_switch_btn) + mute_switch_layout.addRow(mute_switch_btn_layout) + left_content_layout.addWidget(mute_switch_group) + + # 添加监听开关控制组(HID 0xB3 设置经 UART 0x60 透传 MCU,0xB4 获取直接读 g_adc_loop 不经过串口) + listen_switch_group = QGroupBox("监听开关") + self.ui_groups['listen_switch'] = listen_switch_group + listen_switch_layout = QFormLayout(listen_switch_group) + self.listen_switch_label = QLabel("监听开关:") + self.listen_switch_combo = QComboBox() + self.listen_switch_combo.addItems(["关", "开"]) + self.listen_switch_combo.setCurrentIndex(0) + listen_switch_layout.addRow(self.listen_switch_label, self.listen_switch_combo) + self.current_listen_label = QLabel("当前状态: 未获取") + listen_switch_layout.addRow("当前状态:", self.current_listen_label) + listen_switch_btn_layout = QHBoxLayout() + self.set_listen_switch_btn = QPushButton("设置监听开关") + self.set_listen_switch_btn.clicked.connect(self.on_set_listen_switch) + self.get_listen_switch_btn = QPushButton("获取监听开关") + self.get_listen_switch_btn.clicked.connect(self.on_get_listen_switch) + listen_switch_btn_layout.addWidget(self.set_listen_switch_btn) + listen_switch_btn_layout.addWidget(self.get_listen_switch_btn) + listen_switch_layout.addRow(listen_switch_btn_layout) + left_content_layout.addWidget(listen_switch_group) + + # 添加EQ使能控制组 + eq_enable_group = QGroupBox("EQ使能控制") + self.ui_groups['eq_enable'] = eq_enable_group # 保存引用 + eq_enable_layout = QFormLayout(eq_enable_group) + + # EQ使能开关 + eq_enable_switch_layout = QHBoxLayout() + self.eq_enable_label = QLabel("EQ使能开关:") + self.eq_enable_combo = QComboBox() + self.eq_enable_combo.addItems(["OFF (禁用)", "ON (启用)"]) + self.eq_enable_combo.setCurrentIndex(1) # 默认启用 + eq_enable_switch_layout.addWidget(self.eq_enable_label) + eq_enable_switch_layout.addWidget(self.eq_enable_combo) + eq_enable_layout.addRow(eq_enable_switch_layout) + + # 保存的模式显示 + self.saved_mode_label = QLabel("保存的模式: 未获取") + eq_enable_layout.addRow("保存的模式:", self.saved_mode_label) + + # EQ使能控制按钮 + eq_enable_buttons_layout = QVBoxLayout() + + # 设置EQ使能开关按钮 + self.set_eq_enable_btn = QPushButton("设置EQ使能开关") + self.set_eq_enable_btn.clicked.connect(self.on_set_eq_enable) + eq_enable_buttons_layout.addWidget(self.set_eq_enable_btn) + + # 获取EQ使能开关按钮 + self.get_eq_enable_btn = QPushButton("获取EQ使能开关") + self.get_eq_enable_btn.clicked.connect(self.on_get_eq_enable) + eq_enable_buttons_layout.addWidget(self.get_eq_enable_btn) + + eq_enable_layout.addRow(eq_enable_buttons_layout) + + left_content_layout.addWidget(eq_enable_group) + + # 添加固件升级控制组 + # 改动原因:添加HID固件升级功能,支持通过HID协议升级设备固件 + firmware_upgrade_group = QGroupBox("固件升级") + self.ui_groups['firmware'] = firmware_upgrade_group # 保存引用 + firmware_upgrade_layout = QFormLayout(firmware_upgrade_group) + + # 固件文件选择 + firmware_file_layout = QHBoxLayout() + self.firmware_file_edit = QLineEdit() + self.firmware_file_edit.setPlaceholderText("选择固件文件...") + firmware_file_layout.addWidget(self.firmware_file_edit) + browse_btn = QPushButton("浏览") + browse_btn.clicked.connect(self.on_browse_firmware) + firmware_file_layout.addWidget(browse_btn) + firmware_upgrade_layout.addRow("固件文件:", firmware_file_layout) + + # 改动原因:去掉UI里的固件版本号输入,升级只依赖固件文件本身 + + # 升级进度条 + self.firmware_progress = QProgressBar() + self.firmware_progress.setRange(0, 100) + self.firmware_progress.setValue(0) + firmware_upgrade_layout.addRow("升级进度:", self.firmware_progress) + + # 状态标签 + self.firmware_status_label = QLabel("状态: 空闲") + firmware_upgrade_layout.addRow("当前状态:", self.firmware_status_label) + + # 固件升级按钮 + firmware_buttons_layout = QVBoxLayout() + + # 擦除upgrade image按钮 + self.erase_upgrade_btn = QPushButton("擦除现有升级镜像") + self.erase_upgrade_btn.clicked.connect(self.on_erase_upgrade_image) + firmware_buttons_layout.addWidget(self.erase_upgrade_btn) + + # 开始升级按钮 + self.start_upgrade_btn = QPushButton("开始固件升级") + self.start_upgrade_btn.clicked.connect(self.on_start_firmware_upgrade) + firmware_buttons_layout.addWidget(self.start_upgrade_btn) + + # 查询升级状态按钮 + self.status_upgrade_btn = QPushButton("查询升级状态") + self.status_upgrade_btn.clicked.connect(self.on_get_firmware_upgrade_status) + firmware_buttons_layout.addWidget(self.status_upgrade_btn) + + # 中止升级按钮 + self.abort_upgrade_btn = QPushButton("中止固件升级") + self.abort_upgrade_btn.clicked.connect(self.on_abort_firmware_upgrade) + firmware_buttons_layout.addWidget(self.abort_upgrade_btn) + + # 验证镜像按钮 + + # 重启设备按钮 + self.reboot_device_btn = QPushButton("重启设备") + self.reboot_device_btn.clicked.connect(self.on_reboot_device) + firmware_buttons_layout.addWidget(self.reboot_device_btn) + + firmware_upgrade_layout.addRow(firmware_buttons_layout) + + left_content_layout.addWidget(firmware_upgrade_group) + + # EQ后增益补偿 + post_gain_layout = QHBoxLayout() + post_gain_label = QLabel("EQ整体增益 (dB):") + self.post_gain_spin = QSpinBox() + self.post_gain_spin.setRange(-50, 0) + self.post_gain_spin.setSingleStep(1) + self.post_gain_spin.setValue(0) + post_gain_layout.addWidget(post_gain_label) + post_gain_layout.addWidget(self.post_gain_spin) + left_content_layout.addLayout(post_gain_layout) + + # 保存/加载按钮(始终显示) + save_load_layout = QHBoxLayout() + save_button = QPushButton("保存参数") + save_button.clicked.connect(self.save_parameters) + load_button = QPushButton("加载参数") + load_button.clicked.connect(self.load_parameters) + apply_all_button = QPushButton("保存到所有采样率") + apply_all_button.clicked.connect(self.apply_to_all_sample_rates) + save_load_layout.addWidget(save_button) + save_load_layout.addWidget(load_button) + save_load_layout.addWidget(apply_all_button) + left_content_layout.addLayout(save_load_layout) + + # 添加弹性空间,让内容靠上对齐 + left_content_layout.addStretch() + + # 将内容容器放入滚动区域 + left_scroll.setWidget(left_content) + left_layout.addWidget(left_scroll) + + # 右侧响应曲线 + right_panel = QWidget() + right_layout = QVBoxLayout(right_panel) + + # 创建matplotlib画布 + self.plot = MplCanvas(self, width=5, height=4, dpi=100) + right_layout.addWidget(self.plot) + + # 添加左右面板到分割器 + splitter.addWidget(left_panel) + splitter.addWidget(right_panel) + + # 设置分割器初始比例 + splitter.setStretchFactor(0, 1) + splitter.setStretchFactor(1, 2) + + # 添加分割器到主布局 + main_layout.addWidget(splitter) + + # 初始化变量 + self.bands = [] + self.visible_bands = 0 + + # 创建初始滤波器 + self.create_initial_filter() + self.refresh_devices() + + # 改动原因:默认隐藏所有视图选项,只显示EQ参数相关的组(bands_scroll,即滤波器带) + # 隐藏所有在ui_groups中的组,包括音效参数配置组 + for group_key in self.ui_groups.keys(): + self.ui_groups[group_key].setVisible(False) + + + def create_menu_bar(self): + """创建菜单栏和视图菜单,用于控制各组可见性""" + # 改动原因:添加菜单栏,包含视图菜单用于隐藏/显示左侧面板的各组 + # 改动原因:默认隐藏所有视图选项,只显示EQ参数相关的组(bands_scroll,即滤波器带) + menubar = self.menuBar() + + # 创建视图菜单 + view_menu = menubar.addMenu("视图") + + # 定义各组的中文名称和对应的key + # 改动原因:添加'param'(音效参数配置)到菜单控制列表中 + group_names = { + 'device_info': '设备信息', + 'mode': '音效模式设置', + 'param': '音效参数配置', + 'volume': '音量控制', + 'device_mode': '设备模式控制', + 'log_switch': 'Log控制', + 'led': 'LED控制', + 'uac': 'UAC模式控制', + 'input_source': '输入源控制', + 'mute_switch': '静音开关', + 'listen_switch': '监听开关', + 'eq_enable': 'EQ使能控制', + 'firmware': '固件升级' + } + + # 为每组创建切换可见性的动作 + self.view_actions = {} + for key, name in group_names.items(): + action = view_menu.addAction(f"显示 {name}") + action.setCheckable(True) + action.setChecked(False) # 改动原因:默认隐藏所有视图选项,只显示EQ参数相关的组 + action.triggered.connect(lambda checked, k=key: self.toggle_group_visibility(k, checked)) + self.view_actions[key] = action + + def toggle_group_visibility(self, group_key, visible): + """切换组的可见性""" + # 改动原因:切换指定组的可见性,现在所有组都可以通过菜单控制(包括音效参数配置) + # 只有bands_scroll(滤波器带)始终显示,不受此函数控制 + if group_key in self.ui_groups: + self.ui_groups[group_key].setVisible(visible) + # 更新菜单项的文本 + if group_key in self.view_actions: + group_names = { + 'device_info': '设备信息', + 'mode': '音效模式设置', + 'param': '音效参数配置', + 'volume': '音量控制', + 'device_mode': '设备模式控制', + 'log_switch': 'Log控制', + 'led': 'LED控制', + 'uac': 'UAC模式控制', + 'input_source': '输入源控制', + 'mute_switch': '静音开关', + 'listen_switch': '监听开关', + 'eq_enable': 'EQ使能控制', + 'firmware': '固件升级' + } + name = group_names.get(group_key, group_key) + self.view_actions[group_key].setText(f"{'显示' if visible else '隐藏'} {name}") + + def create_initial_filter(self): + """创建所有MAX_EQ_BANDS个滤波器""" + for i in range(MAX_EQ_BANDS): + band = BandFilter(i + 1, self) + self.bands.append(band) + self.bands_layout.addWidget(band) + self.visible_bands = MAX_EQ_BANDS + + def on_sample_rate_changed(self): + """采样率改变时更新所有滤波器""" + for band in self.bands: + if self.show_qshift_debug: + band.update_coefficients() + self.update_eq_curve() + + def on_log_level_changed(self, index): + """当日志级别改变时的处理""" + self.log_level = index + log_message(LOG_LEVEL_INFO, f"日志级别已更改为: {LOG_LEVEL_NAMES[index]}", self.log_level) + + def on_mode_changed(self, index): + """音效模式改变时的处理""" + # 防止循环调用:如果是由代码内部设置触发的,不执行操作 + if hasattr(self, '_mode_changing') and self._mode_changing: + return + + if index == NUM_EQ_MODES: # 禁用EQ选项 + self.current_mode = EQ_DISABLED_MODE + else: + self.current_mode = index + log_message(LOG_LEVEL_INFO, f"音效模式已更改为: {index}", self.log_level) + + # 切换模式 + self.on_switch_mode() + + # 等待设备处理模式切换(添加延迟确保设备完成切换) + import time + time.sleep(0.1) # 等待100ms让设备完成模式切换 + + # 读取参数 + self.read_parameters() + + # 获取当前模式状态(但不更新UI下拉框,避免循环调用) + self.on_get_mode(update_ui=False) + + def on_switch_mode(self): + """切换音效模式(只发送0x8A命令)""" + if self.device_combo.currentData() is not None: + device_info = self.device_combo.currentData() + log_message(LOG_LEVEL_DEBUG, f"正在打开设备: VID=0x{device_info['vendor_id']:04x}, PID=0x{device_info['product_id']:04x}", self.log_level) + + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0x8A # 命令码 (SET_EQ_MODE) + data[2] = self.current_mode # 模式值 + # 其余字节保持为0 + log_message(LOG_LEVEL_DEBUG, f"切换音效模式到模式 {self.current_mode}", self.log_level) + log_message(LOG_LEVEL_DEBUG, f"数据包: {' '.join(f'0x{byte:02x}' for byte in data[:20])}...", self.log_level) + + # 发送命令 + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + h.write([0x01] + list(data)) # 0x01是report_id + + # 等待设备响应(可选:读取响应确认切换成功) + import time + time.sleep(0.05) # 等待50ms让设备处理命令 + + h.close() + log_message(LOG_LEVEL_INFO, f"切换音效模式到模式 {self.current_mode} 成功", self.log_level) + + def on_get_mode(self, update_ui=True, mode=0xFF): + """获取音效模式(只处理0x8B命令) + Args: + update_ui: 是否更新UI下拉框,False时只更新增益和名称,避免循环调用 + mode: 模式值,0xFF表示获取当前模式信息,0-9表示获取指定模式信息 + """ + if self.device_combo.currentData() is not None: + device_info = self.device_combo.currentData() + log_message(LOG_LEVEL_DEBUG, f"正在打开设备: VID=0x{device_info['vendor_id']:04x}, PID=0x{device_info['product_id']:04x}", self.log_level) + + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0x8B # 命令码 (GET_EQ_MODE) + data[2] = mode # 改动原因:添加mode参数,0xFF表示获取当前模式,0-9表示获取指定模式信息 + # 其余字节保持为0 + + log_message(LOG_LEVEL_DEBUG, f"发送0x8B命令,mode=0x{mode:02x} ({'当前模式' if mode == 0xFF else f'模式{mode}'})", self.log_level) + h.write([0x01] + list(data)) # 0x01是report_id + + # 读取0x8B的响应 + import time + time.sleep(0.05) # 等待设备响应 + reply = h.get_input_report(0x1, 64) # 64字节响应 + if reply and len(reply) == 64: + # 检查Report ID和同步头 + if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0x8B: + # 调试:打印原始响应数据 + log_message(LOG_LEVEL_DEBUG, f"0x8B响应原始数据: {' '.join(f'0x{byte:02x}' for byte in reply[:16])}", self.log_level) + + # 解析响应数据 - 根据简化协议 + current_mode = reply[3] # 模式值 + # 解析整体增益 (4字节,位置4-7) + post_gain = int.from_bytes(reply[4:8], 'little', signed=True) + + # 解析模式名称 (16字节,位置8-23) + mode_name_bytes = bytes(reply[8:24]) + mode_name = mode_name_bytes.decode('utf-8', errors='ignore').rstrip('\x00') + + # 调试:打印解析的字节 + log_message(LOG_LEVEL_DEBUG, f"整体增益原始字节: 0x{reply[4]:02x} 0x{reply[5]:02x} 0x{reply[6]:02x} 0x{reply[7]:02x}", self.log_level) + log_message(LOG_LEVEL_DEBUG, f"模式名称原始字节: {' '.join(f'0x{byte:02x}' for byte in reply[8:24])}", self.log_level) + + log_message(LOG_LEVEL_INFO, f"获取到当前EQ模式: {current_mode}, 整体增益: {post_gain}dB, 模式名称: '{mode_name}'", self.log_level) + + # 更新UI - 图像显示固定使用48000Hz + self.sample_rate.setCurrentText("48000") + + # 只有在update_ui=True时才更新下拉框,避免循环调用 + if update_ui: + # 设置标志防止循环调用 + self._mode_changing = True + try: + if current_mode == EQ_DISABLED_MODE: + self.mode_combo.setCurrentIndex(NUM_EQ_MODES) # 禁用EQ选项 + else: + self.mode_combo.setCurrentIndex(current_mode) + finally: + self._mode_changing = False + + # 更新当前模式值(但不触发UI更新) + self.current_mode = current_mode + # 更新整体增益显示 + self.post_gain_spin.setValue(post_gain) + # 更新模式名称显示 + self.mode_name_edit.setText(mode_name) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0x8B响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, "未收到0x8B响应数据", self.log_level) + + h.close() + + + def update_eq_curve(self): + """更新EQ响应曲线""" + try: + fs = float(self.sample_rate.currentText()) + + # 创建频率点 + f = np.logspace(np.log10(20), np.log10(fs/2), 1000) + + # 计算总响应 + h_total = np.ones_like(f, dtype=complex) + + # 计算每个EQ的响应 + responses = [] + enabled_eqs = [] # 记录启用的EQ索引 + + for i, band in enumerate(self.bands): + if band.enabled.isChecked(): + # 获取滤波器系数 + coeffs = band.calculate_coefficients(fs) + if coeffs is not None: + # 计算频率响应 + w = 2 * np.pi * f / fs + z = np.exp(-1j * w) + h = (coeffs[0] + coeffs[1] * z + coeffs[2] * z**2) / \ + (1 + coeffs[3] * z + coeffs[4] * z**2) + responses.append(h) + enabled_eqs.append(i) + h_total *= h + + # 更新图形 + self.plot.update_plot(f, h_total, fs) + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"更新EQ曲线时出错: {str(e)}", self.log_level) + + def save_parameters(self): + """保存参数到JSON文件和头文件""" + try: + fs = float(self.sample_rate.currentText()) + current_mode = self.current_mode + + # 生成JSON文件名 + json_filename = f"eq_parameters_{int(fs)}_mode{current_mode}.json" + + # 读取现有的JSON文件(如果存在) + all_params = {} + if os.path.exists(json_filename): + with open(json_filename, "r", encoding='utf-8') as f: + all_params = json.load(f) + + # 计算总的bshift + total_bshift = sum(band.get_bshift() for band in self.bands) + + # 更新当前mode的参数 + params = { + "sample_rate": fs, + "mode": current_mode, # 保存当前模式 + "total_bshift": total_bshift, + "post_gain_db": int(self.post_gain_spin.value()), + "bands": [] + } + + for band in self.bands: + band_params = band.get_parameters() + if band_params["enabled"]: + # 计算浮点系数 + coeffs = band.calculate_coefficients(fs) + if coeffs is not None: + # 反转 b1 和 b2 的符号 + coeffs = np.array([ + coeffs[0], # a0 + coeffs[1], # a1 + coeffs[2], # a2 + -coeffs[3], # b1 + -coeffs[4] # b2 + ]) + band_scale_factor = band.get_scale_factor() + # 只对 a0, a1, a2 乘以 scale_factor + coeffs_scaled = np.array([ + coeffs[0] * band_scale_factor, + coeffs[1] * band_scale_factor, + coeffs[2] * band_scale_factor, + coeffs[3], + coeffs[4] + ]) + coeffs_q30 = (coeffs_scaled * 2**30).astype(np.int32) + band_params["coefficients"] = { + "float": coeffs.tolist(), + "q30": [f"0x{int(x):08x}" if x >= 0 else f"-0x{int(-x):08x}" for x in coeffs_q30] + } + + params["bands"].append(band_params) + + # 保存当前mode的参数 + all_params[f"mode_{current_mode}"] = params + + # 保存JSON文件 + with open(json_filename, "w", encoding='utf-8') as f: + json.dump(all_params, f, indent=2, ensure_ascii=False) + + # 为当前模式生成头文件 + header_filename = f"eq_params_{int(fs)}_mode{current_mode}.h" + with open(header_filename, "w", encoding='utf-8') as f: + f.write(f"""// EQ参数头文件 - {int(fs)}Hz +// 自动生成,请勿手动修改 + +#include "eq.h" + +// Directly declare sEQ_data_{int(fs)}HZ, including coefficients +eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{ +""") + + # 写入当前模式的EQ参数 + f.write(f" [{current_mode}][0] = {{\n") # 左通道 + f.write(f" .sample_rate = {int(fs)},\n") + f.write(f" .total_bshift = {total_bshift},\n") + f.write(f" .post_gain_db = {int(self.post_gain_spin.value())}, // {self.post_gain_spin.value()} dB\n") + f.write(" .bands = {\n") + + # 写入每个滤波器的参数 + for i, band in enumerate(self.bands): + params = band.get_parameters() + if i < 8: # 最多8个滤波器 + f.write(" {\n") + f.write(f" .index = {i},\n") + + # 写入滤波器类型 + type_map = { + "bypass滤波器": "FILTER_TYPE_BYPASS", + "全通滤波器": "FILTER_TYPE_ALLPASS", + "峰值滤波器": "FILTER_TYPE_PEAKING", + "低通滤波器": "FILTER_TYPE_LOWPASS", + "高通滤波器": "FILTER_TYPE_HIGHPASS", + "带通滤波器": "FILTER_TYPE_BANDPASS", + "带阻滤波器": "FILTER_TYPE_BANDSTOP", + "陷波滤波器": "FILTER_TYPE_NOTCH", + "恒定Q值滤波器": "FILTER_TYPE_CONST_Q", + "低架滤波器": "FILTER_TYPE_LOWSHELF", + "高架滤波器": "FILTER_TYPE_HIGHSHELF" + } + f.write(f" .type = {type_map.get(params['type'], 'FILTER_TYPE_ALLPASS')},\n") + + # 写入参数 - 直接写入float值 + f.write(f" .fc = {params['fc']:.2f}f,\n") + f.write(f" .q = {params['Q']:.4f}f,\n") + f.write(f" .bw = {params['bw']:.2f}f,\n") + f.write(f" .gain = {params['gain']:.2f}f,\n") + f.write(" },\n") + + f.write(" },\n") + + # 写入filter结构 + f.write(" .filter = {\n") + f.write(" .biquad_count = MAX_EQ_BANDS,\n") + f.write(" .state = {{0}},\n") + f.write(" .coef = {\n") + + # 写入系数数组 + coeffs_all = [] + for band in self.bands: + coeffs = band.calculate_coefficients(fs) + if coeffs is not None: + coeffs = np.array([ + coeffs[0], # a0 + coeffs[1], # a1 + coeffs[2], # a2 + -coeffs[3], # b1 + -coeffs[4] # b2 + ]) + band_scale_factor = band.get_scale_factor() + coeffs_scaled = np.array([ + coeffs[0] * band_scale_factor, + coeffs[1] * band_scale_factor, + coeffs[2] * band_scale_factor, + coeffs[3], + coeffs[4] + ]) + coeffs_q30 = (coeffs_scaled * 2**30).astype(np.int32) + coeffs_all.extend(coeffs_q30) + else: + coeffs_all.extend([0] * 5) + + # 补足MAX_EQ_BANDS个band的系数 + while len(coeffs_all) < MAX_EQ_BANDS * 5: + coeffs_all.append(0) + + # 按5个系数一组写入 + for i in range(5): + f.write(" {") + for j in range(MAX_EQ_BANDS): + coeff = coeffs_all[j*5 + i] # 注意:i为系数序号,j为band序号 + f.write(f"{f'0x{coeff:08x}' if coeff >= 0 else f'-0x{-coeff:08x}'}") + if j < MAX_EQ_BANDS - 1: + f.write(", ") + f.write("},\n") + + f.write(" },\n") + f.write(" }\n") + f.write(" },\n") + + # 右通道与左通道相同 + f.write(f" [{current_mode}][1] = {{\n") # 右通道 + f.write(f" .sample_rate = {int(fs)},\n") + f.write(f" .total_bshift = {total_bshift},\n") + f.write(f" .post_gain_db = {int(self.post_gain_spin.value())}, // {self.post_gain_spin.value()} dB\n") + f.write(" .bands = {\n") + + # 写入每个滤波器的参数 + for i, band in enumerate(self.bands): + params = band.get_parameters() + if i < MAX_EQ_BANDS: # 最多MAX_EQ_BANDS个滤波器 + f.write(" {\n") + f.write(f" .index = {i},\n") + f.write(f" .type = {type_map.get(params['type'], 'FILTER_TYPE_ALLPASS')},\n") + f.write(f" .fc = {params['fc']:.2f}f,\n") + f.write(f" .q = {params['Q']:.4f}f,\n") + f.write(f" .bw = {params['bw']:.2f}f,\n") + f.write(f" .gain = {params['gain']:.2f}f,\n") + f.write(" },\n") + + f.write(" },\n") + f.write(" .filter = {\n") + f.write(" .biquad_count = MAX_EQ_BANDS,\n") + f.write(" .state = {{0}},\n") + f.write(" .coef = {\n") + + # 写入系数数组 + for i in range(5): + f.write(" {") + for j in range(MAX_EQ_BANDS): + coeff = coeffs_all[j*5 + i] # 注意:i为系数序号,j为band序号 + f.write(f"{f'0x{coeff:08x}' if coeff >= 0 else f'-0x{-coeff:08x}'}") + if j < MAX_EQ_BANDS - 1: + f.write(", ") + f.write("},\n") + + f.write(" },\n") + f.write(" }\n") + f.write(" },\n") + + f.write("};\n") + + log_message(LOG_LEVEL_INFO, f"参数已保存到 {json_filename}", self.log_level) + log_message(LOG_LEVEL_INFO, f"头文件已生成: {header_filename}", self.log_level) + + # 检查是否所有模式都已生成 + all_modes_generated = True + for mode in range(NUM_EQ_MODES): + mode_file = f"eq_params_{int(fs)}_mode{mode}.h" + if not os.path.exists(mode_file): + all_modes_generated = False + break + + # 如果所有模式都已生成,合并成一个完整的头文件 + if all_modes_generated: + self.merge_mode_files(fs) + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"保存参数时出错: {str(e)}", self.log_level) + + def merge_mode_files(self, fs): + """合并所有模式的头文件""" + try: + # 创建完整的头文件 + header_filename = f"eq_params_{int(fs)}.h" + with open(header_filename, "w", encoding='utf-8') as f: + # 写入头文件头部 + f.write(f"""// EQ参数头文件 - {int(fs)}Hz +// 自动生成,请勿手动修改 + +#include "eq.h" + +// Directly declare sEQ_data_{int(fs)}HZ, including coefficients +eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{ +""") + + # 合并所有模式的文件 + for mode in range(NUM_EQ_MODES): + mode_file = f"eq_params_{int(fs)}_mode{mode}.h" + with open(mode_file, "r", encoding='utf-8') as mf: + content = mf.readlines() + # 截取第8行到第171行 + mode_data = content[7:171] + # 写入模式数据 + f.writelines(mode_data) + + # 写入结尾 + f.write("};\n") + + log_message(LOG_LEVEL_INFO, f"已合并所有模式生成完整头文件: {header_filename}", self.log_level) + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"合并头文件时出错: {str(e)}", self.log_level) + + def load_parameters(self): + """从JSON文件加载参数""" + try: + fs = float(self.sample_rate.currentText()) + current_mode = self.current_mode + json_filename = f"eq_parameters_{int(fs)}_mode{current_mode}.json" + + if not os.path.exists(json_filename): + log_message(LOG_LEVEL_ERROR, f"未找到配置文件: {json_filename}", self.log_level) + return + + with open(json_filename, "r", encoding='utf-8') as f: + all_params = json.load(f) + + # 获取当前mode的参数 + mode_key = f"mode_{current_mode}" + if mode_key not in all_params: + log_message(LOG_LEVEL_ERROR, f"未找到模式 {current_mode} 的参数", self.log_level) + return + + params = all_params[mode_key] + + # 清除现有滤波器 + for band in self.bands: + self.bands_layout.removeWidget(band) + band.deleteLater() + self.bands.clear() + + # 添加新的滤波器 + for band_params in params["bands"]: + band = BandFilter(len(self.bands), self) + band.set_parameters(band_params) + self.bands.append(band) + self.bands_layout.addWidget(band) + + self.visible_bands = len(self.bands) + self.update_eq_curve() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"加载参数时出错: {str(e)}", self.log_level) + + def send_parameters(self): + """发送参数到设备""" + try: + if not self.device_combo.currentData(): + log_message(LOG_LEVEL_ERROR, "未选择设备", self.log_level) + return + + # 计算总的bshift + total_bshift = sum(band.get_bshift() for band in self.bands) + + device_info = self.device_combo.currentData() + log_message(LOG_LEVEL_DEBUG, f"正在打开设备: VID=0x{device_info['vendor_id']:04x}, PID=0x{device_info['product_id']:04x}", self.log_level) + + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + + # 设置非阻塞模式 + h.set_nonblocking(1) + + # 发送所有MAX_EQ_BANDS个滤波器的参数 - 自动应用到所有采样率 + for i in range(MAX_EQ_BANDS): + # 确保有足够的滤波器对象 + while len(self.bands) <= i: + self.add_filter() + + band = self.bands[i] + params = band.get_parameters() + log_message(LOG_LEVEL_DEBUG, f"正在处理滤波器 {i+1} 的参数:", self.log_level) + log_message(LOG_LEVEL_DEBUG, f" 类型: {params['type']}", self.log_level) + log_message(LOG_LEVEL_DEBUG, f" 频率: {params['fc']} Hz", self.log_level) + log_message(LOG_LEVEL_DEBUG, f" Q值: {params['Q']}", self.log_level) + log_message(LOG_LEVEL_DEBUG, f" 带宽: {params['bw']}", self.log_level) + log_message(LOG_LEVEL_DEBUG, f" 增益: {params['gain']} dB", self.log_level) + + # 构建HID数据包 (根据简化协议格式) + data = bytearray(63) # 63字节数据包 + + # 头部 (2字节) + data[0] = 0x77 # 同步头1 + data[1] = 0x8D # 命令码 (SET_EQ_PARAMS) + + # 模式值 (1字节) + mode = self.current_mode + data[2] = mode + log_message(LOG_LEVEL_VERBOSE, f" 模式值: {mode}", self.log_level) + + # 滤波器索引 (1字节) + data[3] = i + log_message(LOG_LEVEL_VERBOSE, f" 滤波器索引: {i}", self.log_level) + + # 滤波器类型 (1字节) + type_map = { + "bypass滤波器": 0x00, + "全通滤波器": 0x01, + "峰值滤波器": 0x02, + "低通滤波器": 0x03, + "高通滤波器": 0x04, + "带通滤波器": 0x05, + "带阻滤波器": 0x06, + "陷波滤波器": 0x07, + "恒定Q值滤波器": 0x08, + "低架滤波器": 0x09, + "高架滤波器": 0x0A + } + data[4] = type_map.get(params["type"], 0x01) + log_message(LOG_LEVEL_VERBOSE, f" 滤波器类型码: 0x{data[4]:02x}", self.log_level) + + # 参数直接作为float发送 + # fc (4字节) - 位置5-8 + fc = float(params["fc"]) + data[5:9] = struct.pack(' 9: + QMessageBox.warning( + self, + "错误", + f"无效的模式值: {mode}\n\n" + f"有效范围: 0-9 (0-5预设模式, 6-8用户模式, 9: bypass)" + ) + return + + # 弹出确认对话框 + mode_name = self.mode_combo.currentText() + reply = QMessageBox.question( + self, + "确认设置并保存EQ模式", + f"将要设置并保存以下EQ模式:\n\n" + f"模式: {mode_name} (索引: {mode})\n\n" + f"该模式将被保存到Flash,开机时自动恢复。\n\n" + f"是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply == QMessageBox.Yes: + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0x92数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0x92 # 命令码 (SET_AND_SAVE_EQ_MODE) + data[2] = mode # 模式值 + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, f"正在设置并保存EQ模式到 {mode}...", self.log_level) + h.write([0x01] + list(data)) + + # 读取响应 + import time + time.sleep(0.05) # 等待设备响应 + reply_data = h.get_input_report(0x1, 64) # 64字节响应 + if reply_data and len(reply_data) == 64: + # 检查Report ID和同步头 + if reply_data[0] == 0x01 and reply_data[1] == 0x77 and reply_data[2] == 0x92: + # 解析状态码 + status = reply_data[3] + if status == 0x00: + log_message(LOG_LEVEL_INFO, f"EQ模式 {mode} 设置并保存成功", self.log_level) + QMessageBox.information( + self, + "成功", + f"EQ模式 {mode} ({mode_name}) 已成功设置并保存到Flash。\n\n" + f"设备开机时将自动恢复该模式。" + ) + # 更新当前模式 + self.current_mode = mode + else: + log_message(LOG_LEVEL_ERROR, f"EQ模式设置并保存失败 (状态码: 0x{status:02x})", self.log_level) + QMessageBox.warning( + self, + "失败", + f"EQ模式设置并保存失败。\n\n" + f"状态码: 0x{status:02x}" + ) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0x92响应同步头: 0x{reply_data[1]:02x} 0x{reply_data[2]:02x}", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, "未收到0x92响应数据", self.log_level) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置并保存EQ模式时出错: {str(e)}", self.log_level) + + def on_set_volume(self): + """设置音量级别(发送0x93命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + # 获取音量值 + volume_level = self.volume_spin.value() + + # 弹出确认对话框 + reply = QMessageBox.question( + self, + "确认设置音量", + f"将要设置音量级别为: {volume_level}\n\n" + f"音量范围: 0-60 (0=最小音量, 60=最大音量)\n\n" + f"是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply == QMessageBox.Yes: + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0x93数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0x93 # 命令码 (SET_VOLUME) + data[2] = volume_level # 音量级别 (0-60) + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, f"正在设置音量级别为 {volume_level}...", self.log_level) + h.write([0x01] + list(data)) + + h.close() + log_message(LOG_LEVEL_INFO, f"音量级别 {volume_level} 设置成功", self.log_level) + QMessageBox.information( + self, + "成功", + f"音量级别已设置为: {volume_level}" + ) + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置音量时出错: {str(e)}", self.log_level) + + def on_get_volume(self): + """读取音量级别(发送0x94命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0x94数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0x94 # 命令码 (GET_VOLUME) + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, "正在读取音量级别...", self.log_level) + h.write([0x01] + list(data)) + + # 读取响应 + import time + time.sleep(0.05) # 等待设备响应 + reply = h.get_input_report(0x1, 64) # 64字节响应 + if reply and len(reply) == 64: + # 检查Report ID和同步头 + if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0x94: + # 解析音量级别 + volume_level = reply[3] + + # 更新UI显示 + self.volume_spin.setValue(volume_level) + + log_message(LOG_LEVEL_INFO, f"当前音量级别: {volume_level}", self.log_level) + QMessageBox.information( + self, + "音量级别", + f"当前音量级别: {volume_level}\n\n" + f"音量范围: 0-60 (0=最小音量, 60=最大音量)" + ) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0x94响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, "未收到0x94响应数据", self.log_level) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"读取音量时出错: {str(e)}", self.log_level) + + def on_get_sample_format(self): + """读取采样率和格式信息(发送0x9F命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0x9F数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0x9F # 命令码 (GET_SAMPLE_FORMAT) + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, "正在读取采样率和格式信息...", self.log_level) + h.write([0x01] + list(data)) + + # 读取响应 + import time + time.sleep(0.05) # 等待设备响应 + reply = h.get_input_report(0x1, 64) # 64字节响应 + if reply and len(reply) == 64: + # 检查Report ID和同步头 + if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0x9F: + # 解析采样率和格式信息(小端序) + # 响应格式:reply[0]=Report ID, reply[1]=0x77, reply[2]=0x9F + # reply[3-6]=采样率(32位小端序), reply[7]=DSD模式 + samfreq = reply[3] | (reply[4] << 8) | (reply[5] << 16) | (reply[6] << 24) + dsd_mode = reply[7] + + # 格式化显示信息 + format_type = "PCM" if dsd_mode == 0 else f"DSD (模式 {dsd_mode})" + + log_message(LOG_LEVEL_INFO, + f"采样率和格式信息: 采样率={samfreq}Hz, 格式={format_type}", + self.log_level) + QMessageBox.information( + self, + "采样率和格式信息", + f"采样率: {samfreq} Hz\n" + f"格式: {format_type}\n" + f"DSD模式: {dsd_mode} (0=PCM, >0=DSD)" + ) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0x9F响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, "未收到0x9F响应数据", self.log_level) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"读取采样率和格式时出错: {str(e)}", self.log_level) + + def on_get_led_info(self): + """获取LED信息(发送0x95命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0x95数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0x95 # 命令码 (GET_LED_INFO) + data[2] = self.led_index_spin.value() # LED索引 + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, f"正在获取LED信息 (索引: {self.led_index_spin.value()})...", self.log_level) + h.write([0x01] + list(data)) + + # 读取响应 + import time + time.sleep(0.05) # 等待设备响应 + reply = h.get_input_report(0x1, 64) # 64字节响应 + if reply and len(reply) == 64: + # 检查Report ID和同步头 + if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0x95: + # 解析LED信息 + led_index = reply[3] + led_name_bytes = bytes(reply[4:20]) + led_name = led_name_bytes.decode('utf-8', errors='ignore').rstrip('\x00') + + # 更新UI显示 + self.led_info_label.setText(f"LED信息: 索引={led_index}, 名称='{led_name}'") + + log_message(LOG_LEVEL_INFO, f"LED信息获取成功: 索引={led_index}, 名称='{led_name}'", self.log_level) + QMessageBox.information( + self, + "LED信息", + f"LED索引: {led_index}\n" + f"LED名称: {led_name}" + ) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0x95响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, "未收到0x95响应数据", self.log_level) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"获取LED信息时出错: {str(e)}", self.log_level) + + def on_set_led_switch(self): + """设置LED开关(发送0x96命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + # 获取LED开关值 + led_switch = self.led_switch_combo.currentIndex() # 0=OFF, 1=ON + led_index = self.led_index_spin.value() + + # 弹出确认对话框 + reply = QMessageBox.question( + self, + "确认设置LED开关", + f"将要设置LED开关为: {'ON (开启)' if led_switch == 1 else 'OFF (关闭)'}\n\n" + f"LED索引: {led_index}\n\n" + f"是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply == QMessageBox.Yes: + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0x96数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0x96 # 命令码 (SET_LED_SWITCH) + data[2] = led_index # LED索引 + data[3] = led_switch # LED开关 (0=OFF, 1=ON) + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, f"正在设置LED开关为 {'ON' if led_switch == 1 else 'OFF'} (索引: {led_index})...", self.log_level) + h.write([0x01] + list(data)) + + # 读取响应 + import time + time.sleep(0.05) # 等待设备响应 + reply_data = h.get_input_report(0x1, 64) # 64字节响应 + if reply_data and len(reply_data) == 64: + # 检查Report ID和同步头 + if reply_data[0] == 0x01 and reply_data[1] == 0x77 and reply_data[2] == 0x96: + # 解析状态码(根据协议,位置3是状态码) + status = reply_data[3] + if status == 0x00: + log_message(LOG_LEVEL_INFO, f"LED开关设置成功", self.log_level) + QMessageBox.information( + self, + "成功", + f"LED开关已设置为: {'ON (开启)' if led_switch == 1 else 'OFF (关闭)'}\n\n" + f"LED索引: {led_index}" + ) + else: + log_message(LOG_LEVEL_ERROR, f"LED开关设置失败 (状态码: 0x{status:02x})", self.log_level) + QMessageBox.warning( + self, + "失败", + f"LED开关设置失败。\n\n" + f"状态码: 0x{status:02x}" + ) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0x96响应同步头: 0x{reply_data[1]:02x} 0x{reply_data[2]:02x}", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, "未收到0x96响应数据", self.log_level) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置LED开关时出错: {str(e)}", self.log_level) + + def on_get_led_switch(self): + """获取LED开关(发送0x97命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0x97数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0x97 # 命令码 (GET_LED_SWITCH) + data[2] = self.led_index_spin.value() # LED索引 + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, f"正在获取LED开关状态 (索引: {self.led_index_spin.value()})...", self.log_level) + h.write([0x01] + list(data)) + + # 读取响应 + import time + time.sleep(0.05) # 等待设备响应 + reply = h.get_input_report(0x1, 64) # 64字节响应 + if reply and len(reply) == 64: + # 检查Report ID和同步头 + if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0x97: + # 解析LED开关状态 + led_index = reply[3] + led_switch = reply[4] # 0=OFF, 1=ON + + # 更新UI显示 + self.led_switch_combo.setCurrentIndex(led_switch) + + log_message(LOG_LEVEL_INFO, f"当前LED开关状态: {'ON (开启)' if led_switch == 1 else 'OFF (关闭)'} (索引: {led_index})", self.log_level) + QMessageBox.information( + self, + "LED开关状态", + f"LED索引: {led_index}\n" + f"LED开关: {'ON (开启)' if led_switch == 1 else 'OFF (关闭)'}" + ) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0x97响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, "未收到0x97响应数据", self.log_level) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"获取LED开关时出错: {str(e)}", self.log_level) + + def on_get_led_status(self): + """获取LED状态(发送0x98命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0x98数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0x98 # 命令码 (GET_LED_STATUS) + data[2] = self.led_index_spin.value() # LED索引 + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, f"正在获取LED状态 (索引: {self.led_index_spin.value()})...", self.log_level) + h.write([0x01] + list(data)) + + # 读取响应 + import time + time.sleep(0.05) # 等待设备响应 + reply = h.get_input_report(0x1, 64) # 64字节响应 + log_message(LOG_LEVEL_INFO, f"LED状态响应: {reply}", self.log_level) + if reply and len(reply) == 64: + # 检查Report ID和同步头 + if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0x98: + # 解析LED状态 + led_index = reply[3] + r = reply[4] # R颜色值 + g = reply[5] # G颜色值 + b = reply[6] # B颜色值 + led_status = reply[7] # LED状态 + + # LED状态名称映射 + status_names = { + 0: "熄灭", + 1: "常亮", + 2: "慢闪", + 3: "快闪", + 4: "呼吸" + } + status_name = status_names.get(led_status, f"未知({led_status})") + + # 更新UI显示 + self.led_status_label.setText( + f"LED状态: RGB=({r},{g},{b}), 状态={status_name}" + ) + + log_message(LOG_LEVEL_INFO, + f"LED状态 - 索引: {led_index}, RGB: ({r},{g},{b}), 状态: {status_name}", + self.log_level) + QMessageBox.information( + self, + "LED状态", + f"LED索引: {led_index}\n" + f"RGB颜色: ({r}, {g}, {b})\n" + f"状态: {status_name}" + ) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0x98响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, "未收到0x98响应数据", self.log_level) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"获取LED状态时出错: {str(e)}", self.log_level) + + def on_get_led_count(self): + """获取LED总数(发送0x99命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0x99数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0x99 # 命令码 (GET_LED_COUNT) + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, "正在获取LED总数...", self.log_level) + h.write([0x01] + list(data)) + + # 读取响应 + import time + time.sleep(0.05) # 等待设备响应 + reply = h.get_input_report(0x1, 64) # 64字节响应 + if reply and len(reply) == 64: + # 检查Report ID和同步头 + if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0x99: + # 解析LED总数 + led_count = reply[3] + + log_message(LOG_LEVEL_INFO, f"设备支持的LED总数: {led_count}", self.log_level) + QMessageBox.information( + self, + "LED总数", + f"设备支持的LED总数: {led_count}\n\n" + f"LED索引范围: 0 到 {led_count - 1}" + ) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0x99响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, "未收到0x99响应数据", self.log_level) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"获取LED总数时出错: {str(e)}", self.log_level) + + def on_get_uac_mode_info(self): + """获取UAC模式信息(发送0x9A命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0x9A数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0x9A # 命令码 (GET_UAC_MODE_INFO) + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, "正在获取UAC模式信息...", self.log_level) + h.write([0x01] + list(data)) + + # 读取响应 + import time + time.sleep(0.05) # 等待设备响应 + reply = h.get_input_report(0x1, 64) # 64字节响应 + if reply and len(reply) == 64: + # 检查Report ID和同步头 + if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0x9A: + # 解析UAC模式信息 + uac_mode_count = reply[3] + mode0_name_bytes = bytes(reply[4:12]) + mode1_name_bytes = bytes(reply[12:20]) + mode0_name = mode0_name_bytes.decode('utf-8', errors='ignore').rstrip('\x00') + mode1_name = mode1_name_bytes.decode('utf-8', errors='ignore').rstrip('\x00') + + log_message(LOG_LEVEL_INFO, f"UAC模式信息获取成功: 总数={uac_mode_count}, 模式0='{mode0_name}', 模式1='{mode1_name}'", self.log_level) + QMessageBox.information( + self, + "UAC模式信息", + f"UAC模式总数: {uac_mode_count}\n\n" + f"模式0: {mode0_name}\n" + f"模式1: {mode1_name}" + ) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0x9A响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, "未收到0x9A响应数据", self.log_level) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"获取UAC模式信息时出错: {str(e)}", self.log_level) + + def on_set_uac_mode(self): + """设置UAC模式(发送0x9B命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + # 获取UAC模式值 + uac_mode_index = self.uac_mode_combo.currentIndex() # 0=UAC2.0, 1=UAC1.0 + uac_mode_name = self.uac_mode_combo.currentText() + + # 弹出确认对话框 + reply = QMessageBox.question( + self, + "确认设置UAC模式", + f"将要设置UAC模式为: {uac_mode_name}\n\n" + f"注意:切换到UAC1.0模式时,设备将自动重启。\n\n" + f"是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply == QMessageBox.Yes: + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0x9B数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0x9B # 命令码 (SET_UAC_MODE) + data[2] = uac_mode_index # UAC模式值 (0=UAC2.0, 1=UAC1.0) + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, f"正在设置UAC模式为 {uac_mode_name}...", self.log_level) + h.write([0x01] + list(data)) + + # 改动原因:SET_UAC_MODE命令不返回响应 + # 如果设置为UAC1.0,设备会重启;如果设置为UAC2.0,设备保持当前状态 + if uac_mode_index == 1: # UAC1.0 - 设备会重启 + log_message(LOG_LEVEL_INFO, f"UAC模式设置为 {uac_mode_name},设备将重启...", self.log_level) + QMessageBox.information( + self, + "设备重启", + f"UAC模式已设置为: {uac_mode_name}\n\n" + f"设备正在重启,请稍候重新连接设备。" + ) + else: # UAC2.0 + log_message(LOG_LEVEL_INFO, f"UAC模式设置为 {uac_mode_name} 成功", self.log_level) + QMessageBox.information( + self, + "成功", + f"UAC模式已设置为: {uac_mode_name}" + ) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置UAC模式时出错: {str(e)}", self.log_level) + + def on_set_input_source(self): + """设置输入源模式(发送0xB0命令,设备透传UART 0x5D给MCU)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + # 0=USB, 1=OPT, 2=COAX + input_source_index = self.input_source_combo.currentIndex() + input_source_name = self.input_source_combo.currentText() + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + # 构建0xB0数据包:同步头0x77、命令码0xB0、输入源(0=USB,1=OPT,2=COAX) + data = bytearray(63) + data[0] = 0x77 + data[1] = 0xB0 # SET_INPUT_SOURCE + data[2] = input_source_index + log_message(LOG_LEVEL_INFO, f"正在设置输入源为 {input_source_name} (HID 0xB0 → UART 0x5D)...", self.log_level) + h.write([0x01] + list(data)) + log_message(LOG_LEVEL_INFO, f"输入源已发送: {input_source_name}", self.log_level) + QMessageBox.information(self, "已发送", f"输入源已设置为: {input_source_name}\n\n设备已通过串口转发给MCU。") + h.close() + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置输入源时出错: {str(e)}", self.log_level) + + def on_set_mute_switch(self): + """设置静音开关(发送0xB1命令,0=关 1=开,设备透传UART 0x5E给MCU)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + mute_index = self.mute_switch_combo.currentIndex() # 0=关, 1=开 + mute_name = self.mute_switch_combo.currentText() + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + data = bytearray(63) + data[0] = 0x77 + data[1] = 0xB1 # SET_MUTE_SWITCH + data[2] = mute_index + log_message(LOG_LEVEL_INFO, f"正在设置静音开关为 {mute_name} (HID 0xB1 → UART 0x5E)...", self.log_level) + h.write([0x01] + list(data)) + log_message(LOG_LEVEL_INFO, f"静音开关已发送: {mute_name}", self.log_level) + QMessageBox.information(self, "已发送", f"静音开关已设置为: {mute_name}\n\n设备已通过串口转发给MCU。") + h.close() + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置静音开关时出错: {str(e)}", self.log_level) + + def on_get_mute_switch(self): + """获取静音开关状态(发送0xB2,设备向MCU发0x5F请求,MCU返回后设备再通过HID返回)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + try: + import time + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + data = bytearray(63) + data[0] = 0x77 + data[1] = 0xB2 # GET_MUTE_SWITCH + log_message(LOG_LEVEL_INFO, "正在获取静音开关状态 (HID 0xB2 → UART 0x5F 请求MCU)...", self.log_level) + h.write([0x01] + list(data)) + time.sleep(0.06) # 等待设备向MCU请求并收到响应 + reply = h.get_input_report(0x01, 64) + if reply and len(reply) == 64 and reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0xB2: + mute_value = reply[3] + mute_str = "开" if mute_value else "关" + self.current_mute_label.setText(f"当前状态: {mute_str}") + self.mute_switch_combo.setCurrentIndex(mute_value) + log_message(LOG_LEVEL_INFO, f"静音开关状态: {mute_str} (值: {mute_value})", self.log_level) + QMessageBox.information(self, "静音开关状态", f"当前静音开关: {mute_str}\n\n值: {mute_value} (0=关, 1=开)") + else: + log_message(LOG_LEVEL_ERROR, "未收到有效的0xB2响应", self.log_level) + h.close() + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"获取静音开关时出错: {str(e)}", self.log_level) + + def on_set_listen_switch(self): + """设置监听开关(发送0xB3命令,0=关 1=开,设备经 UART 0x60 透传给 MCU)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + listen_index = self.listen_switch_combo.currentIndex() # 0=关, 1=开 + listen_name = self.listen_switch_combo.currentText() + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + data = bytearray(63) + data[0] = 0x77 + data[1] = 0xB3 # SET_LISTEN_SWITCH + data[2] = listen_index + log_message(LOG_LEVEL_INFO, f"正在设置监听开关为 {listen_name} (HID 0xB3 → UART 0x60 透传MCU)...", self.log_level) + h.write([0x01] + list(data)) + log_message(LOG_LEVEL_INFO, f"监听开关已发送: {listen_name}", self.log_level) + QMessageBox.information(self, "已发送", f"监听开关已设置为: {listen_name}\n\n设备已通过串口转发给MCU。") + h.close() + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置监听开关时出错: {str(e)}", self.log_level) + + def on_get_listen_switch(self): + """获取监听开关状态(发送0xB4,设备直接返回 g_adc_loop,不经过串口)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + try: + import time + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + data = bytearray(63) + data[0] = 0x77 + data[1] = 0xB4 # GET_LISTEN_SWITCH + log_message(LOG_LEVEL_INFO, "正在获取监听开关状态 (HID 0xB4, g_adc_loop)...", self.log_level) + h.write([0x01] + list(data)) + time.sleep(0.05) + reply = h.get_input_report(0x01, 64) + if reply and len(reply) == 64 and reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0xB4: + listen_value = reply[3] + listen_str = "开" if listen_value else "关" + self.current_listen_label.setText(f"当前状态: {listen_str}") + self.listen_switch_combo.setCurrentIndex(listen_value) + log_message(LOG_LEVEL_INFO, f"监听开关状态: {listen_str} (值: {listen_value})", self.log_level) + QMessageBox.information(self, "监听开关状态", f"当前监听开关: {listen_str}\n\n值: {listen_value} (0=关, 1=开)") + else: + log_message(LOG_LEVEL_ERROR, "未收到有效的0xB4响应", self.log_level) + h.close() + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"获取监听开关时出错: {str(e)}", self.log_level) + + def on_get_current_uac_mode(self): + """获取当前UAC模式(发送0x9C命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0x9C数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0x9C # 命令码 (GET_CURRENT_UAC_MODE) + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, "正在获取当前UAC模式...", self.log_level) + h.write([0x01] + list(data)) + + # 读取响应 + import time + time.sleep(0.05) # 等待设备响应 + reply = h.get_input_report(0x1, 64) # 64字节响应 + if reply and len(reply) == 64: + # 检查Report ID和同步头 + if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0x9C: + # 解析当前UAC模式 + uac_mode_value = reply[3] + uac_mode_name_bytes = bytes(reply[4:12]) + uac_mode_name = uac_mode_name_bytes.decode('utf-8', errors='ignore').rstrip('\x00') + + # 更新UI显示 + self.current_uac_mode_label.setText(f"当前UAC模式: {uac_mode_name}") + # 更新下拉框选择 + self.uac_mode_combo.setCurrentIndex(uac_mode_value) + + log_message(LOG_LEVEL_INFO, f"当前UAC模式: {uac_mode_name} (值: {uac_mode_value})", self.log_level) + QMessageBox.information( + self, + "当前UAC模式", + f"当前UAC模式: {uac_mode_name}\n\n" + f"模式值: {uac_mode_value} (0=UAC2.0, 1=UAC1.0)" + ) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0x9C响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, "未收到0x9C响应数据", self.log_level) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"获取当前UAC模式时出错: {str(e)}", self.log_level) + + def on_set_eq_enable(self): + """设置EQ使能开关(发送0x9D命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + # 获取EQ使能开关值 + eq_enable_index = self.eq_enable_combo.currentIndex() # 0=OFF, 1=ON + eq_enable_name = self.eq_enable_combo.currentText() + + # 弹出确认对话框 + reply = QMessageBox.question( + self, + "确认设置EQ使能开关", + f"将要设置EQ使能开关为: {eq_enable_name}\n\n" + f"注意:eq_enable是全局开关,所有模式共用一个开关。\n\n" + f"是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply == QMessageBox.Yes: + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0x9D数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0x9D # 命令码 (SET_EQ_ENABLE) + data[2] = eq_enable_index # EQ使能开关 (0=OFF, 1=ON) + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, f"正在设置EQ使能开关为 {eq_enable_name}...", self.log_level) + h.write([0x01] + list(data)) + + # 读取响应 + import time + time.sleep(0.05) # 等待设备响应 + reply_data = h.get_input_report(0x1, 64) # 64字节响应 + if reply_data and len(reply_data) == 64: + # 检查Report ID和同步头 + if reply_data[0] == 0x01 and reply_data[1] == 0x77 and reply_data[2] == 0x9D: + # 解析状态码和使能状态(改动原因:0x9D只返回状态码和使能状态,不返回模式信息) + status = reply_data[3] + current_enable = reply_data[4] + + if status == 0x00: + # 更新UI显示 + self.eq_enable_combo.setCurrentIndex(current_enable) + + log_message(LOG_LEVEL_INFO, f"EQ使能开关设置成功 - 状态: {current_enable} (全局开关)", self.log_level) + QMessageBox.information( + self, + "成功", + f"EQ使能开关已设置为: {eq_enable_name}\n\n" + f"当前状态: {'ON (启用)' if current_enable == 1 else 'OFF (禁用)'}" + ) + else: + log_message(LOG_LEVEL_ERROR, f"EQ使能开关设置失败 (状态码: 0x{status:02x})", self.log_level) + QMessageBox.warning( + self, + "失败", + f"EQ使能开关设置失败。\n\n" + f"状态码: 0x{status:02x}" + ) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0x9D响应同步头: 0x{reply_data[1]:02x} 0x{reply_data[2]:02x}", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, "未收到0x9D响应数据", self.log_level) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置EQ使能开关时出错: {str(e)}", self.log_level) + + def on_get_eq_enable(self): + """获取EQ使能开关(发送0x9E命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0x9E数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0x9E # 命令码 (GET_EQ_ENABLE) + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, "正在获取EQ使能开关状态...", self.log_level) + h.write([0x01] + list(data)) + + # 读取响应 + import time + time.sleep(0.05) # 等待设备响应 + reply = h.get_input_report(0x1, 64) # 64字节响应 + if reply and len(reply) == 64: + # 检查Report ID和同步头 + if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0x9E: + # 解析EQ使能开关状态(改动原因:0x9E只返回使能状态,不返回模式信息) + eq_enable = reply[3] + + # 更新UI显示 + self.eq_enable_combo.setCurrentIndex(eq_enable) + + log_message(LOG_LEVEL_INFO, f"当前EQ使能开关状态: {'ON (启用)' if eq_enable == 1 else 'OFF (禁用)'} (全局开关)", self.log_level) + QMessageBox.information( + self, + "EQ使能开关状态", + f"EQ使能开关: {'ON (启用)' if eq_enable == 1 else 'OFF (禁用)'}" + ) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0x9E响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, "未收到0x9E响应数据", self.log_level) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"获取EQ使能开关时出错: {str(e)}", self.log_level) + + def on_set_gain_mode(self): + """设置增益模式(发送0xA0命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + # 获取增益模式值 + gain_mode = self.gain_mode_combo.currentData() + + # 弹出确认对话框 + reply = QMessageBox.question( + self, + "确认设置增益模式", + f"将要设置增益模式为: {self.gain_mode_combo.currentText()}\n\n" + f"增益模式: 0=低阻, 1=高阻\n\n" + f"是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply == QMessageBox.Yes: + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0xA0数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0xA0 # 命令码 (SET_GAIN_MODE) + data[2] = gain_mode # 增益模式值 (0-1) + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, f"正在设置增益模式为 {gain_mode}...", self.log_level) + h.write([0x01] + list(data)) + + h.close() + log_message(LOG_LEVEL_INFO, f"增益模式 {gain_mode} 设置成功", self.log_level) + QMessageBox.information( + self, + "成功", + f"增益模式已设置为: {self.gain_mode_combo.currentText()}" + ) + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置增益模式时出错: {str(e)}", self.log_level) + + def on_get_gain_mode(self): + """读取增益模式(发送0xA1命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0xA1数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0xA1 # 命令码 (GET_GAIN_MODE) + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, "正在读取增益模式...", self.log_level) + h.write([0x01] + list(data)) + + # 读取响应 + import time + time.sleep(0.05) # 等待设备响应 + reply = h.get_input_report(0x1, 64) # 64字节响应 + if reply and len(reply) == 64: + # 检查Report ID和同步头 + if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0xA1: + # 解析增益模式 + gain_mode = reply[3] + + # 更新UI显示 + index = self.gain_mode_combo.findData(gain_mode) + if index >= 0: + self.gain_mode_combo.setCurrentIndex(index) + + log_message(LOG_LEVEL_INFO, f"当前增益模式: {gain_mode} ({'低阻' if gain_mode == 0 else '高阻'})", self.log_level) + QMessageBox.information( + self, + "增益模式", + f"当前增益模式: {gain_mode}\n\n" + f"{'低阻模式' if gain_mode == 0 else '高阻模式'}" + ) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0xA1响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, "未收到0xA1响应数据", self.log_level) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"读取增益模式时出错: {str(e)}", self.log_level) + + def on_set_filter_mode(self): + """设置滤波器模式(发送0xA2命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + # 获取滤波器模式值 + filter_mode = self.filter_mode_combo.currentData() + + # 弹出确认对话框 + # 改动原因:更新滤波器模式范围为0-7(8种模式) + reply = QMessageBox.question( + self, + "确认设置滤波器模式", + f"将要设置滤波器模式为: {self.filter_mode_combo.currentText()}\n\n" + f"滤波器模式范围: 0-7 (8种模式)\n\n" + f"是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply == QMessageBox.Yes: + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0xA2数据包 + # 改动原因:更新滤波器模式范围为0-7(8种模式) + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0xA2 # 命令码 (SET_FILTER_MODE) + data[2] = filter_mode # 滤波器模式值 (0-7) + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, f"正在设置滤波器模式为 {filter_mode}...", self.log_level) + h.write([0x01] + list(data)) + + h.close() + log_message(LOG_LEVEL_INFO, f"滤波器模式 {filter_mode} 设置成功", self.log_level) + QMessageBox.information( + self, + "成功", + f"滤波器模式已设置为: {self.filter_mode_combo.currentText()}" + ) + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置滤波器模式时出错: {str(e)}", self.log_level) + + def on_get_filter_mode(self): + """读取滤波器模式(发送0xA3命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0xA3数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0xA3 # 命令码 (GET_FILTER_MODE) + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, "正在读取滤波器模式...", self.log_level) + h.write([0x01] + list(data)) + + # 读取响应 + import time + time.sleep(0.05) # 等待设备响应 + reply = h.get_input_report(0x1, 64) # 64字节响应 + if reply and len(reply) == 64: + # 检查Report ID和同步头 + if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0xA3: + # 解析滤波器模式 + filter_mode = reply[3] + + # 更新UI显示 + index = self.filter_mode_combo.findData(filter_mode) + if index >= 0: + self.filter_mode_combo.setCurrentIndex(index) + + log_message(LOG_LEVEL_INFO, f"当前滤波器模式: {filter_mode}", self.log_level) + QMessageBox.information( + self, + "滤波器模式", + f"当前滤波器模式: {filter_mode}\n\n" + f"{self.filter_mode_combo.currentText()}" + ) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0xA3响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, "未收到0xA3响应数据", self.log_level) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"读取滤波器模式时出错: {str(e)}", self.log_level) + + def on_set_game_mode(self): + """设置游戏模式(发送0xA4命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + # 获取游戏模式值 + game_mode = self.game_mode_combo.currentData() + + # 弹出确认对话框 + reply = QMessageBox.question( + self, + "确认设置游戏模式", + f"将要设置游戏模式为: {self.game_mode_combo.currentText()}\n\n" + f"游戏模式: 0=无音效, 1=FPS, 2=虚拟7.1\n\n" + f"是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply == QMessageBox.Yes: + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0xA4数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0xA4 # 命令码 (SET_GAME_MODE) + data[2] = game_mode # 游戏模式值 (0-2) + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, f"正在设置游戏模式为 {game_mode}...", self.log_level) + h.write([0x01] + list(data)) + + h.close() + log_message(LOG_LEVEL_INFO, f"游戏模式 {game_mode} 设置成功", self.log_level) + QMessageBox.information( + self, + "成功", + f"游戏模式已设置为: {self.game_mode_combo.currentText()}" + ) + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置游戏模式时出错: {str(e)}", self.log_level) + + def on_get_game_mode(self): + """读取游戏模式(发送0xA5命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0xA5数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0xA5 # 命令码 (GET_GAME_MODE) + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, "正在读取游戏模式...", self.log_level) + h.write([0x01] + list(data)) + + # 读取响应 + import time + time.sleep(0.05) # 等待设备响应 + reply = h.get_input_report(0x1, 64) # 64字节响应 + if reply and len(reply) == 64: + # 检查Report ID和同步头 + if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0xA5: + # 解析游戏模式 + game_mode = reply[3] + + # 更新UI显示 + index = self.game_mode_combo.findData(game_mode) + if index >= 0: + self.game_mode_combo.setCurrentIndex(index) + + mode_names = ["无音效", "FPS模式", "虚拟7.1"] + mode_name = mode_names[game_mode] if game_mode < len(mode_names) else "未知" + + log_message(LOG_LEVEL_INFO, f"当前游戏模式: {game_mode} ({mode_name})", self.log_level) + QMessageBox.information( + self, + "游戏模式", + f"当前游戏模式: {game_mode}\n\n" + f"{mode_name}" + ) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0xA5响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, "未收到0xA5响应数据", self.log_level) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"读取游戏模式时出错: {str(e)}", self.log_level) + + def on_set_log_switch(self): + """设置log打印开关(发送0x70命令),0=关闭 1=开启""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + value = self.log_switch_combo.currentData() + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + data = bytearray(63) + data[0] = 0x77 + data[1] = 0x70 # SET_LOG_SWITCH + data[2] = value # 0=关闭 1=开启 + log_message(LOG_LEVEL_INFO, f"正在设置log开关为 {value} (0=关闭 1=开启)...", self.log_level) + h.write([0x01] + list(data)) + h.close() + state_name = "关闭" if value == 0 else "开启" + log_message(LOG_LEVEL_INFO, f"log开关已设置为 {state_name}", self.log_level) + QMessageBox.information( + self, + "Log控制", + f"log打印已设置为: {self.log_switch_combo.currentText()}\n\n{state_name}" + ) + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置log开关时出错: {str(e)}", self.log_level) + def on_get_firmware_version(self): + """读取固件版本(发送0xA6命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0xA6数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0xA6 # 命令码 (GET_FIRMWARE_VERSION) + # 其余字节保持为0 + + # 发送请求 + log_message(LOG_LEVEL_INFO, "正在读取固件版本...", self.log_level) + h.write([0x01] + list(data)) + + # 读取响应 + import time + time.sleep(0.05) # 等待设备响应 + reply = h.get_input_report(0x1, 64) # 64字节响应 + if reply and len(reply) == 64: + # 检查Report ID和同步头 + if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0xA6: + # 解析固件版本(BCD格式) + major_version = reply[3] # 主版本号 + minor_version = reply[4] # 次版本号 + revision_version = reply[5] # 修订版本号 + + # 格式化版本字符串 + version_str = f"{major_version}.{minor_version}.{revision_version}" + + log_message(LOG_LEVEL_INFO, f"固件版本: {version_str} (BCD: 0x{major_version:02X} 0x{minor_version:02X} 0x{revision_version:02X})", self.log_level) + QMessageBox.information( + self, + "固件版本", + f"固件版本: {version_str}\n\n" + f"主版本号: {major_version}\n" + f"次版本号: {minor_version}\n" + f"修订版本号: {revision_version}\n\n" + f"BCD格式: 0x{major_version:02X} 0x{minor_version:02X} 0x{revision_version:02X}" + ) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0xA6响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, "未收到0xA6响应数据", self.log_level) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"读取固件版本时出错: {str(e)}", self.log_level) + + def on_browse_firmware(self): + """浏览选择固件文件""" + # 改动原因:打开文件对话框选择固件文件 + filename, _ = QFileDialog.getOpenFileName( + self, + "选择固件文件", + "", + "Firmware Files (*.bin *.xe);;All Files (*.*)" + ) + if filename: + self.firmware_file_edit.setText(filename) + log_message(LOG_LEVEL_INFO, f"已选择固件文件: {filename}", self.log_level) + + def calculate_checksum(self, data): + """计算checksum(参考user_func.c实现)""" + # 改动原因:实现checksum算法,与设备端check_sum函数一致 + sum_value = 0 + for byte in data: + sum_value += byte + return sum_value % 256 + + def debug_print_hex(self, data, prefix="", max_bytes=64): + """以16进制形式打印数据包 + 改动原因:添加调试打印功能,方便查看发送的命令和收到的响应 + 参数: + data: 要打印的数据(bytes或bytearray) + prefix: 前缀字符串(如"发送"、"接收") + max_bytes: 最大打印字节数 + """ + if not data: + log_message(LOG_LEVEL_DEBUG, f"{prefix}: (空数据)", self.log_level) + return + + # 限制打印长度 + print_data = data[:max_bytes] if len(data) > max_bytes else data + + # 转换为16进制字符串 + hex_str = ' '.join([f'{b:02X}' for b in print_data]) + + # 如果数据被截断,添加提示 + if len(data) > max_bytes: + hex_str += f" ... (共{len(data)}字节,仅显示前{max_bytes}字节)" + + log_message(LOG_LEVEL_DEBUG, f"{prefix}: {hex_str}", self.log_level) + + def wait_for_hid_response(self, h, expected_cmd, timeout=180.0, max_retries=5000): + """等待设备主动上报的HID响应 + 改动原因:实现可靠的响应等待机制,确保每个命令发送后都等待设备响应后再继续 + 参数: + h: HID设备对象 + expected_cmd: 期望的命令码(如0xA7, 0xA8等) + timeout: 超时时间(秒) + max_retries: 最大重试次数 + 返回: + 响应数据包(64字节),如果超时返回None + """ + import time + start_time = time.time() + retry_count = 0 + + while retry_count < max_retries: + # 检查超时 + if time.time() - start_time > timeout: + log_message(LOG_LEVEL_ERROR, f"等待命令0x{expected_cmd:02x}响应超时({timeout}秒)", self.log_level) + return None + + # 改动原因:使用中断端点读取主动上报数据,避免HID_GET_REPORT返回非预期数据 + # 使用hid.read读取中断IN端点数据(长度64,单位ms超时) + reply = h.read(64, 50) + + if reply and len(reply) == 64: + # 改动原因:添加调试打印,显示所有收到的HID报告(用于调试) + if retry_count % 10 == 0: # 每10次重试打印一次,避免输出过多 + self.debug_print_hex(reply, f"[等待响应] 收到HID报告 (期望命令0x{expected_cmd:02x})", max_bytes=64) + + # 检查Report ID和同步头 + if reply[0] == 0x01 and reply[1] == 0x77: + # 检查命令码 + if reply[2] == expected_cmd: + log_message(LOG_LEVEL_DEBUG, f"收到命令0x{expected_cmd:02x}的响应", self.log_level) + return reply + else: + # 收到其他命令的响应,继续等待 + log_message(LOG_LEVEL_DEBUG, f"收到其他命令0x{reply[2]:02x}的响应,继续等待0x{expected_cmd:02x}", self.log_level) + + # 短暂延迟后重试 + time.sleep(0.05) # 50ms延迟 + retry_count += 1 + + log_message(LOG_LEVEL_ERROR, f"等待命令0x{expected_cmd:02x}响应失败,已重试{max_retries}次", self.log_level) + return None + + def on_erase_upgrade_image(self): + """擦除现有升级镜像(发送FIRMWARE_UPGRADE_ERASE命令)""" + # 改动原因:擦除Flash中的现有upgrade image,为新固件腾出空间 + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + QMessageBox.warning(self, "错误", "请先选择设备") + return + + # 确认对话框 + reply = QMessageBox.question( + self, + "确认擦除", + "确定要擦除现有的升级镜像吗?\n\n" + "这将删除Flash中的upgrade image,\n" + "但不会影响当前运行的固件。\n\n" + "是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply != QMessageBox.Yes: + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建FIRMWARE_UPGRADE_ERASE命令数据包 + data = bytearray(63) + data[0] = 0x77 # 同步头 + data[1] = FIRMWARE_UPGRADE_ERASE # 命令码 + + log_message(LOG_LEVEL_INFO, "正在擦除现有升级镜像...", self.log_level) + + # 改动原因:添加调试打印,显示发送的ERASE命令 + send_packet = [0x01] + list(data) + self.debug_print_hex(send_packet, f"[发送] ERASE命令 (FIRMWARE_UPGRADE_ERASE)", max_bytes=64) + + h.write(send_packet) + + # 改动原因:等待设备主动上报ERASE命令响应 + reply = self.wait_for_hid_response(h, FIRMWARE_UPGRADE_ERASE, timeout=180.0) + + # 改动原因:添加调试打印,显示收到的ERASE响应 + if reply: + self.debug_print_hex(reply, f"[接收] ERASE响应 (FIRMWARE_UPGRADE_ERASE)", max_bytes=64) + if reply: + status = reply[3] + if status == 0x00: + log_message(LOG_LEVEL_INFO, "升级镜像擦除成功", self.log_level) + QMessageBox.information(self, "成功", "升级镜像已擦除") + else: + log_message(LOG_LEVEL_ERROR, f"升级镜像擦除失败,状态码: 0x{status:02x}", self.log_level) + QMessageBox.warning(self, "失败", f"升级镜像擦除失败\n状态码: 0x{status:02x}") + else: + log_message(LOG_LEVEL_ERROR, "ERASE命令响应超时", self.log_level) + QMessageBox.warning(self, "超时", "擦除命令响应超时") + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"擦除升级镜像时出错: {str(e)}", self.log_level) + QMessageBox.critical(self, "错误", f"擦除升级镜像时出错:\n{str(e)}") + + def on_start_firmware_upgrade(self): + """开始固件升级流程""" + # 改动原因:实现HID固件升级的完整流程,包括START、循环DATA、END命令 + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + QMessageBox.warning(self, "错误", "请先选择设备") + return + + firmware_file = self.firmware_file_edit.text() + if not firmware_file or not os.path.exists(firmware_file): + log_message(LOG_LEVEL_ERROR, "请选择有效的固件文件", self.log_level) + QMessageBox.warning(self, "错误", "请选择有效的固件文件") + return + + # 确认对话框 + reply = QMessageBox.question( + self, + "确认升级", + f"确定要升级固件吗?\n\n" + f"固件文件: {firmware_file}\n" + f"警告:升级过程中请勿断电或拔出设备!\n\n" + f"是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply != QMessageBox.Yes: + return + + try: + import time + + # 读取固件文件 + with open(firmware_file, 'rb') as f: + firmware_data = f.read() + + file_size = len(firmware_data) + # 页对齐到256字节 + page_size = 256 + file_size_padded = ((file_size + page_size - 1) // page_size) * page_size + + log_message(LOG_LEVEL_INFO, f"固件文件大小: {file_size} 字节", self.log_level) + log_message(LOG_LEVEL_INFO, f"页对齐后大小: {file_size_padded} 字节", self.log_level) + + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 步骤1: 发送START命令 (FIRMWARE_UPGRADE_START) + log_message(LOG_LEVEL_INFO, "发送START命令...", self.log_level) + self.firmware_status_label.setText("状态: 初始化中...") + QApplication.processEvents() + + # 改动原因:去掉固件版本号和升级标志位,所有实现都是强制升级方式 + data = bytearray(63) + data[0] = 0x77 # 同步头 + data[1] = FIRMWARE_UPGRADE_START # 命令码 + # 固件大小(4字节小端序) + data[2] = (file_size_padded >> 0) & 0xFF + data[3] = (file_size_padded >> 8) & 0xFF + data[4] = (file_size_padded >> 16) & 0xFF + data[5] = (file_size_padded >> 24) & 0xFF + # 其余字节为0(保留字节) + + # 改动原因:添加调试打印,显示发送的START命令 + send_packet = [0x01] + list(data) + self.debug_print_hex(send_packet, f"[发送] START命令 (FIRMWARE_UPGRADE_START)", max_bytes=64) + + h.write(send_packet) + + # 改动原因:等待设备主动上报START命令响应,确保收到响应后再继续 + log_message(LOG_LEVEL_DEBUG, "等待START命令响应...", self.log_level) + reply = self.wait_for_hid_response(h, FIRMWARE_UPGRADE_START, timeout=180.0) + + # 改动原因:添加调试打印,显示收到的START响应 + if reply: + self.debug_print_hex(reply, f"[接收] START响应 (0xA7)", max_bytes=64) + if not reply: + raise Exception("START命令响应超时或无效") + + status = reply[3] + if status != 0x00: + error_msgs = { + 0x01: "初始化失败", + 0x02: "Flash空间不足", + 0x03: "固件大小无效" + } + raise Exception(f"START命令失败: {error_msgs.get(status, f'状态码0x{status:02x}')}") + + # 改动原因:修正总块数读取位置,根据协议响应格式: + # reply[0]=Report ID, reply[1]=0x77, reply[2]=FIRMWARE_UPGRADE_START, reply[3]=状态码 + # reply[4-7]=aligned_size(4字节), reply[8-9]=total_blocks(2字节) + total_blocks = reply[8] | (reply[9] << 8) + log_message(LOG_LEVEL_INFO, f"升级初始化成功,总块数: {total_blocks}", self.log_level) + + # 步骤2: 循环发送DATA命令 + # 改动原因:HID数据包只有63字节(不包括Report ID),需要为Checksum留出空间 + # 数据包格式:同步头(1) + 命令码(1) + 块序号(2) + 数据长度(1) + 数据(N) + Checksum(1) + # 所以最大数据长度 = 63 - 5(头部) - 1(Checksum) = 57字节 + max_data_block_size = 57 # 最大数据块大小(考虑Checksum空间) + block_number = 0 + sent_bytes = 0 + + self.firmware_status_label.setText("状态: 传输中...") + QApplication.processEvents() + + while sent_bytes < file_size_padded: + # 改动原因:数据长度固定为57字节(最后一个块可能不足57字节,用0填充) + remaining = file_size_padded - sent_bytes + # 数据长度固定为57字节 + data_len = max_data_block_size # 固定57字节 + + # 读取实际数据(如果还有数据的话) + if sent_bytes < file_size: + actual_read_len = min(data_len, file_size - sent_bytes) + block_data = firmware_data[sent_bytes:sent_bytes + actual_read_len] + # 如果实际读取的数据不足57字节,用0填充到57字节 + if actual_read_len < data_len: + block_data += bytes(data_len - actual_read_len) # 填充0 + else: + # 如果已经超过实际文件大小,全部填充0 + block_data = bytes(data_len) # 全部填充0 + + # 构建DATA命令数据包 + data = bytearray(63) + data[0] = 0x77 # 同步头 + data[1] = FIRMWARE_UPGRADE_DATA # 命令码 + data[2] = (block_number >> 0) & 0xFF # 块序号(小端序) + data[3] = (block_number >> 8) & 0xFF + data[4] = data_len # 数据长度 + data[5:5+data_len] = block_data # 固件数据 + + # 计算Checksum(同步头+命令码+块序号+数据长度+数据) + checksum_data = data[0:5+data_len] + checksum = self.calculate_checksum(checksum_data) + data[5+data_len] = checksum # Checksum位置:5 + data_len(最大62,不会越界) + + # 改动原因:添加调试打印,显示发送的DATA命令(每10个块打印一次,避免输出过多) + send_packet = [0x01] + list(data) + if block_number % 10 == 0 or block_number < 3: + self.debug_print_hex(send_packet, f"[发送] DATA命令 (FIRMWARE_UPGRADE_DATA) 块{block_number}", max_bytes=64) + + # 发送DATA命令 + h.write(send_packet) + + # 改动原因:等待设备主动上报DATA命令响应,确保收到响应后再发送下一个数据块 + reply = self.wait_for_hid_response(h, FIRMWARE_UPGRADE_DATA, timeout=180.0) + + # 改动原因:添加调试打印,显示收到的DATA响应(每10个块打印一次) + if reply and (block_number % 10 == 0 or block_number < 3): + self.debug_print_hex(reply, f"[接收] DATA响应 (FIRMWARE_UPGRADE_DATA) 块{block_number}", max_bytes=64) + if not reply: + raise Exception(f"DATA命令响应超时(块序号: {block_number})") + + # 改动原因:响应格式已简化,只包含状态码和已确认的块序号,删除了已写入页数和总页数 + # 验证响应 + status = reply[3] + confirmed_block = reply[4] | (reply[5] << 8) + + if status != 0x00: + error_msgs = { + 0x01: "写入Flash失败", + 0x02: f"块序号错误(期望: {confirmed_block})", + 0x03: "Checksum校验失败", + 0x04: "数据长度错误(必须为57字节)" + } + raise Exception(f"DATA命令失败: {error_msgs.get(status, f'状态码0x{status:02x}')}") + + if confirmed_block != block_number: + raise Exception(f"块序号不匹配(发送: {block_number}, 确认: {confirmed_block})") + + log_message(LOG_LEVEL_DEBUG, f"块 {block_number} 传输成功", self.log_level) + + # 更新进度 + sent_bytes += data_len + block_number += 1 + progress = int((sent_bytes / file_size_padded) * 100) + self.firmware_progress.setValue(progress) + self.firmware_status_label.setText(f"状态: 传输中 ({block_number}/{total_blocks})") + QApplication.processEvents() + + if block_number % 10 == 0: + log_message(LOG_LEVEL_INFO, f"已发送 {block_number}/{total_blocks} 块", self.log_level) + + log_message(LOG_LEVEL_INFO, "数据传输完成", self.log_level) + + # 步骤3: 发送END命令 + self.firmware_status_label.setText("状态: 完成中...") + QApplication.processEvents() + + data = bytearray(63) + data[0] = 0x77 # 同步头 + data[1] = FIRMWARE_UPGRADE_END # 命令码 + # 固件总大小(4字节小端序) + data[2] = (file_size_padded >> 0) & 0xFF + data[3] = (file_size_padded >> 8) & 0xFF + data[4] = (file_size_padded >> 16) & 0xFF + data[5] = (file_size_padded >> 24) & 0xFF + + log_message(LOG_LEVEL_INFO, "发送END命令...", self.log_level) + + # 改动原因:添加调试打印,显示发送的END命令 + send_packet = [0x01] + list(data) + self.debug_print_hex(send_packet, f"[发送] END命令 (FIRMWARE_UPGRADE_END)", max_bytes=64) + + h.write(send_packet) + + # 改动原因:等待设备主动上报END命令响应,END命令需要更长时间(写入最后一页并验证) + log_message(LOG_LEVEL_DEBUG, "等待END命令响应(可能需要较长时间)...", self.log_level) + reply = self.wait_for_hid_response(h, FIRMWARE_UPGRADE_END, timeout=180.0) # END命令需要更长时间 + + # 改动原因:添加调试打印,显示收到的END响应 + if reply: + self.debug_print_hex(reply, f"[接收] END响应 (FIRMWARE_UPGRADE_END)", max_bytes=64) + if not reply: + raise Exception("END命令响应超时或无效") + + # 改动原因:响应格式已简化,只包含状态码,删除了已写入总块数和总页数 + status = reply[3] + if status != 0x00: + error_msgs = { + 0x01: "写入失败", + 0x02: "数据不完整", + 0x03: "镜像验证失败", + 0x04: "版本号无效" + } + raise Exception(f"END命令失败: {error_msgs.get(status, f'状态码0x{status:02x}')}") + + log_message(LOG_LEVEL_INFO, "升级完成", self.log_level) + + h.close() + + # 更新UI + self.firmware_progress.setValue(100) + self.firmware_status_label.setText("状态: 升级完成") + + QMessageBox.information( + self, + "升级成功", + f"固件升级完成!\n\n" + f"请点击\"重启设备\"按钮重启设备以加载新固件。" + ) + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"固件升级失败: {str(e)}", self.log_level) + self.firmware_progress.setValue(0) + self.firmware_status_label.setText("状态: 升级失败") + QMessageBox.critical(self, "升级失败", f"固件升级失败:\n{str(e)}") + + def on_verify_firmware_image(self): + """验证固件镜像(发送0xAD命令)""" + # 改动原因:验证Flash中已写入的固件镜像完整性 + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + QMessageBox.warning(self, "错误", "请先选择设备") + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0xAD命令数据包 + data = bytearray(63) + data[0] = 0x77 # 同步头 + data[1] = 0xAD # 命令码 (FIRMWARE_UPGRADE_VERIFY) + # 固件大小(0表示不校验大小) + data[2] = 0x00 + data[3] = 0x00 + data[4] = 0x00 + data[5] = 0x00 + + log_message(LOG_LEVEL_INFO, "正在验证固件镜像...", self.log_level) + + # 改动原因:添加调试打印,显示发送的VERIFY命令 + send_packet = [0x01] + list(data) + self.debug_print_hex(send_packet, f"[发送] VERIFY命令 (0xAD)", max_bytes=64) + + h.write(send_packet) + + # 改动原因:等待设备主动上报VERIFY命令响应 + reply = self.wait_for_hid_response(h, 0xAD, timeout=180.0) + + # 改动原因:添加调试打印,显示收到的VERIFY响应 + if reply: + self.debug_print_hex(reply, f"[接收] VERIFY响应 (0xAD)", max_bytes=64) + verify_result = reply[3] + image_size = reply[4] | (reply[5] << 8) | (reply[6] << 16) | (reply[7] << 24) + ver_major = reply[13] + ver_minor = reply[14] + ver_patch = reply[15] + + if verify_result == 0x00: + log_message(LOG_LEVEL_INFO, "固件镜像验证通过", self.log_level) + QMessageBox.information( + self, + "验证成功", + f"固件镜像验证通过!\n\n" + f"镜像大小: {image_size} 字节\n" + f"镜像版本: {ver_major}.{ver_minor}.{ver_patch}" + ) + else: + error_msgs = { + 0x01: "镜像验证失败", + 0x02: "版本号无效", + 0x03: "大小不匹配" + } + log_message(LOG_LEVEL_ERROR, f"固件镜像验证失败: {error_msgs.get(verify_result, f'状态码0x{verify_result:02x}')}", self.log_level) + QMessageBox.warning( + self, + "验证失败", + f"固件镜像验证失败\n\n{error_msgs.get(verify_result, f'状态码0x{verify_result:02x}')}" + ) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"验证固件镜像时出错: {str(e)}", self.log_level) + QMessageBox.critical(self, "错误", f"验证固件镜像时出错:\n{str(e)}") + + def on_reboot_device(self): + """重启设备(发送DEVICE_REBOOT命令)""" + # 改动原因:发送重启命令,设备会重启并加载新的upgrade image + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + QMessageBox.warning(self, "错误", "请先选择设备") + return + + # 确认对话框 + reply = QMessageBox.question( + self, + "确认重启", + "确定要重启设备吗?\n\n" + "设备将重启并加载新的固件\n" + "(如果upgrade image有效)。\n\n" + "是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply != QMessageBox.Yes: + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 改动原因:将固件升级专用的REBOOT命令改为通用的设备重启命令(DEVICE_REBOOT) + # 构建DEVICE_REBOOT命令数据包(通用设备重启命令) + data = bytearray(63) + data[0] = 0x77 # 同步头 + data[1] = DEVICE_REBOOT # 命令码 + + log_message(LOG_LEVEL_INFO, "正在重启设备...", self.log_level) + + # 改动原因:添加调试打印,显示发送的DEVICE_REBOOT命令 + send_packet = [0x01] + list(data) + self.debug_print_hex(send_packet, f"[发送] DEVICE_REBOOT命令 (DEVICE_REBOOT)", max_bytes=64) + + h.write(send_packet) + + # 改动原因:DEVICE_REBOOT不需要返回,发送后设备立即重启 + # 注意:设备不会返回响应,主机不等待 + + h.close() + + QMessageBox.information( + self, + "重启设备", + "重启命令已发送\n\n" + "设备将在几秒内重启。\n" + "请等待设备重新连接。" + ) + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"重启设备时出错: {str(e)}", self.log_level) + QMessageBox.critical(self, "错误", f"重启设备时出错:\n{str(e)}") + + def on_get_firmware_upgrade_status(self): + """查询固件升级状态(发送FIRMWARE_UPGRADE_STATUS命令)""" + # 改动原因:支持查询升级状态,便于诊断升级进度和错误 + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + QMessageBox.warning(self, "错误", "请先选择设备") + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + data = bytearray(63) + data[0] = 0x77 # 同步头 + data[1] = FIRMWARE_UPGRADE_STATUS # 命令码 + + log_message(LOG_LEVEL_INFO, "正在查询升级状态...", self.log_level) + + send_packet = [0x01] + list(data) + self.debug_print_hex(send_packet, f"[发送] STATUS命令 (FIRMWARE_UPGRADE_STATUS)", max_bytes=64) + + h.write(send_packet) + + reply = self.wait_for_hid_response(h, FIRMWARE_UPGRADE_STATUS, timeout=180.0) + if reply: + self.debug_print_hex(reply, f"[接收] STATUS响应 (FIRMWARE_UPGRADE_STATUS)", max_bytes=64) + if not reply: + raise Exception("STATUS命令响应超时或无效") + + # 响应解析(Report ID + 同步头 + 命令码 + payload) + state = reply[3] + received_blocks = reply[4] | (reply[5] << 8) + total_blocks = reply[6] | (reply[7] << 8) + written_pages = reply[8] | (reply[9] << 8) + total_pages = reply[10] | (reply[11] << 8) + bytes_transferred = reply[12] | (reply[13] << 8) | (reply[14] << 16) | (reply[15] << 24) + total_bytes = reply[16] | (reply[17] << 8) | (reply[18] << 16) | (reply[19] << 24) + error_code = reply[20] + + state_map = { + 0x00: "IDLE", + 0x01: "PREPARING", + 0x02: "TRANSFERRING", + 0x03: "COMPLETING", + 0x04: "COMPLETED", + 0x05: "ERROR", + 0x06: "ABORTED" + } + + msg = ( + f"状态: {state_map.get(state, f'0x{state:02x}')}\n" + f"块进度: {received_blocks}/{total_blocks}\n" + f"页进度: {written_pages}/{total_pages}\n" + f"字节进度: {bytes_transferred}/{total_bytes}\n" + f"错误码: 0x{error_code:02x}" + ) + log_message(LOG_LEVEL_INFO, f"升级状态: {msg}", self.log_level) + QMessageBox.information(self, "升级状态", msg) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"查询升级状态时出错: {str(e)}", self.log_level) + QMessageBox.critical(self, "错误", f"查询升级状态时出错:\n{str(e)}") + + def on_abort_firmware_upgrade(self): + """中止固件升级(发送FIRMWARE_UPGRADE_ABORT命令)""" + # 改动原因:支持中止升级流程,并可选择是否擦除已写入数据 + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + QMessageBox.warning(self, "错误", "请先选择设备") + return + + erase_reply = QMessageBox.question( + self, + "中止升级", + "是否擦除已写入的数据?\n\n" + "选择“是”:擦除已写入数据\n" + "选择“否”:保留已写入数据", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + erase_flag = 0x01 if erase_reply == QMessageBox.Yes else 0x00 + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + data = bytearray(63) + data[0] = 0x77 # 同步头 + data[1] = FIRMWARE_UPGRADE_ABORT # 命令码 + data[2] = erase_flag # 清理标志 + + log_message(LOG_LEVEL_INFO, "正在中止升级...", self.log_level) + + send_packet = [0x01] + list(data) + self.debug_print_hex(send_packet, f"[发送] ABORT命令 (FIRMWARE_UPGRADE_ABORT)", max_bytes=64) + + h.write(send_packet) + + reply = self.wait_for_hid_response(h, FIRMWARE_UPGRADE_ABORT, timeout=180.0) + if reply: + self.debug_print_hex(reply, f"[接收] ABORT响应 (FIRMWARE_UPGRADE_ABORT)", max_bytes=64) + if not reply: + raise Exception("ABORT命令响应超时或无效") + + status = reply[3] + if status == 0x00: + log_message(LOG_LEVEL_INFO, "升级已中止", self.log_level) + QMessageBox.information(self, "成功", "升级已中止") + else: + log_message(LOG_LEVEL_ERROR, f"中止升级失败,状态码: 0x{status:02x}", self.log_level) + QMessageBox.warning(self, "失败", f"中止升级失败\n状态码: 0x{status:02x}") + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"中止升级时出错: {str(e)}", self.log_level) + QMessageBox.critical(self, "错误", f"中止升级时出错:\n{str(e)}") + +if __name__ == "__main__": + app = QApplication([]) + window = EQDesigner() + window.show() + app.exec() diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_designer_uart.py b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_designer_uart.py new file mode 100644 index 0000000..004e678 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_designer_uart.py @@ -0,0 +1,2344 @@ +from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, + QHBoxLayout, QPushButton, QComboBox, QLabel, + QScrollArea, QSplitter, QGroupBox, QFormLayout, + QDoubleSpinBox, QCheckBox, QLineEdit, QSpinBox, + QMessageBox, QMenuBar, QMenu) +from PySide6.QtCore import Qt, QObject, Signal, Slot, QTimer +import numpy as np +import matplotlib +# 设置字体为支持中文的字体 +matplotlib.rcParams['font.family'] = ['Microsoft YaHei', 'SimHei', 'SimSun'] +import matplotlib.pyplot as plt +from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg +from matplotlib.figure import Figure +import json +from pathlib import Path +import os +import serial # 使用pyserial代替hid +import serial.tools.list_ports # 用于列出串口 +import logging # 添加logging模块 +import struct # 添加struct模块用于float打包/解包 +import time # 添加time模块用于延迟 + +# 定义日志级别 +LOG_LEVEL_ERROR = 0 # 错误信息 +LOG_LEVEL_WARN = 1 # 警告信息 +LOG_LEVEL_INFO = 2 # 一般信息 +LOG_LEVEL_DEBUG = 3 # 调试信息 +LOG_LEVEL_VERBOSE = 4 # 详细信息 + +# 日志级别名称映射 +LOG_LEVEL_NAMES = { + LOG_LEVEL_ERROR: "错误", + LOG_LEVEL_WARN: "警告", + LOG_LEVEL_INFO: "信息", + LOG_LEVEL_DEBUG: "调试", + LOG_LEVEL_VERBOSE: "详细" +} + +def log_message(level, message, current_level=LOG_LEVEL_INFO): + """打印日志信息 + Args: + level: 消息的日志级别 + message: 要打印的消息 + current_level: 当前的日志级别设置 + """ + if level <= current_level: + prefix = f"[{LOG_LEVEL_NAMES[level]}]" + print(f"{prefix} {message}") + +# 导入滤波器计算器 +from filter_utils import (BiquadFilterCalculator, make_biquad_bypass, make_biquad_lowpass, + make_biquad_highpass, make_biquad_bandpass, make_biquad_bandstop, + make_biquad_notch, make_biquad_allpass, make_biquad_peaking, + make_biquad_constant_q, make_biquad_lowshelf, make_biquad_highshelf) + +# 常量定义 +MAX_EQ_BANDS = 8 # 最大EQ滤波器数量 (0-7) +NUM_EQ_MODES = 10 # EQ模式数量 +EQ_DISABLED_MODE = 10 # 禁用EQ的模式编号 + +# UART命令码映射(HID -> UART) +# 改动原因:UART命令码从0x40开始,所有命令码加0x10(0x30-0x4C改为0x40-0x5C) +UART_CMD_SET_EQ_MODE = 0x40 +UART_CMD_GET_EQ_MODE = 0x41 +UART_CMD_SET_MODE_GAIN_AND_NAME = 0x42 +UART_CMD_SET_EQ_PARAMS = 0x43 +UART_CMD_GET_EQ_PARAMS = 0x44 +UART_CMD_GET_DEVICE_INFO = 0x45 +UART_CMD_RESET_EQ_PARAMS = 0x46 +UART_CMD_GET_EQ_MODE_COUNT = 0x47 +UART_CMD_SET_AND_SAVE_EQ_MODE = 0x48 +UART_CMD_SET_VOLUME = 0x49 +UART_CMD_GET_VOLUME = 0x4A +UART_CMD_GET_LED_INFO = 0x4B +UART_CMD_SET_LED_SWITCH = 0x4C +UART_CMD_GET_LED_SWITCH = 0x4D +UART_CMD_GET_LED_STATUS = 0x4E +UART_CMD_GET_LED_COUNT = 0x4F +UART_CMD_GET_UAC_MODE_INFO = 0x50 +UART_CMD_SET_UAC_MODE = 0x51 +UART_CMD_GET_CURRENT_UAC_MODE = 0x52 +UART_CMD_SET_EQ_ENABLE = 0x53 +UART_CMD_GET_EQ_ENABLE = 0x54 +UART_CMD_GET_SAMPLE_FORMAT = 0x55 +UART_CMD_SET_GAIN_MODE = 0x56 +UART_CMD_GET_GAIN_MODE = 0x57 +UART_CMD_SET_FILTER_MODE = 0x58 +UART_CMD_GET_FILTER_MODE = 0x59 +UART_CMD_SET_GAME_MODE = 0x5A +UART_CMD_GET_GAME_MODE = 0x5B +UART_CMD_GET_FIRMWARE_VERSION = 0x5C + +# UART协议常量 +UART_HEAD1 = 0x55 +UART_HEAD2 = 0xAA +UART_VERSION = 0x00 # EQ命令使用版本0x00 +UART_BAUDRATE = 115200 +UART_TIMEOUT = 1.0 # 串口超时时间(秒) +UART_RESPONSE_DELAY = 0.2 # 等待响应延迟(秒),改动原因:增加延迟时间以确保设备有足够时间处理命令并返回响应 +UART_READ_TIMEOUT = 0.5 # 读取响应超时时间(秒),改动原因:增加读取超时时间以等待设备响应 + +class UartComm: + """UART通信类""" + def __init__(self, port_name=None, baudrate=UART_BAUDRATE): + self.port_name = port_name + self.baudrate = baudrate + self.serial_port = None + self.is_connected = False + + def connect(self, port_name=None): + """连接串口""" + if port_name: + self.port_name = port_name + + if not self.port_name: + return False + + try: + self.serial_port = serial.Serial( + port=self.port_name, + baudrate=self.baudrate, + bytesize=serial.EIGHTBITS, + parity=serial.PARITY_NONE, + stopbits=serial.STOPBITS_ONE, + timeout=UART_TIMEOUT + ) + self.is_connected = True + return True + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"连接串口失败: {str(e)}", LOG_LEVEL_ERROR) + self.is_connected = False + return False + + def disconnect(self): + """断开串口""" + if self.serial_port and self.serial_port.is_open: + self.serial_port.close() + self.is_connected = False + + def calculate_checksum(self, data): + """计算校验和(所有字节求和模256)""" + return sum(data) % 256 + + def send_command(self, cmd, data=bytearray()): + """发送UART命令 + Args: + cmd: 命令码 (0x30-0x4C) + data: 命令数据(字节数组) + Returns: + bool: 发送是否成功 + """ + if not self.is_connected or not self.serial_port: + return False + + try: + # 构建UART数据包: 0x55 0xAA [版本] [命令] [数据长度] [数据] [校验和] + packet = bytearray() + packet.append(UART_HEAD1) # 帧头1 + packet.append(UART_HEAD2) # 帧头2 + packet.append(UART_VERSION) # 版本 + packet.append(cmd) # 命令码 + packet.append(len(data)) # 数据长度 + packet.extend(data) # 数据 + + # 计算校验和(包括校验和之前的所有字节) + checksum = self.calculate_checksum(packet) + packet.append(checksum) + + # 清空输入缓冲区(改动原因:在发送新命令前清空缓冲区,避免读取到旧数据) + self.serial_port.reset_input_buffer() + + # 发送数据包 + self.serial_port.write(packet) + self.serial_port.flush() + + # 打印发送的数据(十六进制格式) + hex_str = ' '.join(f'{b:02X}' for b in packet) + log_message(LOG_LEVEL_INFO, f"[发送数据] 命令: 0x{cmd:02X}, 长度: {len(packet)}, 数据: {hex_str}", LOG_LEVEL_INFO) + # 改动原因:添加校验和打印,方便调试 + log_message(LOG_LEVEL_INFO, f"[发送数据] 校验和: 0x{checksum:02X} (计算值)", LOG_LEVEL_INFO) + log_message(LOG_LEVEL_DEBUG, f"发送UART命令 0x{cmd:02X}, 数据: {data.hex()}", LOG_LEVEL_DEBUG) + return True + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"发送UART命令失败: {str(e)}", LOG_LEVEL_ERROR) + return False + + def receive_response(self, expected_cmd, data_length=0): + """接收UART响应 + Args: + expected_cmd: 期望的命令码 + data_length: 期望的数据长度(不包括帧头、版本、命令、长度、校验和) + Returns: + bytearray: 响应数据包,失败返回None + """ + if not self.is_connected or not self.serial_port: + return None + + try: + # 等待响应(改动原因:给设备足够时间处理命令并返回响应) + time.sleep(UART_RESPONSE_DELAY) + + # 改进的读取逻辑:等待数据到达(改动原因:使用超时循环等待,而不是立即读取) + response = bytearray() + start_time = time.time() + + # 先读取已到达的数据 + while time.time() - start_time < UART_READ_TIMEOUT: + if self.serial_port.in_waiting > 0: + # 有数据到达,读取所有可用数据 + data = self.serial_port.read(self.serial_port.in_waiting) + response.extend(data) + + # 如果已经读取到足够的数据(至少6字节),尝试解析 + if len(response) >= 6: + # 检查是否已读取完整数据包 + resp_data_len = response[4] + expected_packet_len = 5 + resp_data_len + 1 + if len(response) >= expected_packet_len: + break # 已读取完整数据包 + else: + # 没有数据,短暂等待后继续 + time.sleep(0.01) + + # 如果还没有读取到数据,再尝试读取一次 + if len(response) == 0: + response = bytearray(self.serial_port.read(64)) + + # 打印接收到的原始数据(十六进制格式) + if len(response) > 0: + hex_str = ' '.join(f'{b:02X}' for b in response) + log_message(LOG_LEVEL_INFO, f"[接收数据] 原始长度: {len(response)}, 数据: {hex_str}", LOG_LEVEL_INFO) + + if len(response) < 6: # 最小包长度:帧头(2) + 版本(1) + 命令(1) + 长度(1) + 校验和(1) + log_message(LOG_LEVEL_ERROR, f"响应数据包太短: {len(response)}字节", LOG_LEVEL_ERROR) + return None + + # 验证帧头 + if response[0] != UART_HEAD1 or response[1] != UART_HEAD2: + log_message(LOG_LEVEL_ERROR, f"无效的响应帧头: 0x{response[0]:02X} 0x{response[1]:02X}", LOG_LEVEL_ERROR) + return None + + # 验证版本 + if response[2] != UART_VERSION: + log_message(LOG_LEVEL_WARN, f"响应版本不匹配: 0x{response[2]:02X}", LOG_LEVEL_WARN) + + # 验证命令码 + if response[3] != expected_cmd: + log_message(LOG_LEVEL_ERROR, f"响应命令码不匹配: 期望0x{expected_cmd:02X}, 收到0x{response[3]:02X}", LOG_LEVEL_ERROR) + return None + + # 验证数据长度 + resp_data_len = response[4] + expected_packet_len = 5 + resp_data_len + 1 # 帧头(2) + 版本(1) + 命令(1) + 长度(1) + 数据 + 校验和(1) + + if len(response) < expected_packet_len: + log_message(LOG_LEVEL_ERROR, f"响应数据包长度不足: 期望{expected_packet_len}字节, 收到{len(response)}字节", LOG_LEVEL_ERROR) + return None + + # 验证校验和 + packet_for_checksum = response[:expected_packet_len-1] # 不包括校验和字节 + calculated_checksum = self.calculate_checksum(packet_for_checksum) + received_checksum = response[expected_packet_len-1] + + # 改动原因:添加详细的校验和验证信息,包括用于计算校验和的数据 + checksum_data_hex = ' '.join(f'{b:02X}' for b in packet_for_checksum) + log_message(LOG_LEVEL_INFO, f"[校验和检查] 用于计算的数据 ({len(packet_for_checksum)}字节): {checksum_data_hex}", LOG_LEVEL_INFO) + log_message(LOG_LEVEL_INFO, f"[校验和检查] 计算值: 0x{calculated_checksum:02X}, 接收值: 0x{received_checksum:02X}", LOG_LEVEL_INFO) + + if calculated_checksum != received_checksum: + log_message(LOG_LEVEL_ERROR, f"[校验和检查] 校验和不匹配: 计算=0x{calculated_checksum:02X}, 接收=0x{received_checksum:02X}, 差异=0x{(calculated_checksum - received_checksum) % 256:02X}", LOG_LEVEL_ERROR) + return None + else: + log_message(LOG_LEVEL_INFO, f"[校验和检查] 校验和匹配成功: 0x{calculated_checksum:02X}", LOG_LEVEL_INFO) + + # 打印解析后的响应数据(十六进制格式) + valid_response = bytearray(response[:expected_packet_len]) + hex_str = ' '.join(f'{b:02X}' for b in valid_response) + log_message(LOG_LEVEL_INFO, f"[接收数据] 命令: 0x{expected_cmd:02X}, 长度: {len(valid_response)}, 数据: {hex_str}", LOG_LEVEL_INFO) + + log_message(LOG_LEVEL_DEBUG, f"接收UART响应 0x{expected_cmd:02X}, 数据长度: {resp_data_len}", LOG_LEVEL_DEBUG) + return valid_response + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"接收UART响应失败: {str(e)}", LOG_LEVEL_ERROR) + return None + +# 复用HID版本的BandFilter类(滤波器带控件) +# 这里直接从eq_designer_new.py复制,不做修改 +# 为了简化,我会在下面完整实现 + +class BandFilter(QGroupBox): + """单个滤波器带控件(与HID版本相同)""" + def __init__(self, band_id, parent=None): + super().__init__(f"滤波器 {band_id}", parent) + self.band_id = band_id + self.parent_window = parent + self.calculator = BiquadFilterCalculator() + + layout = QFormLayout() + + self.enabled = QCheckBox() + self.enabled.setChecked(True) + + self.filter_type = QComboBox() + self.filter_type.addItems([ + "bypass滤波器", + "全通滤波器", "峰值滤波器", "低通滤波器", "高通滤波器", + "带通滤波器", "带阻滤波器", "陷波滤波器", "恒定Q值滤波器", + "低架滤波器", "高架滤波器" + ]) + self.filter_type.setCurrentText("bypass滤波器") + self.filter_type.currentTextChanged.connect(self.on_filter_type_changed) + layout.addRow("类型:", self.filter_type) + + self.fc = QSpinBox() + self.fc.setRange(20, 96000) + self.fc.setValue(1000) + self.fc.setSuffix(" Hz") + self.fc.valueChanged.connect(self.on_parameter_changed) + layout.addRow("频率:", self.fc) + + self.Q = QDoubleSpinBox() + self.Q.setRange(0.01, 100) + self.Q.setValue(0.707) + self.Q.setSingleStep(0.1) + self.Q.valueChanged.connect(self.on_parameter_changed) + layout.addRow("Q值:", self.Q) + + self.bw = QSpinBox() + self.bw.setRange(1, 192000) + self.bw.setValue(1) + self.bw.valueChanged.connect(self.on_parameter_changed) + layout.addRow("带宽:", self.bw) + + self.gain = QDoubleSpinBox() + self.gain.setRange(-80, 80) + self.gain.setValue(0) + self.gain.setSuffix(" dB") + self.gain.valueChanged.connect(self.on_parameter_changed) + layout.addRow("增益:", self.gain) + + self.bshift_label = QLabel("bshift: 0") + self.bshift_label.hide() + + self.coeffs_label = QLineEdit() + self.coeffs_label.setReadOnly(True) + self.coeffs_label.setMinimumWidth(300) + self.coeffs_label.setStyleSheet(""" + QLineEdit { + background-color: #f0f0f0; + border: 1px solid #cccccc; + padding: 2px; + font-family: monospace; + } + """) + self.coeffs_label.setText("Coefficients: Not calculated") + self.coeffs_label.hide() + + self.setLayout(layout) + + if self.parent_window and self.parent_window.show_qshift_debug: + self.update_coefficients() + + def on_filter_type_changed(self): + filter_type = self.filter_type.currentText() + self.fc.hide() + self.Q.hide() + self.bw.hide() + self.gain.hide() + + if filter_type in ["峰值滤波器", "低通滤波器", "高通滤波器", "陷波滤波器", + "全通滤波器", "恒定Q值滤波器", "低架滤波器", "高架滤波器"]: + self.fc.show() + self.Q.show() + if filter_type in ["峰值滤波器", "恒定Q值滤波器", "低架滤波器", "高架滤波器"]: + self.gain.show() + elif filter_type in ["带通滤波器", "带阻滤波器"]: + self.fc.show() + self.bw.show() + elif filter_type == "bypass滤波器": + pass + + self.on_parameter_changed() + + def on_parameter_changed(self): + if self.parent_window and self.parent_window.show_qshift_debug: + self.update_coefficients() + if self.parent_window: + self.parent_window.update_eq_curve() + + def update_coefficients(self): + if not self.enabled.isChecked(): + if self.parent_window and self.parent_window.show_qshift_debug: + log_message(LOG_LEVEL_DEBUG, f"滤波器 {self.band_id} 已禁用,bshift = 0", self.parent_window.log_level) + return + + try: + fs = float(self.parent_window.sample_rate.currentText()) + coeffs = self.calculate_coefficients(fs) + + if self.parent_window and self.parent_window.show_qshift_debug and coeffs is not None: + display_coeffs = [ + coeffs[0], + coeffs[1], + coeffs[2], + -coeffs[3], + -coeffs[4] + ] + + bshift = self.calculate_bshift(display_coeffs) + scale_factor = 2 ** (-bshift) + + self.coeffs_label.setText( + f"Coefficients: {display_coeffs[0]:.16f}, {display_coeffs[1]:.16f}, " + f"{display_coeffs[2]:.16f}, {display_coeffs[3]:.16f}, {display_coeffs[4]:.16f}\n" + f"Scaled: {display_coeffs[0] * scale_factor:.16f}, {display_coeffs[1] * scale_factor:.16f}, " + f"{display_coeffs[2] * scale_factor:.16f}, {display_coeffs[3] * scale_factor:.16f}, {display_coeffs[4] * scale_factor:.16f}" + ) + except Exception as e: + if self.parent_window and self.parent_window.show_qshift_debug: + self.coeffs_label.setText("Coefficients: Calculation error") + self.bshift_label.setText("bshift: 0") + + def calculate_coefficients(self, fs): + try: + filter_type = self.filter_type.currentText() + + calculator_types = { + "峰值滤波器": "peak", + "低通滤波器": "lowpass", + "高通滤波器": "highpass", + "带通滤波器": "bandpass", + "陷波滤波器": "notch", + "低架滤波器": "lowshelf", + "高架滤波器": "highshelf" + } + + if filter_type in calculator_types: + coeffs = self.calculator.calculate( + calculator_types[filter_type], + self.fc.value(), + fs, + self.Q.value(), + self.gain.value(), + self.bw.value() if filter_type in ['bandpass', 'bandstop'] else None + ) + return [coeffs['a0'], coeffs['a1'], coeffs['a2'], coeffs['b1'], coeffs['b2']] + + if filter_type == "全通滤波器": + coeffs = make_biquad_allpass(fs, self.fc.value(), self.Q.value()) + elif filter_type == "带阻滤波器": + coeffs = make_biquad_bandstop(fs, self.fc.value(), self.bw.value()) + elif filter_type == "恒定Q值滤波器": + coeffs = make_biquad_constant_q(fs, self.fc.value(), self.Q.value(), self.gain.value()) + elif filter_type == "bypass滤波器": + coeffs = make_biquad_bypass(fs) + else: + coeffs = make_biquad_bypass(fs) + + return coeffs + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"计算系数时出错: {str(e)}", self.parent_window.log_level if self.parent_window else LOG_LEVEL_ERROR) + return None + + def get_parameters(self): + params = { + "enabled": self.enabled.isChecked(), + "type": self.filter_type.currentText(), + "fc": self.fc.value(), + "Q": self.Q.value(), + "bw": self.bw.value(), + "gain": self.gain.value() + } + return params + + def set_parameters(self, params): + try: + self.enabled.setChecked(params.get("enabled", True)) + filter_type = params.get("type", "全通滤波器") + self.filter_type.setCurrentText(filter_type) + self.fc.setValue(params.get("fc", 1000)) + self.Q.setValue(params.get("Q", 0.707)) + self.bw.setValue(params.get("bw", 1)) + self.gain.setValue(params.get("gain", 0)) + self.on_parameter_changed() + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置滤波器参数时出错: {str(e)}", self.parent_window.log_level if self.parent_window else LOG_LEVEL_ERROR) + + def calculate_bshift(self, coeffs): + if not self.enabled.isChecked(): + if self.parent_window and self.parent_window.show_qshift_debug: + log_message(LOG_LEVEL_DEBUG, f"滤波器 {self.band_id} 已禁用,bshift = 0", self.parent_window.log_level) + return 0 + b_coeffs = coeffs[:3] + max_b = max(abs(x) for x in b_coeffs) + if self.parent_window and self.parent_window.show_qshift_debug: + log_message(LOG_LEVEL_DEBUG, f"滤波器 {self.band_id} b系数最大值: {max_b:.6f}", self.parent_window.log_level) + if max_b != 0: + bshift = int(np.floor(np.log2(max_b))) + else: + bshift = 0 + bshift = bshift if bshift >= 0 else 0 + if self.parent_window and self.parent_window.show_qshift_debug: + log_message(LOG_LEVEL_DEBUG, f"滤波器 {self.band_id} bshift={bshift}", self.parent_window.log_level) + self.bshift_label.setText(f"bshift: {bshift}") + return bshift + + def get_bshift(self): + coeffs = self.calculate_coefficients(float(self.parent_window.sample_rate.currentText())) + if coeffs is None: + return 0 + bshift = self.calculate_bshift(coeffs) + return bshift + + def get_scale_factor(self): + bshift = self.get_bshift() + scale_factor = 2 ** (-bshift) + return scale_factor + +class MplCanvas(FigureCanvasQTAgg): + """响应曲线画布(与HID版本相同)""" + def __init__(self, parent=None, width=5, height=4, dpi=100): + fig = Figure(figsize=(width, height), dpi=dpi) + self.axes = fig.subplots(1, 1) + fig.suptitle("PEQ响应曲线") + self.axes.set_xscale('log') + self.axes.set_xlabel('频率 (Hz)') + self.axes.set_ylabel('增益 (dB)') + self.axes.grid(True, which='both', linestyle='-', alpha=0.3) + self.axes.set_xlim(20, 20000) + self.axes.set_ylim(-30, 30) + super().__init__(fig) + + def update_plot(self, f, h, fs): + try: + h_db = 20 * np.log10(np.abs(h)) + self.axes.clear() + self.axes.semilogx(f, h_db, 'b-', linewidth=2, label='总响应') + x_max = fs / 2 + self.axes.set_xlim([20, x_max]) + x_ticks = [20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000] + if x_max > 20000: + x_ticks.extend([40000, 80000]) + self.axes.set_xticks(x_ticks) + self.axes.grid(True, which='both', linestyle='-', alpha=0.3) + self.axes.set_ylim([-30, 30]) + self.axes.set_ylabel("幅度 (dB)") + self.axes.set_xlabel("频率 (Hz)") + self.axes.legend(prop={'family': ['Microsoft YaHei', 'SimHei', 'SimSun']}) + self.draw() + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"更新响应曲线时出错: {str(e)}", self.parent_window.log_level if self.parent_window else LOG_LEVEL_ERROR) + +# ========== EQDesigner主窗口类 ========== +# 改动原因:基于HID版本创建UART版本,主要修改通信部分 + +class EQDesigner(QMainWindow): + def __init__(self): + super().__init__() + self.setWindowTitle("EQ参数设计器 (UART版本)") + self.setMinimumSize(1200, 800) + + # 添加控制是否显示系数的变量 + self.show_qshift_debug = False + self.current_mode = 0 + self.total_bshift = 0 + self.log_level = LOG_LEVEL_VERBOSE + + # UART通信对象 + self.uart_comm = UartComm() + + # 创建菜单栏 + self.create_menu_bar() + + # 创建主窗口部件 + main_widget = QWidget() + self.setCentralWidget(main_widget) + + # 创建主布局 + main_layout = QHBoxLayout(main_widget) + + # 创建分割器 + splitter = QSplitter(Qt.Horizontal) + + # 左侧控制面板 + left_panel = QWidget() + left_layout = QVBoxLayout(left_panel) + left_layout.setContentsMargins(5, 5, 5, 5) + + # 创建左侧面板内容的滚动区域 + left_scroll = QScrollArea() + left_scroll.setWidgetResizable(True) + left_scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) + left_scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) + + # 创建左侧内容容器 + left_content = QWidget() + left_content_layout = QVBoxLayout(left_content) + left_content_layout.setContentsMargins(5, 5, 5, 5) + + # 滤波器带滚动区域 + bands_scroll = QScrollArea() + bands_scroll.setWidgetResizable(True) + bands_scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) + bands_scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) + bands_scroll.setMinimumHeight(400) + self.bands_widget = QWidget() + self.bands_layout = QVBoxLayout(self.bands_widget) + bands_scroll.setWidget(self.bands_widget) + left_content_layout.addWidget(bands_scroll) + + # 采样率选择 + sample_rate_layout = QHBoxLayout() + sample_rate_layout.addWidget(QLabel("采样率:")) + self.sample_rate = QComboBox() + self.sample_rate.addItems(["44100", "48000", "88200", "96000", "176400", "192000"]) + self.sample_rate.currentTextChanged.connect(self.on_sample_rate_changed) + sample_rate_layout.addWidget(self.sample_rate) + left_content_layout.addLayout(sample_rate_layout) + + # 添加调试选项 + debug_layout = QHBoxLayout() + self.debug_checkbox = QCheckBox("显示bshift调试信息") + self.debug_checkbox.stateChanged.connect(self.on_debug_changed) + self.debug_checkbox.hide() + debug_layout.addWidget(self.debug_checkbox) + + # 添加日志级别选择 + log_level_layout = QHBoxLayout() + self.debug_label = QLabel("调试信息:") + self.debug_label.hide() + log_level_layout.addWidget(self.debug_label) + self.log_level_combo = QComboBox() + self.log_level_combo.addItems(["错误", "警告", "信息", "调试", "详细"]) + self.log_level_combo.setCurrentIndex(2) + self.log_level_combo.currentIndexChanged.connect(self.on_log_level_changed) + self.log_level_combo.hide() + log_level_layout.addWidget(self.log_level_combo) + debug_layout.addLayout(log_level_layout) + left_content_layout.addLayout(debug_layout) + + # 添加串口选择下拉框(UART版本使用串口而不是USB设备) + device_layout = QHBoxLayout() + device_layout.addWidget(QLabel("串口:")) + self.device_combo = QComboBox() # 存储串口名称 + device_layout.addWidget(self.device_combo) + refresh_button = QPushButton("刷新串口") + refresh_button.clicked.connect(self.refresh_devices) + device_layout.addWidget(refresh_button) + connect_button = QPushButton("连接") + connect_button.clicked.connect(self.on_connect_device) + device_layout.addWidget(connect_button) + left_content_layout.addLayout(device_layout) + + # 保存各组引用 + self.ui_groups = {} + + # 添加设备信息显示组 + device_info_group = QGroupBox("设备信息") + self.ui_groups['device_info'] = device_info_group + device_info_layout = QFormLayout(device_info_group) + + self.device_pid_label = QLabel("PID: 未知") + self.device_vid_label = QLabel("VID: 未知") + self.device_product_label = QLabel("产品: 未知") + self.device_vendor_label = QLabel("厂商: 未知") + self.device_serial_label = QLabel("序列号: 未知") + + device_info_layout.addRow("产品ID:", self.device_pid_label) + device_info_layout.addRow("厂商ID:", self.device_vid_label) + device_info_layout.addRow("产品名称:", self.device_product_label) + device_info_layout.addRow("厂商名称:", self.device_vendor_label) + device_info_layout.addRow("序列号:", self.device_serial_label) + + self.get_device_info_btn = QPushButton("获取设备信息") + self.get_device_info_btn.clicked.connect(self.on_get_device_info) + device_info_layout.addRow(self.get_device_info_btn) + + left_content_layout.addWidget(device_info_group) + + # 音效模式设置组(与HID版本相同,这里简化,完整版需要从HID版本复制) + mode_group = QGroupBox("音效模式设置") + self.ui_groups['mode'] = mode_group + mode_layout = QFormLayout(mode_group) + self.mode_label = QLabel("音效模式:") + self.mode_combo = QComboBox() + self.mode_combo.addItems(["预设模式1", "预设模式2", "预设模式3", "预设模式4", "预设模式5", "预设模式6", + "用户模式1", "用户模式2", "用户模式3", "bypass", "禁用EQ"]) + self.mode_combo.currentIndexChanged.connect(self.on_mode_changed) + mode_layout.addRow(self.mode_label, self.mode_combo) + + self.mode_name_label = QLabel("模式名称:") + self.mode_name_edit = QLineEdit() + self.mode_name_edit.setMaxLength(15) + self.mode_name_edit.setPlaceholderText("输入模式名称(最多15个字符)") + self.mode_name_edit.textChanged.connect(self.on_mode_name_changed) + mode_layout.addRow(self.mode_name_label, self.mode_name_edit) + + self.get_mode_btn = QPushButton("获取当前音效模式") + self.get_mode_btn.clicked.connect(self.on_get_mode) + mode_layout.addRow(self.get_mode_btn) + + self.set_and_save_mode_btn = QPushButton("设置并保存音效模式") + self.set_and_save_mode_btn.clicked.connect(self.on_set_and_save_mode) + mode_layout.addRow(self.set_and_save_mode_btn) + + left_content_layout.addWidget(mode_group) + + # 音效参数配置组(简化版,完整功能需要从HID版本复制) + param_group = QGroupBox("音效参数配置") + self.ui_groups['param'] = param_group + param_layout = QVBoxLayout(param_group) + + self.config_params_btn = QPushButton("配置音效参数") + self.config_params_btn.clicked.connect(self.on_config_params) + param_layout.addWidget(self.config_params_btn) + + self.read_params_btn = QPushButton("读取音效参数") + self.read_params_btn.clicked.connect(self.on_read_params) + param_layout.addWidget(self.read_params_btn) + + self.set_gain_btn = QPushButton("设置整体增益") + self.set_gain_btn.clicked.connect(self.on_set_gain) + param_layout.addWidget(self.set_gain_btn) + + self.reset_eq_btn = QPushButton("复位EQ参数") + self.reset_eq_btn.clicked.connect(self.on_reset_eq_params) + param_layout.addWidget(self.reset_eq_btn) + + self.get_mode_count_btn = QPushButton("获取EQ模式总数") + self.get_mode_count_btn.clicked.connect(self.on_get_mode_count) + param_layout.addWidget(self.get_mode_count_btn) + + left_content_layout.addWidget(param_group) + + # 音量控制组(简化版) + volume_group = QGroupBox("音量控制") + self.ui_groups['volume'] = volume_group + volume_layout = QFormLayout(volume_group) + + volume_control_layout = QHBoxLayout() + self.volume_label = QLabel("音量级别:") + self.volume_spin = QSpinBox() + self.volume_spin.setRange(0, 60) + self.volume_spin.setValue(60) + self.volume_spin.setSuffix(" (0=最小, 60=最大)") + volume_control_layout.addWidget(self.volume_label) + volume_control_layout.addWidget(self.volume_spin) + volume_layout.addRow(volume_control_layout) + + self.set_volume_btn = QPushButton("设置音量") + self.set_volume_btn.clicked.connect(self.on_set_volume) + volume_layout.addRow(self.set_volume_btn) + + self.get_volume_btn = QPushButton("读取音量") + self.get_volume_btn.clicked.connect(self.on_get_volume) + volume_layout.addRow(self.get_volume_btn) + + self.get_sample_format_btn = QPushButton("读取采样率和格式") + self.get_sample_format_btn.clicked.connect(self.on_get_sample_format) + volume_layout.addRow(self.get_sample_format_btn) + + left_content_layout.addWidget(volume_group) + + # 设备模式控制组(新增:增益模式、滤波器模式、游戏模式) + device_mode_group = QGroupBox("设备模式控制") + self.ui_groups['device_mode'] = device_mode_group + device_mode_layout = QFormLayout(device_mode_group) + + # 增益模式 + gain_control_layout = QHBoxLayout() + self.gain_mode_combo = QComboBox() + self.gain_mode_combo.addItem("低阻模式 (0)", 0) + self.gain_mode_combo.addItem("高阻模式 (1)", 1) + gain_control_layout.addWidget(QLabel("增益模式:")) + gain_control_layout.addWidget(self.gain_mode_combo) + device_mode_layout.addRow(gain_control_layout) + + gain_btn_layout = QHBoxLayout() + self.set_gain_mode_btn = QPushButton("设置增益模式") + self.set_gain_mode_btn.clicked.connect(self.on_set_gain_mode) + self.get_gain_mode_btn = QPushButton("读取增益模式") + self.get_gain_mode_btn.clicked.connect(self.on_get_gain_mode) + gain_btn_layout.addWidget(self.set_gain_mode_btn) + gain_btn_layout.addWidget(self.get_gain_mode_btn) + device_mode_layout.addRow(gain_btn_layout) + + # 滤波器模式 + filter_control_layout = QHBoxLayout() + self.filter_mode_combo = QComboBox() + self.filter_mode_combo.addItem("Minimum Phase filter (default) (0)", 0) + self.filter_mode_combo.addItem("Linear Phase Apodizing Fast Roll-off filter (1)", 1) + self.filter_mode_combo.addItem("Linear phase fast roll-off filter (2)", 2) + self.filter_mode_combo.addItem("Linear Phase Fast Roll-off low-ripple filter (3)", 3) + self.filter_mode_combo.addItem("Linear phase slow roll-off filter (4)", 4) + self.filter_mode_combo.addItem("Minimum phase fast roll-off filter (5)", 5) + self.filter_mode_combo.addItem("Minimum phase slow roll-off filter (6)", 6) + self.filter_mode_combo.addItem("Minimum Phase Fast Roll-Off Low Dispersion (7)", 7) + filter_control_layout.addWidget(QLabel("滤波器模式:")) + filter_control_layout.addWidget(self.filter_mode_combo) + device_mode_layout.addRow(filter_control_layout) + + filter_btn_layout = QHBoxLayout() + self.set_filter_mode_btn = QPushButton("设置滤波器模式") + self.set_filter_mode_btn.clicked.connect(self.on_set_filter_mode) + self.get_filter_mode_btn = QPushButton("读取滤波器模式") + self.get_filter_mode_btn.clicked.connect(self.on_get_filter_mode) + filter_btn_layout.addWidget(self.set_filter_mode_btn) + filter_btn_layout.addWidget(self.get_filter_mode_btn) + device_mode_layout.addRow(filter_btn_layout) + + # 游戏模式 + game_control_layout = QHBoxLayout() + self.game_mode_combo = QComboBox() + self.game_mode_combo.addItem("无音效 (0)", 0) + self.game_mode_combo.addItem("FPS (1)", 1) + self.game_mode_combo.addItem("虚拟7.1 (2)", 2) + game_control_layout.addWidget(QLabel("游戏模式:")) + game_control_layout.addWidget(self.game_mode_combo) + device_mode_layout.addRow(game_control_layout) + + game_btn_layout = QHBoxLayout() + self.set_game_mode_btn = QPushButton("设置游戏模式") + self.set_game_mode_btn.clicked.connect(self.on_set_game_mode) + self.get_game_mode_btn = QPushButton("读取游戏模式") + self.get_game_mode_btn.clicked.connect(self.on_get_game_mode) + game_btn_layout.addWidget(self.set_game_mode_btn) + game_btn_layout.addWidget(self.get_game_mode_btn) + device_mode_layout.addRow(game_btn_layout) + + left_content_layout.addWidget(device_mode_group) + + # LED控制组(新增) + led_group = QGroupBox("LED控制") + self.ui_groups['led'] = led_group + led_layout = QFormLayout(led_group) + + # LED索引选择 + led_index_layout = QHBoxLayout() + self.led_index_label = QLabel("LED索引:") + self.led_index_spin = QSpinBox() + self.led_index_spin.setRange(0, 7) + self.led_index_spin.setValue(0) + led_index_layout.addWidget(self.led_index_label) + led_index_layout.addWidget(self.led_index_spin) + led_layout.addRow(led_index_layout) + + # LED开关 + led_switch_layout = QHBoxLayout() + self.led_switch_label = QLabel("LED开关:") + self.led_switch_combo = QComboBox() + self.led_switch_combo.addItems(["OFF (关闭)", "ON (开启)"]) + self.led_switch_combo.setCurrentIndex(1) # 默认开启 + led_switch_layout.addWidget(self.led_switch_label) + led_switch_layout.addWidget(self.led_switch_combo) + led_layout.addRow(led_switch_layout) + + # LED信息显示 + self.led_info_label = QLabel("LED信息: 未获取") + led_layout.addRow("LED信息:", self.led_info_label) + + # LED状态显示 + self.led_status_label = QLabel("LED状态: 未获取") + led_layout.addRow("LED状态:", self.led_status_label) + + # LED控制按钮 + led_buttons_layout = QVBoxLayout() + + self.get_led_info_btn = QPushButton("获取LED信息") + self.get_led_info_btn.clicked.connect(self.on_get_led_info) + led_buttons_layout.addWidget(self.get_led_info_btn) + + self.set_led_switch_btn = QPushButton("设置LED开关") + self.set_led_switch_btn.clicked.connect(self.on_set_led_switch) + led_buttons_layout.addWidget(self.set_led_switch_btn) + + self.get_led_switch_btn = QPushButton("获取LED开关") + self.get_led_switch_btn.clicked.connect(self.on_get_led_switch) + led_buttons_layout.addWidget(self.get_led_switch_btn) + + self.get_led_status_btn = QPushButton("获取LED状态") + self.get_led_status_btn.clicked.connect(self.on_get_led_status) + led_buttons_layout.addWidget(self.get_led_status_btn) + + self.get_led_count_btn = QPushButton("获取LED总数") + self.get_led_count_btn.clicked.connect(self.on_get_led_count) + led_buttons_layout.addWidget(self.get_led_count_btn) + + led_layout.addRow(led_buttons_layout) + + left_content_layout.addWidget(led_group) + + # UAC模式控制组(新增) + uac_group = QGroupBox("UAC模式控制") + self.ui_groups['uac'] = uac_group + uac_layout = QFormLayout(uac_group) + + # UAC模式选择 + uac_mode_layout = QHBoxLayout() + self.uac_mode_label = QLabel("UAC模式:") + self.uac_mode_combo = QComboBox() + self.uac_mode_combo.addItems(["UAC2.0", "UAC1.0"]) + self.uac_mode_combo.setCurrentIndex(0) # 默认UAC2.0 + uac_mode_layout.addWidget(self.uac_mode_label) + uac_mode_layout.addWidget(self.uac_mode_combo) + uac_layout.addRow(uac_mode_layout) + + # 当前UAC模式显示 + self.current_uac_mode_label = QLabel("当前UAC模式: 未获取") + uac_layout.addRow("当前模式:", self.current_uac_mode_label) + + # UAC控制按钮 + uac_buttons_layout = QVBoxLayout() + + self.get_uac_mode_info_btn = QPushButton("获取UAC模式信息") + self.get_uac_mode_info_btn.clicked.connect(self.on_get_uac_mode_info) + uac_buttons_layout.addWidget(self.get_uac_mode_info_btn) + + self.set_uac_mode_btn = QPushButton("设置UAC模式") + self.set_uac_mode_btn.clicked.connect(self.on_set_uac_mode) + uac_buttons_layout.addWidget(self.set_uac_mode_btn) + + self.get_current_uac_mode_btn = QPushButton("获取当前UAC模式") + self.get_current_uac_mode_btn.clicked.connect(self.on_get_current_uac_mode) + uac_buttons_layout.addWidget(self.get_current_uac_mode_btn) + + uac_layout.addRow(uac_buttons_layout) + + left_content_layout.addWidget(uac_group) + + # EQ使能控制组(新增) + eq_enable_group = QGroupBox("EQ使能控制") + self.ui_groups['eq_enable'] = eq_enable_group + eq_enable_layout = QFormLayout(eq_enable_group) + + # EQ使能开关 + eq_enable_switch_layout = QHBoxLayout() + self.eq_enable_label = QLabel("EQ使能开关:") + self.eq_enable_combo = QComboBox() + self.eq_enable_combo.addItems(["OFF (禁用)", "ON (启用)"]) + self.eq_enable_combo.setCurrentIndex(1) # 默认启用 + eq_enable_switch_layout.addWidget(self.eq_enable_label) + eq_enable_switch_layout.addWidget(self.eq_enable_combo) + eq_enable_layout.addRow(eq_enable_switch_layout) + + # 保存的模式显示 + self.saved_mode_label = QLabel("保存的模式: 未获取") + eq_enable_layout.addRow("保存的模式:", self.saved_mode_label) + + # EQ使能控制按钮 + eq_enable_buttons_layout = QVBoxLayout() + + self.set_eq_enable_btn = QPushButton("设置EQ使能开关") + self.set_eq_enable_btn.clicked.connect(self.on_set_eq_enable) + eq_enable_buttons_layout.addWidget(self.set_eq_enable_btn) + + self.get_eq_enable_btn = QPushButton("获取EQ使能开关") + self.get_eq_enable_btn.clicked.connect(self.on_get_eq_enable) + eq_enable_buttons_layout.addWidget(self.get_eq_enable_btn) + + eq_enable_layout.addRow(eq_enable_buttons_layout) + + left_content_layout.addWidget(eq_enable_group) + + # EQ后增益补偿 + post_gain_layout = QHBoxLayout() + post_gain_label = QLabel("EQ整体增益 (dB):") + self.post_gain_spin = QSpinBox() + self.post_gain_spin.setRange(-50, 0) + self.post_gain_spin.setSingleStep(1) + self.post_gain_spin.setValue(0) + post_gain_layout.addWidget(post_gain_label) + post_gain_layout.addWidget(self.post_gain_spin) + left_content_layout.addLayout(post_gain_layout) + + # 保存/加载按钮 + save_load_layout = QHBoxLayout() + save_button = QPushButton("保存参数") + save_button.clicked.connect(self.save_parameters) + load_button = QPushButton("加载参数") + load_button.clicked.connect(self.load_parameters) + apply_all_button = QPushButton("保存到所有采样率") + apply_all_button.clicked.connect(self.apply_to_all_sample_rates) + save_load_layout.addWidget(save_button) + save_load_layout.addWidget(load_button) + save_load_layout.addWidget(apply_all_button) + left_content_layout.addLayout(save_load_layout) + + left_content_layout.addStretch() + left_scroll.setWidget(left_content) + left_layout.addWidget(left_scroll) + + # 右侧响应曲线 + right_panel = QWidget() + right_layout = QVBoxLayout(right_panel) + self.plot = MplCanvas(self, width=5, height=4, dpi=100) + right_layout.addWidget(self.plot) + + splitter.addWidget(left_panel) + splitter.addWidget(right_panel) + splitter.setStretchFactor(0, 1) + splitter.setStretchFactor(1, 2) + main_layout.addWidget(splitter) + + # 初始化变量 + self.bands = [] + self.visible_bands = 0 + + # 创建初始滤波器 + self.create_initial_filter() + self.refresh_devices() + + # 默认隐藏所有视图选项 + for group_key in self.ui_groups.keys(): + self.ui_groups[group_key].setVisible(False) + + def create_menu_bar(self): + """创建菜单栏(与HID版本相同)""" + menubar = self.menuBar() + view_menu = menubar.addMenu("视图") + group_names = { + 'device_info': '设备信息', + 'mode': '音效模式设置', + 'param': '音效参数配置', + 'volume': '音量控制', + 'device_mode': '设备模式控制', + 'led': 'LED控制', + 'uac': 'UAC模式控制', + 'eq_enable': 'EQ使能控制' + } + self.view_actions = {} + for key, name in group_names.items(): + action = view_menu.addAction(f"显示 {name}") + action.setCheckable(True) + action.setChecked(False) + action.triggered.connect(lambda checked, k=key: self.toggle_group_visibility(k, checked)) + self.view_actions[key] = action + + def toggle_group_visibility(self, group_key, visible): + """切换组的可见性""" + if group_key in self.ui_groups: + self.ui_groups[group_key].setVisible(visible) + if group_key in self.view_actions: + group_names = { + 'device_info': '设备信息', + 'mode': '音效模式设置', + 'param': '音效参数配置', + 'volume': '音量控制', + 'device_mode': '设备模式控制', + 'led': 'LED控制', + 'uac': 'UAC模式控制', + 'eq_enable': 'EQ使能控制' + } + name = group_names.get(group_key, group_key) + self.view_actions[group_key].setText(f"{'显示' if visible else '隐藏'} {name}") + + def create_initial_filter(self): + """创建所有MAX_EQ_BANDS个滤波器""" + for i in range(MAX_EQ_BANDS): + band = BandFilter(i + 1, self) + self.bands.append(band) + self.bands_layout.addWidget(band) + self.visible_bands = MAX_EQ_BANDS + + def on_sample_rate_changed(self): + """采样率改变时更新所有滤波器""" + for band in self.bands: + if self.show_qshift_debug: + band.update_coefficients() + self.update_eq_curve() + + def on_log_level_changed(self, index): + """当日志级别改变时的处理""" + self.log_level = index + log_message(LOG_LEVEL_INFO, f"日志级别已更改为: {LOG_LEVEL_NAMES[index]}", self.log_level) + + def on_debug_changed(self, state): + """当调试开关状态改变时更新所有滤波器""" + self.show_qshift_debug = state == Qt.Checked + for band in self.bands: + band.show_qshift_debug = self.show_qshift_debug + if self.show_qshift_debug: + band.update_coefficients() + + def refresh_devices(self): + """刷新串口列表(UART版本)""" + self.device_combo.clear() + ports = serial.tools.list_ports.comports() + for port in ports: + # 显示串口描述和端口名 + port_info = f"{port.description} ({port.device})" + self.device_combo.addItem(port_info, port.device) # 存储实际端口名 + log_message(LOG_LEVEL_DEBUG, f"找到串口: {port_info}", self.log_level) + + def on_connect_device(self): + """连接选中的串口""" + if self.device_combo.currentData() is None: + QMessageBox.warning(self, "错误", "请先选择串口") + return + + port_name = self.device_combo.currentData() + if self.uart_comm.connect(port_name): + QMessageBox.information(self, "成功", f"已连接到串口: {port_name}") + log_message(LOG_LEVEL_INFO, f"已连接到串口: {port_name}", self.log_level) + else: + QMessageBox.warning(self, "失败", f"连接串口失败: {port_name}") + log_message(LOG_LEVEL_ERROR, f"连接串口失败: {port_name}", self.log_level) + + def on_mode_changed(self, index): + """音效模式改变时的处理""" + if hasattr(self, '_mode_changing') and self._mode_changing: + return + + if index == NUM_EQ_MODES: + self.current_mode = EQ_DISABLED_MODE + else: + self.current_mode = index + log_message(LOG_LEVEL_INFO, f"音效模式已更改为: {index}", self.log_level) + + # 切换模式(UART版本) + self.on_switch_mode() + time.sleep(0.1) + + # 读取参数 + self.read_parameters() + + # 获取当前模式状态 + self.on_get_mode(update_ui=False) + + def on_switch_mode(self): + """切换音效模式(UART版本:发送0x40命令)""" + if not self.uart_comm.is_connected: + log_message(LOG_LEVEL_ERROR, "未连接串口", self.log_level) + return + + data = bytearray([self.current_mode]) + if self.uart_comm.send_command(UART_CMD_SET_EQ_MODE, data): + log_message(LOG_LEVEL_INFO, f"切换音效模式到模式 {self.current_mode} 成功", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, f"切换音效模式失败", self.log_level) + + def on_get_mode(self, update_ui=True, mode=0xFF): + """获取音效模式(UART版本:发送0x41命令)""" + if not self.uart_comm.is_connected: + log_message(LOG_LEVEL_ERROR, "未连接串口", self.log_level) + return + + data = bytearray([mode]) + if not self.uart_comm.send_command(UART_CMD_GET_EQ_MODE, data): + log_message(LOG_LEVEL_ERROR, "发送GET_EQ_MODE命令失败", self.log_level) + return + + response = self.uart_comm.receive_response(UART_CMD_GET_EQ_MODE) + if response and len(response) >= 27: + # 解析响应:位置5开始是数据 + current_mode = response[5] # 模式值 + post_gain = int.from_bytes(response[6:10], 'little', signed=True) # 增益值 + mode_name_bytes = bytes(response[10:26]) + mode_name = mode_name_bytes.decode('utf-8', errors='ignore').rstrip('\x00') + + log_message(LOG_LEVEL_INFO, f"获取到当前EQ模式: {current_mode}, 整体增益: {post_gain}dB, 模式名称: '{mode_name}'", self.log_level) + + self.sample_rate.setCurrentText("48000") + + if update_ui: + self._mode_changing = True + try: + if current_mode == EQ_DISABLED_MODE: + self.mode_combo.setCurrentIndex(NUM_EQ_MODES) + else: + self.mode_combo.setCurrentIndex(current_mode) + finally: + self._mode_changing = False + + self.current_mode = current_mode + self.post_gain_spin.setValue(post_gain) + self.mode_name_edit.setText(mode_name) + else: + log_message(LOG_LEVEL_ERROR, "未收到GET_EQ_MODE响应数据", self.log_level) + + def on_mode_name_changed(self): + """模式名称改变时的处理""" + mode_name = self.mode_name_edit.text() + log_message(LOG_LEVEL_DEBUG, f"模式名称已更改为: '{mode_name}'", self.log_level) + + def update_eq_curve(self): + """更新EQ响应曲线(与HID版本相同)""" + try: + fs = float(self.sample_rate.currentText()) + f = np.logspace(np.log10(20), np.log10(fs/2), 1000) + h_total = np.ones_like(f, dtype=complex) + + for i, band in enumerate(self.bands): + if band.enabled.isChecked(): + coeffs = band.calculate_coefficients(fs) + if coeffs is not None: + w = 2 * np.pi * f / fs + z = np.exp(-1j * w) + h = (coeffs[0] + coeffs[1] * z + coeffs[2] * z**2) / \ + (1 + coeffs[3] * z + coeffs[4] * z**2) + h_total *= h + + self.plot.update_plot(f, h_total, fs) + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"更新EQ曲线时出错: {str(e)}", self.log_level) + + # 以下方法需要从HID版本复制并修改为UART版本 + # 由于代码量大,这里先实现关键方法,其余方法可以逐步添加 + + def save_parameters(self): + """保存参数到JSON文件和头文件(与HID版本相同)""" + try: + fs = float(self.sample_rate.currentText()) + current_mode = self.current_mode + + # 生成JSON文件名 + json_filename = f"eq_parameters_{int(fs)}_mode{current_mode}.json" + + # 读取现有的JSON文件(如果存在) + all_params = {} + if os.path.exists(json_filename): + with open(json_filename, "r", encoding='utf-8') as f: + all_params = json.load(f) + + # 计算总的bshift + total_bshift = sum(band.get_bshift() for band in self.bands) + + # 更新当前mode的参数 + params = { + "sample_rate": fs, + "mode": current_mode, + "total_bshift": total_bshift, + "post_gain_db": int(self.post_gain_spin.value()), + "bands": [] + } + + for band in self.bands: + band_params = band.get_parameters() + if band_params["enabled"]: + # 计算浮点系数 + coeffs = band.calculate_coefficients(fs) + if coeffs is not None: + # 反转 b1 和 b2 的符号 + coeffs = np.array([ + coeffs[0], # a0 + coeffs[1], # a1 + coeffs[2], # a2 + -coeffs[3], # b1 + -coeffs[4] # b2 + ]) + band_scale_factor = band.get_scale_factor() + # 只对 a0, a1, a2 乘以 scale_factor + coeffs_scaled = np.array([ + coeffs[0] * band_scale_factor, + coeffs[1] * band_scale_factor, + coeffs[2] * band_scale_factor, + coeffs[3], + coeffs[4] + ]) + coeffs_q30 = (coeffs_scaled * 2**30).astype(np.int32) + band_params["coefficients"] = { + "float": coeffs.tolist(), + "q30": [f"0x{int(x):08x}" if x >= 0 else f"-0x{int(-x):08x}" for x in coeffs_q30] + } + + params["bands"].append(band_params) + + # 保存当前mode的参数 + all_params[f"mode_{current_mode}"] = params + + # 保存JSON文件 + with open(json_filename, "w", encoding='utf-8') as f: + json.dump(all_params, f, indent=2, ensure_ascii=False) + + # 为当前模式生成头文件 + header_filename = f"eq_params_{int(fs)}_mode{current_mode}.h" + with open(header_filename, "w", encoding='utf-8') as f: + f.write(f"""// EQ参数头文件 - {int(fs)}Hz +// 自动生成,请勿手动修改 + +#include "eq.h" + +// Directly declare sEQ_data_{int(fs)}HZ, including coefficients +eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{ +""") + + # 写入当前模式的EQ参数 + f.write(f" [{current_mode}][0] = {{\n") # 左通道 + f.write(f" .sample_rate = {int(fs)},\n") + f.write(f" .total_bshift = {total_bshift},\n") + f.write(f" .post_gain_db = {int(self.post_gain_spin.value())}, // {self.post_gain_spin.value()} dB\n") + f.write(" .bands = {\n") + + # 写入每个滤波器的参数 + for i, band in enumerate(self.bands): + params = band.get_parameters() + if i < 8: # 最多8个滤波器 + f.write(" {\n") + f.write(f" .index = {i},\n") + + # 写入滤波器类型 + type_map = { + "bypass滤波器": "FILTER_TYPE_BYPASS", + "全通滤波器": "FILTER_TYPE_ALLPASS", + "峰值滤波器": "FILTER_TYPE_PEAKING", + "低通滤波器": "FILTER_TYPE_LOWPASS", + "高通滤波器": "FILTER_TYPE_HIGHPASS", + "带通滤波器": "FILTER_TYPE_BANDPASS", + "带阻滤波器": "FILTER_TYPE_BANDSTOP", + "陷波滤波器": "FILTER_TYPE_NOTCH", + "恒定Q值滤波器": "FILTER_TYPE_CONST_Q", + "低架滤波器": "FILTER_TYPE_LOWSHELF", + "高架滤波器": "FILTER_TYPE_HIGHSHELF" + } + f.write(f" .type = {type_map.get(params['type'], 'FILTER_TYPE_ALLPASS')},\n") + + # 写入参数 - 直接写入float值 + f.write(f" .fc = {params['fc']:.2f}f,\n") + f.write(f" .q = {params['Q']:.4f}f,\n") + f.write(f" .bw = {params['bw']:.2f}f,\n") + f.write(f" .gain = {params['gain']:.2f}f,\n") + f.write(" },\n") + + f.write(" },\n") + + # 写入filter结构 + f.write(" .filter = {\n") + f.write(" .biquad_count = MAX_EQ_BANDS,\n") + f.write(" .state = {{0}},\n") + f.write(" .coef = {\n") + + # 写入系数数组 + coeffs_all = [] + for band in self.bands: + coeffs = band.calculate_coefficients(fs) + if coeffs is not None: + coeffs = np.array([ + coeffs[0], # a0 + coeffs[1], # a1 + coeffs[2], # a2 + -coeffs[3], # b1 + -coeffs[4] # b2 + ]) + band_scale_factor = band.get_scale_factor() + coeffs_scaled = np.array([ + coeffs[0] * band_scale_factor, + coeffs[1] * band_scale_factor, + coeffs[2] * band_scale_factor, + coeffs[3], + coeffs[4] + ]) + coeffs_q30 = (coeffs_scaled * 2**30).astype(np.int32) + coeffs_all.extend(coeffs_q30) + else: + coeffs_all.extend([0] * 5) + + # 补足MAX_EQ_BANDS个band的系数 + while len(coeffs_all) < MAX_EQ_BANDS * 5: + coeffs_all.append(0) + + # 按5个系数一组写入 + for i in range(5): + f.write(" {") + for j in range(MAX_EQ_BANDS): + coeff = coeffs_all[j*5 + i] + f.write(f"{f'0x{coeff:08x}' if coeff >= 0 else f'-0x{-coeff:08x}'}") + if j < MAX_EQ_BANDS - 1: + f.write(", ") + f.write("},\n") + + f.write(" },\n") + f.write(" }\n") + f.write(" },\n") + + # 右通道与左通道相同 + f.write(f" [{current_mode}][1] = {{\n") # 右通道 + f.write(f" .sample_rate = {int(fs)},\n") + f.write(f" .total_bshift = {total_bshift},\n") + f.write(f" .post_gain_db = {int(self.post_gain_spin.value())}, // {self.post_gain_spin.value()} dB\n") + f.write(" .bands = {\n") + + # 写入每个滤波器的参数 + for i, band in enumerate(self.bands): + params = band.get_parameters() + if i < MAX_EQ_BANDS: + f.write(" {\n") + f.write(f" .index = {i},\n") + f.write(f" .type = {type_map.get(params['type'], 'FILTER_TYPE_ALLPASS')},\n") + f.write(f" .fc = {params['fc']:.2f}f,\n") + f.write(f" .q = {params['Q']:.4f}f,\n") + f.write(f" .bw = {params['bw']:.2f}f,\n") + f.write(f" .gain = {params['gain']:.2f}f,\n") + f.write(" },\n") + + f.write(" },\n") + f.write(" .filter = {\n") + f.write(" .biquad_count = MAX_EQ_BANDS,\n") + f.write(" .state = {{0}},\n") + f.write(" .coef = {\n") + + # 写入系数数组 + for i in range(5): + f.write(" {") + for j in range(MAX_EQ_BANDS): + coeff = coeffs_all[j*5 + i] + f.write(f"{f'0x{coeff:08x}' if coeff >= 0 else f'-0x{-coeff:08x}'}") + if j < MAX_EQ_BANDS - 1: + f.write(", ") + f.write("},\n") + + f.write(" },\n") + f.write(" }\n") + f.write(" },\n") + + f.write("};\n") + + log_message(LOG_LEVEL_INFO, f"参数已保存到 {json_filename}", self.log_level) + log_message(LOG_LEVEL_INFO, f"头文件已生成: {header_filename}", self.log_level) + + # 检查是否所有模式都已生成 + all_modes_generated = True + for mode in range(NUM_EQ_MODES): + mode_file = f"eq_params_{int(fs)}_mode{mode}.h" + if not os.path.exists(mode_file): + all_modes_generated = False + break + + # 如果所有模式都已生成,合并成一个完整的头文件 + if all_modes_generated: + self.merge_mode_files(fs) + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"保存参数时出错: {str(e)}", self.log_level) + + def merge_mode_files(self, fs): + """合并所有模式的头文件""" + try: + # 创建完整的头文件 + header_filename = f"eq_params_{int(fs)}.h" + with open(header_filename, "w", encoding='utf-8') as f: + # 写入头文件头部 + f.write(f"""// EQ参数头文件 - {int(fs)}Hz +// 自动生成,请勿手动修改 + +#include "eq.h" + +// Directly declare sEQ_data_{int(fs)}HZ, including coefficients +eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{ +""") + + # 合并所有模式的文件 + for mode in range(NUM_EQ_MODES): + mode_file = f"eq_params_{int(fs)}_mode{mode}.h" + with open(mode_file, "r", encoding='utf-8') as mf: + content = mf.readlines() + # 截取第8行到第171行 + mode_data = content[7:171] + # 写入模式数据 + f.writelines(mode_data) + + # 写入结尾 + f.write("};\n") + + log_message(LOG_LEVEL_INFO, f"已合并所有模式生成完整头文件: {header_filename}", self.log_level) + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"合并头文件时出错: {str(e)}", self.log_level) + + def load_parameters(self): + """从JSON文件加载参数(与HID版本相同)""" + try: + fs = float(self.sample_rate.currentText()) + current_mode = self.current_mode + json_filename = f"eq_parameters_{int(fs)}_mode{current_mode}.json" + + if not os.path.exists(json_filename): + log_message(LOG_LEVEL_ERROR, f"未找到配置文件: {json_filename}", self.log_level) + return + + with open(json_filename, "r", encoding='utf-8') as f: + all_params = json.load(f) + + # 获取当前mode的参数 + mode_key = f"mode_{current_mode}" + if mode_key not in all_params: + log_message(LOG_LEVEL_ERROR, f"未找到模式 {current_mode} 的参数", self.log_level) + return + + params = all_params[mode_key] + + # 清除现有滤波器 + for band in self.bands: + self.bands_layout.removeWidget(band) + band.deleteLater() + self.bands.clear() + + # 添加新的滤波器 + for band_params in params["bands"]: + band = BandFilter(len(self.bands), self) + band.set_parameters(band_params) + self.bands.append(band) + self.bands_layout.addWidget(band) + + self.visible_bands = len(self.bands) + self.update_eq_curve() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"加载参数时出错: {str(e)}", self.log_level) + + def send_parameters(self): + """发送参数到设备(UART版本:发送0x43命令)""" + if not self.uart_comm.is_connected: + log_message(LOG_LEVEL_ERROR, "未连接串口", self.log_level) + return + + try: + # 发送所有MAX_EQ_BANDS个滤波器的参数 + for i in range(MAX_EQ_BANDS): + band = self.bands[i] + params = band.get_parameters() + + # 构建UART数据包 + data = bytearray() + data.append(self.current_mode) # 模式值 + data.append(i) # 滤波器索引 + + # 滤波器类型 + type_map = { + "bypass滤波器": 0x00, + "全通滤波器": 0x01, + "峰值滤波器": 0x02, + "低通滤波器": 0x03, + "高通滤波器": 0x04, + "带通滤波器": 0x05, + "带阻滤波器": 0x06, + "陷波滤波器": 0x07, + "恒定Q值滤波器": 0x08, + "低架滤波器": 0x09, + "高架滤波器": 0x0A + } + data.append(type_map.get(params["type"], 0x01)) + + # 参数作为float发送 + data.extend(struct.pack('= 25: + # 解析响应:位置5开始是数据 + resp_mode = response[5] + resp_eq_idx = response[6] + filter_type_code = response[7] + + # 解析参数(float格式) + fc = struct.unpack('= 6: + status = response[5] + if status == 0x00: + QMessageBox.information(self, "成功", "EQ参数复位成功") + else: + QMessageBox.warning(self, "失败", f"EQ参数复位失败,状态码: 0x{status:02X}") + + def on_get_mode_count(self): + """获取EQ模式总数(UART版本:发送0x47命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + if self.uart_comm.send_command(UART_CMD_GET_EQ_MODE_COUNT, bytearray()): + response = self.uart_comm.receive_response(UART_CMD_GET_EQ_MODE_COUNT) + if response and len(response) >= 8: + mode_count = response[5] + preset_mode_count = response[6] + QMessageBox.information( + self, + "EQ模式总数", + f"当前EQ模式总数为: {mode_count}\n" + f"预定义模式数量: {preset_mode_count}" + ) + + def on_set_and_save_mode(self): + """设置并保存EQ模式(UART版本:发送0x48命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + mode_index = self.mode_combo.currentIndex() + if mode_index == NUM_EQ_MODES: + mode = EQ_DISABLED_MODE + else: + mode = mode_index + + reply = QMessageBox.question( + self, + "确认设置并保存EQ模式", + f"将要设置并保存模式: {self.mode_combo.currentText()} (索引: {mode})\n\n是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply == QMessageBox.Yes: + data = bytearray([mode]) + if self.uart_comm.send_command(UART_CMD_SET_AND_SAVE_EQ_MODE, data): + response = self.uart_comm.receive_response(UART_CMD_SET_AND_SAVE_EQ_MODE) + if response and len(response) >= 6: + status = response[5] + if status == 0x00: + QMessageBox.information(self, "成功", f"EQ模式 {mode} 设置并保存成功") + self.current_mode = mode + else: + QMessageBox.warning(self, "失败", f"EQ模式设置并保存失败,状态码: 0x{status:02X}") + + def on_get_device_info(self): + """获取设备信息(UART版本:发送0x45命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + if self.uart_comm.send_command(UART_CMD_GET_DEVICE_INFO, bytearray()): + response = self.uart_comm.receive_response(UART_CMD_GET_DEVICE_INFO) + if response and len(response) >= 58: + # 解析响应:位置5开始是数据(PID, VID, 3个16字节字符串) + pid = int.from_bytes(response[5:7], 'little') + vid = int.from_bytes(response[7:9], 'little') + product_str = bytes(response[9:25]).decode('utf-8', errors='ignore').rstrip('\x00') + vendor_str = bytes(response[25:41]).decode('utf-8', errors='ignore').rstrip('\x00') + serial_str = bytes(response[41:57]).decode('utf-8', errors='ignore').rstrip('\x00') + + self.device_pid_label.setText(f"PID: 0x{pid:04x}") + self.device_vid_label.setText(f"VID: 0x{vid:04x}") + self.device_product_label.setText(f"产品: {product_str}") + self.device_vendor_label.setText(f"厂商: {vendor_str}") + self.device_serial_label.setText(f"序列号: {serial_str}") + + log_message(LOG_LEVEL_INFO, f"设备信息获取成功: PID=0x{pid:04x}, VID=0x{vid:04x}", self.log_level) + + def on_set_volume(self): + """设置音量级别(UART版本:发送0x49命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + volume_level = self.volume_spin.value() + data = bytearray([volume_level]) + if self.uart_comm.send_command(UART_CMD_SET_VOLUME, data): + QMessageBox.information(self, "成功", f"音量级别已设置为: {volume_level}") + log_message(LOG_LEVEL_INFO, f"音量级别 {volume_level} 设置成功", self.log_level) + + def on_get_volume(self): + """读取音量级别(UART版本:发送0x4A命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + if self.uart_comm.send_command(UART_CMD_GET_VOLUME, bytearray()): + response = self.uart_comm.receive_response(UART_CMD_GET_VOLUME) + if response and len(response) >= 7: + volume_level = response[5] + self.volume_spin.setValue(volume_level) + QMessageBox.information(self, "音量级别", f"当前音量级别: {volume_level}") + log_message(LOG_LEVEL_INFO, f"当前音量级别: {volume_level}", self.log_level) + + def on_get_sample_format(self): + """读取采样率和格式(UART版本:发送0x55命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + if self.uart_comm.send_command(UART_CMD_GET_SAMPLE_FORMAT, bytearray()): + response = self.uart_comm.receive_response(UART_CMD_GET_SAMPLE_FORMAT) + if response and len(response) >= 11: + samfreq = int.from_bytes(response[5:9], 'little') + dsd_mode = response[9] + format_type = "PCM" if dsd_mode == 0 else f"DSD (模式 {dsd_mode})" + QMessageBox.information( + self, + "采样率和格式信息", + f"采样率: {samfreq} Hz\n" + f"格式: {format_type}\n" + f"DSD模式: {dsd_mode}" + ) + log_message(LOG_LEVEL_INFO, f"采样率: {samfreq}Hz, 格式: {format_type}", self.log_level) + + def apply_to_all_sample_rates(self): + """将当前EQ参数应用到所有采样率(与HID版本相同)""" + try: + # 获取当前模式 + current_mode = self.current_mode + + # 获取所有可用的采样率 + sample_rates = [float(self.sample_rate.itemText(i)) for i in range(self.sample_rate.count())] + + # 保存当前采样率 + current_fs = float(self.sample_rate.currentText()) + + # 遍历所有采样率 + for fs in sample_rates: + log_message(LOG_LEVEL_INFO, f"正在处理采样率: {fs}Hz", self.log_level) + + # 临时切换到目标采样率 + self.sample_rate.setCurrentText(str(int(fs))) + + # 计算总的bshift + total_bshift = sum(band.get_bshift() for band in self.bands) + + # 生成JSON文件名 + json_filename = f"eq_parameters_{int(fs)}_mode{current_mode}.json" + + # 读取现有的JSON文件(如果存在) + all_params = {} + if os.path.exists(json_filename): + with open(json_filename, "r", encoding='utf-8') as f: + all_params = json.load(f) + + # 更新当前mode的参数 + params = { + "sample_rate": fs, + "mode": current_mode, + "total_bshift": total_bshift, + "post_gain_db": int(self.post_gain_spin.value()), + "bands": [] + } + + # 计算每个band的参数 + for band in self.bands: + band_params = band.get_parameters() + if band_params["enabled"]: + # 计算浮点系数 + coeffs = band.calculate_coefficients(fs) + if coeffs is not None: + # 反转 b1 和 b2 的符号 + coeffs = np.array([ + coeffs[0], # a0 + coeffs[1], # a1 + coeffs[2], # a2 + -coeffs[3], # b1 + -coeffs[4] # b2 + ]) + band_scale_factor = band.get_scale_factor() + # 只对 a0, a1, a2 乘以 scale_factor + coeffs_scaled = np.array([ + coeffs[0] * band_scale_factor, + coeffs[1] * band_scale_factor, + coeffs[2] * band_scale_factor, + coeffs[3], + coeffs[4] + ]) + coeffs_q30 = (coeffs_scaled * 2**30).astype(np.int32) + band_params["coefficients"] = { + "float": coeffs.tolist(), + "q30": [f"0x{int(x):08x}" if x >= 0 else f"-0x{int(-x):08x}" for x in coeffs_q30] + } + + params["bands"].append(band_params) + + # 保存当前mode的参数 + all_params[f"mode_{current_mode}"] = params + + # 保存JSON文件 + with open(json_filename, "w", encoding='utf-8') as f: + json.dump(all_params, f, indent=2, ensure_ascii=False) + + # 生成头文件 + self.save_parameters() # 这会自动生成头文件 + + log_message(LOG_LEVEL_INFO, f"已保存采样率 {fs}Hz 的参数", self.log_level) + + # 恢复原始采样率 + self.sample_rate.setCurrentText(str(int(current_fs))) + + log_message(LOG_LEVEL_INFO, "所有采样率的参数已保存完成", self.log_level) + + # 检查是否所有模式都已生成 + all_modes_generated = True + for mode in range(NUM_EQ_MODES): + mode_file = f"eq_params_{int(current_fs)}_mode{mode}.h" + if not os.path.exists(mode_file): + all_modes_generated = False + break + + # 如果所有模式都已生成,合并成一个完整的头文件 + if all_modes_generated: + self.merge_mode_files(current_fs) + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"应用到所有采样率时出错: {str(e)}", self.log_level) + import traceback + log_message(LOG_LEVEL_ERROR, "详细错误信息:", self.log_level) + traceback.print_exc() + + # ========== 设备模式控制相关方法 ========== + # 改动原因:添加设备模式控制功能(增益模式、滤波器模式、游戏模式) + + def on_set_gain_mode(self): + """设置增益模式(UART版本:发送0x56命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + gain_mode = self.gain_mode_combo.currentData() + + reply = QMessageBox.question( + self, + "确认设置增益模式", + f"将要设置增益模式为: {self.gain_mode_combo.currentText()}\n\n" + f"增益模式: 0=低阻, 1=高阻\n\n" + f"是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply == QMessageBox.Yes: + data = bytearray([gain_mode]) + if self.uart_comm.send_command(UART_CMD_SET_GAIN_MODE, data): + log_message(LOG_LEVEL_INFO, f"增益模式 {gain_mode} 设置成功", self.log_level) + QMessageBox.information(self, "成功", f"增益模式已设置为: {self.gain_mode_combo.currentText()}") + + def on_get_gain_mode(self): + """读取增益模式(UART版本:发送0x57命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + if self.uart_comm.send_command(UART_CMD_GET_GAIN_MODE, bytearray()): + response = self.uart_comm.receive_response(UART_CMD_GET_GAIN_MODE) + if response and len(response) >= 7: + gain_mode = response[5] + index = self.gain_mode_combo.findData(gain_mode) + if index >= 0: + self.gain_mode_combo.setCurrentIndex(index) + log_message(LOG_LEVEL_INFO, f"当前增益模式: {gain_mode} ({'低阻' if gain_mode == 0 else '高阻'})", self.log_level) + QMessageBox.information(self, "增益模式", f"当前增益模式: {gain_mode}\n\n{'低阻模式' if gain_mode == 0 else '高阻模式'}") + + def on_set_filter_mode(self): + """设置滤波器模式(UART版本:发送0x58命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + filter_mode = self.filter_mode_combo.currentData() + + reply = QMessageBox.question( + self, + "确认设置滤波器模式", + f"将要设置滤波器模式为: {self.filter_mode_combo.currentText()}\n\n" + f"滤波器模式范围: 0-7 (8种模式)\n\n" + f"是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply == QMessageBox.Yes: + data = bytearray([filter_mode]) + if self.uart_comm.send_command(UART_CMD_SET_FILTER_MODE, data): + log_message(LOG_LEVEL_INFO, f"滤波器模式 {filter_mode} 设置成功", self.log_level) + QMessageBox.information(self, "成功", f"滤波器模式已设置为: {self.filter_mode_combo.currentText()}") + + def on_get_filter_mode(self): + """读取滤波器模式(UART版本:发送0x59命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + if self.uart_comm.send_command(UART_CMD_GET_FILTER_MODE, bytearray()): + response = self.uart_comm.receive_response(UART_CMD_GET_FILTER_MODE) + if response and len(response) >= 7: + filter_mode = response[5] + index = self.filter_mode_combo.findData(filter_mode) + if index >= 0: + self.filter_mode_combo.setCurrentIndex(index) + log_message(LOG_LEVEL_INFO, f"当前滤波器模式: {filter_mode}", self.log_level) + QMessageBox.information(self, "滤波器模式", f"当前滤波器模式: {filter_mode}\n\n{self.filter_mode_combo.currentText()}") + + def on_set_game_mode(self): + """设置游戏模式(UART版本:发送0x5A命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + game_mode = self.game_mode_combo.currentData() + + reply = QMessageBox.question( + self, + "确认设置游戏模式", + f"将要设置游戏模式为: {self.game_mode_combo.currentText()}\n\n" + f"游戏模式: 0=无音效, 1=FPS, 2=虚拟7.1\n\n" + f"是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply == QMessageBox.Yes: + data = bytearray([game_mode]) + if self.uart_comm.send_command(UART_CMD_SET_GAME_MODE, data): + log_message(LOG_LEVEL_INFO, f"游戏模式 {game_mode} 设置成功", self.log_level) + QMessageBox.information(self, "成功", f"游戏模式已设置为: {self.game_mode_combo.currentText()}") + + def on_get_game_mode(self): + """读取游戏模式(UART版本:发送0x5B命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + if self.uart_comm.send_command(UART_CMD_GET_GAME_MODE, bytearray()): + response = self.uart_comm.receive_response(UART_CMD_GET_GAME_MODE) + if response and len(response) >= 7: + game_mode = response[5] + index = self.game_mode_combo.findData(game_mode) + if index >= 0: + self.game_mode_combo.setCurrentIndex(index) + log_message(LOG_LEVEL_INFO, f"当前游戏模式: {game_mode}", self.log_level) + QMessageBox.information(self, "游戏模式", f"当前游戏模式: {game_mode}\n\n{self.game_mode_combo.currentText()}") + + # ========== LED控制相关方法 ========== + # 改动原因:添加LED控制功能 + + def on_get_led_info(self): + """获取LED信息(UART版本:发送0x4B命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + data = bytearray([self.led_index_spin.value()]) + if self.uart_comm.send_command(UART_CMD_GET_LED_INFO, data): + response = self.uart_comm.receive_response(UART_CMD_GET_LED_INFO) + if response and len(response) >= 22: + led_index = response[5] + led_name_bytes = bytes(response[6:22]) + led_name = led_name_bytes.decode('utf-8', errors='ignore').rstrip('\x00') + + self.led_info_label.setText(f"LED信息: 索引={led_index}, 名称='{led_name}'") + log_message(LOG_LEVEL_INFO, f"LED信息获取成功: 索引={led_index}, 名称='{led_name}'", self.log_level) + QMessageBox.information(self, "LED信息", f"LED索引: {led_index}\nLED名称: {led_name}") + + def on_set_led_switch(self): + """设置LED开关(UART版本:发送0x4C命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + led_switch = self.led_switch_combo.currentIndex() # 0=OFF, 1=ON + led_index = self.led_index_spin.value() + + reply = QMessageBox.question( + self, + "确认设置LED开关", + f"将要设置LED开关为: {'ON (开启)' if led_switch == 1 else 'OFF (关闭)'}\n\n" + f"LED索引: {led_index}\n\n" + f"是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply == QMessageBox.Yes: + data = bytearray([led_index, led_switch]) + if self.uart_comm.send_command(UART_CMD_SET_LED_SWITCH, data): + response = self.uart_comm.receive_response(UART_CMD_SET_LED_SWITCH) + if response and len(response) >= 7: + status = response[5] + if status == 0x00: + log_message(LOG_LEVEL_INFO, f"LED开关设置成功", self.log_level) + QMessageBox.information(self, "成功", f"LED开关已设置为: {'ON (开启)' if led_switch == 1 else 'OFF (关闭)'}") + else: + QMessageBox.warning(self, "失败", f"LED开关设置失败,状态码: 0x{status:02X}") + + def on_get_led_switch(self): + """获取LED开关(UART版本:发送0x4D命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + data = bytearray([self.led_index_spin.value()]) + if self.uart_comm.send_command(UART_CMD_GET_LED_SWITCH, data): + response = self.uart_comm.receive_response(UART_CMD_GET_LED_SWITCH) + if response and len(response) >= 8: + led_index = response[5] + led_switch = response[6] # 0=OFF, 1=ON + + self.led_switch_combo.setCurrentIndex(led_switch) + log_message(LOG_LEVEL_INFO, f"当前LED开关状态: {'ON (开启)' if led_switch == 1 else 'OFF (关闭)'} (索引: {led_index})", self.log_level) + QMessageBox.information(self, "LED开关状态", f"LED索引: {led_index}\nLED开关: {'ON (开启)' if led_switch == 1 else 'OFF (关闭)'}") + + def on_get_led_status(self): + """获取LED状态(UART版本:发送0x4E命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + data = bytearray([self.led_index_spin.value()]) + if self.uart_comm.send_command(UART_CMD_GET_LED_STATUS, data): + response = self.uart_comm.receive_response(UART_CMD_GET_LED_STATUS) + if response and len(response) >= 12: + led_index = response[5] + r = response[6] # R颜色值 + g = response[7] # G颜色值 + b = response[8] # B颜色值 + led_status = response[9] # LED状态 + + status_names = { + 0: "熄灭", + 1: "常亮", + 2: "慢闪", + 3: "快闪", + 4: "呼吸" + } + status_name = status_names.get(led_status, f"未知({led_status})") + + self.led_status_label.setText(f"LED状态: RGB=({r},{g},{b}), 状态={status_name}") + log_message(LOG_LEVEL_INFO, f"LED状态获取成功: 索引={led_index}, RGB=({r},{g},{b}), 状态={status_name}", self.log_level) + QMessageBox.information(self, "LED状态", f"LED索引: {led_index}\nRGB颜色: ({r}, {g}, {b})\n状态: {status_name}") + + def on_get_led_count(self): + """获取LED总数(UART版本:发送0x4F命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + if self.uart_comm.send_command(UART_CMD_GET_LED_COUNT, bytearray()): + response = self.uart_comm.receive_response(UART_CMD_GET_LED_COUNT) + if response and len(response) >= 7: + led_count = response[5] + log_message(LOG_LEVEL_INFO, f"LED总数: {led_count}", self.log_level) + QMessageBox.information(self, "LED总数", f"设备支持的LED总数: {led_count}") + + # ========== UAC模式控制相关方法 ========== + # 改动原因:添加UAC模式控制功能 + + def on_get_uac_mode_info(self): + """获取UAC模式信息(UART版本:发送0x50命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + if self.uart_comm.send_command(UART_CMD_GET_UAC_MODE_INFO, bytearray()): + response = self.uart_comm.receive_response(UART_CMD_GET_UAC_MODE_INFO) + if response and len(response) >= 22: + uac_mode_count = response[5] + mode0_name_bytes = bytes(response[6:14]) + mode1_name_bytes = bytes(response[14:22]) + mode0_name = mode0_name_bytes.decode('utf-8', errors='ignore').rstrip('\x00') + mode1_name = mode1_name_bytes.decode('utf-8', errors='ignore').rstrip('\x00') + + log_message(LOG_LEVEL_INFO, f"UAC模式信息获取成功: 总数={uac_mode_count}, 模式0='{mode0_name}', 模式1='{mode1_name}'", self.log_level) + QMessageBox.information(self, "UAC模式信息", f"UAC模式总数: {uac_mode_count}\n\n模式0: {mode0_name}\n模式1: {mode1_name}") + + def on_set_uac_mode(self): + """设置UAC模式(UART版本:发送0x51命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + uac_mode_index = self.uac_mode_combo.currentIndex() # 0=UAC2.0, 1=UAC1.0 + uac_mode_name = self.uac_mode_combo.currentText() + + reply = QMessageBox.question( + self, + "确认设置UAC模式", + f"将要设置UAC模式为: {uac_mode_name}\n\n" + f"注意:切换到UAC1.0模式时,设备将自动重启。\n\n" + f"是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply == QMessageBox.Yes: + data = bytearray([uac_mode_index]) + if self.uart_comm.send_command(UART_CMD_SET_UAC_MODE, data): + if uac_mode_index == 1: # UAC1.0 - 设备会重启 + log_message(LOG_LEVEL_INFO, f"UAC模式设置为 {uac_mode_name},设备将重启...", self.log_level) + QMessageBox.information(self, "设备重启", f"UAC模式已设置为: {uac_mode_name}\n\n设备正在重启,请稍候重新连接设备。") + else: # UAC2.0 + log_message(LOG_LEVEL_INFO, f"UAC模式设置为 {uac_mode_name} 成功", self.log_level) + QMessageBox.information(self, "成功", f"UAC模式已设置为: {uac_mode_name}") + + def on_get_current_uac_mode(self): + """获取当前UAC模式(UART版本:发送0x52命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + if self.uart_comm.send_command(UART_CMD_GET_CURRENT_UAC_MODE, bytearray()): + response = self.uart_comm.receive_response(UART_CMD_GET_CURRENT_UAC_MODE) + if response and len(response) >= 13: + uac_mode_value = response[5] + uac_mode_name_bytes = bytes(response[6:14]) + uac_mode_name = uac_mode_name_bytes.decode('utf-8', errors='ignore').rstrip('\x00') + + self.current_uac_mode_label.setText(f"当前UAC模式: {uac_mode_name}") + self.uac_mode_combo.setCurrentIndex(uac_mode_value) + + log_message(LOG_LEVEL_INFO, f"当前UAC模式: {uac_mode_name} (值: {uac_mode_value})", self.log_level) + QMessageBox.information(self, "当前UAC模式", f"当前UAC模式: {uac_mode_name}\n\n模式值: {uac_mode_value} (0=UAC2.0, 1=UAC1.0)") + + # ========== EQ使能控制相关方法 ========== + # 改动原因:添加EQ使能控制功能 + + def on_set_eq_enable(self): + """设置EQ使能开关(UART版本:发送0x53命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + eq_enable_index = self.eq_enable_combo.currentIndex() # 0=OFF, 1=ON + eq_enable_name = self.eq_enable_combo.currentText() + + reply = QMessageBox.question( + self, + "确认设置EQ使能开关", + f"将要设置EQ使能开关为: {eq_enable_name}\n\n" + f"注意:eq_enable是全局开关,所有模式共用一个开关。\n\n" + f"是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply == QMessageBox.Yes: + data = bytearray([eq_enable_index]) + if self.uart_comm.send_command(UART_CMD_SET_EQ_ENABLE, data): + response = self.uart_comm.receive_response(UART_CMD_SET_EQ_ENABLE) + if response and len(response) >= 7: + status = response[5] + current_enable = response[6] if len(response) >= 8 else eq_enable_index + + if status == 0x00: + self.eq_enable_combo.setCurrentIndex(current_enable) + log_message(LOG_LEVEL_INFO, f"EQ使能开关设置为 {eq_enable_name} 成功", self.log_level) + QMessageBox.information(self, "成功", f"EQ使能开关已设置为: {'ON (启用)' if current_enable == 1 else 'OFF (禁用)'}") + else: + QMessageBox.warning(self, "失败", f"EQ使能开关设置失败,状态码: 0x{status:02X}") + + def on_get_eq_enable(self): + """获取EQ使能开关(UART版本:发送0x54命令)""" + if not self.uart_comm.is_connected: + QMessageBox.warning(self, "错误", "请先连接串口") + return + + if self.uart_comm.send_command(UART_CMD_GET_EQ_ENABLE, bytearray()): + response = self.uart_comm.receive_response(UART_CMD_GET_EQ_ENABLE) + if response and len(response) >= 7: + eq_enable = response[5] + + self.eq_enable_combo.setCurrentIndex(eq_enable) + + log_message(LOG_LEVEL_INFO, f"当前EQ使能开关状态: {'ON (启用)' if eq_enable == 1 else 'OFF (禁用)'} (全局开关)", self.log_level) + QMessageBox.information(self, "EQ使能开关状态", f"EQ使能开关: {'ON (启用)' if eq_enable == 1 else 'OFF (禁用)'}") + + +if __name__ == "__main__": + app = QApplication([]) + window = EQDesigner() + window.show() + app.exec() + diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_flash_storage.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_flash_storage.c new file mode 100644 index 0000000..5058e9d --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_flash_storage.c @@ -0,0 +1,2107 @@ +#define DEBUG_PRINT_ENABLE 0 +#include +#include +#include +#include +#include +#include "xmath/xmath.h" +#include "eq.h" +#include "eq_flash_storage.h" +#include "lfs_io.h" +#include "lfs.h" +#include "eq_coefficient_calculator.h" +#include "debug_print.h" + +#if 0 // DEBUG_PRINT_ENABLE +#define DPRINTF(...) printf(__VA_ARGS__) +#else +#define DPRINTF(...) +#endif +// 外部函数声明 +extern uint32_t get_reference_time(void); +extern lfs_t lfs; +void delay_milliseconds(unsigned int); +extern void print_float(float value, int precision); +#define FILE_PATH_MAX_LENGTH 30 + +// EQ Flash存储目录和文件名全局变量定义(默认值) +// 改动原因:统一管理所有EQ相关文件的存储路径,便于支持不同产品的参数存储 +#if 0 +#if UAC2 == 1 +char *g_eq_flash_base_dir = "uac2"; // 基础目录名 +#elif FPS == 1 +char *g_eq_flash_base_dir = "fps"; // 基础目录名 +#elif SPATIAL_MODE == 1 +char *g_eq_flash_base_dir = "spa"; // 基础目录名 +#else +char *g_eq_flash_base_dir = "default"; // 基础目录名 +#endif +#else +char *g_eq_flash_base_dir = "eq"; // 基础目录名 +#endif +char *g_eq_flash_gains_file = "gains"; // 增益文件名 +char *g_eq_flash_mode_file = "cur_mode"; // 当前模式文件名 +char *g_eq_flash_enable_file = "eq_enable"; // EQ使能开关文件名(独立存储) +char *g_eq_flash_name_prefix = "name_"; // 模式名称文件前缀 + +// 外部EQ数组声明 +// 改动原因:进一步优化EQ参数存储策略,所有采样率共用44100Hz数组 +extern eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS]; +extern void debug_print_eq_mode(eq_mode_data_t *eq_data); +extern unsigned int g_eq_sample_rate; + +// 支持的采样率数组 +static const uint32_t supported_sample_rates[EQ_FLASH_MAX_SAMPLE_RATES] = EQ_SAMPLE_RATES; + +// 存储状态 +static eq_storage_status_t storage_status = {0}; + +// 脏标志数组,用于跟踪哪些模式需要同步到Flash (简化版本,不按采样率分组) +static int dirty_flags[EQ_FLASH_MAX_MODES] = {0}; + +// 增益和模式名称脏标志(分别独立) +static int gain_dirty = 0; +static int name_dirty = 0; + +// 单参数存储数据库 +static eq_single_param_database_t single_param_database = {0}; + +// 内部函数声明 +static int get_sample_rate_index(uint32_t sample_rate); +static int create_eq_directory_structure(void); +// 元数据相关函数已移除,简化存储系统 +static int verify_file_header(const eq_file_header_t *header, uint8_t mode, uint8_t channel); +static eq_mode_data_t (*get_eq_array_ptr(uint32_t sample_rate))[NUM_EQ_MODES][NUM_EQ_CHANS]; + +/** + * @brief 获取采样率在数组中的索引 + * @param sample_rate 采样率 + * @return 索引,-1表示不支持 + */ +static int get_sample_rate_index(uint32_t sample_rate) { + for (int i = 0; i < EQ_FLASH_MAX_SAMPLE_RATES; i++) { + if (supported_sample_rates[i] == sample_rate) { + return i; + } + } + return -1; +} + +/** + * @brief 获取对应采样率的EQ数组指针 + * @param sample_rate 采样率 + * @return EQ数组指针,NULL表示不支持的采样率 + */ +static eq_mode_data_t (*get_eq_array_ptr(uint32_t sample_rate))[NUM_EQ_MODES][NUM_EQ_CHANS] { + // 改动原因:所有采样率共用44100Hz数组 +#if !UAC1 + return &sEQ_data_44100HZ; +#else + return 0; +#endif +} + +/** + * @brief 验证文件头 (简化版本,去除采样率字段) + * @param header 文件头指针 + * @param mode 期望的模式 + * @param channel 期望的通道 + * @return 1: 有效, 0: 无效 + */ +static int verify_file_header(const eq_file_header_t *header, uint8_t mode, uint8_t channel) { + if (!header) return 0; + + return (header->magic == EQ_FLASH_MAGIC && + header->version == EQ_FLASH_VERSION && + header->mode == mode && + header->channel == channel && + header->data_size == sizeof(eq_mode_data_t)); +} + +/** + * @brief 创建EQ目录结构(按需创建) + * @return 0: 成功, -1: 失败 + */ +static int create_eq_directory_structure(void) { + char dir_path[64]; + + DPRINTF("Creating EQ directory structure (on-demand)\n"); + + // 检查主目录是否存在,不存在才创建 + // 改动原因:使用全局变量代替硬编码目录名,支持不同产品 + if (!lfs_file_exists(g_eq_flash_base_dir)) { + lfs_mkdir(&lfs, g_eq_flash_base_dir); + DPRINTF("Created %s directory\n", g_eq_flash_base_dir); + } else { + DPRINTF("%s directory already exists\n", g_eq_flash_base_dir); + } + + // 不再为每个采样率创建子目录,因为同一模式的参数是相同的 + DPRINTF("EQ parameters will be stored without sample rate grouping\n"); + + DPRINTF("EQ directory structure creation completed\n"); + return 0; +} + +// 元数据保存函数已移除,简化存储系统 + +// 元数据加载函数已移除,简化存储系统 + +// 元数据迁移函数已移除,简化存储系统 + +/** + * @brief 初始化EQ Flash存储系统 + * @return 0: 成功, -1: 失败 + */ +int eq_flash_init(void) { + DPRINTF("Initializing EQ Flash storage system\n"); + + // 初始化存储状态 + memset(&storage_status, 0, sizeof(storage_status)); + memset(dirty_flags, 0, sizeof(dirty_flags)); + + // 延迟一段时间,确保QSPI Flash已经初始化完成 + delay_milliseconds(100); + + // 尝试初始化LFS,最多重试3次 + int retry_count = 0; + int lfs_init_result = -1; + + while (retry_count < 3 && lfs_init_result != 0) { + lfs_init_result = lfs_init(); + if (lfs_init_result != 0) { + retry_count++; + DPRINTF("Failed to initialize LFS, retry %d/3\n", retry_count); + if (retry_count < 3) { + delay_milliseconds(200 * retry_count); // 递增延迟 + } + } + } + + if (lfs_init_result != 0) { + DPRINTF("Failed to initialize LFS after %d retries, continuing without Flash storage\n", retry_count); + // 即使LFS初始化失败,也标记为已初始化,系统继续运行 + storage_status.is_initialized = 1; + storage_status.has_flash_data = 0; + return 0; + } + + DPRINTF("LFS initialized successfully\n"); + + // 创建目录结构(按需创建) + create_eq_directory_structure(); + + // 检查是否有现有数据(通过检查目录是否存在) + // 改动原因:使用全局变量代替硬编码目录名 + storage_status.has_flash_data = lfs_file_exists(g_eq_flash_base_dir) ? 1 : 0; + storage_status.is_initialized = 1; + + DPRINTF("EQ Flash storage initialized, has_data: %d\n", storage_status.has_flash_data); + + lfs_deinit(); + return 0; +} + +/** + * @brief 反初始化EQ Flash存储系统 + */ +void eq_flash_deinit(void) { + DPRINTF("Deinitializing EQ Flash storage system\n"); + storage_status.is_initialized = 0; + storage_status.has_flash_data = 0; + memset(dirty_flags, 0, sizeof(dirty_flags)); +} + +// 注意:eq_flash_load_all 函数已移除,现在使用动态单参数存储系统 + +// 注意:eq_flash_save_all 函数已移除,现在使用动态单参数存储系统 + +/** + * @brief 从Flash加载指定模式的EQ参数 + * @param mode EQ模式 + * @return 0: 成功, -1: 失败 + */ +int eq_flash_load_mode(uint8_t mode) { + //DPRINTF("Loading EQ mode %d from Flash\n", mode); + + if (!storage_status.is_initialized) { + DPRINTF(" Error: EQ Flash storage not initialized\n"); + return -1; + } + + if (mode >= NUM_EQ_MODES) { + DPRINTF(" Error: Invalid mode %d (max: %d)\n", mode, NUM_EQ_MODES - 1); + return -1; + } + + // 获取当前采样率的EQ数组指针 + eq_mode_data_t (*eq_array)[NUM_EQ_MODES][NUM_EQ_CHANS] = get_eq_array_ptr(g_eq_sample_rate); + if (!eq_array) { + DPRINTF(" Error: Failed to get EQ array for current sample rate %lu\n", (unsigned long)g_eq_sample_rate); + return -1; + } + + // 加载左右两个声道的数据 + for (int ch = 0; ch < NUM_EQ_CHANS; ch++) { + // 构建文件路径 + // 改动原因:使用全局变量代替硬编码目录名,统一文件路径管理 + char file_path[FILE_PATH_MAX_LENGTH]; + snprintf(file_path, sizeof(file_path), "%s/mode%d_ch%d.bin", g_eq_flash_base_dir, mode, ch); + DPRINTF(" File path (channel %d): %s\n", ch, file_path); + + // 检查文件是否存在 + if (!lfs_file_exists(file_path)) { + DPRINTF(" ****************** file is not exist (ch %d), initializing with default values\n", ch); + // 文件不存在,使用默认值初始化当前通道 + eq_mode_data_t *eq_data = &(*eq_array)[mode][ch]; + memset(eq_data, 0, sizeof(eq_mode_data_t)); + eq_data->sample_rate = g_eq_sample_rate; + eq_data->total_bshift = 0; + eq_data->post_gain_db = 0; + + // 初始化bands数组为默认值 + for (int i = 0; i < MAX_EQ_BANDS; i++) { + eq_data->bands[i].index = i; + eq_data->bands[i].type = FILTER_TYPE_BYPASS; + eq_data->bands[i].fc = 1000.0f; + eq_data->bands[i].q = 0.707f; + eq_data->bands[i].bw = 1.0f; + eq_data->bands[i].gain = 0.0f; + } + + // 初始化filter系数为默认值 + for (int i = 0; i < 8; i++) { + eq_data->filter.coef[0][i] = 1 << 30; // b0 = 1.0 in Q30 + eq_data->filter.coef[1][i] = 0; // b1 = 0 + eq_data->filter.coef[2][i] = 0; // b2 = 0 + eq_data->filter.coef[3][i] = 0; // a1 = 0 + eq_data->filter.coef[4][i] = 0; // a2 = 0 + } + + DPRINTF(" Initialized with default values for mode %d, channel %d\n", mode, ch); + continue; // 继续处理下一个通道 + } + + // 准备读取缓冲区 + eq_file_header_t header; + eq_flash_data_t flash_data; + uint8_t file_data[sizeof(header) + sizeof(flash_data)]; + + // 使用lfs_read_config读取文件 + DPRINTF(" Read file data, size: %zu bytes\n", sizeof(file_data)); + lfs_read_config(file_path, file_data, sizeof(file_data)); + + // 解析文件数据 + memcpy(&header, file_data, sizeof(header)); + memcpy(&flash_data, file_data + sizeof(header), sizeof(flash_data)); + + // 检查文件头基本信息 + DPRINTF(" File header: magic=0x%08X, version=%u, mode=%u\n", + header.magic, header.version, header.mode); + + // 验证文件头 + DPRINTF(" Verifying file header:\n"); + DPRINTF(" Expected: magic=0x%08X, version=%u, mode=%u, channel=%d, data_size=%zu\n", + EQ_FLASH_MAGIC, EQ_FLASH_VERSION, mode, ch, sizeof(eq_flash_data_t)); + DPRINTF(" Actual: magic=0x%08X, version=%u, mode=%u, channel=%u, data_size=%u\n", + header.magic, header.version, header.mode, header.channel, header.data_size); + + if (!verify_file_header(&header, mode, ch)) { + DPRINTF(" Invalid file header for mode %d, channel %d\n", mode, ch); + // 文件头验证失败,使用默认值初始化当前通道 + eq_mode_data_t *eq_data = &(*eq_array)[mode][ch]; + memset(eq_data, 0, sizeof(eq_mode_data_t)); + eq_data->sample_rate = g_eq_sample_rate; + eq_data->total_bshift = 0; + eq_data->post_gain_db = 0; + + // 初始化bands数组为默认值 + for (int i = 0; i < MAX_EQ_BANDS; i++) { + eq_data->bands[i].index = i; + eq_data->bands[i].type = FILTER_TYPE_BYPASS; + eq_data->bands[i].fc = 1000.0f; + eq_data->bands[i].q = 0.707f; + eq_data->bands[i].bw = 1.0f; + eq_data->bands[i].gain = 0.0f; + } + + // 初始化filter系数为默认值 + for (int i = 0; i < 8; i++) { + eq_data->filter.coef[0][i] = 1 << 30; // b0 = 1.0 in Q30 + eq_data->filter.coef[1][i] = 0; // b1 = 0 + eq_data->filter.coef[2][i] = 0; // b2 = 0 + eq_data->filter.coef[3][i] = 0; // a1 = 0 + eq_data->filter.coef[4][i] = 0; // a2 = 0 + } + + DPRINTF(" Initialized with default values for mode %d, channel %d\n", mode, ch); + continue; // 继续处理下一个通道 + } + + // 验证CRC32 + uint32_t calculated_crc = eq_flash_calculate_crc32((uint8_t*)&flash_data, sizeof(flash_data)); + if (calculated_crc != header.crc32) { + DPRINTF(" CRC32 mismatch for mode %d, sample rate %lu, channel %d\n", mode, (unsigned long)g_eq_sample_rate, ch); + // CRC32验证失败,使用默认值初始化当前通道 + eq_mode_data_t *eq_data = &(*eq_array)[mode][ch]; + memset(eq_data, 0, sizeof(eq_mode_data_t)); + eq_data->sample_rate = g_eq_sample_rate; + eq_data->total_bshift = 0; + eq_data->post_gain_db = 0; + + // 初始化bands数组为默认值 + for (int i = 0; i < MAX_EQ_BANDS; i++) { + eq_data->bands[i].index = i; + eq_data->bands[i].type = FILTER_TYPE_BYPASS; + eq_data->bands[i].fc = 1000.0f; + eq_data->bands[i].q = 0.707f; + eq_data->bands[i].bw = 1.0f; + eq_data->bands[i].gain = 0.0f; + } + + // 初始化filter系数为默认值 + for (int i = 0; i < 8; i++) { + eq_data->filter.coef[0][i] = 1 << 30; // b0 = 1.0 in Q30 + eq_data->filter.coef[1][i] = 0; // b1 = 0 + eq_data->filter.coef[2][i] = 0; // b2 = 0 + eq_data->filter.coef[3][i] = 0; // a1 = 0 + eq_data->filter.coef[4][i] = 0; // a2 = 0 + } + + DPRINTF(" Initialized with default values due to CRC32 mismatch for channel %d\n", ch); + continue; // 继续处理下一个通道 + } + + // 将Flash数据加载到EQ数组 + eq_mode_data_t *eq_data = &(*eq_array)[mode][ch]; + + // 检查Flash数据的完整性 + DPRINTF(" Flash data before restore (ch %d): active_bands_count=%d\n", + ch, flash_data.active_bands_count); + + DPRINTF(" EQ array after copy (ch %d): sample_rate=%u, post_gain_db=%ld\n", + ch, eq_data->sample_rate, (long)eq_data->post_gain_db); + DPRINTF(" EQ array total_bshift=%ld\n", + (long)eq_data->total_bshift); + + + // 检查内存地址是否有效 + if (eq_data == NULL) { + DPRINTF(" ERROR: eq_data is NULL\n"); + continue; // 继续处理下一个通道 + } + + DPRINTF(" eq_data address: %p\n", (void*)eq_data); + DPRINTF(" eq_data size: %zu bytes\n", sizeof(eq_mode_data_t)); + + // 检查bands数组地址是否有效 + DPRINTF(" bands array address: %p\n", (void*)&eq_data->bands); + DPRINTF(" bands array size: %zu bytes\n", sizeof(eq_data->bands)); + + // 检查bands数组偏移量 + DPRINTF(" bands offset in struct: %zu bytes\n", (size_t)&eq_data->bands - (size_t)eq_data); + + // 检查第一个band的地址 + DPRINTF(" bands[0] address: %p\n", (void*)&eq_data->bands[0]); + DPRINTF(" bands[0] size: %zu bytes\n", sizeof(eq_data->bands[0])); + + // 检查内存对齐 + DPRINTF(" eq_data alignment: %zu\n", (size_t)eq_data % 4); + DPRINTF(" bands alignment: %zu\n", (size_t)&eq_data->bands % 4); + + // 尝试安全地访问第一个band + DPRINTF(" Attempting to access bands[0]...\n"); + + // 先检查bands[0]的地址是否在合理范围内 + if ((size_t)&eq_data->bands[0] < (size_t)eq_data || + (size_t)&eq_data->bands[0] > (size_t)eq_data + sizeof(eq_mode_data_t)) { + DPRINTF(" ERROR: bands[0] address out of range\n"); + continue; // 继续处理下一个通道 + } + + // 暂时注释掉有问题的调试代码 + DPRINTF(" Accessing bands[0].index...\n"); + DPRINTF(" bands[0].index = %d\n", eq_data->bands[0].index); + + DPRINTF(" Accessing bands[0].type...\n"); + DPRINTF(" bands[0].type = %d\n", eq_data->bands[0].type); + + DPRINTF(" Accessing bands[0].fc...\n"); + DPRINTF(" bands[0].fc = %d.%02d Hz\n", (int)eq_data->bands[0].fc, (int)((eq_data->bands[0].fc - (int)eq_data->bands[0].fc) * 100)); + + DPRINTF(" Accessing bands[0].q...\n"); + DPRINTF(" bands[0].q = %d.%04d\n", (int)eq_data->bands[0].q, (int)((eq_data->bands[0].q - (int)eq_data->bands[0].q) * 10000)); + + DPRINTF(" Successfully loaded EQ parameters for mode %d, channel %d\n", mode, ch); + } + + return 0; +} + +/** + * @brief 检查滤波器是否为默认值(bypass) + * @param band 滤波器参数 + * @return 1: 是默认值, 0: 不是默认值 + */ +int is_filter_bypass(const filter_params_t *band) { + if (band == NULL) return 1; + + // 检查是否为bypass类型 + if (band->type != FILTER_TYPE_BYPASS) return 0; + + // 检查其他参数是否为默认值 + if (band->fc != 1000.0f) return 0; + if (band->q != 0.707f) return 0; + if (band->bw != 1.0f) return 0; + if (band->gain != 0.0f) return 0; + + return 1; +} + +/** + * @brief 从EQ数据中提取非默认滤波器到Flash存储格式 + * @param eq_data 源EQ数据 + * @param flash_data 目标Flash存储数据 + * @return 0: 成功, -1: 失败 + */ +int extract_active_filters(const eq_mode_data_t *eq_data, eq_flash_data_t *flash_data) { + if (eq_data == NULL || flash_data == NULL) return -1; + + flash_data->active_bands_count = 0; + + // 遍历所有滤波器,只保存非bypass的 + for (int i = 0; i < MAX_EQ_BANDS; i++) { + if (!is_filter_bypass(&eq_data->bands[i])) { + if (flash_data->active_bands_count >= MAX_EQ_BANDS) { + DPRINTF(" Warning: Too many active filters, truncating\n"); + break; + } + + // 复制非默认滤波器 + flash_data->active_bands[flash_data->active_bands_count] = eq_data->bands[i]; + flash_data->active_bands[flash_data->active_bands_count].index = flash_data->active_bands_count; + flash_data->active_bands_count++; + } + } + + DPRINTF(" Extracted %d active filters from %d total filters\n", + flash_data->active_bands_count, MAX_EQ_BANDS); + + return 0; +} + +/** + * @brief 从Flash存储格式恢复EQ数据 + * @param flash_data 源Flash存储数据 + * @param eq_data 目标EQ数据 + * @return 0: 成功, -1: 失败 + */ +int restore_eq_from_flash(const eq_flash_data_t *flash_data, eq_mode_data_t *eq_data) { + if (flash_data == NULL || eq_data == NULL) return -1; + + // 初始化所有滤波器为bypass + for (int i = 0; i < MAX_EQ_BANDS; i++) { + eq_data->bands[i].index = i; + eq_data->bands[i].type = FILTER_TYPE_BYPASS; + eq_data->bands[i].fc = 1000.0f; + eq_data->bands[i].q = 0.707f; + eq_data->bands[i].bw = 1.0f; + eq_data->bands[i].gain = 0.0f; + } + + // 恢复非默认滤波器 + for (int i = 0; i < flash_data->active_bands_count && i < MAX_EQ_BANDS; i++) { + int target_index = flash_data->active_bands[i].index; + if (target_index >= 0 && target_index < MAX_EQ_BANDS) { + eq_data->bands[target_index] = flash_data->active_bands[i]; + } + } + + DPRINTF(" Restored %d active filters to EQ data\n", flash_data->active_bands_count); + + return 0; +} + +// ==================== 单参数动态存储系统实现 ==================== + +/** + * @brief 初始化单参数存储数据库 + * @return 0: 成功, -1: 失败 + */ +int eq_single_param_database_init(void) { + DPRINTF("Initializing single parameter storage database\n"); + + memset(&single_param_database, 0, sizeof(single_param_database)); + single_param_database.max_params = MAX_EQ_BANDS * 8 * 2; // 最多8个模式×2通道的所有参数 + single_param_database.param_count = 0; + single_param_database.last_save_time = 0; + + DPRINTF(" Single parameter database initialized: max_params=%d\n", single_param_database.max_params); + return 0; +} + +/** + * @brief 处理0x8c/0x8d命令的单参数变化 + * @param data 接收到的数据 + * @param len 数据长度 + * @return 0: 成功, -1: 失败 + */ +int eq_process_single_param_change(uint32_t sample_rate, uint8_t mode, uint8_t channel, uint8_t band_index, filter_params_t *band) { + DPRINTF("Processing single parameter change: rate=%u, mode=%d, ch=%d, band=%d\n", + sample_rate, mode, channel, band_index); + + DPRINTF("fc="); + print_float(band->fc, 6); + DPRINTF(", q="); + print_float(band->q, 6); + DPRINTF(", bw="); + print_float(band->bw, 6); + DPRINTF(", gain="); + print_float(band->gain, 6); + DPRINTF("\n"); + + // 比较参数是否不同 + DPRINTF(" Single parameter changed, adding to database\n"); + + // 添加到单参数数据库 + if (eq_add_single_param(sample_rate, mode, channel, band_index, band) == 0) { + DPRINTF(" Single parameter change recorded successfully\n"); + // 标记为脏数据 + dirty_flags[mode] = 1; + DPRINTF(" Marked mode %d as dirty\n", mode); + + return 0; + } else { + DPRINTF(" Error: Failed to add single parameter change to database\n"); + return -1; + } +} + +/** + * @brief 比较单个参数是否不同 + * @param old_params 旧参数 + * @param new_params 新参数 + * @return 1: 不同, 0: 相同 + */ +int eq_single_params_different(const filter_params_t *old_params, const filter_params_t *new_params) { + if (old_params == NULL || new_params == NULL) return 1; + + // 比较各个字段 + if (old_params->type != new_params->type) return 1; + if (fabsf(old_params->fc - new_params->fc) > 0.01f) return 1; + if (fabsf(old_params->q - new_params->q) > 0.0001f) return 1; + if (fabsf(old_params->bw - new_params->bw) > 0.01f) return 1; + if (fabsf(old_params->gain - new_params->gain) > 0.01f) return 1; + + return 0; +} + +/** + * @brief 添加单个参数变化到数据库 + * @param sample_rate 采样率 + * @param mode 模式 + * @param channel 通道 + * @param band_index 滤波器索引 + * @param new_params 新参数 + * @return 0: 成功, -1: 失败 + */ +int eq_add_single_param(uint32_t sample_rate, uint8_t mode, uint8_t channel, + uint8_t band_index, const filter_params_t *new_params) { + if (new_params == NULL) return -1; + + // 检查是否已存在相同的参数记录 + for (int i = 0; i < single_param_database.param_count; i++) { + eq_single_param_t *param = &single_param_database.params[i]; + if (param->sample_rate == sample_rate && + param->mode == mode && + param->channel == channel && + param->band_index == band_index) { + // 更新现有记录 + param->params = *new_params; + param->timestamp = get_reference_time(); + param->is_dirty = 1; + DPRINTF(" Updated existing single parameter: rate=%u, mode=%d, ch=%d, band=%d\n", + sample_rate, mode, channel, band_index); + return 0; + } + } + + // 检查数据库是否已满 + if (single_param_database.param_count >= single_param_database.max_params) { + DPRINTF(" Warning: Single parameter database full, overwriting oldest entry\n"); + // 移动所有条目向前一位,覆盖最旧的 + memmove(&single_param_database.params[0], &single_param_database.params[1], + (single_param_database.max_params - 1) * sizeof(eq_single_param_t)); + single_param_database.param_count--; + } + + // 添加新参数 + eq_single_param_t *param = &single_param_database.params[single_param_database.param_count]; + param->sample_rate = sample_rate; + param->mode = mode; + param->channel = channel; + param->band_index = band_index; + param->params = *new_params; + param->timestamp = get_reference_time(); + param->is_dirty = 1; + + single_param_database.param_count++; + + DPRINTF(" Added single parameter: rate=%u, mode=%d, ch=%d, band=%d, count=%d\n", + sample_rate, mode, channel, band_index, single_param_database.param_count); + + return 0; +} + +/** + * @brief 保存单个参数到Flash + * @param sample_rate 采样率 + * @param mode 模式 + * @param channel 通道 + * @param band_index 滤波器索引 + * @return 0: 成功, -1: 失败 + */ +int eq_save_single_param(uint32_t sample_rate, uint8_t mode, uint8_t channel, uint8_t band_index) { + if (mode < EQ_USER_MODE_MIN || mode > EQ_USER_MODE_MAX ) { + return -1; + } + DPRINTF("Saving single parameter to Flash: mode=%d, ch=%d, band=%d (applying to all sample rates)\n", + mode, channel, band_index); + + if (!storage_status.is_initialized) { + DPRINTF(" Error: Flash storage not initialized\n"); + return -1; + } + + // 构建单个参数文件路径 - 简化格式:只存储mode和band信息 + // 改动原因:使用全局变量代替硬编码目录名,统一文件路径管理 + char file_path[FILE_PATH_MAX_LENGTH]; + snprintf(file_path, sizeof(file_path), "%s/mode%d_band%d.bin", + g_eq_flash_base_dir, mode, band_index); + + // 改动原因:优化EQ参数存储策略,统一参数源为44100Hz + // 保存参数时,总是从44100Hz读取参数,确保参数一致性 + eq_mode_data_t (*eq_array)[NUM_EQ_MODES][NUM_EQ_CHANS] = get_eq_array_ptr(44100); + if (!eq_array) { + DPRINTF(" Error: Failed to get EQ array for sample rate 44100 (unified source)\n"); + return -1; + } + + // 从44100Hz统一参数源读取参数 + filter_params_t *param = &(*eq_array)[mode][channel].bands[band_index]; + + // 创建文件头 + eq_file_header_t header; + header.magic = EQ_FLASH_MAGIC; + header.version = EQ_FLASH_VERSION; + header.mode = mode; + header.channel = 0; // 固定为channel 0,因为只存储channel 0的参数 + header.reserved = band_index; // 使用reserved字段存储band_index + header.data_size = sizeof(filter_params_t); + header.crc32 = eq_flash_calculate_crc32((uint8_t*)param, sizeof(filter_params_t)); + + // 创建文件数据 + uint8_t file_data[sizeof(header) + sizeof(filter_params_t)]; + memcpy(file_data, &header, sizeof(header)); + memcpy(file_data + sizeof(header), param, sizeof(filter_params_t)); + + // 写入文件 + lfs_write_config(file_path, file_data, sizeof(file_data)); + + DPRINTF(" Successfully saved single parameter to %s\n", file_path); + + // 改动原因:优化EQ参数存储策略,参数保存后需要同步到44100Hz并更新所有采样率 + // 确保44100Hz作为统一参数源,然后通过copy_params_from_44100函数同步到其他采样率 + // 注意:这里只保存参数,系数会在切换采样率时动态计算 + // 参数已经保存到Flash,加载时会自动应用到所有采样率 + + return 0; +} + +/** + * @brief 从Flash加载单个参数 + * @param sample_rate 采样率 + * @param mode 模式 + * @param channel 通道 + * @param band_index 滤波器索引 + * @return 0: 成功, -1: 失败 + */ +int eq_load_single_param(uint32_t sample_rate, uint8_t mode, uint8_t channel, uint8_t band_index) { + if (mode < EQ_USER_MODE_MIN || mode > EQ_USER_MODE_MAX ) { + return -1; + } + DPRINTF("Loading single parameter from Flash: mode=%d, ch=%d, band=%d (applying to all sample rates)\n", + mode, channel, band_index); + + if (!storage_status.is_initialized) { + DPRINTF(" Error: Flash storage not initialized\n"); + return -1; + } + + // 构建单个参数文件路径 - 简化格式:只存储mode和band信息 + // 改动原因:使用全局变量代替硬编码目录名,统一文件路径管理 + char file_path[FILE_PATH_MAX_LENGTH]; + snprintf(file_path, sizeof(file_path), "%s/mode%d_band%d.bin", + g_eq_flash_base_dir, mode, band_index); + + // 检查文件是否存在 + if (!lfs_file_exists(file_path)) { + DPRINTF(" Single parameter file does not exist: %s\n", file_path); + return -1; + } + + // 准备读取缓冲区 + eq_file_header_t header; + filter_params_t param; + uint8_t file_data[sizeof(header) + sizeof(filter_params_t)]; + + // 读取文件 + lfs_read_config(file_path, file_data, sizeof(file_data)); + + // 解析文件数据 + memcpy(&header, file_data, sizeof(header)); + memcpy(¶m, file_data + sizeof(header), sizeof(filter_params_t)); + + // 验证文件头 + if (header.magic != EQ_FLASH_MAGIC || + header.version != EQ_FLASH_VERSION || + header.mode != mode || + header.channel != 0 || // 固定验证channel为0 + header.reserved != band_index) { + DPRINTF(" Error: Invalid single parameter file header\n"); + return -1; + } + + // 验证CRC32 + uint32_t calculated_crc = eq_flash_calculate_crc32((uint8_t*)¶m, sizeof(filter_params_t)); + if (calculated_crc != header.crc32) { + DPRINTF(" Error: CRC32 mismatch for single parameter\n"); + return -1; + } + + // 为所有采样率应用参数到两个通道并计算系数 + for (int i = 0; i < EQ_FLASH_MAX_SAMPLE_RATES; i++) { + uint32_t fs = supported_sample_rates[i]; + eq_mode_data_t (*eq_array)[NUM_EQ_MODES][NUM_EQ_CHANS] = get_eq_array_ptr(fs); + if (eq_array) { + // 应用到两个通道 + (*eq_array)[mode][0].bands[band_index] = param; + (*eq_array)[mode][1].bands[band_index] = param; + DPRINTF(" Applied parameter to sample rate %u (both channels)\n", fs); + DPRINTF(" fc="); + print_float(param.fc, 6); + DPRINTF(", q="); + print_float(param.q, 6); + DPRINTF(", bw="); + print_float(param.bw, 6); + DPRINTF(", gain="); + print_float(param.gain, 6); + DPRINTF("\n"); + } else { + DPRINTF(" Error: Failed to get EQ array for sample rate %u\n", fs); + } + } + + DPRINTF(" Successfully loaded single parameter: type=%d\n", param.type); + + return 0; +} + +/** + * @brief 保存所有脏参数到Flash + * @return 0: 成功, -1: 失败 + */ +int eq_save_dirty_params(void) { + //DPRINTF("Saving dirty single parameters to Flash\n"); + + if (!storage_status.is_initialized) { + DPRINTF(" Error: Flash storage not initialized\n"); + return -1; + } + + //DPRINTF(" Single param database count: %d\n", single_param_database.param_count); + + int saved_count = 0; + + // 遍历所有脏参数,但只保存一次(不按采样率分组) + bool saved_params[EQ_FLASH_MAX_MODES][NUM_EQ_CHANS][MAX_EQ_BANDS] = {0}; // 记录已保存的参数 + + for (int i = 0; i < single_param_database.param_count; i++) { + eq_single_param_t *param = &single_param_database.params[i]; + + DPRINTF(" Checking param %d: mode=%d, ch=%d, band=%d, dirty=%d\n", + i, param->mode, param->channel, param->band_index, param->is_dirty); + + if (param->is_dirty && !saved_params[param->mode][param->channel][param->band_index]) { + DPRINTF(" Saving dirty single parameter: mode=%d, ch=%d, band=%d (applying to all sample rates)\n", + param->mode, param->channel, param->band_index); + if (param->mode < EQ_USER_MODE_MIN || param->mode > EQ_USER_MODE_MAX ) { + printf(" Invalid mode %d, only user modes (%d-%d) can be saved\n", param->mode, EQ_USER_MODE_MIN, EQ_USER_MODE_MAX); + continue; + } + if (eq_save_single_param(param->sample_rate, param->mode, param->channel, param->band_index) == 0) { + // 标记所有相同模式的参数为已保存 + for (int j = 0; j < single_param_database.param_count; j++) { + eq_single_param_t *p = &single_param_database.params[j]; + if (p->mode == param->mode && p->channel == param->channel && p->band_index == param->band_index) { + p->is_dirty = 0; + } + } + saved_params[param->mode][param->channel][param->band_index] = true; + saved_count++; + DPRINTF(" Successfully saved single parameter\n"); + } else { + DPRINTF(" Error: Failed to save single parameter\n"); + } + } + } + + if (saved_count > 0) { + DPRINTF(" Saved %d dirty single parameters\n", saved_count); + } + return 0; +} +/** + * @brief 保存脏的增益到Flash + * @return 0: 成功, -1: 失败 + */ +int eq_save_dirty_gain(void) { + if (!storage_status.is_initialized) { + DPRINTF(" Error: Flash storage not initialized\n"); + return -1; + } + + // 检查是否有脏的增益 + if (!gain_dirty) { + DPRINTF(" No dirty gain to save\n"); + return 0; + } + + DPRINTF(" Saving dirty gain\n"); + // 使用新的独立保存函数 + if (eq_save_gain() == 0) { + gain_dirty = 0; // 只清除增益脏标志 + DPRINTF(" Successfully saved gain\n"); + return 0; + } else { + DPRINTF(" Error: Failed to save gain\n"); + return -1; + } +} +/** + * @brief 保存脏的模式名称到Flash + * @return 0: 成功, -1: 失败 + */ +int eq_save_dirty_names(void) { + if (!storage_status.is_initialized) { + DPRINTF(" Error: Flash storage not initialized\n"); + return -1; + } + + // 检查是否有脏的模式名称 + if (!name_dirty) { + DPRINTF(" No dirty mode names to save\n"); + return 0; + } + + DPRINTF(" Saving dirty mode names\n"); + // 使用新的独立保存函数,逐个保存每个用户模式的name + int saved_count = 0; + int skipped_count = 0; + + for (int i = EQ_USER_MODE_MIN; i <= EQ_USER_MODE_MAX; i++) { + int result = eq_save_name(i); + if (result == 0) { + saved_count++; + } else if (result == 1) { + skipped_count++; // 跳过(与初始值相同或为空) + } + // result == -1 表示错误,但继续处理其他模式 + } + + name_dirty = 0; // 清除名称脏标志(无论是否保存成功) + + if (saved_count > 0) { + DPRINTF(" Successfully saved %d mode name(s), skipped %d\n", saved_count, skipped_count); + return 0; + } else if (skipped_count > 0) { + DPRINTF(" All mode names skipped (same as default or empty), %d skipped\n", skipped_count); + return 0; // 跳过是正常的,不算错误 + } else { + DPRINTF(" Error: Failed to save mode names\n"); + return -1; + } +} + +/** + * @brief 保存用户模式的增益到Flash(只保存用户模式6-8) + * @return 0: 成功, -1: 失败 + */ +int eq_save_gain(void) { + DPRINTF("Saving user mode gains to Flash\n"); + + if (!storage_status.is_initialized) { + DPRINTF(" Error: Flash storage not initialized\n"); + return -1; + } + + // 构建文件路径 + // 改动原因:使用全局变量代替硬编码文件名,统一文件路径管理,将文件存储到基础目录下 + char file_path[FILE_PATH_MAX_LENGTH]; + snprintf(file_path, sizeof(file_path), "%s/%s", g_eq_flash_base_dir, g_eq_flash_gains_file); + + // 准备数据(只存储用户模式6-8的gain) + eq_gain_data_t data = {0}; + + // 从全局模式信息中获取数据 + extern eq_mode_info_t g_mode_info; + + // 只复制用户模式(6-8)的增益数据 + for (int i = EQ_USER_MODE_MIN; i <= EQ_USER_MODE_MAX; i++) { + int idx = i - EQ_USER_MODE_MIN; // 转换为数组索引 0, 1, 2 + data.mode_gains[idx] = g_mode_info.mode_gains[i]; + debug_printf(" Saving user mode %d: gain=%d\n", i, data.mode_gains[idx]); + } + + // 创建文件头 + eq_gain_header_t header; + header.magic = 0x4551474E; // "EQGN" + header.version = EQ_FLASH_VERSION; + header.data_size = sizeof(eq_gain_data_t); + header.crc32 = eq_flash_calculate_crc32((uint8_t*)&data, sizeof(eq_gain_data_t)); + + // 创建文件数据 + uint8_t file_data[sizeof(header) + sizeof(eq_gain_data_t)]; + memcpy(file_data, &header, sizeof(header)); + memcpy(file_data + sizeof(header), &data, sizeof(eq_gain_data_t)); + + // 写入文件 + lfs_write_config(file_path, file_data, sizeof(file_data)); + + DPRINTF(" Successfully saved gains to %s\n", file_path); + return 0; +} + +/** + * @brief 保存单个用户模式的名称到Flash(只有与初始值不同且非空才保存) + * @param mode 模式号(必须是用户模式6-8) + * @return 0: 成功, -1: 失败, 1: 跳过(与初始值相同或为空) + */ +int eq_save_name(uint8_t mode) { + if (mode < EQ_USER_MODE_MIN || mode > EQ_USER_MODE_MAX) { + DPRINTF(" Error: Invalid mode %d, only user modes (%d-%d) can be saved\n", + mode, EQ_USER_MODE_MIN, EQ_USER_MODE_MAX); + return -1; + } + + if (!storage_status.is_initialized) { + DPRINTF(" Error: Flash storage not initialized\n"); + return -1; + } + + // 从全局模式信息中获取当前名称 + extern eq_mode_info_t g_mode_info; + const char* current_name = g_mode_info.mode_names[mode]; + + // 获取初始默认名称 + const char* default_names[] = {"user 1", "user 2", "user 3"}; + int idx = mode - EQ_USER_MODE_MIN; // 转换为数组索引 0, 1, 2 + const char* default_name = default_names[idx]; + + // 检查是否与初始值相同 + if (strncmp(current_name, default_name, 15) == 0) { + DPRINTF(" Mode %d name '%s' is same as default, skip saving\n", mode, current_name); + return 1; // 跳过保存 + } + + // 检查是否为空(全0或全空格) + bool name_is_empty = true; + if (current_name[0] != '\0') { + for (int i = 0; i < 16 && current_name[i] != '\0'; i++) { + if (current_name[i] != ' ') { + name_is_empty = false; + break; + } + } + } + + if (name_is_empty) { + DPRINTF(" Mode %d name is empty, skip saving\n", mode); + // 如果文件存在,删除它 + // 改动原因:使用全局变量代替硬编码文件名,统一文件路径管理,将文件存储到基础目录下 + char file_path[FILE_PATH_MAX_LENGTH]; + snprintf(file_path, sizeof(file_path), "%s/%s%d", g_eq_flash_base_dir, g_eq_flash_name_prefix, mode); + if (lfs_file_exists(file_path)) { + // 删除文件(通过写入空文件或使用删除函数) + DPRINTF(" Deleting empty name file: %s\n", file_path); + // 注意:LittleFS可能没有直接的删除函数,可以通过写入空文件或标记删除 + } + return 1; // 跳过保存 + } + + DPRINTF("Saving user mode %d name to Flash: '%s'\n", mode, current_name); + + // 构建文件路径 + // 改动原因:使用全局变量代替硬编码文件名,统一文件路径管理,将文件存储到基础目录下 + char file_path[FILE_PATH_MAX_LENGTH]; + snprintf(file_path, sizeof(file_path), "%s/%s%d", g_eq_flash_base_dir, g_eq_flash_name_prefix, mode); + + // 准备数据 + eq_name_data_t data = {0}; + strncpy(data.mode_name, current_name, 15); + data.mode_name[15] = '\0'; // 确保字符串终止 + + // 创建文件头 + eq_name_header_t header; + header.magic = 0x45514E4D; // "EQNM" + header.version = EQ_FLASH_VERSION; + header.mode = mode; + header.reserved[0] = 0; + header.reserved[1] = 0; + header.reserved[2] = 0; + header.data_size = sizeof(eq_name_data_t); + header.crc32 = eq_flash_calculate_crc32((uint8_t*)&data, sizeof(eq_name_data_t)); + + // 创建文件数据 + uint8_t file_data[sizeof(header) + sizeof(eq_name_data_t)]; + memcpy(file_data, &header, sizeof(header)); + memcpy(file_data + sizeof(header), &data, sizeof(eq_name_data_t)); + + // 写入文件 + lfs_write_config(file_path, file_data, sizeof(file_data)); + + DPRINTF(" Successfully saved mode %d name to %s\n", mode, file_path); + return 0; +} + +/** + * @brief 保存增益和模式名称到Flash(兼容旧接口,内部调用新函数) + * @return 0: 成功, -1: 失败 + */ +int eq_save_gain_and_names(void) { + int ret = 0; + + // 保存gain + if (eq_save_gain() != 0) { + ret = -1; + } + + // 保存每个用户模式的name(如果与初始值不同且非空) + for (int i = EQ_USER_MODE_MIN; i <= EQ_USER_MODE_MAX; i++) { + int result = eq_save_name(i); + if (result == -1) { + ret = -1; // 错误 + } + // result == 1 表示跳过,这是正常的 + } + + return ret; +} + +/** + * @brief 标记增益为脏(需要保存) + */ +void eq_mark_gain_dirty(void) { + gain_dirty = 1; + DPRINTF("Marked gain as dirty for Flash sync\n"); +} + +/** + * @brief 标记模式名称为脏(需要保存) + */ +void eq_mark_name_dirty(void) { + name_dirty = 1; + DPRINTF("Marked mode names as dirty for Flash sync\n"); +} + +/** + * @brief 从Flash加载用户模式的增益 + * @return 0: 成功, -1: 失败 + */ +int eq_load_gain(void) { + DPRINTF("Loading user mode gains from Flash\n"); + + if (!storage_status.is_initialized) { + DPRINTF(" Error: Flash storage not initialized\n"); + return -1; + } + + // 构建文件路径 + // 改动原因:使用全局变量代替硬编码文件名,统一文件路径管理,将文件存储到基础目录下 + char file_path[FILE_PATH_MAX_LENGTH]; + snprintf(file_path, sizeof(file_path), "%s/%s", g_eq_flash_base_dir, g_eq_flash_gains_file); + + // 检查文件是否存在 + if (!lfs_file_exists(file_path)) { + debug_printf(" Gains file does not exist: %s, using defaults\n", file_path); + return -1; // 文件不存在,使用默认值 + } + + // 准备读取缓冲区 + eq_gain_header_t header; + eq_gain_data_t data; + uint8_t file_data[sizeof(header) + sizeof(eq_gain_data_t)]; + + // 读取文件 + lfs_read_config(file_path, file_data, sizeof(file_data)); + + // 解析文件数据 + memcpy(&header, file_data, sizeof(header)); + memcpy(&data, file_data + sizeof(header), sizeof(eq_gain_data_t)); + + // 验证文件头 + if (header.magic != 0x4551474E) { // "EQGN" + DPRINTF(" Error: Invalid gains file magic\n"); + return -1; + } + + if (header.version != EQ_FLASH_VERSION) { + DPRINTF(" Error: Unsupported gains file version\n"); + return -1; + } + + // 验证CRC32 + uint32_t calculated_crc = eq_flash_calculate_crc32((uint8_t*)&data, sizeof(eq_gain_data_t)); + if (calculated_crc != header.crc32) { + DPRINTF(" Error: CRC32 mismatch for gains data\n"); + return -1; + } + + // 更新全局模式信息(只加载用户模式) + extern eq_mode_info_t g_mode_info; + + // 只加载用户模式(6-8)的增益 + for (int i = EQ_USER_MODE_MIN; i <= EQ_USER_MODE_MAX; i++) { + int idx = i - EQ_USER_MODE_MIN; // 转换为数组索引 0, 1, 2 + g_mode_info.mode_gains[i] = data.mode_gains[idx]; + debug_printf(" Loaded user mode %d: gain=%d\n", i, g_mode_info.mode_gains[i]); + } + + DPRINTF(" Successfully loaded gains\n"); + return 0; +} + +/** + * @brief 从Flash加载单个用户模式的名称 + * @param mode 模式号(必须是用户模式6-8) + * @return 0: 成功, -1: 失败(文件不存在或错误) + */ +int eq_load_name(uint8_t mode) { + if (mode < EQ_USER_MODE_MIN || mode > EQ_USER_MODE_MAX) { + DPRINTF(" Error: Invalid mode %d, only user modes (%d-%d) can be loaded\n", + mode, EQ_USER_MODE_MIN, EQ_USER_MODE_MAX); + return -1; + } + + if (!storage_status.is_initialized) { + DPRINTF(" Error: Flash storage not initialized\n"); + return -1; + } + + // 构建文件路径 + // 改动原因:使用全局变量代替硬编码文件名,统一文件路径管理,将文件存储到基础目录下 + char file_path[FILE_PATH_MAX_LENGTH]; + snprintf(file_path, sizeof(file_path), "%s/%s%d", g_eq_flash_base_dir, g_eq_flash_name_prefix, mode); + + // 检查文件是否存在 + if (!lfs_file_exists(file_path)) { + DPRINTF(" Mode %d name file does not exist: %s, using default\n", mode, file_path); + return -1; // 文件不存在,使用默认值 + } + + // 准备读取缓冲区 + eq_name_header_t header; + eq_name_data_t data; + uint8_t file_data[sizeof(header) + sizeof(eq_name_data_t)]; + + // 读取文件 + lfs_read_config(file_path, file_data, sizeof(file_data)); + + // 解析文件数据 + memcpy(&header, file_data, sizeof(header)); + memcpy(&data, file_data + sizeof(header), sizeof(eq_name_data_t)); + + // 验证文件头 + if (header.magic != 0x45514E4D) { // "EQNM" + DPRINTF(" Error: Invalid name file magic for mode %d\n", mode); + return -1; + } + + if (header.mode != mode) { + DPRINTF(" Error: Mode mismatch in name file (expected %d, got %d)\n", mode, header.mode); + return -1; + } + + if (header.version != EQ_FLASH_VERSION) { + DPRINTF(" Error: Unsupported name file version for mode %d\n", mode); + return -1; + } + + // 验证CRC32 + uint32_t calculated_crc = eq_flash_calculate_crc32((uint8_t*)&data, sizeof(eq_name_data_t)); + if (calculated_crc != header.crc32) { + DPRINTF(" Error: CRC32 mismatch for mode %d name data\n", mode); + return -1; + } + + // 更新全局模式信息 + extern eq_mode_info_t g_mode_info; + strncpy(g_mode_info.mode_names[mode], data.mode_name, 15); + g_mode_info.mode_names[mode][15] = '\0'; // 确保字符串终止 + + DPRINTF(" Loaded user mode %d name: '%s'\n", mode, g_mode_info.mode_names[mode]); + return 0; +} + +/** + * @brief 从Flash加载增益和模式名称(兼容旧接口,内部调用新函数) + * @return 0: 成功, -1: 失败 + */ +int eq_load_gain_and_names(void) { + int ret = 0; + + // 加载gain + if (eq_load_gain() != 0) { + ret = -1; // 文件不存在是正常的,使用默认值 + } + + // 加载每个用户模式的name + for (int i = EQ_USER_MODE_MIN; i <= EQ_USER_MODE_MAX; i++) { + if (eq_load_name(i) != 0) { + // 文件不存在是正常的,使用默认值 + } + } + + DPRINTF("Successfully loaded gain and mode names\n"); + return ret; +} + +/** + * @brief 系统开机时加载所有参数并计算系数 + * @param sample_rate 采样率 + * @param mode 模式 + * @return 0: 成功, -1: 失败 + */ +int eq_load_all_params_and_calculate_coefficients(uint32_t sample_rate, uint8_t mode) { + //DPRINTF("Loading all parameters and calculating coefficients for rate=%u, mode=%d\n", + // sample_rate, mode); + + if (mode < EQ_USER_MODE_MIN || mode > EQ_USER_MODE_MAX ) { + return -1; + } + if (!storage_status.is_initialized) { + DPRINTF(" Error: Flash storage not initialized\n"); + return -1; + } + + // 获取EQ数组指针 + eq_mode_data_t (*eq_array)[NUM_EQ_MODES][NUM_EQ_CHANS] = get_eq_array_ptr(sample_rate); + if (!eq_array) { + DPRINTF(" Error: Failed to get EQ array for sample rate %u\n", sample_rate); + return -1; + } + + int loaded_count = 0; + + // 简化加载逻辑:只从44100Hz channel 0加载参数,然后应用到所有采样率和通道 + for (int band = 0; band < MAX_EQ_BANDS; band++) { + if (eq_load_single_param(44100, mode, 0, band) == 0) { + loaded_count++; + DPRINTF(" Loaded parameter for band %d from 44100Hz channel 0\n", band); + } + } + + //DPRINTF(" Loaded %d single parameters and calculated coefficients for mode %d\n", + // loaded_count, mode); + + return 0; +} + +/** + * @brief 获取单参数存储统计 + * @param stats 输出统计信息 + * @return 0: 成功, -1: 失败 + */ +int eq_get_single_param_stats(eq_single_param_database_t *stats) { + if (stats == NULL) return -1; + + *stats = single_param_database; + return 0; +} + +/** + * @brief 清空单参数存储数据库 + * @return 0: 成功, -1: 失败 + */ +int eq_clear_single_param_database(void) { + DPRINTF("Clearing single parameter database\n"); + + memset(&single_param_database, 0, sizeof(single_param_database)); + single_param_database.max_params = MAX_EQ_BANDS * 8 * 2; + + DPRINTF(" Single parameter database cleared\n"); + return 0; +} + +/** + * @brief 保存指定模式的EQ参数到Flash + * @param mode EQ模式 + * @return 0: 成功, -1: 失败 + */ +int eq_flash_save_mode(uint8_t mode) { + DPRINTF("Saving EQ mode %d to Flash\n", mode); + + if (!storage_status.is_initialized) { + DPRINTF(" Error: EQ Flash storage not initialized\n"); + return -1; + } + + if (mode >= NUM_EQ_MODES) { + DPRINTF(" Error: Invalid mode %d (max: %d)\n", mode, NUM_EQ_MODES - 1); + return -1; + } + + // 获取当前采样率的EQ数组指针 + eq_mode_data_t (*eq_array)[NUM_EQ_MODES][NUM_EQ_CHANS] = get_eq_array_ptr(g_eq_sample_rate); + if (!eq_array) { + DPRINTF(" Error: Failed to get EQ array for current sample rate %lu\n", (unsigned long)g_eq_sample_rate); + return -1; + } + + // 保存左右两个声道的数据 + for (int ch = 0; ch < NUM_EQ_CHANS; ch++) { + // 构建文件路径 + // 改动原因:使用全局变量代替硬编码目录名,统一文件路径管理 + char file_path[FILE_PATH_MAX_LENGTH]; + snprintf(file_path, sizeof(file_path), "%s/mode%d_ch%d.bin", g_eq_flash_base_dir, mode, ch); + DPRINTF(" File path (channel %d): %s\n", ch, file_path); + + // 从EQ数组读取数据 + eq_mode_data_t *eq_data = &(*eq_array)[mode][ch]; + DPRINTF(" Reading EQ data from array (ch %d): sample_rate=%u, post_gain_db=%ld\n", + ch, eq_data->sample_rate, (long)eq_data->post_gain_db); + + // 提取非默认滤波器到优化存储格式 + eq_flash_data_t flash_data; + if (extract_active_filters(eq_data, &flash_data) != 0) { + DPRINTF(" Error: Failed to extract active filters\n"); + continue; + } + + // 准备文件头 + eq_file_header_t header; + header.magic = EQ_FLASH_MAGIC; + header.version = EQ_FLASH_VERSION; + header.mode = mode; + header.channel = ch; // 使用正确的通道号 + header.reserved = 0; + header.data_size = sizeof(eq_flash_data_t); + header.crc32 = eq_flash_calculate_crc32((uint8_t*)&flash_data, sizeof(eq_flash_data_t)); + + // 创建完整的数据包(文件头 + 优化EQ数据) + uint8_t file_data[sizeof(header) + sizeof(eq_flash_data_t)]; + uint8_t file_data2[sizeof(header) + sizeof(eq_flash_data_t)]; + memcpy(file_data, &header, sizeof(header)); + memcpy(file_data + sizeof(header), &flash_data, sizeof(eq_flash_data_t)); + + DPRINTF(" +++++++++++++++ data before save (ch %d) ++++++++++++++ \n", ch); + // debug_print_eq_mode(eq_data); + DPRINTF(" +++++++++++++++ data before save (ch %d) ++++++++++++++ \n", ch); + + // 使用lfs_write_config写入文件 + lfs_write_config(file_path, file_data, sizeof(file_data)); +#if 0 + lfs_read_config(file_path, file_data2, sizeof(file_data2)); + + if( memcmp(file_data, file_data2, sizeof(file_data)) != 0) + { + DPRINTF(" *********** ** \n %s, file_data is not equal to file_data2\n", file_path); + return -1; + } + #endif + DPRINTF(" Successfully saved EQ parameters for mode %d, channel %d\n", mode, ch); + } + + return 0; +} + +/** + * @brief 标记指定模式为脏(需要同步) + * @param mode EQ模式 + */ +void eq_flash_mark_dirty(uint8_t mode) { + if ((mode >= EQ_USER_MODE_MIN) && (mode <= EQ_USER_MODE_MAX )) { + dirty_flags[mode] = 1; + DPRINTF("Marked mode %d as dirty\n", mode); + } +} + +/** + * @brief 同步指定模式参数到Flash(延迟写入) + * @param mode 模式号 + * @return 0: 成功, -1: 失败 + */ +int eq_flash_sync_mode(uint8_t mode) { + DPRINTF("Syncing EQ mode %d to Flash\n", mode); + + if (!storage_status.is_initialized) { + DPRINTF("EQ Flash storage not initialized\n"); + return -1; + } + + if (mode >= NUM_EQ_MODES) { + DPRINTF("Invalid mode %d\n", mode); + return -1; + } + + // 保存指定模式到Flash + if (eq_flash_save_mode(mode) != 0) { + DPRINTF("Failed to save mode %d to Flash\n", mode); + return -1; + } + + // 清除脏标志 + dirty_flags[mode] = 0; + DPRINTF("EQ mode %d synced to Flash\n", mode); + return 0; +} + +/** + * @brief 同步所有脏数据到Flash + * @return 0: 成功, -1: 失败 + */ +int eq_flash_sync_all(void) { + DPRINTF("Syncing dirty EQ parameters to Flash\n"); + + if (!storage_status.is_initialized) { + DPRINTF("EQ Flash storage not initialized\n"); + return -1; + } + + // 简化实现 + memset(dirty_flags, 0, sizeof(dirty_flags)); + DPRINTF("EQ parameters synced to Flash (simplified)\n"); + return 0; +} + +/** + * @brief 检查Flash中是否有EQ数据 + * @return 1: 有数据, 0: 无数据 + */ +int eq_flash_has_data(void) { + return storage_status.has_flash_data; +} + +/** + * @brief 获取存储状态 + * @param status 输出存储状态结构 + * @return 0: 成功, -1: 失败 + */ +int eq_flash_get_status(eq_storage_status_t *status) { + if (!status) { + return -1; + } + *status = storage_status; + return 0; +} + +/** + * @brief 清除所有Flash数据 + * @return 0: 成功, -1: 失败 + */ +int eq_flash_clear_all(void) { + DPRINTF("Clearing all EQ Flash data\n"); + + if (!storage_status.is_initialized) { + DPRINTF("EQ Flash storage not initialized\n"); + return -1; + } + + // 简化实现 + storage_status.has_flash_data = 0; + memset(dirty_flags, 0, sizeof(dirty_flags)); + DPRINTF("All EQ Flash data cleared\n"); + return 0; +} + +/** + * @brief 验证指定模式的完整性 + * @param mode EQ模式 + * @return 1: 有效, 0: 无效 + */ +int eq_flash_verify_mode(uint8_t mode) { + DPRINTF("Verifying EQ mode %d\n", mode); + + if (!storage_status.is_initialized) { + return 0; + } + + // 简化实现 + return 1; +} + +/** + * @brief 获取文件路径 + * @param mode EQ模式 + * @param channel 通道 + * @param file_path 输出文件路径 + * @param max_len 最大长度 + * @return 0: 成功, -1: 失败 + */ +int eq_flash_get_file_path(uint8_t mode, uint8_t channel, char *file_path, size_t max_len) { + if (!file_path || max_len == 0) { + return -1; + } + // 改动原因:使用全局变量代替硬编码目录名,统一文件路径管理 + snprintf(file_path, max_len, "%s/mode%d_ch%d.bin", g_eq_flash_base_dir, mode, channel); + return 0; +} + +/** + * @brief 计算CRC32校验和 + * @param data 数据指针 + * @param length 数据长度 + * @return CRC32值 + */ +uint32_t eq_flash_calculate_crc32(const uint8_t *data, size_t length) { + // 简化的CRC32计算(实际应该使用标准CRC32算法) + uint32_t crc = 0xFFFFFFFF; + for (size_t i = 0; i < length; i++) { + crc ^= data[i]; + for (int j = 0; j < 8; j++) { + if (crc & 1) { + crc = (crc >> 1) ^ 0xEDB88320; + } else { + crc >>= 1; + } + } + } + return ~crc; +} + +/** + * @brief 检查是否有需要同步的数据 + * @return 1: 需要同步, 0: 不需要同步 + */ +int eq_flash_needs_sync(void) { + for (int j = 0; j < NUM_EQ_MODES; j++) { + if (dirty_flags[j]) { + return 1; + } + } + return 0; +} + +/** + * @brief 删除Flash中的EQ参数文件 + * @param mode 模式号 (0-9, 0xFF表示所有模式) + * @return 0: 成功, -1: 失败 + */ +int delete_flash_eq_params(uint8_t mode) { + DPRINTF("Deleting Flash EQ params for mode %d\n", mode); + + if (!storage_status.is_initialized) { + DPRINTF(" Error: Flash storage not initialized\n"); + return -1; + } + + int deleted_count = 0; + + if (mode == 0xFF) { + // 删除所有模式的参数文件 + DPRINTF(" Deleting all mode parameters\n"); + for (uint8_t m = 0; m < NUM_EQ_MODES; m++) { + for (uint8_t band = 0; band < MAX_EQ_BANDS; band++) { + // 改动原因:使用全局变量代替硬编码目录名,统一文件路径管理 + char file_path[FILE_PATH_MAX_LENGTH]; + snprintf(file_path, sizeof(file_path), "%s/mode%d_band%d.bin", g_eq_flash_base_dir, m, band); + + if (lfs_file_exists(file_path)) { + if (lfs_remove_file(file_path) == 0) { + deleted_count++; + DPRINTF(" Deleted: %s\n", file_path); + } else { + DPRINTF(" Failed to delete: %s\n", file_path); + } + } + } + } + } else { + // 删除指定模式的参数文件 + DPRINTF(" Deleting mode %d parameters\n", mode); + for (uint8_t band = 0; band < MAX_EQ_BANDS; band++) { + // 改动原因:使用全局变量代替硬编码目录名,统一文件路径管理 + char file_path[FILE_PATH_MAX_LENGTH]; + snprintf(file_path, sizeof(file_path), "%s/mode%d_band%d.bin", g_eq_flash_base_dir, mode, band); + + if (lfs_file_exists(file_path)) { + if (lfs_remove_file(file_path) == 0) { + deleted_count++; + DPRINTF(" Deleted: %s\n", file_path); + } else { + DPRINTF(" Failed to delete: %s\n", file_path); + } + } + } + } + + DPRINTF(" Deleted %d parameter files\n", deleted_count); + return 0; +} + +/** + * @brief 删除Flash中的增益和模式名称文件 + * @param mode 模式号 (0-9, 0xFF表示所有模式) + * @return 0: 成功, -1: 失败 + * + * 改动原因:修改为按模式删除,只删除指定模式的增益和名称,而不是删除所有文件 + * - 如果mode == 0xFF,删除所有用户模式的增益和名称文件 + * - 如果mode是用户模式(6-8),只删除该模式的名称文件,并将该模式的增益恢复为默认值(0) + * - 如果mode是预设模式(0-5),不需要删除(预设模式的增益和名称不存储在Flash中) + */ +int delete_flash_gain_and_names(uint8_t mode) { + DPRINTF("Deleting Flash gain and names for mode %d\n", mode); + + if (!storage_status.is_initialized) { + DPRINTF(" Error: Flash storage not initialized\n"); + return -1; + } + + // 处理删除所有模式的情况 + if (mode == 0xFF) { + DPRINTF(" Deleting all user mode gains and names\n"); + + // 删除gains文件 + char file_path[FILE_PATH_MAX_LENGTH]; + snprintf(file_path, sizeof(file_path), "%s/%s", g_eq_flash_base_dir, g_eq_flash_gains_file); + if (lfs_file_exists(file_path)) { + if (lfs_remove_file(file_path) == 0) { + DPRINTF(" Successfully deleted gains file: %s\n", file_path); + } else { + DPRINTF(" Failed to delete gains file: %s\n", file_path); + } + } + + // 删除所有用户模式的名称文件 + for (int i = EQ_USER_MODE_MIN; i <= EQ_USER_MODE_MAX; i++) { + snprintf(file_path, sizeof(file_path), "%s/%s%d", g_eq_flash_base_dir, g_eq_flash_name_prefix, i); + if (lfs_file_exists(file_path)) { + if (lfs_remove_file(file_path) == 0) { + DPRINTF(" Successfully deleted name file for mode %d: %s\n", i, file_path); + } else { + DPRINTF(" Failed to delete name file for mode %d: %s\n", i, file_path); + } + } + } + + return 0; + } + + // 检查模式有效性 + if (mode >= NUM_EQ_MODES) { + DPRINTF(" Error: Invalid mode %d\n", mode); + return -1; + } + + // 预设模式(0-5)的增益和名称不存储在Flash中,不需要删除 + if (mode < EQ_USER_MODE_MIN) { + DPRINTF(" Mode %d is a preset mode, no Flash data to delete\n", mode); + return 0; + } + + // 只处理用户模式(6-8) + if (mode >= EQ_USER_MODE_MIN && mode <= EQ_USER_MODE_MAX) { + // 删除该模式的名称文件 + char file_path[FILE_PATH_MAX_LENGTH]; + snprintf(file_path, sizeof(file_path), "%s/%s%d", g_eq_flash_base_dir, g_eq_flash_name_prefix, mode); + if (lfs_file_exists(file_path)) { + if (lfs_remove_file(file_path) == 0) { + DPRINTF(" Successfully deleted name file for mode %d: %s\n", mode, file_path); + } else { + DPRINTF(" Failed to delete name file for mode %d: %s\n", mode, file_path); + } + } else { + DPRINTF(" Name file for mode %d does not exist: %s\n", mode, file_path); + } + + // 从gains文件中移除该模式的增益(恢复为默认值0) + // 改动原因:gains文件存储了所有用户模式的增益,需要读取、修改、写回 + snprintf(file_path, sizeof(file_path), "%s/%s", g_eq_flash_base_dir, g_eq_flash_gains_file); + if (lfs_file_exists(file_path)) { + // 读取gains文件 + // 改动原因:lfs_read_config返回void,不能检查返回值,需要通过验证文件头来判断读取是否成功 + eq_gain_header_t header; + eq_gain_data_t data; + uint8_t file_data[sizeof(header) + sizeof(eq_gain_data_t)]; + + // 直接调用lfs_read_config(返回void,不能检查返回值) + lfs_read_config(file_path, file_data, sizeof(file_data)); + + // 解析文件数据 + memcpy(&header, file_data, sizeof(header)); + memcpy(&data, file_data + sizeof(header), sizeof(eq_gain_data_t)); + + // 验证文件头来判断读取是否成功 + if (header.magic == 0x4551474E && header.version == EQ_FLASH_VERSION) { + // 将对应模式的增益恢复为默认值(0) + int idx = mode - EQ_USER_MODE_MIN; // 转换为数组索引 0, 1, 2 + data.mode_gains[idx] = 0; + DPRINTF(" Reset gain for mode %d to default (0)\n", mode); + + // 重新计算CRC32 + header.crc32 = eq_flash_calculate_crc32((uint8_t*)&data, sizeof(eq_gain_data_t)); + + // 写回文件 + memcpy(file_data, &header, sizeof(header)); + memcpy(file_data + sizeof(header), &data, sizeof(eq_gain_data_t)); + lfs_write_config(file_path, file_data, sizeof(file_data)); + + DPRINTF(" Successfully updated gains file for mode %d\n", mode); + } else { + DPRINTF(" Error: Invalid gains file format or read failed\n"); + } + } else { + DPRINTF(" Gains file does not exist: %s\n", file_path); + } + + return 0; + } + + // 其他模式(如模式9)不需要处理 + DPRINTF(" Mode %d does not require Flash data deletion\n", mode); + return 0; +} + +/** + * @brief 恢复指定模式在指定采样率下的默认参数 + * @param mode 模式号 + * @param sample_rate 采样率 + */ +void restore_mode_default_params(uint8_t mode, uint32_t sample_rate) { + if (mode >= NUM_EQ_MODES) return; + + // 改动原因:所有采样率共用44100Hz数组 + eq_mode_data_t (*eq_array)[NUM_EQ_MODES][NUM_EQ_CHANS] = &sEQ_data_44100HZ; + + if (eq_array == NULL) return; + + // 恢复左右通道的默认参数 + for (int ch = 0; ch < NUM_EQ_CHANS; ch++) { + eq_mode_data_t *eq_data = &(*eq_array)[mode][ch]; + + // 恢复基本参数 + eq_data->sample_rate = sample_rate; + eq_data->total_bshift = 0; + eq_data->post_gain_db = 0; + + // 恢复所有滤波器的默认参数 + for (int i = 0; i < MAX_EQ_BANDS; i++) { + filter_params_t *band = &eq_data->bands[i]; + band->index = i; + band->type = FILTER_TYPE_BYPASS; + band->fc = 1000.0f; + band->q = 0.707f; + band->bw = 1.0f; + band->gain = 0.0f; + + // 恢复默认系数 (bypass滤波器) + eq_data->filter.coef[0][i] = 1 << 30; // b0 = 1.0 in Q30 + eq_data->filter.coef[1][i] = 0; // b1 = 0 + eq_data->filter.coef[2][i] = 0; // b2 = 0 + eq_data->filter.coef[3][i] = 0; // a1 = 0 + eq_data->filter.coef[4][i] = 0; // a2 = 0 + } + + eq_data->filter.biquad_count = MAX_EQ_BANDS; + memset(eq_data->filter.state, 0, sizeof(eq_data->filter.state)); + } + + DPRINTF(" Restored mode %d for sample rate %u Hz\n", mode, sample_rate); +} +/** + * @brief 恢复默认EQ参数 + * @param mode 模式号 (0-9, 0xFF表示所有模式) + * @return 0: 成功, -1: 失败 + */ +int restore_default_eq_params(uint8_t mode) { + DPRINTF("Restoring default EQ params for mode %d\n", mode); + + // 改动原因:所有采样率共用44100Hz数组,只需要恢复44100Hz数组 + if (mode == 0xFF) { + // 恢复所有模式的默认参数 + DPRINTF(" Restoring all modes to default parameters\n"); + for (uint8_t m = 0; m < NUM_EQ_MODES; m++) { + restore_mode_default_params(m, 44100); // 恢复44100Hz数组 + } + } else { + // 恢复指定模式的默认参数 + DPRINTF(" Restoring mode %d to default parameters\n", mode); + restore_mode_default_params(mode, 44100); // 恢复44100Hz数组 + } + + DPRINTF(" Default parameters restored successfully\n"); + return 0; +} + +/** + * @brief 保存EQ使能状态到Flash(独立文件存储,与模式存储完全分离) + * @param enable EQ使能状态 (0=禁用, 1=启用) + * @return 0: 成功, -1: 失败 + * + * 改动原因:将eq_enable存储独立为单独文件,与模式存储完全分离,互不影响 + */ +int eq_flash_save_eq_enable(uint8_t enable) +{ + DPRINTF("Saving EQ enable state %d to Flash (independent file)\n", enable); + + if (!storage_status.is_initialized) { + DPRINTF(" Error: Flash storage not initialized\n"); + return -1; + } + + // 验证使能值范围 + if (enable > 1) { + DPRINTF(" Error: Invalid EQ enable value %d (valid range: 0-1)\n", enable); + return -1; + } + + // 构建独立文件路径 + // 改动原因:使用独立的文件名存储eq_enable,与模式存储完全分离 + char file_path[FILE_PATH_MAX_LENGTH]; + snprintf(file_path, sizeof(file_path), "%s", g_eq_flash_enable_file); + + // 创建文件头 + eq_file_header_t header = {0}; + header.magic = EQ_FLASH_MAGIC; + header.version = EQ_FLASH_VERSION; + header.mode = 0; // 不使用模式字段 + header.channel = 0; // 不使用通道字段 + header.data_size = 1; // 数据大小:只有使能状态(1字节) + + // 准备数据(只有使能状态) + uint8_t enable_data = enable; + + header.crc32 = eq_flash_calculate_crc32(&enable_data, 1); + + // 准备文件数据 + uint8_t file_data[sizeof(header) + 1]; + memcpy(file_data, &header, sizeof(header)); + file_data[sizeof(header)] = enable; + + // 写入文件 + lfs_write_config(file_path, file_data, sizeof(file_data)); + DPRINTF(" Successfully saved EQ enable %d to Flash (independent file: %s)\n", enable, file_path); + return 0; +} + +/** + * @brief 保存当前EQ模式到Flash(独立文件存储,与使能状态存储完全分离) + * @param mode 模式值 (0-9) + * @return 0: 成功, -1: 失败 + * + * 改动原因:将模式存储独立为单独文件,与eq_enable存储完全分离,互不影响 + */ +int eq_flash_save_current_mode(uint8_t mode) +{ + DPRINTF("Saving current EQ mode %d to Flash (independent file)\n", mode); + + if (!storage_status.is_initialized) { + DPRINTF(" Error: Flash storage not initialized\n"); + return -1; + } + + // 验证模式值范围 + if (mode > 9) { + DPRINTF(" Error: Invalid mode %d (valid range: 0-9)\n", mode); + return -1; + } + + // 构建独立文件路径 + // 改动原因:使用独立的文件名存储模式,与eq_enable存储完全分离 + char file_path[FILE_PATH_MAX_LENGTH]; + snprintf(file_path, sizeof(file_path), "%s", g_eq_flash_mode_file); + + // 创建文件头 + eq_file_header_t header = {0}; + header.magic = EQ_FLASH_MAGIC; + header.version = EQ_FLASH_VERSION; + header.mode = mode; // 模式值 + header.channel = 0; // 不使用通道字段 + header.data_size = 1; // 数据大小:只有模式值(1字节) + + // 准备数据(只有模式值) + uint8_t mode_data = mode; + + header.crc32 = eq_flash_calculate_crc32(&mode_data, 1); + + // 准备文件数据 + uint8_t file_data[sizeof(header) + 1]; + memcpy(file_data, &header, sizeof(header)); + file_data[sizeof(header)] = mode; + + // 写入文件 + lfs_write_config(file_path, file_data, sizeof(file_data)); + DPRINTF(" Successfully saved EQ mode %d to Flash (independent file: %s)\n", mode, file_path); + return 0; +} + +/** + * @brief 从Flash加载当前EQ模式和使能状态(从两个独立文件分别加载) + * @return 模式值: 成功, -1: 失败 + * + * 改动原因:从两个独立文件分别加载模式和使能状态,完全独立,互不影响 + */ +int eq_flash_load_current_mode(void) +{ + uint8_t mode = 0; + uint8_t eq_enable = 0; + DPRINTF("Loading current EQ mode and enable state from Flash (independent files)\n"); + + if (!storage_status.is_initialized) { + DPRINTF(" Error: Flash storage not initialized\n"); + return -1; + } + + // 加载模式(从独立文件) + char mode_file_path[FILE_PATH_MAX_LENGTH]; + snprintf(mode_file_path, sizeof(mode_file_path), "%s", g_eq_flash_mode_file); + + if (lfs_file_exists(mode_file_path)) { + eq_file_header_t header; + uint8_t file_header_data[sizeof(header) + 1]; + lfs_read_config(mode_file_path, file_header_data, sizeof(file_header_data)); + memcpy(&header, file_header_data, sizeof(header)); + + if (header.magic == EQ_FLASH_MAGIC && header.version == EQ_FLASH_VERSION) { + mode = file_header_data[sizeof(header)]; + + // 验证模式值范围 + if (mode > 9) { + DPRINTF(" Error: Invalid mode value %d in file\n", mode); + mode = 0; // 使用默认值 + } else { + // 验证CRC32 + uint8_t mode_data = mode; + uint32_t calculated_crc = eq_flash_calculate_crc32(&mode_data, 1); + if (calculated_crc == header.crc32) { + DPRINTF(" Successfully loaded mode %d from Flash\n", mode); + } else { + DPRINTF(" Error: CRC32 mismatch for mode file, using default mode 0\n"); + mode = 0; + } + } + } else { + DPRINTF(" Error: Invalid mode file header, using default mode 0\n"); + mode = 0; + } + } else { + DPRINTF(" Mode file does not exist, using default mode 0\n"); + mode = 0; + } + + // 加载使能状态(从独立文件) + char enable_file_path[FILE_PATH_MAX_LENGTH]; + snprintf(enable_file_path, sizeof(enable_file_path), "%s", g_eq_flash_enable_file); + + if (lfs_file_exists(enable_file_path)) { + eq_file_header_t header; + uint8_t file_header_data[sizeof(header) + 1]; + lfs_read_config(enable_file_path, file_header_data, sizeof(file_header_data)); + memcpy(&header, file_header_data, sizeof(header)); + + if (header.magic == EQ_FLASH_MAGIC && header.version == EQ_FLASH_VERSION) { + eq_enable = file_header_data[sizeof(header)]; + + // 验证使能值范围 + if (eq_enable > 1) { + DPRINTF(" Warning: Invalid EQ enable value %d in file, defaulting to 0\n", eq_enable); + eq_enable = 0; + } else { + // 验证CRC32 + uint8_t enable_data = eq_enable; + uint32_t calculated_crc = eq_flash_calculate_crc32(&enable_data, 1); + if (calculated_crc == header.crc32) { + DPRINTF(" Successfully loaded EQ enable %d from Flash\n", eq_enable); + } else { + DPRINTF(" Error: CRC32 mismatch for enable file, using default enable 0\n"); + eq_enable = 0; + } + } + } else { + DPRINTF(" Error: Invalid enable file header, using default enable 0\n"); + eq_enable = 0; + } + } else { + DPRINTF(" Enable file does not exist, using default enable 0\n"); + eq_enable = 0; + } + + // 设置全局变量g_eq_enable + extern unsigned int g_eq_enable; + g_eq_enable = eq_enable; + + DPRINTF(" Successfully loaded mode %d and EQ enable %d from Flash (independent files)\n", mode, eq_enable); + return mode; +} + +/** + * @brief 从Flash加载EQ使能状态(独立文件加载,与模式加载完全分离) + * @return 使能状态值: 成功(0或1), -1: 失败 + * + * 改动原因:从独立文件(eq_enable)加载eq_enable,与模式加载完全分离,互不影响 + */ +int eq_flash_load_eq_enable(void) +{ + uint8_t eq_enable = 0; + DPRINTF("Loading EQ enable state from Flash (independent file)\n"); + + if (!storage_status.is_initialized) { + DPRINTF(" Error: Flash storage not initialized\n"); + return -1; + } + + // 加载使能状态(从独立文件) + char enable_file_path[FILE_PATH_MAX_LENGTH]; + snprintf(enable_file_path, sizeof(enable_file_path), "%s", g_eq_flash_enable_file); + + if (lfs_file_exists(enable_file_path)) { + eq_file_header_t header; + uint8_t file_header_data[sizeof(header) + 1]; + lfs_read_config(enable_file_path, file_header_data, sizeof(file_header_data)); + memcpy(&header, file_header_data, sizeof(header)); + + if (header.magic == EQ_FLASH_MAGIC && header.version == EQ_FLASH_VERSION) { + eq_enable = file_header_data[sizeof(header)]; + + // 验证使能值范围 + if (eq_enable > 1) { + DPRINTF(" Warning: Invalid EQ enable value %d in file, defaulting to 0\n", eq_enable); + eq_enable = 0; + } else { + // 验证CRC32 + uint8_t enable_data = eq_enable; + uint32_t calculated_crc = eq_flash_calculate_crc32(&enable_data, 1); + if (calculated_crc == header.crc32) { + DPRINTF(" Successfully loaded EQ enable %d from Flash\n", eq_enable); + } else { + DPRINTF(" Error: CRC32 mismatch for enable file, using default enable 0\n"); + eq_enable = 0; + } + } + } else { + DPRINTF(" Error: Invalid enable file header, using default enable 0\n"); + eq_enable = 0; + } + } else { + DPRINTF(" Enable file does not exist, using default enable 0\n"); + eq_enable = 0; + } + + // 设置全局变量g_eq_enable + extern unsigned int g_eq_enable; + g_eq_enable = eq_enable; + + DPRINTF(" Successfully loaded EQ enable %d from Flash (independent file)\n", eq_enable); + return eq_enable; +} + diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_flash_storage.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_flash_storage.h new file mode 100644 index 0000000..1d7838e --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_flash_storage.h @@ -0,0 +1,423 @@ +#ifndef __EQ_FLASH_STORAGE_H__ +#define __EQ_FLASH_STORAGE_H__ + +#include +#include +#include "eq.h" + +// EQ Flash存储相关常量定义 +#define EQ_FLASH_MAGIC 0x45515041 // "EQPA" - EQ参数文件魔数 +#define EQ_FLASH_MAGIC_PARAMS 0x45515041 // "EQPA" - EQ参数文件魔数 +#define EQ_FLASH_VERSION 0x00020000 // 版本2.0.0 - 优化存储格式 +#define EQ_FLASH_MAX_SAMPLE_RATES 6 // 支持的采样率数量 +#define EQ_FLASH_MAX_MODES 10 // 最大模式数量 +#define EQ_FLASH_MAX_CHANNELS 2 // 最大通道数量 + +// 支持的采样率列表 +#define EQ_SAMPLE_RATES {44100, 48000, 88200, 96000, 176400, 192000} + +// EQ参数文件头结构 (简化版本,去除采样率字段) +typedef struct { + uint32_t magic; // 魔数: 0x45515041 ("EQPA") + uint32_t version; // 版本号 + uint8_t mode; // 模式号 + uint8_t channel; // 通道号 + uint16_t reserved; // 保留字段 + uint32_t data_size; // 数据大小 + uint32_t crc32; // CRC32校验 +} __attribute__((packed)) eq_file_header_t; + +// 元数据结构已移除,简化存储系统 + +// EQ存储状态结构 +typedef struct { + int is_initialized; // 是否已初始化 (0: 否, 1: 是) + int has_flash_data; // Flash中是否有数据 (0: 否, 1: 是) + uint32_t last_sync_time; // 最后同步时间 + uint32_t sync_count; // 同步次数 + uint32_t error_count; // 错误次数 +} eq_storage_status_t; + +// 增益存储结构(只存储用户模式) +typedef struct { + uint32_t magic; // 魔数: 0x4551474E ("EQGN" - EQ Gain) + uint32_t version; // 版本号 + uint32_t data_size; // 数据大小 + uint32_t crc32; // CRC32校验 +} __attribute__((packed)) eq_gain_header_t; + +// 模式增益数据(只存储用户模式6-8) +typedef struct { + int32_t mode_gains[3]; // 用户模式增益数组:mode 6, 7, 8,每个4字节 +} __attribute__((packed)) eq_gain_data_t; + +// 单个模式名称存储结构 +typedef struct { + uint32_t magic; // 魔数: 0x45514E4D ("EQNM" - EQ Name) + uint32_t version; // 版本号 + uint8_t mode; // 模式号 + uint8_t reserved[3]; // 保留字段 + uint32_t data_size; // 数据大小(16字节) + uint32_t crc32; // CRC32校验 +} __attribute__((packed)) eq_name_header_t; + +// 单个模式名称数据 +typedef struct { + char mode_name[16]; // 模式名称,16字节 +} __attribute__((packed)) eq_name_data_t; + +// 兼容旧格式的结构(保留用于向后兼容) +typedef struct { + uint32_t magic; // 魔数: 0x45514E47 ("EQNG" - EQ Name Gain) + uint32_t version; // 版本号 + uint32_t data_size; // 数据大小 + uint32_t crc32; // CRC32校验 +} __attribute__((packed)) eq_gain_name_header_t; + +// 模式增益和名称数据 +typedef struct { + int32_t mode_gains[NUM_EQ_MODES]; // 模式增益数组,每个4字节 + char mode_names[NUM_EQ_MODES][16]; // 模式名称数组,每个16字节 +} __attribute__((packed)) eq_gain_name_data_t; + +// 函数声明 + +/** + * @brief 初始化EQ Flash存储系统 + * @return 0: 成功, -1: 失败 + */ +int eq_flash_init(void); + +/** + * @brief 反初始化EQ Flash存储系统 + */ +void eq_flash_deinit(void); + +// 注意:save all 和 load all 函数已移除,使用动态单参数存储系统 + +/** + * @brief 从Flash加载指定模式的EQ参数 + * @param mode 模式号 + * @return 0: 成功, -1: 失败 + */ +int eq_flash_load_mode(uint8_t mode); + +/** + * @brief 保存指定模式的EQ参数到Flash + * @param mode 模式号 + * @return 0: 成功, -1: 失败 + */ +int eq_flash_save_mode(uint8_t mode); + +/** + * @brief 同步指定模式参数到Flash(延迟写入) + * @param mode 模式号 + * @return 0: 成功, -1: 失败 + */ +int eq_flash_sync_mode(uint8_t mode); + +/** + * @brief 同步所有待更新的参数到Flash + * @return 0: 成功, -1: 失败 + */ +int eq_flash_sync_all(void); + +/** + * @brief 检查Flash中是否存在EQ参数数据 + * @return 1: 存在, 0: 不存在 + */ +int eq_flash_has_data(void); + +/** + * @brief 获取EQ存储状态 + * @param status 状态结构指针 + * @return 0: 成功, -1: 失败 + */ +int eq_flash_get_status(eq_storage_status_t *status); + +/** + * @brief 清除Flash中的所有EQ参数数据 + * @return 0: 成功, -1: 失败 + */ +int eq_flash_clear_all(void); + +/** + * @brief 验证EQ参数文件完整性 + * @param mode 模式号 + * @return 1: 完整, 0: 损坏 + */ +int eq_flash_verify_mode(uint8_t mode); + +/** + * @brief 获取文件路径 + * @param mode 模式号 + * @param channel 通道号 + * @param path 输出路径缓冲区 + * @param max_len 缓冲区最大长度 + * @return 0: 成功, -1: 失败 + */ +int eq_flash_get_file_path(uint8_t mode, uint8_t channel, + char *path, size_t max_len); + +/** + * @brief 计算CRC32校验值 + * @param data 数据指针 + * @param len 数据长度 + * @return CRC32值 + */ +uint32_t eq_flash_calculate_crc32(const uint8_t *data, size_t len); + +/** + * @brief 检查是否需要同步参数到Flash + * @return 1: 需要同步, 0: 不需要 + */ +int eq_flash_needs_sync(void); + +/** + * @brief 标记参数已修改,需要同步 + * @param mode 模式号 + */ +void eq_flash_mark_dirty(uint8_t mode); + +/** + * @brief 检查滤波器是否为默认值(bypass) + * @param band 滤波器参数 + * @return 1: 是默认值, 0: 不是默认值 + */ +int is_filter_bypass(const filter_params_t *band); + +/** + * @brief 从EQ数据中提取非默认滤波器到Flash存储格式 + * @param eq_data 源EQ数据 + * @param flash_data 目标Flash存储数据 + * @return 0: 成功, -1: 失败 + */ +int extract_active_filters(const eq_mode_data_t *eq_data, eq_flash_data_t *flash_data); + +/** + * @brief 从Flash存储格式恢复EQ数据 + * @param flash_data 源Flash存储数据 + * @param eq_data 目标EQ数据 + * @return 0: 成功, -1: 失败 + */ +int restore_eq_from_flash(const eq_flash_data_t *flash_data, eq_mode_data_t *eq_data); + +/** + * @brief 实时计算滤波器系数 + * @param eq_data EQ数据 + * @param sample_rate 采样率 + * @return 0: 成功, -1: 失败 + */ +int calculate_filter_coefficients(eq_mode_data_t *eq_data, uint32_t sample_rate); + +// ==================== 单参数动态存储系统 ==================== + +/** + * @brief 初始化单参数存储数据库 + * @return 0: 成功, -1: 失败 + */ +int eq_single_param_database_init(void); + +/** + * @brief 处理0x8c/0x8d命令的单参数变化 + * @param data 接收到的数据 + * @param len 数据长度 + * @return 0: 成功, -1: 失败 + */ +int eq_process_single_param_change(uint32_t sample_rate, uint8_t mode, uint8_t channel, uint8_t band_index, filter_params_t *band); + +/** + * @brief 比较单个参数是否不同 + * @param old_params 旧参数 + * @param new_params 新参数 + * @return 1: 不同, 0: 相同 + */ +int eq_single_params_different(const filter_params_t *old_params, const filter_params_t *new_params); + +/** + * @brief 添加单个参数变化到数据库 + * @param sample_rate 采样率 + * @param mode 模式 + * @param channel 通道 + * @param band_index 滤波器索引 + * @param new_params 新参数 + * @return 0: 成功, -1: 失败 + */ +int eq_add_single_param(uint32_t sample_rate, uint8_t mode, uint8_t channel, + uint8_t band_index, const filter_params_t *new_params); + +/** + * @brief 保存单个参数到Flash + * @param sample_rate 采样率 + * @param mode 模式 + * @param channel 通道 + * @param band_index 滤波器索引 + * @return 0: 成功, -1: 失败 + */ +int eq_save_single_param(uint32_t sample_rate, uint8_t mode, uint8_t channel, uint8_t band_index); + +/** + * @brief 从Flash加载单个参数 + * @param sample_rate 采样率 + * @param mode 模式 + * @param channel 通道 + * @param band_index 滤波器索引 + * @return 0: 成功, -1: 失败 + */ +int eq_load_single_param(uint32_t sample_rate, uint8_t mode, uint8_t channel, uint8_t band_index); + +/** + * @brief 保存所有脏参数到Flash(只保存EQ参数,不包括增益和名称) + * @return 0: 成功, -1: 失败 + */ +int eq_save_dirty_params(void); + +/** + * @brief 保存脏的增益到Flash + * @return 0: 成功, -1: 失败 + */ +int eq_save_dirty_gain(void); + +/** + * @brief 保存脏的模式名称到Flash + * @return 0: 成功, -1: 失败 + */ +int eq_save_dirty_names(void); + +/** + * @brief 保存脏的增益和模式名称到Flash(兼容旧接口) + * @return 0: 成功, -1: 失败 + */ +int eq_save_dirty_gain_and_names(void); + +/** + * @brief 保存用户模式的增益到Flash(只保存用户模式6-8) + * @return 0: 成功, -1: 失败 + */ +int eq_save_gain(void); + +/** + * @brief 保存单个用户模式的名称到Flash(只有与初始值不同且非空才保存) + * @param mode 模式号(必须是用户模式6-8) + * @return 0: 成功, -1: 失败, 1: 跳过(与初始值相同或为空) + */ +int eq_save_name(uint8_t mode); + +/** + * @brief 从Flash加载用户模式的增益 + * @return 0: 成功, -1: 失败 + */ +int eq_load_gain(void); + +/** + * @brief 从Flash加载单个用户模式的名称 + * @param mode 模式号(必须是用户模式6-8) + * @return 0: 成功, -1: 失败(文件不存在或错误) + */ +int eq_load_name(uint8_t mode); + +/** + * @brief 保存增益和模式名称到Flash(兼容旧接口,内部调用新函数) + * @return 0: 成功, -1: 失败 + */ +int eq_save_gain_and_names(void); + +/** + * @brief 从Flash加载增益和模式名称(兼容旧接口,内部调用新函数) + * @return 0: 成功, -1: 失败 + */ +int eq_load_gain_and_names(void); + +/** + * @brief 标记增益为脏(需要保存) + */ +void eq_mark_gain_dirty(void); + +/** + * @brief 标记模式名称为脏(需要保存) + */ +void eq_mark_name_dirty(void); + +/** + * @brief 标记增益和模式名称为脏(需要保存)(兼容旧接口) + */ +void eq_mark_gain_name_dirty(void); + +/** + * @brief 删除Flash中的EQ参数文件 + * @param mode 模式号 (0-9, 0xFF表示所有模式) + * @return 0: 成功, -1: 失败 + */ +int delete_flash_eq_params(uint8_t mode); + +/** + * @brief 删除Flash中的增益和模式名称文件 + * @param mode 模式号 (0-9, 0xFF表示所有模式) + * @return 0: 成功, -1: 失败 + */ +int delete_flash_gain_and_names(uint8_t mode); + +/** + * @brief 恢复默认EQ参数 + * @param mode 模式号 (0-9, 0xFF表示所有模式) + * @return 0: 成功, -1: 失败 + */ +int restore_default_eq_params(uint8_t mode); + +/** + * @brief 系统开机时加载所有参数并计算系数 + * @param sample_rate 采样率 + * @param mode 模式 + * @return 0: 成功, -1: 失败 + */ +int eq_load_all_params_and_calculate_coefficients(uint32_t sample_rate, uint8_t mode); + +/** + * @brief 获取单参数存储统计 + * @param stats 输出统计信息 + * @return 0: 成功, -1: 失败 + */ +int eq_get_single_param_stats(eq_single_param_database_t *stats); + +/** + * @brief 清空单参数存储数据库 + * @return 0: 成功, -1: 失败 + */ +int eq_clear_single_param_database(void); + +/** + * @brief 保存EQ使能状态到Flash(独立文件存储,与模式存储完全分离) + * @param enable EQ使能状态 (0=禁用, 1=启用) + * @return 0: 成功, -1: 失败 + * + * 改动原因:将eq_enable存储独立为单独文件(eq_enable),与模式存储完全分离,互不影响 + */ +int eq_flash_save_eq_enable(uint8_t enable); + +/** + * @brief 从Flash加载EQ使能状态(独立文件加载,与模式加载完全分离) + * @return 使能状态值: 成功(0或1), -1: 失败 + * + * 改动原因:从独立文件(eq_enable)加载eq_enable,与模式加载完全分离,互不影响 + */ +int eq_flash_load_eq_enable(void); + +/** + * @brief 保存当前EQ模式到Flash(独立文件存储,与使能状态存储完全分离) + * @param mode 模式值 (0-9) + * @return 0: 成功, -1: 失败 + * + * 改动原因:将模式存储独立为单独文件(cur_mode),与eq_enable存储完全分离,互不影响 + */ +int eq_flash_save_current_mode(uint8_t mode); + +/** + * @brief 从Flash加载当前EQ模式(独立文件加载,与使能状态加载完全分离) + * @return 模式值: 成功(0-9), -1: 失败 + * + * 改动原因:从独立文件(cur_mode)加载模式,与eq_enable加载完全分离,互不影响 + * 注意:此函数同时加载模式和使能状态(从两个独立文件),用于初始化 + */ +int eq_flash_load_current_mode(void); + +#endif // __EQ_FLASH_STORAGE_H__ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_hid_protocol.md b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_hid_protocol.md new file mode 100644 index 0000000..c7771df --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_hid_protocol.md @@ -0,0 +1,1012 @@ +# EQ HID通信协议详细文档 + +## 1. 总体框架 + +### 1.1 协议概述 +该协议使用HID (Human Interface Device) 协议进行主机与设备之间的通信。协议支持EQ参数设置、读取、模式切换等功能。 + +### 1.2 支持的指令列表 +| 指令码 | 命令名称 | 功能 | 方向 | 描述 | +|--------|----------|------|------|------| +| 0x8A | SET_EQ_MODE | 切换EQ模式 | 主机→设备 | 切换EQ模式 | +| 0x8B | GET_EQ_MODE | 获取当前EQ模式信息 | 主机→设备 | 读取设备当前EQ模式和名称 | +| 0x8C | SET_MODE_GAIN_AND_NAME | 设置模式整体增益和名称 | 主机→设备 | 设置模式整体增益和名称 | +| 0x8D | SET_EQ_PARAMS | 发送EQ参数 | 主机→设备 | 发送单个滤波器的参数 | +| 0x8E | GET_EQ_PARAMS | 读取EQ参数 | 主机→设备 | 读取单个滤波器的参数 | +| 0x8F | GET_DEVICE_INFO | 获取设备信息 | 主机→设备 | 读取设备PID、VID、产品字符串等信息 | +| 0x90 | RESET_EQ_PARAMS | 复位EQ参数 | 主机→设备 | 删除Flash中的EQ参数并恢复头文件预设参数 | +| 0x91 | GET_EQ_MODE_COUNT | 获取EQ模式总数 | 主机→设备 | 返回预定义加用户模式的总数(不包含禁用模式) | +| 0x92 | SET_AND_SAVE_EQ_MODE | 设置并保存EQ模式 | 主机→设备 | 设置当前EQ模式(0-9)并保存到Flash,开机时自动恢复 | +| 0x93 | SET_VOLUME | 设置音量级别 | 主机→设备 | 设置设备音量级别(0-255) | +| 0x94 | GET_VOLUME | 获取音量级别 | 主机→设备 | 读取设备当前音量级别(0-255) | +| 0x95 | GET_LED_INFO | 获取LED信息 | 主机→设备 | 读取LED索引和LED名称 | +| 0x96 | SET_LED_SWITCH | 设置LED开关 | 主机→设备 | 设置LED开关状态(ON/OFF) | +| 0x97 | GET_LED_SWITCH | 获取LED开关 | 主机→设备 | 读取LED开关状态(ON/OFF) | +| 0x98 | GET_LED_STATUS | 获取LED状态 | 主机→设备 | 读取LED RGB颜色和状态(熄灭、常亮、慢闪、快闪、呼吸) | +| 0x99 | GET_LED_COUNT | 获取LED总数 | 主机→设备 | 读取设备支持的LED总数 | +| 0x9A | GET_UAC_MODE_INFO | 获取UAC模式信息 | 主机→设备 | 读取UAC模式总数和模式名称列表 | +| 0x9B | SET_UAC_MODE | 设置UAC模式 | 主机→设备 | 设置UAC模式(UAC1.0/UAC2.0) | +| 0x9C | GET_CURRENT_UAC_MODE | 获取当前UAC模式 | 主机→设备 | 读取当前UAC模式(UAC1.0/UAC2.0) | +| 0x9D | SET_EQ_ENABLE | 设置EQ使能开关 | 主机→设备 | 设置EQ使能开关(ON/OFF),禁用时保存当前模式,启用时恢复之前模式 | +| 0x9E | GET_EQ_ENABLE | 获取EQ使能开关 | 主机→设备 | 读取EQ使能开关状态(ON/OFF) | +| 0x9F | GET_SAMPLE_FORMAT | 获取采样率和格式 | 主机→设备 | 读取当前采样率、DSD模式和DAC采样分辨率 | +| 0xA0 | SET_GAIN_MODE | 设置增益模式 | 主机→设备 | 设置增益模式(0=低阻,1=高阻) | +| 0xA1 | GET_GAIN_MODE | 获取增益模式 | 主机→设备 | 读取当前增益模式(0=低阻,1=高阻) | +| 0xA2 | SET_FILTER_MODE | 设置滤波器模式 | 主机→设备 | 设置滤波器模式(0-7:8种滤波器模式) | +| 0xA3 | GET_FILTER_MODE | 获取滤波器模式 | 主机→设备 | 读取当前滤波器模式(0-7) | +| 0xA4 | SET_GAME_MODE | 设置游戏模式 | 主机→设备 | 设置游戏模式(0=无音效,1=FPS,2=虚拟7.1) | +| 0xA5 | GET_GAME_MODE | 获取游戏模式 | 主机→设备 | 读取当前游戏模式(0-2) | +| 0xA6 | GET_FIRMWARE_VERSION | 获取固件版本 | 主机→设备 | 读取设备固件版本号(BCD格式:主版本.次版本.修订版本) | +| 0xB0 | SET_INPUT_SOURCE | 设置输入源模式 | 主机→设备 | 设置输入源模式(0=USB, 1=OPT, 2=COAX),通过UART 0x5D透传给MCU | +| 0xB1 | SET_MUTE_SWITCH | 设置静音开关 | 主机→设备 | 设置静音开关(0=关,1=开),通过UART 0x5E透传给MCU | +| 0xB2 | GET_MUTE_SWITCH | 获取静音开关状态 | 主机→设备 | 读取静音开关状态(0=关,1=开),设备通过串口向MCU请求后返回 | +| 0xB3 | SET_LISTEN_SWITCH | 设置监听开关 | 主机→设备 | 设置监听开关(0=关,1=开),通过UART 0x60透传给MCU | +| 0xB4 | GET_LISTEN_SWITCH | 获取监听开关状态 | 主机→设备 | 读取监听开关状态(0=关,1=开),直接返回 g_adc_loop 的值,不经过串口 | + +### 1.3 数据包格式 +- **Report ID**: 0x01 (HID报告ID) +- **数据包大小**: 64字节 (1字节Report ID + 63字节数据) +- **同步头**: 0x77 (所有命令的第一个字节) +- **字节序**: 小端序 (Little Endian) + +## 2. 详细指令说明 + +### 2.1 0x8A - SET_EQ_MODE (切换EQ模式) +**功能**: 切换当前EQ模式 +**方向**: 主机→设备 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x8A | 命令码 +2 | 1 | uint8 | 模式值 (0-5: 预设模式, 6-8: 用户模式, 9: bypass) +3-62 | 60 | 0x00 | 保留字节 +``` + + +## 2.2 0x8B - GET_EQ_MODE (读取EQ模式信息) +**功能**: 读取EQ模式信息 +**方向**: 主机→设备 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x8B | 命令码 +2 | 1 | uint8 | 模式值 (0-9: 有效模式值, 0xFF: 获取当前模式信息) +3-62 | 60 | 0x00 | 保留字节 +``` + +**设备端处理**: +- 如果mode值为0xFF,返回当前模式值、整体增益和模式名称 +- 如果mode值为有效模式值(0-9),返回指定模式值、整体增益和模式名称 + + + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x8B | 同步头2 +3 | 1 | uint8 | 模式值 (当前模式或指定模式) +4-7 | 4 | int32 | 增益值 (范围0到-50dB,有符号整数) +8-23 | 16 | char | 模式名称 (UTF-8编码,16字节) +24-62 | 39 | 0x00 | 保留字节 +``` + +**使用说明**: +- 发送mode=0xFF时,返回当前激活的EQ模式信息 +- 发送mode=0-9时,返回指定模式的增益和名称信息(不切换当前模式) + +### 2.3 0x8C - SET_MODE_GAIN_AND_NAME (设置模式整体增益和名称) +**功能**: 设置EQ模式整体增益和名称 +**方向**: 主机→设备 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x8C | 命令码 +2 | 1 | uint8 | 模式值 (0-9) +3-6 | 4 | int32 | 增益值 (范围0到-50dB,有符号整数) +7-22 | 16 | char | 模式名称 (UTF-8编码,16字节) +23-62 | 40 | 0x00 | 保留字节 +``` + +**使用场景**: +- 需要为特定模式设置整体增益补偿和自定义名称 +- 自动应用到所有采样率以确保一致性 + + +### 2.4 0x8D - SET_EQ_PARAMS (发送EQ参数) +**功能**: 发送单个滤波器的参数 +**方向**: 主机→设备 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x8D | 命令码 +2 | 1 | uint8 | 模式值 (0-9) +3 | 1 | uint8 | 滤波器Band索引 (0-7) +4 | 1 | uint8 | 滤波器类型 +5-8 | 4 | float | 中心频率 (Hz) +9-12 | 4 | float | Q值 +13-16 | 4 | float | 带宽 (Hz) +17-20 | 4 | float | 增益 (dB) +21-62 | 42 | 0x00 | 保留字节 +``` + +**滤波器类型码**: +| 类型码 | 滤波器类型 | +|--------|------------| +| 0x00 | bypass滤波器 | +| 0x01 | 全通滤波器 | +| 0x02 | 峰值滤波器 | +| 0x03 | 低通滤波器 | +| 0x04 | 高通滤波器 | +| 0x05 | 带通滤波器 | +| 0x06 | 带阻滤波器 | +| 0x07 | 陷波滤波器 | +| 0x08 | 恒定Q值滤波器 | +| 0x09 | 低架滤波器 | +| 0x0A | 高架滤波器 | + +### 2.5 0x8E - GET_EQ_PARAMS (读取EQ参数) +**功能**: 读取单个滤波器的参数 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x8E | 命令码 +2 | 1 | uint8 | 模式值 (0-9) +3 | 1 | uint8 | EQ索引 (0-7) +4-62 | 59 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x8E | 同步头2 +3 | 1 | uint8 | 模式值 (0-9) +4 | 1 | uint8 | 滤波器Band索引 (0-7) +5 | 1 | uint8 | 滤波器类型 +6-9 | 4 | float | 中心频率 (Hz) +10-13 | 4 | float | Q值 +14-17 | 4 | float | 带宽 (Hz) +18-21 | 4 | float | 增益 (dB) +22-62 | 41 | 0x00 | 保留字节 +``` + +### 2.6 0x8F - GET_DEVICE_INFO (获取设备信息) +**功能**: 获取设备基本信息 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x8F | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x8F | 同步头2 +3-4 | 2 | uint16 | 产品ID (PID) +5-6 | 2 | uint16 | 厂商ID (VID) +7-22 | 16 | char | 产品字符串 (UTF-8编码,16字节) +23-38 | 16 | char | 厂商字符串 (UTF-8编码,16字节) +39-54 | 16 | char | 序列号字符串 (UTF-8编码,16字节) +55-62 | 8 | 0x00 | 保留字节 +``` + +### 2.7 0x90 - RESET_EQ_PARAMS (复位EQ参数) +**功能**: 删除客户定制EQ参数并恢复预设参数 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x90 | 命令码 +2 | 1 | uint8 | 模式号 (0-9, 0xFF表示恢复所有包括EQ参数,总体增益,模式名称 ) +3-62 | 60 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x90 | 同步头2 +3 | 1 | uint8 | 状态码 (0x00=成功, 0x01=失败) +4-62 | 59 | 0x00 | 保留字节 +``` + +### 2.8 0x91 - GET_EQ_MODE_COUNT (获取EQ模式总数) +**功能**: 获取预定义加用户模式的总数(不包含禁用模式) +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x91 | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x91 | 同步头2 +3 | 1 | uint8 | 模式总数 (当前为9,包含0-8共9个模式,不包含禁用模式) +4 | 1 | uint8 | 预定义模式数量 (当前为6,包含0-5共6个预设模式) +5-62 | 58 | 0x00 | 保留字节 +``` + +### 2.9 0x92 - SET_AND_SAVE_EQ_MODE (设置并保存EQ模式) +**功能**: 设置当前EQ模式并保存到Flash,开机时自动恢复 +**方向**: 主机→设备 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x92 | 命令码 +2 | 1 | uint8 | 模式值 (0-9: 0-5预设模式, 6-8用户模式, 9: bypass) +3-62 | 60 | 0x00 | 保留字节 +``` + +**设备端处理**: +- 将模式值保存到Flash +- 开机时自动从Flash读取并恢复该模式 + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x92 | 同步头2 +3 | 1 | uint8 | 状态码 (0x00=成功, 0x01=失败) +4-62 | 59 | 0x00 | 保留字节 +``` + +### 2.10 0x93 - SET_VOLUME (设置音量级别) +**功能**: 设置设备音量级别 +**方向**: 主机→设备 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x93 | 命令码 +2 | 1 | uint8 | 音量级别 (0-255: 0=最小音量, 255=最大音量) +3-62 | 60 | 0x00 | 保留字节 +``` + +**参数说明**: +- **音量级别范围:** 0-255(共256级) +- **说明:** 控制设备的输出音量级别,直接设置g_dac_vol全局变量 + - 0: 最小音量 + - 255: 最大音量 + - 与SET_DAC_VOLUME命令使用相同的实现方式 + +**设备端处理**: +- 直接设置 `g_dac_vol = data[2]`,与SET_DAC_VOLUME命令实现方式一致 +- 参数会通过现有的定时保存机制自动保存到Flash + +**返回值**: +无直接返回值。如需确认音量是否设置成功,请使用GET_VOLUME命令读取当前音量。 + +### 2.11 0x94 - GET_VOLUME (获取音量级别) +**功能**: 读取设备当前音量级别 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x94 | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x94 | 同步头2 +3 | 1 | uint8 | 当前音量级别 (0-255) +4-62 | 59 | 0x00 | 保留字节 +``` + +### 2.12 0x95 - GET_LED_INFO (获取LED信息) +**功能**: 读取LED索引和LED名称 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x95 | 命令码 +2 | 1 | uint8 | LED索引 (0-7,当前设备只有1个LED,索引为0) +3-62 | 60 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x95 | 同步头2 +3 | 1 | uint8 | LED索引 (0-7) +4-19 | 16 | char | LED名称 (UTF-8编码,16字节) +20-62 | 43 | 0x00 | 保留字节 +``` + +### 2.13 0x96 - SET_LED_SWITCH (设置LED开关) +**功能**: 设置LED开关状态 +**方向**: 主机→设备 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x96 | 命令码 +2 | 1 | uint8 | LED索引 (0-7,当前设备只有1个LED,索引为0) +3 | 1 | uint8 | LED开关 (0=OFF关闭, 1=ON开启) +4-62 | 59 | 0x00 | 保留字节 +``` + +**设备端处理**: +- 当LED开关为OFF时,所有LED输出都被禁用,不显示任何LED +- 当LED开关为ON时,LED正常显示 + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x96 | 同步头2 +3 | 1 | uint8 | 状态码 (0x00=成功, 0x01=失败) +4-62 | 59 | 0x00 | 保留字节 +``` + +### 2.14 0x97 - GET_LED_SWITCH (获取LED开关) +**功能**: 读取LED开关状态 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x97 | 命令码 +2 | 1 | uint8 | LED索引 (0-7,当前设备只有1个LED,索引为0) +3-62 | 60 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x97 | 同步头2 +3 | 1 | uint8 | LED索引 (0-7) +4 | 1 | uint8 | LED开关 (0=OFF关闭, 1=ON开启) +5-62 | 58 | 0x00 | 保留字节 +``` + +### 2.15 0x98 - GET_LED_STATUS (获取LED状态) +**功能**: 读取LED RGB颜色和状态 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x98 | 命令码 +2 | 1 | uint8 | LED索引 (0-7,当前设备只有1个LED,索引为0) +3-62 | 60 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x98 | 同步头2 +3 | 1 | uint8 | LED索引 (0-7) +4 | 1 | uint8 | R颜色值 (0-255) +5 | 1 | uint8 | G颜色值 (0-255) +6 | 1 | uint8 | B颜色值 (0-255) +7 | 1 | uint8 | LED状态 (0=熄灭, 1=常亮, 2=慢闪, 3=快闪, 4=呼吸) +8-62 | 55 | 0x00 | 保留字节 +``` + +**LED状态枚举**: +- 0: LED_STATUS_OFF (熄灭) +- 1: LED_STATUS_SOLID (常亮) +- 2: LED_STATUS_SLOW_BLINK (慢闪) +- 3: LED_STATUS_FAST_BLINK (快闪) +- 4: LED_STATUS_BREATHE (呼吸) + +**注意**: +- RGB颜色值基于当前LED颜色定义转换(低电平有效) +- LED状态基于当前LED显示模式(常亮/闪烁)判断 + +### 2.16 0x99 - GET_LED_COUNT (获取LED总数) +**功能**: 读取设备支持的LED总数 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x99 | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x99 | 同步头2 +3 | 1 | uint8 | LED总数 (当前设备为1) +4-62 | 59 | 0x00 | 保留字节 +``` + +**设备端处理**: +- 返回设备支持的LED总数 +- 当前设备只有1个LED,所以返回1 +- LED索引范围为0到(LED总数-1) + +### 2.17 0x9A - GET_UAC_MODE_INFO (获取UAC模式信息) +**功能**: 读取UAC模式总数和模式名称列表 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x9A | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x9A | 同步头2 +3 | 1 | uint8 | UAC模式总数 (当前为2,包含UAC1.0和UAC2.0) +4-11 | 8 | char | 模式0名称 (UTF-8编码,8字节,如"UAC2.0") +12-19 | 8 | char | 模式1名称 (UTF-8编码,8字节,如"UAC1.0") +20-62 | 43 | 0x00 | 保留字节 +``` + +**设备端处理**: +- 返回UAC模式总数(当前为2) +- 返回每个模式的名称(不超过8个字符) +- 模式0对应UAC2.0,模式1对应UAC1.0 + +### 2.18 0x9B - SET_UAC_MODE (设置UAC模式) +**功能**: 设置UAC模式(UAC1.0或UAC2.0),通过UART 0x51命令透传给MCU处理 +**方向**: 主机→设备(XMOS)→MCU +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x9B | 命令码 +2 | 1 | uint8 | UAC模式值 (0=UAC2.0, 1=UAC1.0) +3-62 | 60 | 0x00 | 保留字节 +``` + +**设备端处理**: +- XMOS设备接收到HID 0x9B命令后,将其转换为UART 0x51命令格式 +- 通过UART接口将完整的0x51数据包透传给MCU +- MCU负责处理UAC模式切换和设备重启 +- 注意:设备重启后不会返回响应 + +**透传机制**: +- HID 0x9B命令 → XMOS设备转换为UART 0x51命令 → 透传给MCU +- UART 0x51数据包格式:0x55 0xAA 0x00 0x51 [长度] [UAC模式值] [校验和] +- MCU根据UAC模式值执行相应的模式切换操作 + +### 2.19 0x9C - GET_CURRENT_UAC_MODE (获取当前UAC模式) +**功能**: 读取当前UAC模式 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x9C | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x9C | 同步头2 +3 | 1 | uint8 | 当前UAC模式值 (0=UAC2.0, 1=UAC1.0) +4-11 | 8 | char | 当前UAC模式名称 (UTF-8编码,8字节,如"UAC2.0"或"UAC1.0") +12-62 | 51 | 0x00 | 保留字节 +``` + +**设备端处理**: +- 返回当前UAC模式名称(不超过8个字符) + +### 2.20 0x9D - SET_EQ_ENABLE (设置EQ使能开关) +**功能**: 设置EQ使能开关(启用/禁用) +**方向**: 主机→设备 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x9D | 命令码 +2 | 1 | uint8 | EQ使能开关 (0=OFF禁用, 1=ON启用) +3-62 | 60 | 0x00 | 保留字节 +``` + +**设备端处理**: +- 只保存EQ使能状态到Flash(独立文件存储),不影响已保存的模式 + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x9D | 同步头2 +3 | 1 | uint8 | 状态码 (0x00=成功, 0x01=失败) +4 | 1 | uint8 | 当前EQ使能状态 (0=OFF, 1=ON) +5-62 | 58 | 0x00 | 保留字节 +``` + +### 2.21 0x9E - GET_EQ_ENABLE (获取EQ使能开关) +**功能**: 读取EQ使能开关状态 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x9E | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x9E | 同步头2 +3 | 1 | uint8 | EQ使能开关状态 (0=OFF禁用, 1=ON启用) +4-62 | 59 | 0x00 | 保留字节 +``` + +**设备端处理**: +- 返回当前EQ使能开关状态(0=OFF, 1=ON) + + +### 2.22 0x9F - GET_SAMPLE_FORMAT (获取采样率和格式) +**功能**: 读取当前采样率和DSD模式 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x9F | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x9F | 同步头2 +3-6 | 4 | uint32 | 采样率 (samFreq,小端序,单位:Hz) +7 | 1 | uint8 | DSD模式 (dsdMode: 0=PCM, 1=DOP, 2=Native DSD) +8-62 | 55 | 0x00 | 保留字节 +``` + +**设备端处理**: +- 返回当前采样率(32位无符号整数,小端序,单位:Hz) +- 返回DSD模式(0表示PCM格式,>0表示DSD格式) +- 设备会在采样率或DSD模式发生变化时自动上报此信息(通过HID状态报告) + +**自动上报机制**: +- 设备中监控采样率和DSD模式的变化 +- 当这些值发生变化时,设备会自动构建0x9F响应数据包并通过HID状态报告上报 +- 主机可以通过HID GET_REPORT接收这些自动上报的状态变化 + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x9E | 同步头2 +3 | 1 | uint8 | EQ使能开关状态 (0=OFF禁用, 1=ON启用) +4 | 1 | uint8 | 保存的模式值 (0-9,如果之前有保存,0xFF表示未保存) +5-62 | 58 | 0x00 | 保留字节 +``` + +**设备端处理**: +- 返回当前EQ使能开关状态 +- 返回之前保存的模式值(如果存在) + +### 2.23 0xA0 - SET_GAIN_MODE (设置增益模式) +**功能**: 设置增益模式 +**方向**: 主机→设备 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xA0 | 命令码 +2 | 1 | uint8 | 增益模式值 (0=低阻, 1=高阻) +3-62 | 60 | 0x00 | 保留字节 +``` + +**参数说明**: +- **增益模式范围:** 0-1 +- **说明:** 控制设备的增益档位 + - 0: 低阻模式(适合高灵敏度耳机) + - 1: 高阻模式(适合高阻抗耳机) + +**设备端处理**: +- 参数会通过现有的定时保存机制自动保存到Flash + +**返回值**: +无直接返回值。如需确认增益模式是否设置成功,请使用GET_GAIN_MODE命令读取当前增益模式。 + +### 2.24 0xA1 - GET_GAIN_MODE (获取增益模式) +**功能**: 读取设备当前增益模式 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xA1 | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0xA1 | 同步头2 +3 | 1 | uint8 | 当前增益模式 (0=低阻, 1=高阻) +4-62 | 59 | 0x00 | 保留字节 +``` + +### 2.25 0xA2 - SET_FILTER_MODE (设置滤波器模式) +**功能**: 设置滤波器模式 +**方向**: 主机→设备 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xA2 | 命令码 +2 | 1 | uint8 | 滤波器模式值 (0-7: 8种滤波器模式) +3-62 | 60 | 0x00 | 保留字节 +``` + +**参数说明**: +- **滤波器模式范围:** 0-7(共8种模式) +- **说明:** 选择DAC的数字滤波器类型 + - 0: Minimum Phase filter (default) + - 1: Linear Phase Apodizing Fast Roll-off filter + - 2: Linear phase fast roll-off filter + - 3: Linear Phase Fast Roll-off low-ripple filter + - 4: Linear phase slow roll-off filter + - 5: Minimum phase fast roll-off filter + - 6: Minimum phase slow roll-off filter + - 7: Minimum Phase Fast Roll-Off Low Dispersion + +**设备端处理**: +- 参数会通过现有的定时保存机制自动保存到Flash +- 如果参数超出范围(>7),固件将拒绝设置并返回false + +**返回值**: +无直接返回值。如需确认滤波器模式是否设置成功,请使用GET_FILTER_MODE命令读取当前滤波器模式。 + +### 2.26 0xA3 - GET_FILTER_MODE (获取滤波器模式) +**功能**: 读取设备当前滤波器模式 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xA3 | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0xA3 | 同步头2 +3 | 1 | uint8 | 当前滤波器模式 (0-7) +4-62 | 59 | 0x00 | 保留字节 +``` + +### 2.27 0xA4 - SET_GAME_MODE (设置游戏模式) +**功能**: 设置游戏模式,通过UART 0x5A命令透传给MCU处理 +**方向**: 主机→设备(XMOS)→MCU +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xA4 | 命令码 +2 | 1 | uint8 | 游戏模式值 (0=无音效, 1=FPS, 2=虚拟7.1) +3-62 | 60 | 0x00 | 保留字节 +``` + +**参数说明**: +- **游戏模式范围:** 0-2 +- **说明:** 选择游戏音效模式 + - 0: 无音效(标准立体声) + - 1: FPS模式(增强定位感) + - 2: 虚拟7.1(环绕声效果) + +**设备端处理**: +- XMOS设备接收到HID 0xA4命令后,将其转换为UART 0x5A命令格式 +- 通过UART接口将完整的0x5A数据包透传给MCU +- MCU负责处理游戏模式设置和参数保存 +- 如果参数超出范围(>2),MCU将拒绝设置 + +**透传机制**: +- HID 0xA4命令 → XMOS设备转换为UART 0x5A命令 → 透传给MCU +- UART 0x5A数据包格式:0x55 0xAA 0x00 0x5A [长度] [游戏模式值] [校验和] +- MCU根据游戏模式值执行相应的模式设置操作 + +**返回值**: +无直接返回值。如需确认游戏模式是否设置成功,请使用GET_GAME_MODE命令读取当前游戏模式。 + +### 2.28 0xA5 - GET_GAME_MODE (获取游戏模式) +**功能**: 读取设备当前游戏模式 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xA5 | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0xA5 | 同步头2 +3 | 1 | uint8 | 当前游戏模式 (0=无音效, 1=FPS, 2=虚拟7.1) +4-62 | 59 | 0x00 | 保留字节 +``` + +### 2.29 0xA6 - GET_FIRMWARE_VERSION (获取固件版本) +**功能**: 读取设备固件版本号 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xA6 | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0xA6 | 同步头2 +3 | 1 | uint8 | 主版本号 (BCD格式,如0x01表示1) +4 | 1 | uint8 | 次版本号 (BCD格式,如0x00表示0) +5 | 1 | uint8 | 修订版本号 (BCD格式,如0x0C表示12) +6-62 | 57 | 0x00 | 保留字节 +``` + +**版本号格式说明**: +- 版本号采用BCD(Binary Coded Decimal)格式 +- 3个字节分别表示:主版本号、次版本号、修订版本号 +- 例如:0x01 0x00 0x0C 表示版本 1.0.12 + +### 2.30 0xB0 - SET_INPUT_SOURCE (设置输入源模式) +**功能**: 设置输入源模式(USB/OPT/COAX),通过UART 0x5D命令透传给MCU处理 +**方向**: 主机→设备(XMOS)→MCU +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xB0 | 命令码 +2 | 1 | uint8 | 输入源模式值 (0=USB, 1=OPT, 2=COAX) +3-62 | 60 | 0x00 | 保留字节 +``` + +**设备端处理**: +- XMOS设备接收到HID 0xB0命令后,将其转换为UART 0x5D命令格式 +- 通过UART接口将完整的0x5D数据包透传给MCU +- MCU负责处理输入源切换(USB/OPT/COAX) +- 本命令不返回HID响应 + +**透传机制**: +- HID 0xB0命令 → XMOS设备转换为UART 0x5D命令 → 透传给MCU +- UART 0x5D数据包格式:0x55 0xAA 0x00 0x5D [长度] [输入源模式值] [校验和] +- MCU根据输入源模式值执行相应的输入切换操作 + +### 2.31 0xB1 - SET_MUTE_SWITCH (设置静音开关) +**功能**: 设置静音开关(0=关,1=开),通过UART 0x5E命令透传给MCU处理 +**方向**: 主机→设备(XMOS)→MCU +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xB1 | 命令码 +2 | 1 | uint8 | 静音开关值 (0=关,1=开) +3-62 | 60 | 0x00 | 保留字节 +``` + +**设备端处理**: +- XMOS设备接收到HID 0xB1命令后,将其转换为UART 0x5E命令格式并透传给MCU +- MCU负责处理静音开关状态 +- 本命令不返回HID响应 + +### 2.32 0xB2 - GET_MUTE_SWITCH (获取静音开关状态) +**功能**: 读取静音开关状态(0=关,1=开);设备通过串口向MCU发送0x5F请求,MCU返回状态后设备再通过HID响应返回给主机 +**方向**: 主机→设备→MCU→设备→主机 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xB2 | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**设备端处理**: +- 主机发送0xB2后,XMOS向MCU发送UART 0x5F(GET请求) +- MCU返回UART 0x5F响应(含静音开关值) +- 主机随后通过HID读报告获取响应 + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0xB2 | 同步头2 +3 | 1 | uint8 | 静音开关状态 (0=关,1=开) +4-62 | 59 | 0x00 | 保留字节 +``` + +**说明**: 主机发送0xB2后建议稍作延时(如50ms)再执行HID读,以确保MCU已返回数据。 + +**状态变化上报**: 当静音开关状态发生变化(如 MCU 通过 0x5F 返回新值)时,设备会主动通过 HID 上报,数据格式与上述响应一致(0x77 0xB2 + 1 字节静音值),与音量变化上报(0x94)方式相同,主机可通过 HID 读或中断 IN 获取。 + +### 2.33 0xB3 - SET_LISTEN_SWITCH (设置监听开关) +**功能**: 设置监听开关(0=关,1=开),通过UART 0x60命令透传给MCU处理 +**方向**: 主机→设备(XMOS)→MCU +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xB3 | 命令码 +2 | 1 | uint8 | 监听开关值 (0=关,1=开) +3-62 | 60 | 0x00 | 保留字节 +``` + +**设备端处理**: +- XMOS设备接收到HID 0xB3命令后,将其转换为UART 0x60命令格式并透传给MCU +- MCU负责处理监听开关(对应 g_adc_loop 语义) +- 本命令不返回HID响应 + +### 2.34 0xB4 - GET_LISTEN_SWITCH (获取监听开关状态) +**功能**: 读取监听开关状态(0=关,1=开),设备直接返回 g_adc_loop 的值,不经过串口 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xB4 | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0xB4 | 同步头2 +3 | 1 | uint8 | 监听开关状态 (0=关,1=开),即 g_adc_loop 的值 +4-62 | 59 | 0x00 | 保留字节 +``` + +**设备端处理**: +- 设备直接读取 g_adc_loop,填入响应字节 3,无需向 MCU 请求 + +**状态变化上报**: 当监听开关状态(g_adc_loop)发生变化时,设备会主动通过 HID 上报,数据格式与上述响应一致(0x77 0xB4 + 1 字节监听状态),与音量变化上报(0x94)方式相同,主机可通过 HID 读或中断 IN 获取。 + +## 5. 关键特性 + +### 5.1 设备端系数计算 +- 主机只发送参数 (fc, Q, bw, gain) +- 设备端根据参数实时计算滤波器系数 + +### 5.2 参数格式 +- **浮点参数**: fc, Q, bw, gain 使用IEEE 754 float格式传输 +- **字节序**: 所有多字节数据使用小端序 + +### 5.3 错误处理 +- 数据包长度检查 +- 同步头验证 +- 参数范围检查 +- 滤波器索引边界检查 + +### 5.4 模式管理 +- 支持10个EQ模式 (0-9: 0-5预设模式, 6-8用户模式, 9: bypass) +- 支持禁用EQ模式 (10) +- 模式切换时自动清除滤波器状态 + +## 7. 注意事项 + +1. **时序要求**: 发送参数后需要等待设备处理完成再发送下一条命令 +2. **数据完整性**: 所有8个滤波器的参数都需要发送,即使某些滤波器未使用 +3. **模式同步**: 设置模式后需要调用读取模式确保数据同步 +4. **错误恢复**: 通信失败时需要重新建立连接并重试 +5. **参数验证**: 设备端会验证参数范围,超出范围的值会被限制 + diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode0.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode0.json new file mode 100644 index 0000000..15cfd78 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode0.json @@ -0,0 +1,202 @@ +{ + "mode_0": { + "sample_rate": 176400.0, + "mode": 0, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "峰值滤波器", + "fc": 600, + "Q": 0.2, + "bw": 1, + "gain": -9.0, + "coefficients": { + "float": [ + 0.9155671107280683, + -1.7378713657626566, + 0.822701204630699, + 1.7378713657626566, + -0.7382683153587671 + ], + "q30": [ + "0x3a98a6cb", + "-0x6f3948d2", + "0x34a722f4", + "0x6f3948d2", + "-0x2f3fc9bf" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3200, + "Q": 0.1, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0442338113928935, + -1.266692268528345, + 0.23073141176218073, + 1.266692268528345, + -0.2749652231550741 + ], + "q30": [ + "0x42d4ba0d", + "-0x51117c72", + "0x0ec44dae", + "0x51117c72", + "-0x119907bc" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 5000, + "Q": 0.4, + "bw": 1, + "gain": -2.0, + "coefficients": { + "float": [ + 0.8052406008107629, + -1.4085613863240112, + 0.6259580687205994, + 1.7762044072535015, + -0.7988416904608524 + ], + "q30": [ + "0x33890fdf", + "-0x5a25dea8", + "0x280fb26e", + "0x71ad5540", + "-0x332038e5" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode1.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode1.json new file mode 100644 index 0000000..dd7a26e --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode1.json @@ -0,0 +1,202 @@ +{ + "mode_1": { + "sample_rate": 176400.0, + "mode": 1, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "低架滤波器", + "fc": 100, + "Q": 0.3, + "bw": 1, + "gain": -8.0, + "coefficients": { + "float": [ + 0.9985279548308079, + -1.9920260531214533, + 0.9935107348804876, + 1.9920165005770918, + -0.992048242255657 + ], + "q30": [ + "0x3fe7e1cb", + "-0x7f7d5ad7", + "0x3f95ae0c", + "0x7f7d32c6", + "-0x3f7db7e9" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": -5.0, + "coefficients": { + "float": [ + 0.5748583959086605, + -1.0485969489819282, + 0.48194014823964165, + 1.8678899301279297, + -0.8760915252943035 + ], + "q30": [ + "0x24ca7ade", + "-0x431c3660", + "0x1ed81b7d", + "0x778b8234", + "-0x3811e230" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": -2.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode2.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode2.json new file mode 100644 index 0000000..762c299 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode2.json @@ -0,0 +1,202 @@ +{ + "mode_2": { + "sample_rate": 176400.0, + "mode": 2, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "高架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 0.6310227167300719, + -1.2614097056087148, + 0.6303873089514883, + 1.9991997489278437, + -0.9992000690006894 + ], + "q30": [ + "0x2862ad1a", + "-0x50baefc6", + "0x28584402", + "0x7ff2e380", + "-0x3ff2e4d8" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -2.5, + "coefficients": { + "float": [ + 0.9999220349933291, + -1.9988366921695855, + 0.998915164365431, + 1.9988366075903554, + -0.9988372839379904 + ], + "q30": [ + "0x3ffeb8fd", + "-0x7fecf0bb", + "0x3fee39de", + "0x7fecf060", + "-0x3fecf337" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 55, + "Q": 0.41, + "bw": 1, + "gain": 3.75, + "coefficients": { + "float": [ + 1.001286850769367, + -1.995229408758731, + 0.993946386690705, + 1.995229408758731, + -0.9952332374600719 + ], + "q30": [ + "0x40151571", + "-0x7fb1d6b0", + "0x3f9cd14e", + "0x7fb1d6b0", + "-0x3fb1e6bf" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 350, + "Q": 0.81, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9968595541535487, + -1.9783403460755207, + 0.9816345357891075, + 1.9783403460755207, + -0.9784940899426562 + ], + "q30": [ + "0x3fcc8c03", + "-0x7e9d20d3", + "0x3ed319a8", + "0x7e9d20d3", + "-0x3e9fa5ac" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3600, + "Q": 0.41, + "bw": 1, + "gain": 3.65, + "coefficients": { + "float": [ + 1.0704628546428228, + -1.715977226183559, + 0.6597191418149229, + 1.715977226183559, + -0.7301819964577457 + ], + "q30": [ + "0x448276a2", + "-0x6dd29224", + "0x2a38d6a2", + "0x6dd29224", + "-0x2ebb4d44" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 10000, + "Q": 0.71, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.1065316340062092, + -1.69331782375213, + 0.6874906479635262, + 1.5036953412992213, + -0.6043997995168271 + ], + "q30": [ + "0x46d16a0f", + "-0x6c5f51b8", + "0x2bffd8c6", + "0x603c8b62", + "-0x26ae7c7f" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode3.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode3.json new file mode 100644 index 0000000..1d40b41 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode3.json @@ -0,0 +1,202 @@ +{ + "mode_3": { + "sample_rate": 176400.0, + "mode": 3, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 600, + "Q": 0.2, + "bw": 1, + "gain": -6.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 2000, + "Q": 0.11, + "bw": 1, + "gain": -5.0, + "coefficients": { + "float": [ + 0.9833600352727222, + -1.8677285789882112, + 0.8891177997574193, + 1.8658804548929924, + -0.8743259591253603 + ], + "q30": [ + "0x3eef5eed", + "-0x7788dd73", + "0x38e74e58", + "0x776a95db", + "-0x37f4f4de" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3200, + "Q": 0.5, + "bw": 1, + "gain": -10.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode4.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode4.json new file mode 100644 index 0000000..cac2087 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode4.json @@ -0,0 +1,202 @@ +{ + "mode_4": { + "sample_rate": 176400.0, + "mode": 4, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "高架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 0.6310227167300719, + -1.2614097056087148, + 0.6303873089514883, + 1.9991997489278437, + -0.9992000690006894 + ], + "q30": [ + "0x2862ad1a", + "-0x50baefc6", + "0x28584402", + "0x7ff2e380", + "-0x3ff2e4d8" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -2.5, + "coefficients": { + "float": [ + 0.9999220349933291, + -1.9988366921695855, + 0.998915164365431, + 1.9988366075903554, + -0.9988372839379904 + ], + "q30": [ + "0x3ffeb8fd", + "-0x7fecf0bb", + "0x3fee39de", + "0x7fecf060", + "-0x3fecf337" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 55, + "Q": 0.41, + "bw": 1, + "gain": 3.75, + "coefficients": { + "float": [ + 1.001286850769367, + -1.995229408758731, + 0.993946386690705, + 1.995229408758731, + -0.9952332374600719 + ], + "q30": [ + "0x40151571", + "-0x7fb1d6b0", + "0x3f9cd14e", + "0x7fb1d6b0", + "-0x3fb1e6bf" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 350, + "Q": 0.81, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9968595541535487, + -1.9783403460755207, + 0.9816345357891075, + 1.9783403460755207, + -0.9784940899426562 + ], + "q30": [ + "0x3fcc8c03", + "-0x7e9d20d3", + "0x3ed319a8", + "0x7e9d20d3", + "-0x3e9fa5ac" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3600, + "Q": 0.41, + "bw": 1, + "gain": 3.65, + "coefficients": { + "float": [ + 1.0704628546428228, + -1.715977226183559, + 0.6597191418149229, + 1.715977226183559, + -0.7301819964577457 + ], + "q30": [ + "0x448276a2", + "-0x6dd29224", + "0x2a38d6a2", + "0x6dd29224", + "-0x2ebb4d44" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 10000, + "Q": 0.71, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.1065316340062092, + -1.69331782375213, + 0.6874906479635262, + 1.5036953412992213, + -0.6043997995168271 + ], + "q30": [ + "0x46d16a0f", + "-0x6c5f51b8", + "0x2bffd8c6", + "0x603c8b62", + "-0x26ae7c7f" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode5.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode5.json new file mode 100644 index 0000000..969e95f --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode5.json @@ -0,0 +1,202 @@ +{ + "mode_5": { + "sample_rate": 176400.0, + "mode": 5, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "峰值滤波器", + "fc": 600, + "Q": 0.4, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9893808984656488, + -1.9268398176354453, + 0.9378990313106884, + 1.9268398176354453, + -0.9272799297763372 + ], + "q30": [ + "0x3f520442", + "-0x7b5157f4", + "0x3c0689a8", + "0x7b5157f4", + "-0x3b588deb" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 200, + "Q": 0.5, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.7085116110952062, + -1.4098853361948367, + 0.7014095005860805, + 1.9915233503539502, + -0.9915591258404001 + ], + "q30": [ + "0x2d584115", + "-0x5a3b8fb4", + "0x2ce3e4ac", + "0x7f751e5a", + "-0x3f75b468" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.5, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 0.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode6.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode6.json new file mode 100644 index 0000000..dd30aa9 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode6.json @@ -0,0 +1,202 @@ +{ + "mode_6": { + "sample_rate": 176400.0, + "mode": 6, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "高架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 0.6310227167300719, + -1.2614097056087148, + 0.6303873089514883, + 1.9991997489278437, + -0.9992000690006894 + ], + "q30": [ + "0x2862ad1a", + "-0x50baefc6", + "0x28584402", + "0x7ff2e380", + "-0x3ff2e4d8" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -2.5, + "coefficients": { + "float": [ + 0.9999220349933291, + -1.9988366921695855, + 0.998915164365431, + 1.9988366075903554, + -0.9988372839379904 + ], + "q30": [ + "0x3ffeb8fd", + "-0x7fecf0bb", + "0x3fee39de", + "0x7fecf060", + "-0x3fecf337" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 55, + "Q": 0.41, + "bw": 1, + "gain": 3.75, + "coefficients": { + "float": [ + 1.001286850769367, + -1.995229408758731, + 0.993946386690705, + 1.995229408758731, + -0.9952332374600719 + ], + "q30": [ + "0x40151571", + "-0x7fb1d6b0", + "0x3f9cd14e", + "0x7fb1d6b0", + "-0x3fb1e6bf" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 350, + "Q": 0.81, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9968595541535487, + -1.9783403460755207, + 0.9816345357891075, + 1.9783403460755207, + -0.9784940899426562 + ], + "q30": [ + "0x3fcc8c03", + "-0x7e9d20d3", + "0x3ed319a8", + "0x7e9d20d3", + "-0x3e9fa5ac" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3600, + "Q": 0.41, + "bw": 1, + "gain": 3.65, + "coefficients": { + "float": [ + 1.0704628546428228, + -1.715977226183559, + 0.6597191418149229, + 1.715977226183559, + -0.7301819964577457 + ], + "q30": [ + "0x448276a2", + "-0x6dd29224", + "0x2a38d6a2", + "0x6dd29224", + "-0x2ebb4d44" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 10000, + "Q": 0.71, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.1065316340062092, + -1.69331782375213, + 0.6874906479635262, + 1.5036953412992213, + -0.6043997995168271 + ], + "q30": [ + "0x46d16a0f", + "-0x6c5f51b8", + "0x2bffd8c6", + "0x603c8b62", + "-0x26ae7c7f" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode7.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode7.json new file mode 100644 index 0000000..bbdc7c7 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode7.json @@ -0,0 +1,202 @@ +{ + "mode_7": { + "sample_rate": 176400.0, + "mode": 7, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 85, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode8.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode8.json new file mode 100644 index 0000000..9db142f --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode8.json @@ -0,0 +1,202 @@ +{ + "mode_8": { + "sample_rate": 176400.0, + "mode": 8, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 130, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode9.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode9.json new file mode 100644 index 0000000..7312716 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_176400_mode9.json @@ -0,0 +1,202 @@ +{ + "mode_9": { + "sample_rate": 176400.0, + "mode": 9, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 130, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode0.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode0.json new file mode 100644 index 0000000..de797a7 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode0.json @@ -0,0 +1,202 @@ +{ + "mode_0": { + "sample_rate": 192000.0, + "mode": 0, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "峰值滤波器", + "fc": 600, + "Q": 0.2, + "bw": 1, + "gain": -9.0, + "coefficients": { + "float": [ + 0.9215927820803712, + -1.7566084951797154, + 0.835354381387612, + 1.7566084951797154, + -0.7569471634679831 + ], + "q30": [ + "0x3afb604a", + "-0x706c4609", + "0x35767239", + "0x706c4609", + "-0x3071d283" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3200, + "Q": 0.1, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0418824611060038, + -1.3063105953339762, + 0.2716236581838554, + 1.3063105953339762, + -0.3135061192898593 + ], + "q30": [ + "0x42ae33c6", + "-0x539a97c1", + "0x11624832", + "0x539a97c1", + "-0x14107bf8" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 5000, + "Q": 0.4, + "bw": 1, + "gain": -2.0, + "coefficients": { + "float": [ + 0.8043537655875335, + -1.4232806926968924, + 0.6381945661275895, + 1.7942986728356711, + -0.8135663118539018 + ], + "q30": [ + "0x337a8837", + "-0x5b1707e7", + "0x28d82e05", + "0x72d5ca19", + "-0x3411786f" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode1.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode1.json new file mode 100644 index 0000000..b94d952 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode1.json @@ -0,0 +1,202 @@ +{ + "mode_1": { + "sample_rate": 192000.0, + "mode": 1, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "低架滤波器", + "fc": 100, + "Q": 0.3, + "bw": 1, + "gain": -8.0, + "coefficients": { + "float": [ + 0.9986474766721821, + -1.9926732179865128, + 0.9940364113360969, + 1.9926651520559464, + -0.9926919539388452 + ], + "q30": [ + "0x3fe9d71b", + "-0x7f87f53f", + "0x3f9e4ae5", + "0x7f87d36a", + "-0x3f8843d5" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": -5.0, + "coefficients": { + "float": [ + 0.5738335944987293, + -1.0548978659644153, + 0.48802178254547074, + 1.8786105985477757, + -0.8855681096275608 + ], + "q30": [ + "0x24b9b08a", + "-0x43837256", + "0x1f3bbfb6", + "0x783b27f2", + "-0x38ad25dd" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": -2.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode2.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode2.json new file mode 100644 index 0000000..83d2db1 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode2.json @@ -0,0 +1,202 @@ +{ + "mode_2": { + "sample_rate": 192000.0, + "mode": 2, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "高架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 0.6310174049825422, + -1.2614507399104473, + 0.630433605110674, + 1.999264769323134, + -0.9992650395059027 + ], + "q30": [ + "0x286296d3", + "-0x50bb9be2", + "0x28590631", + "0x7ff3f438", + "-0x3ff3f55a" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -2.5, + "coefficients": { + "float": [ + 0.9999283694220642, + -1.9989312045993515, + 0.9990032633166911, + 1.998931133202518, + -0.998931704135589 + ], + "q30": [ + "0x3ffed38f", + "-0x7fee7d25", + "0x3fefab62", + "0x7fee7cd9", + "-0x3fee7f3e" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 55, + "Q": 0.41, + "bw": 1, + "gain": 3.75, + "coefficients": { + "float": [ + 1.0011825232573024, + -1.9956164557955929, + 0.994437164977196, + 1.9956164557955929, + -0.9956196882344984 + ], + "q30": [ + "0x40135fdc", + "-0x7fb82e15", + "0x3fa4dbc7", + "0x7fb82e15", + "-0x3fb83ba4" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 350, + "Q": 0.81, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9971121808193354, + -1.9800941991860823, + 0.9831119075433339, + 1.9800941991860823, + -0.9802240883626692 + ], + "q30": [ + "0x3fd0af9b", + "-0x7eb9dd05", + "0x3eeb4e34", + "0x7eb9dd05", + "-0x3ebbfdd0" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3600, + "Q": 0.41, + "bw": 1, + "gain": 3.65, + "coefficients": { + "float": [ + 1.0654797141316281, + -1.7371384585000738, + 0.6837838399910254, + 1.7371384585000738, + -0.7492635541226537 + ], + "q30": [ + "0x4430d1d3", + "-0x6f2d46c8", + "0x2bc31d4b", + "0x6f2d46c8", + "-0x2ff3ef1f" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 10000, + "Q": 0.71, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.1077564255091918, + -1.7366866397460652, + 0.7154130877428615, + 1.5431211312373858, + -0.629604004743374 + ], + "q30": [ + "0x46e57b34", + "-0x6f25dfb8", + "0x2dc953f9", + "0x62c27f22", + "-0x284b6e98" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode3.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode3.json new file mode 100644 index 0000000..f10e9f9 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode3.json @@ -0,0 +1,202 @@ +{ + "mode_3": { + "sample_rate": 192000.0, + "mode": 3, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 600, + "Q": 0.2, + "bw": 1, + "gain": -6.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 2000, + "Q": 0.11, + "bw": 1, + "gain": -5.0, + "coefficients": { + "float": [ + 0.9846988490010825, + -1.8783146556352648, + 0.8976460515577018, + 1.87674632731457, + -0.8839132288794791 + ], + "q30": [ + "0x3f054e52", + "-0x78364eac", + "0x3973086c", + "0x781c9ca0", + "-0x389208ca" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3200, + "Q": 0.5, + "bw": 1, + "gain": -10.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode4.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode4.json new file mode 100644 index 0000000..60aef88 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode4.json @@ -0,0 +1,202 @@ +{ + "mode_4": { + "sample_rate": 192000.0, + "mode": 4, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "高架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 0.6310174049825422, + -1.2614507399104473, + 0.630433605110674, + 1.999264769323134, + -0.9992650395059027 + ], + "q30": [ + "0x286296d3", + "-0x50bb9be2", + "0x28590631", + "0x7ff3f438", + "-0x3ff3f55a" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -2.5, + "coefficients": { + "float": [ + 0.9999283694220642, + -1.9989312045993515, + 0.9990032633166911, + 1.998931133202518, + -0.998931704135589 + ], + "q30": [ + "0x3ffed38f", + "-0x7fee7d25", + "0x3fefab62", + "0x7fee7cd9", + "-0x3fee7f3e" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 55, + "Q": 0.41, + "bw": 1, + "gain": 3.75, + "coefficients": { + "float": [ + 1.0011825232573024, + -1.9956164557955929, + 0.994437164977196, + 1.9956164557955929, + -0.9956196882344984 + ], + "q30": [ + "0x40135fdc", + "-0x7fb82e15", + "0x3fa4dbc7", + "0x7fb82e15", + "-0x3fb83ba4" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 350, + "Q": 0.81, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9971121808193354, + -1.9800941991860823, + 0.9831119075433339, + 1.9800941991860823, + -0.9802240883626692 + ], + "q30": [ + "0x3fd0af9b", + "-0x7eb9dd05", + "0x3eeb4e34", + "0x7eb9dd05", + "-0x3ebbfdd0" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3600, + "Q": 0.41, + "bw": 1, + "gain": 3.65, + "coefficients": { + "float": [ + 1.0654797141316281, + -1.7371384585000738, + 0.6837838399910254, + 1.7371384585000738, + -0.7492635541226537 + ], + "q30": [ + "0x4430d1d3", + "-0x6f2d46c8", + "0x2bc31d4b", + "0x6f2d46c8", + "-0x2ff3ef1f" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 10000, + "Q": 0.71, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.1077564255091918, + -1.7366866397460652, + 0.7154130877428615, + 1.5431211312373858, + -0.629604004743374 + ], + "q30": [ + "0x46e57b34", + "-0x6f25dfb8", + "0x2dc953f9", + "0x62c27f22", + "-0x284b6e98" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode5.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode5.json new file mode 100644 index 0000000..c3ab501 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode5.json @@ -0,0 +1,202 @@ +{ + "mode_5": { + "sample_rate": 192000.0, + "mode": 5, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "峰值滤波器", + "fc": 600, + "Q": 0.4, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9902146802501011, + -1.932617101619678, + 0.9427750235330516, + 1.932617101619678, + -0.9329897037831528 + ], + "q30": [ + "0x3f5fad64", + "-0x7bafffa3", + "0x3c566d0d", + "0x7bafffa3", + "-0x3bb61a72" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 200, + "Q": 0.5, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.7084656213257384, + -1.410373727017767, + 0.7019383141972331, + 1.9922120724334011, + -0.9922422809386058 + ], + "q30": [ + "0x2d578030", + "-0x5a43902a", + "0x2cec8ead", + "0x7f806710", + "-0x3f80e5c4" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.5, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 0.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode6.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode6.json new file mode 100644 index 0000000..755f0bc --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode6.json @@ -0,0 +1,202 @@ +{ + "mode_6": { + "sample_rate": 192000.0, + "mode": 6, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "高架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 0.6310174049825422, + -1.2614507399104473, + 0.630433605110674, + 1.999264769323134, + -0.9992650395059027 + ], + "q30": [ + "0x286296d3", + "-0x50bb9be2", + "0x28590631", + "0x7ff3f438", + "-0x3ff3f55a" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -2.5, + "coefficients": { + "float": [ + 0.9999283694220642, + -1.9989312045993515, + 0.9990032633166911, + 1.998931133202518, + -0.998931704135589 + ], + "q30": [ + "0x3ffed38f", + "-0x7fee7d25", + "0x3fefab62", + "0x7fee7cd9", + "-0x3fee7f3e" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 55, + "Q": 0.41, + "bw": 1, + "gain": 3.75, + "coefficients": { + "float": [ + 1.0011825232573024, + -1.9956164557955929, + 0.994437164977196, + 1.9956164557955929, + -0.9956196882344984 + ], + "q30": [ + "0x40135fdc", + "-0x7fb82e15", + "0x3fa4dbc7", + "0x7fb82e15", + "-0x3fb83ba4" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 350, + "Q": 0.81, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9971121808193354, + -1.9800941991860823, + 0.9831119075433339, + 1.9800941991860823, + -0.9802240883626692 + ], + "q30": [ + "0x3fd0af9b", + "-0x7eb9dd05", + "0x3eeb4e34", + "0x7eb9dd05", + "-0x3ebbfdd0" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3600, + "Q": 0.41, + "bw": 1, + "gain": 3.65, + "coefficients": { + "float": [ + 1.0654797141316281, + -1.7371384585000738, + 0.6837838399910254, + 1.7371384585000738, + -0.7492635541226537 + ], + "q30": [ + "0x4430d1d3", + "-0x6f2d46c8", + "0x2bc31d4b", + "0x6f2d46c8", + "-0x2ff3ef1f" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 10000, + "Q": 0.71, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.1077564255091918, + -1.7366866397460652, + 0.7154130877428615, + 1.5431211312373858, + -0.629604004743374 + ], + "q30": [ + "0x46e57b34", + "-0x6f25dfb8", + "0x2dc953f9", + "0x62c27f22", + "-0x284b6e98" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode7.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode7.json new file mode 100644 index 0000000..cc5e6fa --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode7.json @@ -0,0 +1,202 @@ +{ + "mode_7": { + "sample_rate": 192000.0, + "mode": 7, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 85, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode8.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode8.json new file mode 100644 index 0000000..9ab9c5a --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode8.json @@ -0,0 +1,202 @@ +{ + "mode_8": { + "sample_rate": 192000.0, + "mode": 8, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 130, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode9.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode9.json new file mode 100644 index 0000000..7f98808 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_192000_mode9.json @@ -0,0 +1,202 @@ +{ + "mode_9": { + "sample_rate": 192000.0, + "mode": 9, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 130, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode0.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode0.json new file mode 100644 index 0000000..9dce6bc --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode0.json @@ -0,0 +1,202 @@ +{ + "mode_0": { + "sample_rate": 44100.0, + "mode": 0, + "total_bshift": 0, + "post_gain_db": -4, + "bands": [ + { + "enabled": true, + "type": "峰值滤波器", + "fc": 125, + "Q": 0.75, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9951829876037918, + -1.9667009511011073, + 0.9718299015198903, + 1.9667009511011073, + -0.9670128891236821 + ], + "q30": [ + "0x3fb113fc", + "-0x7dde6daa", + "0x3e32760b", + "0x7dde6daa", + "-0x3de38a07" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 250, + "Q": 0.75, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9905237504899161, + -1.9338788151241537, + 0.9445824797687291, + 1.9338788151241537, + -0.9351062302586451 + ], + "q30": [ + "0x3f64bdba", + "-0x7bc4aba6", + "0x3c740a12", + "0x7bc4aba6", + "-0x3bd8c7cd" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 500, + "Q": 0.75, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.0117298717445247, + -1.9045528543862489, + 0.8976658753685514, + 1.9045528543862489, + -0.9093957471130761 + ], + "q30": [ + "0x40c02ea5", + "-0x79e431a7", + "0x39735b92", + "0x79e431a7", + "-0x3a338a38" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 1000, + "Q": 0.75, + "bw": 1, + "gain": 4.0, + "coefficients": { + "float": [ + 1.0505796573308959, + -1.8085339187004776, + 0.776466859938123, + 1.8085339187004776, + -0.8270465172690189 + ], + "q30": [ + "0x433cb275", + "-0x73bf050c", + "0x31b1a20e", + "0x73bf050c", + "-0x34ee5483" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 4000, + "Q": 0.75, + "bw": 1, + "gain": -1.0, + "coefficients": { + "float": [ + 0.968730127818369, + -1.1997132035040843, + 0.45618680213016627, + 1.1997132035040843, + -0.42491692994853514 + ], + "q30": [ + "0x3dffaca6", + "-0x4cc819e3", + "0x1d322a21", + "0x4cc819e3", + "-0x1b31d6c7" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 8000, + "Q": 0.71, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.8613534780971538, + -0.43888516175004405, + 0.18918909592131206, + 0.43888516175004405, + -0.05054257401846581 + ], + "q30": [ + "0x37206a56", + "-0x1c16b1ca", + "0x0c1bac94", + "0x1c16b1ca", + "-0x033c16eb" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 16000, + "Q": 0.75, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.8782528462699781, + 0.7591677956182449, + 0.2880173376868571, + -0.7591677956182449, + -0.1662701839568353 + ], + "q30": [ + "0x38354b6d", + "0x30963485", + "0x126ee045", + "-0x30963485", + "-0x0aa42bb2" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 4000, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + -1.238439033795616, + 0.4709121653494177, + 1.238439033795616, + -0.4709121653494177 + ], + "q30": [ + "0x40000000", + "-0x4f4295cb", + "0x1e236cc7", + "0x4f4295cb", + "-0x1e236cc7" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode1.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode1.json new file mode 100644 index 0000000..a398a91 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode1.json @@ -0,0 +1,202 @@ +{ + "mode_1": { + "sample_rate": 44100.0, + "mode": 1, + "total_bshift": 0, + "post_gain_db": -3, + "bands": [ + { + "enabled": true, + "type": "峰值滤波器", + "fc": 63, + "Q": 0.75, + "bw": 1, + "gain": -1.0, + "coefficients": { + "float": [ + 0.9992747226317901, + -1.9865814202464802, + 0.987386727945102, + 1.9865814202464802, + -0.9866614505768923 + ], + "q30": [ + "0x3ff41df7", + "-0x7f242665", + "0x3f31581a", + "0x7f242665", + "-0x3f257611" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 125, + "Q": 0.75, + "bw": 1, + "gain": -2.0, + "coefficients": { + "float": [ + 0.9969712136756477, + -1.9702348799967075, + 0.9735761648593506, + 1.9702348799967075, + -0.9705473785349984 + ], + "q30": [ + "0x3fce6059", + "-0x7e185409", + "0x3e4f1267", + "0x7e185409", + "-0x3e1d72c0" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 250, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + -1.9523800556701958, + 0.9536192133722544, + 1.9523800556701958, + -0.9536192133722544 + ], + "q30": [ + "0x40000000", + "-0x7cf3cb7a", + "0x3d0818e1", + "0x7cf3cb7a", + "-0x3d0818e1" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 500, + "Q": 0.75, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.0117298717445247, + -1.9045528543862489, + 0.8976658753685514, + 1.9045528543862489, + -0.9093957471130761 + ], + "q30": [ + "0x40c02ea5", + "-0x79e431a7", + "0x39735b92", + "0x79e431a7", + "-0x3a338a38" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 1000, + "Q": 0.75, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.0356749025498964, + -1.8085339187004776, + 0.7913716147191224, + 1.8085339187004776, + -0.8270465172690189 + ], + "q30": [ + "0x42487f62", + "-0x73bf050c", + "0x32a5d521", + "0x73bf050c", + "-0x34ee5483" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 4000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 0.9999999999999999, + -1.220252533217394, + 0.4493117924480128, + 1.220252533217394, + -0.4493117924480128 + ], + "q30": [ + "0x3fffffff", + "-0x4e189e14", + "0x1cc1863f", + "0x4e189e14", + "-0x1cc1863f" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 8000, + "Q": 0.75, + "bw": 1, + "gain": -2.0, + "coefficients": { + "float": [ + 0.9110192174324842, + -0.4740562297094222, + 0.22371099263567526, + 0.4740562297094222, + -0.13473021006815927 + ], + "q30": [ + "0x3a4e238c", + "-0x1e56eff0", + "0x0e5147e9", + "0x1e56eff0", + "-0x089f6b75" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 16000, + "Q": 0.75, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.8782528462699781, + 0.7591677956182449, + 0.2880173376868571, + -0.7591677956182449, + -0.1662701839568353 + ], + "q30": [ + "0x38354b6d", + "0x30963485", + "0x126ee045", + "-0x30963485", + "-0x0aa42bb2" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode2.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode2.json new file mode 100644 index 0000000..22812f7 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode2.json @@ -0,0 +1,202 @@ +{ + "mode_2": { + "sample_rate": 44100.0, + "mode": 2, + "total_bshift": 0, + "post_gain_db": -3, + "bands": [ + { + "enabled": true, + "type": "峰值滤波器", + "fc": 63, + "Q": 0.75, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9975521050651297, + -1.9831568164067024, + 0.985684603710271, + 1.9831568164067024, + -0.9832367087754007 + ], + "q30": [ + "0x3fd7e4c8", + "-0x7eec0a91", + "0x3f1574e0", + "0x7eec0a91", + "-0x3eed59a9" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 125, + "Q": 0.75, + "bw": 1, + "gain": -2.0, + "coefficients": { + "float": [ + 0.9969712136756477, + -1.9702348799967075, + 0.9735761648593506, + 1.9702348799967075, + -0.9705473785349984 + ], + "q30": [ + "0x3fce6059", + "-0x7e185409", + "0x3e4f1267", + "0x7e185409", + "-0x3e1d72c0" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 250, + "Q": 0.75, + "bw": 1, + "gain": -2.0, + "coefficients": { + "float": [ + 0.9940312576651497, + -1.9407268021781996, + 0.9479273060020728, + 1.9407268021781996, + -0.9419585636672224 + ], + "q30": [ + "0x3f9e3547", + "-0x7c34de30", + "0x3caad74a", + "0x7c34de30", + "-0x3c490c92" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 500, + "Q": 0.75, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.0117298717445247, + -1.9045528543862489, + 0.8976658753685514, + 1.9045528543862489, + -0.9093957471130761 + ], + "q30": [ + "0x40c02ea5", + "-0x79e431a7", + "0x39735b92", + "0x79e431a7", + "-0x3a338a38" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 1000, + "Q": 0.75, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.0223910258686773, + -1.8085339187004776, + 0.8046554914003415, + 1.8085339187004776, + -0.8270465172690189 + ], + "q30": [ + "0x416edac4", + "-0x73bf050c", + "0x337f79bf", + "0x73bf050c", + "-0x34ee5483" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 4000, + "Q": 0.71, + "bw": 1, + "gain": -1.0, + "coefficients": { + "float": [ + 0.9674950102115041, + -1.1805882370857763, + 0.4347069172226393, + 1.1805882370857763, + -0.40220192743414335 + ], + "q30": [ + "0x3deb7030", + "-0x4b8ec1f7", + "0x1bd23cf6", + "0x4b8ec1f7", + "-0x19bdad27" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 8000, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 0.8192470275031591, + -0.42630182725819504, + 0.20117530149701873, + 0.42630182725819504, + -0.02042232900017765 + ], + "q30": [ + "0x346e8b15", + "-0x1b488775", + "0x0ce00e5f", + "0x1b488775", + "-0x014e9974" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 16000, + "Q": 0.75, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.8782528462699781, + 0.7591677956182449, + 0.2880173376868571, + -0.7591677956182449, + -0.1662701839568353 + ], + "q30": [ + "0x38354b6d", + "0x30963485", + "0x126ee045", + "-0x30963485", + "-0x0aa42bb2" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode3.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode3.json new file mode 100644 index 0000000..01b0ad7 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode3.json @@ -0,0 +1,202 @@ +{ + "mode_3": { + "sample_rate": 44100.0, + "mode": 3, + "total_bshift": 0, + "post_gain_db": -3, + "bands": [ + { + "enabled": true, + "type": "峰值滤波器", + "fc": 63, + "Q": 0.75, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9975521050651297, + -1.9831568164067024, + 0.985684603710271, + 1.9831568164067024, + -0.9832367087754007 + ], + "q30": [ + "0x3fd7e4c8", + "-0x7eec0a91", + "0x3f1574e0", + "0x7eec0a91", + "-0x3eed59a9" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 125, + "Q": 0.75, + "bw": 1, + "gain": -2.0, + "coefficients": { + "float": [ + 0.9969712136756477, + -1.9702348799967075, + 0.9735761648593506, + 1.9702348799967075, + -0.9705473785349984 + ], + "q30": [ + "0x3fce6059", + "-0x7e185409", + "0x3e4f1267", + "0x7e185409", + "-0x3e1d72c0" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 250, + "Q": 0.75, + "bw": 1, + "gain": -2.0, + "coefficients": { + "float": [ + 0.9940312576651497, + -1.9407268021781996, + 0.9479273060020728, + 1.9407268021781996, + -0.9419585636672224 + ], + "q30": [ + "0x3f9e3547", + "-0x7c34de30", + "0x3caad74a", + "0x7c34de30", + "-0x3c490c92" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 500, + "Q": 0.75, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0055276954452232, + -1.9045528543862489, + 0.9038680516678529, + 1.9045528543862489, + -0.9093957471130761 + ], + "q30": [ + "0x405a90d5", + "-0x79e431a7", + "0x39d8f962", + "0x79e431a7", + "-0x3a338a38" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 1000, + "Q": 0.75, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0105517583144878, + -1.8085339187004776, + 0.816494758954531, + 1.8085339187004776, + -0.8270465172690189 + ], + "q30": [ + "0x40ace148", + "-0x73bf050c", + "0x3441733b", + "0x73bf050c", + "-0x34ee5483" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 4000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 0.9999999999999999, + -1.220252533217394, + 0.4493117924480128, + 1.220252533217394, + -0.4493117924480128 + ], + "q30": [ + "0x3fffffff", + "-0x4e189e14", + "0x1cc1863f", + "0x4e189e14", + "-0x1cc1863f" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 8000, + "Q": 0.75, + "bw": 1, + "gain": -1.0, + "coefficients": { + "float": [ + 0.955997603525617, + -0.4974610972706331, + 0.2347559401049542, + 0.4974610972706331, + -0.1907535436305711 + ], + "q30": [ + "0x3d2f1092", + "-0x1fd66711", + "0x0f063dc7", + "0x1fd66711", + "-0x0c354e59" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 16000, + "Q": 0.75, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.8782528462699781, + 0.7591677956182449, + 0.2880173376868571, + -0.7591677956182449, + -0.1662701839568353 + ], + "q30": [ + "0x38354b6d", + "0x30963485", + "0x126ee045", + "-0x30963485", + "-0x0aa42bb2" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode4.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode4.json new file mode 100644 index 0000000..d032264 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode4.json @@ -0,0 +1,202 @@ +{ + "mode_4": { + "sample_rate": 44100.0, + "mode": 4, + "total_bshift": 0, + "post_gain_db": -4, + "bands": [ + { + "enabled": true, + "type": "峰值滤波器", + "fc": 63, + "Q": 0.75, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.001540169009555, + -1.9880232885451363, + 0.9865632079523097, + 1.9880232885451363, + -0.9881033769618642 + ], + "q30": [ + "0x40193bef", + "-0x7f3bc607", + "0x3f23da02", + "0x7f3bc607", + "-0x3f3d15f2" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 125, + "Q": 0.75, + "bw": 1, + "gain": 4.0, + "coefficients": { + "float": [ + 1.0068625877067698, + -1.9762204294072017, + 0.9696712896054508, + 1.9762204294072017, + -0.9765338773122206 + ], + "q30": [ + "0x40706fc7", + "-0x7e7a6540", + "0x3e0f182b", + "0x7e7a6540", + "-0x3e7f87f2" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 250, + "Q": 0.75, + "bw": 1, + "gain": 4.0, + "coefficients": { + "float": [ + 1.0135639031797798, + -1.9523800556701958, + 0.9400553101924745, + 1.9523800556701958, + -0.9536192133722544 + ], + "q30": [ + "0x40de3b22", + "-0x7cf3cb7a", + "0x3c29ddbf", + "0x7cf3cb7a", + "-0x3d0818e1" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 500, + "Q": 0.75, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0055276954452232, + -1.9045528543862489, + 0.9038680516678529, + 1.9045528543862489, + -0.9093957471130761 + ], + "q30": [ + "0x405a90d5", + "-0x79e431a7", + "0x39d8f962", + "0x79e431a7", + "-0x3a338a38" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 1000, + "Q": 0.75, + "bw": 1, + "gain": -1.0, + "coefficients": { + "float": [ + 0.9895584187275204, + -1.7896499648043307, + 0.8184108438428332, + 1.7896499648043307, + -0.8079692625703537 + ], + "q30": [ + "0x3f54ecd5", + "-0x7289a001", + "0x3460d7e0", + "0x7289a001", + "-0x33b5c4b5" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 4000, + "Q": 0.71, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.071293585455295, + -1.220252533217394, + 0.3780182069927177, + 1.220252533217394, + -0.4493117924480128 + ], + "q30": [ + "0x449012f8", + "-0x4e189e14", + "0x18317347", + "0x4e189e14", + "-0x1cc1863f" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 8000, + "Q": 0.75, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.097671685585612, + -0.5203581007275015, + 0.14788953678482, + 0.5203581007275015, + -0.24556122237043207 + ], + "q30": [ + "0x464040bd", + "-0x214d8c10", + "0x097705ac", + "0x214d8c10", + "-0x0fb7466a" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 16000, + "Q": 0.75, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.0870062492620975, + 0.8644068719418347, + 0.24093727965453934, + -0.8644068719418347, + -0.32794352891663675 + ], + "q30": [ + "0x459182a8", + "0x37527133", + "0x0f6b8432", + "-0x37527133", + "-0x14fd06da" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode5.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode5.json new file mode 100644 index 0000000..4b1f12d --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode5.json @@ -0,0 +1,202 @@ +{ + "mode_5": { + "sample_rate": 44100.0, + "mode": 5, + "total_bshift": 0, + "post_gain_db": -4, + "bands": [ + { + "enabled": true, + "type": "峰值滤波器", + "fc": 63, + "Q": 0.75, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.001540169009555, + -1.9880232885451363, + 0.9865632079523097, + 1.9880232885451363, + -0.9881033769618642 + ], + "q30": [ + "0x40193bef", + "-0x7f3bc607", + "0x3f23da02", + "0x7f3bc607", + "-0x3f3d15f2" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 125, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + -1.9762204294072017, + 0.9765338773122206, + 1.9762204294072017, + -0.9765338773122206 + ], + "q30": [ + "0x40000000", + "-0x7e7a6540", + "0x3e7f87f2", + "0x7e7a6540", + "-0x3e7f87f2" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 250, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + -1.9523800556701958, + 0.9536192133722544, + 1.9523800556701958, + -0.9536192133722544 + ], + "q30": [ + "0x40000000", + "-0x7cf3cb7a", + "0x3d0818e1", + "0x7cf3cb7a", + "-0x3d0818e1" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 500, + "Q": 0.75, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0055276954452232, + -1.9045528543862489, + 0.9038680516678529, + 1.9045528543862489, + -0.9093957471130761 + ], + "q30": [ + "0x405a90d5", + "-0x79e431a7", + "0x39d8f962", + "0x79e431a7", + "-0x3a338a38" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 1000, + "Q": 0.75, + "bw": 1, + "gain": -1.0, + "coefficients": { + "float": [ + 0.9895584187275204, + -1.7896499648043307, + 0.8184108438428332, + 1.7896499648043307, + -0.8079692625703537 + ], + "q30": [ + "0x3f54ecd5", + "-0x7289a001", + "0x3460d7e0", + "0x7289a001", + "-0x33b5c4b5" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 4000, + "Q": 0.71, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.1135897804981012, + -1.220252533217394, + 0.3357220119499115, + 1.220252533217394, + -0.4493117924480128 + ], + "q30": [ + "0x47450e12", + "-0x4e189e14", + "0x157c782d", + "0x4e189e14", + "-0x1cc1863f" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 8000, + "Q": 0.75, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.1556171604457468, + -0.5203581007275015, + 0.089944061924685, + 0.5203581007275015, + -0.24556122237043207 + ], + "q30": [ + "0x49f5a1ad", + "-0x214d8c10", + "0x05c1a4bd", + "0x214d8c10", + "-0x0fb7466a" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 16000, + "Q": 0.75, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.138624263214282, + 0.8644068719418347, + 0.18931926570235472, + -0.8644068719418347, + -0.32794352891663675 + ], + "q30": [ + "0x48df384d", + "0x37527133", + "0x0c1dce8d", + "-0x37527133", + "-0x14fd06da" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode6.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode6.json new file mode 100644 index 0000000..ec9b31d --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode6.json @@ -0,0 +1,202 @@ +{ + "mode_6": { + "sample_rate": 44100.0, + "mode": 6, + "total_bshift": 0, + "post_gain_db": -4, + "bands": [ + { + "enabled": true, + "type": "峰值滤波器", + "fc": 63, + "Q": 0.75, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.0024539018287275, + -1.9880232885451363, + 0.9856494751331367, + 1.9880232885451363, + -0.9881033769618642 + ], + "q30": [ + "0x40283469", + "-0x7f3bc607", + "0x3f14e189", + "0x7f3bc607", + "-0x3f3d15f2" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 125, + "Q": 0.75, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.0048403283177165, + -1.9762204294072017, + 0.9716935489945042, + 1.9762204294072017, + -0.9765338773122206 + ], + "q30": [ + "0x404f4dce", + "-0x7e7a6540", + "0x3e303a23", + "0x7e7a6540", + "-0x3e7f87f2" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 250, + "Q": 0.75, + "bw": 1, + "gain": -1.0, + "coefficients": { + "float": [ + 0.9971783284129728, + -1.9468710803400326, + 0.9509284131330387, + 1.9468710803400326, + -0.9481067415460115 + ], + "q30": [ + "0x3fd1c50d", + "-0x7c998928", + "0x3cdc02d8", + "0x7c998928", + "-0x3cadc7e6" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 500, + "Q": 0.75, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9816540365464702, + -1.869611997324363, + 0.8927120059717443, + 1.869611997324363, + -0.8743660425182146 + ], + "q30": [ + "0x3ed36b73", + "-0x77a7b914", + "0x39223189", + "0x77a7b914", + "-0x37f59cfd" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 1000, + "Q": 0.75, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9655539566884718, + -1.7462370810065533, + 0.7985580371145217, + 1.7462370810065533, + -0.7641119938029935 + ], + "q30": [ + "0x3dcba2d2", + "-0x6fc2592c", + "0x331b932b", + "0x6fc2592c", + "-0x30e735fd" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 4000, + "Q": 0.71, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.1135897804981012, + -1.220252533217394, + 0.3357220119499115, + 1.220252533217394, + -0.4493117924480128 + ], + "q30": [ + "0x47450e12", + "-0x4e189e14", + "0x157c782d", + "0x4e189e14", + "-0x1cc1863f" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 8000, + "Q": 0.75, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.1556171604457468, + -0.5203581007275015, + 0.089944061924685, + 0.5203581007275015, + -0.24556122237043207 + ], + "q30": [ + "0x49f5a1ad", + "-0x214d8c10", + "0x05c1a4bd", + "0x214d8c10", + "-0x0fb7466a" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 16000, + "Q": 0.75, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.138624263214282, + 0.8644068719418347, + 0.18931926570235472, + -0.8644068719418347, + -0.32794352891663675 + ], + "q30": [ + "0x48df384d", + "0x37527133", + "0x0c1dce8d", + "-0x37527133", + "-0x14fd06da" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode7.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode7.json new file mode 100644 index 0000000..946d0b2 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode7.json @@ -0,0 +1,202 @@ +{ + "mode_7": { + "sample_rate": 44100.0, + "mode": 7, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 85, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode8.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode8.json new file mode 100644 index 0000000..7db58a6 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode8.json @@ -0,0 +1,202 @@ +{ + "mode_8": { + "sample_rate": 44100.0, + "mode": 8, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 130, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode9.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode9.json new file mode 100644 index 0000000..72b65a7 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_44100_mode9.json @@ -0,0 +1,202 @@ +{ + "mode_9": { + "sample_rate": 44100.0, + "mode": 9, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 130, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode0.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode0.json new file mode 100644 index 0000000..53075ad --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode0.json @@ -0,0 +1,202 @@ +{ + "mode_0": { + "sample_rate": 48000.0, + "mode": 0, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "峰值滤波器", + "fc": 600, + "Q": 0.2, + "bw": 1, + "gain": -9.0, + "coefficients": { + "float": [ + 0.7703070351379608, + -1.2840093416260083, + 0.5176727182261572, + 1.2840093416260083, + -0.28797975336411796 + ], + "q30": [ + "0x314cb5e0", + "-0x522d3584", + "0x21218cc0", + "0x522d3584", + "-0x126e42a1" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3200, + "Q": 0.1, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.08179722959287, + -0.6022681953154893, + -0.4225326136101699, + 0.6022681953154893, + 0.3407353840172999 + ], + "q30": [ + "0x453c2a72", + "-0x268b8fe6", + "-0x1b0ac63b", + "0x268b8fe6", + "0x15ce9bc8" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 5000, + "Q": 0.4, + "bw": 1, + "gain": -2.0, + "coefficients": { + "float": [ + 0.8340113612874133, + -0.9251094153108881, + 0.33206353665312616, + 1.1958397950339525, + -0.43680527766360394 + ], + "q30": [ + "0x35607130", + "-0x3b34fe1e", + "0x1540876b", + "0x4c88a3a2", + "-0x1bf49e1f" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode1.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode1.json new file mode 100644 index 0000000..6f3de68 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode1.json @@ -0,0 +1,202 @@ +{ + "mode_1": { + "sample_rate": 48000.0, + "mode": 1, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "低架滤波器", + "fc": 100, + "Q": 0.3, + "bw": 1, + "gain": -8.0, + "coefficients": { + "float": [ + 0.9946011632842847, + -1.9707907762296357, + 0.9763584698386548, + 1.9706631300067092, + -0.971087279345866 + ], + "q30": [ + "0x3fa78ba3", + "-0x7e216fa2", + "0x3e7ca83c", + "0x7e1f583f", + "-0x3e264b42" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": -5.0, + "coefficients": { + "float": [ + 0.6091057260133661, + -0.8322868251995856, + 0.31888192112737523, + 1.5172795141193884, + -0.6129803360605444 + ], + "q30": [ + "0x26fb9695", + "-0x35442ff5", + "0x14688fb7", + "0x611b1b89", + "-0x273b11e0" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": -2.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode2.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode2.json new file mode 100644 index 0000000..3ae28f0 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode2.json @@ -0,0 +1,202 @@ +{ + "mode_2": { + "sample_rate": 48000.0, + "mode": 2, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "高架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 0.631197620611673, + -1.2600582962694589, + 0.6288649938218213, + 1.9970590786939884, + -0.9970633968580239 + ], + "q30": [ + "0x28658ab4", + "-0x50a4cb8d", + "0x283f52f5", + "0x7fcfd0e1", + "-0x3fcfe2fe" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -2.5, + "coefficients": { + "float": [ + 0.9997135088529657, + -1.9957256801793692, + 0.9960190105900172, + 1.9957245396588716, + -0.9957336599634806 + ], + "q30": [ + "0x3ffb4e5e", + "-0x7fb9f834", + "0x3fbec685", + "0x7fb9f36b", + "-0x3fba19ac" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 55, + "Q": 0.41, + "bw": 1, + "gain": 3.75, + "coefficients": { + "float": [ + 1.0046991792492208, + -1.9825418827820602, + 0.9778940847509143, + 1.9825418827820602, + -0.9825932640001351 + ], + "q30": [ + "0x404cfdc9", + "-0x7ee1f759", + "0x3e95d112", + "0x7ee1f759", + "-0x3ee2cedb" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 350, + "Q": 0.81, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9887850448806729, + -1.9211814493671355, + 0.934414453570819, + 1.9211814493671355, + -0.9231994984514917 + ], + "q30": [ + "0x3f484111", + "-0x7af4a309", + "0x3bcd7247", + "0x7af4a309", + "-0x3b15b359" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3600, + "Q": 0.41, + "bw": 1, + "gain": 3.65, + "coefficients": { + "float": [ + 1.1861229298008034, + -1.1469871242899063, + 0.10117081401854221, + 1.1469871242899063, + -0.28729374381934547 + ], + "q30": [ + "0x4be97026", + "-0x49683cae", + "0x06799526", + "0x49683cae", + "-0x1263054c" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 10000, + "Q": 0.71, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0696789892692506, + -0.3988307655549178, + 0.20993057737750198, + 0.3075663597922098, + -0.18834516088404463 + ], + "q30": [ + "0x44759edd", + "-0x19867179", + "0x0d6f80a9", + "0x13af2ad0", + "-0x0c0dd8dc" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode3.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode3.json new file mode 100644 index 0000000..12b6ec2 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode3.json @@ -0,0 +1,202 @@ +{ + "mode_3": { + "sample_rate": 48000.0, + "mode": 3, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 600, + "Q": 0.2, + "bw": 1, + "gain": -6.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 2000, + "Q": 0.11, + "bw": 1, + "gain": -5.0, + "coefficients": { + "float": [ + 0.9409070040203438, + -1.536494703507122, + 0.6497893638468322, + 1.5154026838264862, + -0.6117883875478116 + ], + "q30": [ + "0x3c37d202", + "-0x6255ede1", + "0x29962620", + "0x60fc5b89", + "-0x27278a7b" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3200, + "Q": 0.5, + "bw": 1, + "gain": -10.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode4.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode4.json new file mode 100644 index 0000000..6670a6d --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode4.json @@ -0,0 +1,202 @@ +{ + "mode_4": { + "sample_rate": 48000.0, + "mode": 4, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "高架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 0.631197620611673, + -1.2600582962694589, + 0.6288649938218213, + 1.9970590786939884, + -0.9970633968580239 + ], + "q30": [ + "0x28658ab4", + "-0x50a4cb8d", + "0x283f52f5", + "0x7fcfd0e1", + "-0x3fcfe2fe" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -2.5, + "coefficients": { + "float": [ + 0.9997135088529657, + -1.9957256801793692, + 0.9960190105900172, + 1.9957245396588716, + -0.9957336599634806 + ], + "q30": [ + "0x3ffb4e5e", + "-0x7fb9f834", + "0x3fbec685", + "0x7fb9f36b", + "-0x3fba19ac" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 55, + "Q": 0.41, + "bw": 1, + "gain": 3.75, + "coefficients": { + "float": [ + 1.0046991792492208, + -1.9825418827820602, + 0.9778940847509143, + 1.9825418827820602, + -0.9825932640001351 + ], + "q30": [ + "0x404cfdc9", + "-0x7ee1f759", + "0x3e95d112", + "0x7ee1f759", + "-0x3ee2cedb" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 350, + "Q": 0.81, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9887850448806729, + -1.9211814493671355, + 0.934414453570819, + 1.9211814493671355, + -0.9231994984514917 + ], + "q30": [ + "0x3f484111", + "-0x7af4a309", + "0x3bcd7247", + "0x7af4a309", + "-0x3b15b359" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3600, + "Q": 0.41, + "bw": 1, + "gain": 3.65, + "coefficients": { + "float": [ + 1.1861229298008034, + -1.1469871242899063, + 0.10117081401854221, + 1.1469871242899063, + -0.28729374381934547 + ], + "q30": [ + "0x4be97026", + "-0x49683cae", + "0x06799526", + "0x49683cae", + "-0x1263054c" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 10000, + "Q": 0.71, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0696789892692506, + -0.3988307655549178, + 0.20993057737750198, + 0.3075663597922098, + -0.18834516088404463 + ], + "q30": [ + "0x44759edd", + "-0x19867179", + "0x0d6f80a9", + "0x13af2ad0", + "-0x0c0dd8dc" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode5.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode5.json new file mode 100644 index 0000000..5f0c45b --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode5.json @@ -0,0 +1,202 @@ +{ + "mode_5": { + "sample_rate": 48000.0, + "mode": 5, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "峰值滤波器", + "fc": 600, + "Q": 0.4, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9644637857995143, + -1.7512313012589753, + 0.7921826702322905, + 1.7512313012589753, + -0.7566464560318048 + ], + "q30": [ + "0x3db9c650", + "-0x70142c73", + "0x32b31ef1", + "0x70142c73", + "-0x306ce541" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 200, + "Q": 0.5, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.7100272556172365, + -1.39376936570039, + 0.6842198837557174, + 1.9688501073857252, + -0.9693278810582892 + ], + "q30": [ + "0x2d711628", + "-0x5933846c", + "0x2bca4232", + "0x7e01a3e1", + "-0x3e0977cf" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.5, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 0.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode6.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode6.json new file mode 100644 index 0000000..4773125 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode6.json @@ -0,0 +1,202 @@ +{ + "mode_6": { + "sample_rate": 48000.0, + "mode": 6, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "高架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 0.631197620611673, + -1.2600582962694589, + 0.6288649938218213, + 1.9970590786939884, + -0.9970633968580239 + ], + "q30": [ + "0x28658ab4", + "-0x50a4cb8d", + "0x283f52f5", + "0x7fcfd0e1", + "-0x3fcfe2fe" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -2.5, + "coefficients": { + "float": [ + 0.9997135088529657, + -1.9957256801793692, + 0.9960190105900172, + 1.9957245396588716, + -0.9957336599634806 + ], + "q30": [ + "0x3ffb4e5e", + "-0x7fb9f834", + "0x3fbec685", + "0x7fb9f36b", + "-0x3fba19ac" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 55, + "Q": 0.41, + "bw": 1, + "gain": 3.75, + "coefficients": { + "float": [ + 1.0046991792492208, + -1.9825418827820602, + 0.9778940847509143, + 1.9825418827820602, + -0.9825932640001351 + ], + "q30": [ + "0x404cfdc9", + "-0x7ee1f759", + "0x3e95d112", + "0x7ee1f759", + "-0x3ee2cedb" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 350, + "Q": 0.81, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9887850448806729, + -1.9211814493671355, + 0.934414453570819, + 1.9211814493671355, + -0.9231994984514917 + ], + "q30": [ + "0x3f484111", + "-0x7af4a309", + "0x3bcd7247", + "0x7af4a309", + "-0x3b15b359" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3600, + "Q": 0.41, + "bw": 1, + "gain": 3.65, + "coefficients": { + "float": [ + 1.1861229298008034, + -1.1469871242899063, + 0.10117081401854221, + 1.1469871242899063, + -0.28729374381934547 + ], + "q30": [ + "0x4be97026", + "-0x49683cae", + "0x06799526", + "0x49683cae", + "-0x1263054c" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 10000, + "Q": 0.71, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0696789892692506, + -0.3988307655549178, + 0.20993057737750198, + 0.3075663597922098, + -0.18834516088404463 + ], + "q30": [ + "0x44759edd", + "-0x19867179", + "0x0d6f80a9", + "0x13af2ad0", + "-0x0c0dd8dc" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode7.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode7.json new file mode 100644 index 0000000..1de910c --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode7.json @@ -0,0 +1,202 @@ +{ + "mode_7": { + "sample_rate": 48000.0, + "mode": 7, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 85, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode8.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode8.json new file mode 100644 index 0000000..261ff31 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode8.json @@ -0,0 +1,202 @@ +{ + "mode_8": { + "sample_rate": 48000.0, + "mode": 8, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 130, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode9.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode9.json new file mode 100644 index 0000000..033a2ab --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_48000_mode9.json @@ -0,0 +1,202 @@ +{ + "mode_9": { + "sample_rate": 48000.0, + "mode": 9, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 130, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode0.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode0.json new file mode 100644 index 0000000..2c61a81 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode0.json @@ -0,0 +1,202 @@ +{ + "mode_0": { + "sample_rate": 88200.0, + "mode": 0, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "峰值滤波器", + "fc": 600, + "Q": 0.2, + "bw": 1, + "gain": -9.0, + "coefficients": { + "float": [ + 0.8507018838630024, + -1.5357900342081252, + 0.6864921197148316, + 1.5357900342081252, + -0.537194003577834 + ], + "q30": [ + "0x3671e650", + "-0x624a6248", + "0x2bef7ca4", + "0x624a6248", + "-0x226162f5" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3200, + "Q": 0.1, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.06473173362677, + -0.9146921890400389, + -0.1257472004606038, + 0.9146921890400389, + 0.06101546683383367 + ], + "q30": [ + "0x44249091", + "-0x3a8a511b", + "-0x080c3dfc", + "0x3a8a511b", + "0x03e7ad6a" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 5000, + "Q": 0.4, + "bw": 1, + "gain": -2.0, + "coefficients": { + "float": [ + 0.8161090351892741, + -1.2271793542063139, + 0.4932561372522685, + 1.5555672722545826, + -0.6377530904898113 + ], + "q30": [ + "0x343b2164", + "-0x4e8a1b46", + "0x1f918230", + "0x638e6a08", + "-0x28d0f256" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode1.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode1.json new file mode 100644 index 0000000..d4328e2 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode1.json @@ -0,0 +1,202 @@ +{ + "mode_1": { + "sample_rate": 88200.0, + "mode": 1, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "低架滤波器", + "fc": 100, + "Q": 0.3, + "bw": 1, + "gain": -8.0, + "coefficients": { + "float": [ + 0.9970581143792774, + -1.9840713868110786, + 0.9870636177451345, + 1.9840333286130194, + -0.9841597903224713 + ], + "q30": [ + "0x3fcfccd6", + "-0x7efb068d", + "0x3f2c0ce1", + "0x7efa66ed", + "-0x3efc7958" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": -5.0, + "coefficients": { + "float": [ + 0.5875579972642514, + -0.9695988915772819, + 0.41298025221864965, + 1.7362574774973265, + -0.7671968354029455 + ], + "q30": [ + "0x259a8cdb", + "-0x3e0de882", + "0x1a6e44b9", + "0x6f1ed7ae", + "-0x3119c0c1" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": -2.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode2.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode2.json new file mode 100644 index 0000000..c642125 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode2.json @@ -0,0 +1,202 @@ +{ + "mode_2": { + "sample_rate": 88200.0, + "mode": 2, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "高架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 0.631088095729438, + -1.2609046043451269, + 0.629817788395221, + 1.9983994980366335, + -0.9984007778161657 + ], + "q30": [ + "0x2863bf53", + "-0x50b2a939", + "0x284eef44", + "0x7fe5c702", + "-0x3fe5cc60" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -2.5, + "coefficients": { + "float": [ + 0.9998440761143335, + -1.9976735541851465, + 0.9978315056482505, + 1.9976732160648814, + -0.9976759198828492 + ], + "q30": [ + "0x3ffd7202", + "-0x7fd9e22d", + "0x3fdc78ac", + "0x7fd9e0c2", + "-0x3fd9ec19" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 55, + "Q": 0.41, + "bw": 1, + "gain": 3.75, + "coefficients": { + "float": [ + 1.0025675771082923, + -1.9904738827059831, + 0.9879215839743045, + 1.9904738827059831, + -0.9904891610825969 + ], + "q30": [ + "0x402a1132", + "-0x7f63ec91", + "0x3f3a1b73", + "0x7f63ec91", + "-0x3f642ca6" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 350, + "Q": 0.81, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9937864005510619, + -1.9568405897237229, + 0.9636625995543779, + 1.9568405897237229, + -0.9574490001054398 + ], + "q30": [ + "0x3f9a3246", + "-0x7d3ce050", + "0x3daca5e5", + "0x7d3ce050", + "-0x3d46d82b" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3600, + "Q": 0.41, + "bw": 1, + "gain": 3.65, + "coefficients": { + "float": [ + 1.123394964463027, + -1.4775362571522486, + 0.4040981646849478, + 1.4775362571522486, + -0.5274931291479746 + ], + "q30": [ + "0x47e5b3fe", + "-0x5e8ff43b", + "0x19dcbe8c", + "0x5e8ff43b", + "-0x21c2728a" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 10000, + "Q": 0.71, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0920318200973402, + -1.1817752782667914, + 0.42238293788926035, + 1.035171209738942, + -0.36781068945875106 + ], + "q30": [ + "0x45e3d96e", + "-0x4ba234c6", + "0x1b085272", + "0x42403ebe", + "-0x178a35d8" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode3.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode3.json new file mode 100644 index 0000000..353b8d4 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode3.json @@ -0,0 +1,202 @@ +{ + "mode_3": { + "sample_rate": 88200.0, + "mode": 3, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 600, + "Q": 0.2, + "bw": 1, + "gain": -6.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 2000, + "Q": 0.11, + "bw": 1, + "gain": -5.0, + "coefficients": { + "float": [ + 0.9671039967150586, + -1.7399133280883343, + 0.7906195126775327, + 1.7329826793892527, + -0.7646541580916733 + ], + "q30": [ + "0x3de50829", + "-0x6f5abd6e", + "0x32998295", + "0x6ee9302f", + "-0x30f017fe" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3200, + "Q": 0.5, + "bw": 1, + "gain": -10.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode4.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode4.json new file mode 100644 index 0000000..721c441 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode4.json @@ -0,0 +1,202 @@ +{ + "mode_4": { + "sample_rate": 88200.0, + "mode": 4, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "高架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 0.631088095729438, + -1.2609046043451269, + 0.629817788395221, + 1.9983994980366335, + -0.9984007778161657 + ], + "q30": [ + "0x2863bf53", + "-0x50b2a939", + "0x284eef44", + "0x7fe5c702", + "-0x3fe5cc60" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -2.5, + "coefficients": { + "float": [ + 0.9998440761143335, + -1.9976735541851465, + 0.9978315056482505, + 1.9976732160648814, + -0.9976759198828492 + ], + "q30": [ + "0x3ffd7202", + "-0x7fd9e22d", + "0x3fdc78ac", + "0x7fd9e0c2", + "-0x3fd9ec19" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 55, + "Q": 0.41, + "bw": 1, + "gain": 3.75, + "coefficients": { + "float": [ + 1.0025675771082923, + -1.9904738827059831, + 0.9879215839743045, + 1.9904738827059831, + -0.9904891610825969 + ], + "q30": [ + "0x402a1132", + "-0x7f63ec91", + "0x3f3a1b73", + "0x7f63ec91", + "-0x3f642ca6" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 350, + "Q": 0.81, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9937864005510619, + -1.9568405897237229, + 0.9636625995543779, + 1.9568405897237229, + -0.9574490001054398 + ], + "q30": [ + "0x3f9a3246", + "-0x7d3ce050", + "0x3daca5e5", + "0x7d3ce050", + "-0x3d46d82b" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3600, + "Q": 0.41, + "bw": 1, + "gain": 3.65, + "coefficients": { + "float": [ + 1.123394964463027, + -1.4775362571522486, + 0.4040981646849478, + 1.4775362571522486, + -0.5274931291479746 + ], + "q30": [ + "0x47e5b3fe", + "-0x5e8ff43b", + "0x19dcbe8c", + "0x5e8ff43b", + "-0x21c2728a" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 10000, + "Q": 0.71, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0920318200973402, + -1.1817752782667914, + 0.42238293788926035, + 1.035171209738942, + -0.36781068945875106 + ], + "q30": [ + "0x45e3d96e", + "-0x4ba234c6", + "0x1b085272", + "0x42403ebe", + "-0x178a35d8" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode5.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode5.json new file mode 100644 index 0000000..d018610 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode5.json @@ -0,0 +1,202 @@ +{ + "mode_5": { + "sample_rate": 88200.0, + "mode": 5, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "峰值滤波器", + "fc": 600, + "Q": 0.4, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.979511277305502, + -1.8579938162245202, + 0.8801810565216751, + 1.8579938162245202, + -0.8596923338271771 + ], + "q30": [ + "0x3eb05011", + "-0x76e95ee5", + "0x3854e2ed", + "0x76e95ee5", + "-0x370532fe" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 200, + "Q": 0.5, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.7090778681673701, + -1.4038689110539606, + 0.6949335432110327, + 1.9830469379593583, + -0.9831894382838002 + ], + "q30": [ + "0x2d618823", + "-0x59d8fcfd", + "0x2c79ca8a", + "0x7eea3db4", + "-0x3eec9364" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.5, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 0.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode6.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode6.json new file mode 100644 index 0000000..65022c5 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode6.json @@ -0,0 +1,202 @@ +{ + "mode_6": { + "sample_rate": 88200.0, + "mode": 6, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "高架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 0.631088095729438, + -1.2609046043451269, + 0.629817788395221, + 1.9983994980366335, + -0.9984007778161657 + ], + "q30": [ + "0x2863bf53", + "-0x50b2a939", + "0x284eef44", + "0x7fe5c702", + "-0x3fe5cc60" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -2.5, + "coefficients": { + "float": [ + 0.9998440761143335, + -1.9976735541851465, + 0.9978315056482505, + 1.9976732160648814, + -0.9976759198828492 + ], + "q30": [ + "0x3ffd7202", + "-0x7fd9e22d", + "0x3fdc78ac", + "0x7fd9e0c2", + "-0x3fd9ec19" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 55, + "Q": 0.41, + "bw": 1, + "gain": 3.75, + "coefficients": { + "float": [ + 1.0025675771082923, + -1.9904738827059831, + 0.9879215839743045, + 1.9904738827059831, + -0.9904891610825969 + ], + "q30": [ + "0x402a1132", + "-0x7f63ec91", + "0x3f3a1b73", + "0x7f63ec91", + "-0x3f642ca6" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 350, + "Q": 0.81, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9937864005510619, + -1.9568405897237229, + 0.9636625995543779, + 1.9568405897237229, + -0.9574490001054398 + ], + "q30": [ + "0x3f9a3246", + "-0x7d3ce050", + "0x3daca5e5", + "0x7d3ce050", + "-0x3d46d82b" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3600, + "Q": 0.41, + "bw": 1, + "gain": 3.65, + "coefficients": { + "float": [ + 1.123394964463027, + -1.4775362571522486, + 0.4040981646849478, + 1.4775362571522486, + -0.5274931291479746 + ], + "q30": [ + "0x47e5b3fe", + "-0x5e8ff43b", + "0x19dcbe8c", + "0x5e8ff43b", + "-0x21c2728a" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 10000, + "Q": 0.71, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0920318200973402, + -1.1817752782667914, + 0.42238293788926035, + 1.035171209738942, + -0.36781068945875106 + ], + "q30": [ + "0x45e3d96e", + "-0x4ba234c6", + "0x1b085272", + "0x42403ebe", + "-0x178a35d8" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode7.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode7.json new file mode 100644 index 0000000..39be35c --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode7.json @@ -0,0 +1,202 @@ +{ + "mode_7": { + "sample_rate": 88200.0, + "mode": 7, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 85, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode8.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode8.json new file mode 100644 index 0000000..087157c --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode8.json @@ -0,0 +1,202 @@ +{ + "mode_8": { + "sample_rate": 88200.0, + "mode": 8, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 130, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode9.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode9.json new file mode 100644 index 0000000..b3ce2b7 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_88200_mode9.json @@ -0,0 +1,202 @@ +{ + "mode_9": { + "sample_rate": 88200.0, + "mode": 9, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 130, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode0.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode0.json new file mode 100644 index 0000000..538c52c --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode0.json @@ -0,0 +1,202 @@ +{ + "mode_0": { + "sample_rate": 96000.0, + "mode": 0, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "峰值滤波器", + "fc": 600, + "Q": 0.2, + "bw": 1, + "gain": -9.0, + "coefficients": { + "float": [ + 0.8601987830138271, + -1.5654254181043494, + 0.7064344525392124, + 1.5654254181043494, + -0.5666332355530395 + ], + "q30": [ + "0x370d7f32", + "-0x642fee17", + "0x2d3638d9", + "0x642fee17", + "-0x2443b80b" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3200, + "Q": 0.1, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0621925375417216, + -0.9591758439409941, + -0.08158813466691908, + 0.9591758439409941, + 0.01939559712519742 + ], + "q30": [ + "0x43faf668", + "-0x3d632314", + "-0x0538bd70", + "0x3d632314", + "0x013dc707" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 5000, + "Q": 0.4, + "bw": 1, + "gain": -2.0, + "coefficients": { + "float": [ + 0.8143505744262889, + -1.2566415796325099, + 0.5127183829238585, + 1.5911357370050918, + -0.6615631147227292 + ], + "q30": [ + "0x341e51df", + "-0x506cd0cd", + "0x20d060c3", + "0x65d52afc", + "-0x2a570cd1" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode1.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode1.json new file mode 100644 index 0000000..0558018 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode1.json @@ -0,0 +1,202 @@ +{ + "mode_1": { + "sample_rate": 96000.0, + "mode": 1, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "低架滤波器", + "fc": 100, + "Q": 0.3, + "bw": 1, + "gain": -8.0, + "coefficients": { + "float": [ + 0.9972968120091041, + -1.9853627040704471, + 0.9881084161373591, + 1.9853305582836764, + -0.9854373739332337 + ], + "q30": [ + "0x3fd3b601", + "-0x7f102ebb", + "0x3f3d2b15", + "0x7f0fa7e6", + "-0x3f1167eb" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": -5.0, + "coefficients": { + "float": [ + 0.585484540879424, + -0.9826056312216752, + 0.42347824613585044, + 1.757603978020477, + -0.7839611338140762 + ], + "q30": [ + "0x25789426", + "-0x3ee302ba", + "0x1b1a4480", + "0x707c9565", + "-0x322c6b51" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": -2.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 2.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3500, + "Q": 0.5, + "bw": 1, + "gain": 3.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode2.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode2.json new file mode 100644 index 0000000..f16cfb2 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode2.json @@ -0,0 +1,202 @@ +{ + "mode_2": { + "sample_rate": 96000.0, + "mode": 2, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "高架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 0.6310774711837125, + -1.260986691313349, + 0.6299103004637236, + 1.9985295387866169, + -0.9985306191207041 + ], + "q30": [ + "0x286392c2", + "-0x50b40185", + "0x2850734a", + "0x7fe7e870", + "-0x3fe7ecf8" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -2.5, + "coefficients": { + "float": [ + 0.9998567440131776, + -1.9978625525256353, + 0.9980075201554369, + 1.9978622670908264, + -0.9978645496034232 + ], + "q30": [ + "0x3ffda724", + "-0x7fdcfae5", + "0x3fdf5aef", + "0x7fdcf9b2", + "-0x3fdd0345" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 55, + "Q": 0.41, + "bw": 1, + "gain": 3.75, + "coefficients": { + "float": [ + 1.0023598742081443, + -1.991245634277488, + 0.9888986615583146, + 1.991245634277488, + -0.9912585357664592 + ], + "q30": [ + "0x4026aa07", + "-0x7f709187", + "0x3f4a1d9c", + "0x7f709187", + "-0x3f70c7a4" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 350, + "Q": 0.81, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9942812795184419, + -1.9603234994061256, + 0.9665566733287794, + 1.9603234994061256, + -0.9608379528472213 + ], + "q30": [ + "0x3fa24df2", + "-0x7d75f0b1", + "0x3ddc1085", + "0x7d75f0b1", + "-0x3d7e5e78" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3600, + "Q": 0.41, + "bw": 1, + "gain": 3.65, + "coefficients": { + "float": [ + 1.1157424156015094, + -1.5137820376513778, + 0.4410540318166462, + 1.5137820376513778, + -0.5567964474181556 + ], + "q30": [ + "0x476852e0", + "-0x60e1ce0e", + "0x1c3a3ab0", + "0x60e1ce0e", + "-0x23a28d91" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 10000, + "Q": 0.71, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0943175504186735, + -1.2622021748812131, + 0.4568081257655523, + 1.109228792618427, + -0.39815229392143964 + ], + "q30": [ + "0x46094c7a", + "-0x50c7eba1", + "0x1d3c5826", + "0x46fd9ac3", + "-0x197b53c2" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode3.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode3.json new file mode 100644 index 0000000..a050e54 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode3.json @@ -0,0 +1,202 @@ +{ + "mode_3": { + "sample_rate": 96000.0, + "mode": 3, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 600, + "Q": 0.2, + "bw": 1, + "gain": -6.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 2000, + "Q": 0.11, + "bw": 1, + "gain": -5.0, + "coefficients": { + "float": [ + 0.9697162749906751, + -1.760365792557813, + 0.8058396445977685, + 1.7544547110059052, + -0.7814670011403514 + ], + "q30": [ + "0x3e0fd4d9", + "-0x70a9d549", + "0x3392e071", + "0x7048fc69", + "-0x32038e2b" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 3200, + "Q": 0.5, + "bw": 1, + "gain": -10.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode4.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode4.json new file mode 100644 index 0000000..b10a1a6 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode4.json @@ -0,0 +1,202 @@ +{ + "mode_4": { + "sample_rate": 96000.0, + "mode": 4, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "高架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 0.6310774711837125, + -1.260986691313349, + 0.6299103004637236, + 1.9985295387866169, + -0.9985306191207041 + ], + "q30": [ + "0x286392c2", + "-0x50b40185", + "0x2850734a", + "0x7fe7e870", + "-0x3fe7ecf8" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -2.5, + "coefficients": { + "float": [ + 0.9998567440131776, + -1.9978625525256353, + 0.9980075201554369, + 1.9978622670908264, + -0.9978645496034232 + ], + "q30": [ + "0x3ffda724", + "-0x7fdcfae5", + "0x3fdf5aef", + "0x7fdcf9b2", + "-0x3fdd0345" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 55, + "Q": 0.41, + "bw": 1, + "gain": 3.75, + "coefficients": { + "float": [ + 1.0023598742081443, + -1.991245634277488, + 0.9888986615583146, + 1.991245634277488, + -0.9912585357664592 + ], + "q30": [ + "0x4026aa07", + "-0x7f709187", + "0x3f4a1d9c", + "0x7f709187", + "-0x3f70c7a4" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 350, + "Q": 0.81, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9942812795184419, + -1.9603234994061256, + 0.9665566733287794, + 1.9603234994061256, + -0.9608379528472213 + ], + "q30": [ + "0x3fa24df2", + "-0x7d75f0b1", + "0x3ddc1085", + "0x7d75f0b1", + "-0x3d7e5e78" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3600, + "Q": 0.41, + "bw": 1, + "gain": 3.65, + "coefficients": { + "float": [ + 1.1157424156015094, + -1.5137820376513778, + 0.4410540318166462, + 1.5137820376513778, + -0.5567964474181556 + ], + "q30": [ + "0x476852e0", + "-0x60e1ce0e", + "0x1c3a3ab0", + "0x60e1ce0e", + "-0x23a28d91" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 10000, + "Q": 0.71, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0943175504186735, + -1.2622021748812131, + 0.4568081257655523, + 1.109228792618427, + -0.39815229392143964 + ], + "q30": [ + "0x46094c7a", + "-0x50c7eba1", + "0x1d3c5826", + "0x46fd9ac3", + "-0x197b53c2" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode5.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode5.json new file mode 100644 index 0000000..cf0a542 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode5.json @@ -0,0 +1,202 @@ +{ + "mode_5": { + "sample_rate": 96000.0, + "mode": 5, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "峰值滤波器", + "fc": 600, + "Q": 0.4, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9810672335201196, + -1.8689056196043783, + 0.8892803562932556, + 1.8689056196043783, + -0.8703475898133753 + ], + "q30": [ + "0x3ec9ce38", + "-0x779c2650", + "0x38e9f827", + "0x779c2650", + "-0x37b3c660" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 200, + "Q": 0.5, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.7089858229897464, + -1.4048472614005911, + 0.69598180539601, + 1.9844243291390486, + -0.984544696124214 + ], + "q30": [ + "0x2d600612", + "-0x59e9047c", + "0x2c8af745", + "0x7f00cee6", + "-0x3f02c7c1" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.5, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 0.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode6.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode6.json new file mode 100644 index 0000000..dc163a9 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode6.json @@ -0,0 +1,202 @@ +{ + "mode_6": { + "sample_rate": 96000.0, + "mode": 6, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "高架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 0.6310774711837125, + -1.260986691313349, + 0.6299103004637236, + 1.9985295387866169, + -0.9985306191207041 + ], + "q30": [ + "0x286392c2", + "-0x50b40185", + "0x2850734a", + "0x7fe7e870", + "-0x3fe7ecf8" + ] + } + }, + { + "enabled": true, + "type": "低架滤波器", + "fc": 20, + "Q": 0.71, + "bw": 1, + "gain": -2.5, + "coefficients": { + "float": [ + 0.9998567440131776, + -1.9978625525256353, + 0.9980075201554369, + 1.9978622670908264, + -0.9978645496034232 + ], + "q30": [ + "0x3ffda724", + "-0x7fdcfae5", + "0x3fdf5aef", + "0x7fdcf9b2", + "-0x3fdd0345" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 55, + "Q": 0.41, + "bw": 1, + "gain": 3.75, + "coefficients": { + "float": [ + 1.0023598742081443, + -1.991245634277488, + 0.9888986615583146, + 1.991245634277488, + -0.9912585357664592 + ], + "q30": [ + "0x4026aa07", + "-0x7f709187", + "0x3f4a1d9c", + "0x7f709187", + "-0x3f70c7a4" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 350, + "Q": 0.81, + "bw": 1, + "gain": -3.0, + "coefficients": { + "float": [ + 0.9942812795184419, + -1.9603234994061256, + 0.9665566733287794, + 1.9603234994061256, + -0.9608379528472213 + ], + "q30": [ + "0x3fa24df2", + "-0x7d75f0b1", + "0x3ddc1085", + "0x7d75f0b1", + "-0x3d7e5e78" + ] + } + }, + { + "enabled": true, + "type": "峰值滤波器", + "fc": 3600, + "Q": 0.41, + "bw": 1, + "gain": 3.65, + "coefficients": { + "float": [ + 1.1157424156015094, + -1.5137820376513778, + 0.4410540318166462, + 1.5137820376513778, + -0.5567964474181556 + ], + "q30": [ + "0x476852e0", + "-0x60e1ce0e", + "0x1c3a3ab0", + "0x60e1ce0e", + "-0x23a28d91" + ] + } + }, + { + "enabled": true, + "type": "高架滤波器", + "fc": 10000, + "Q": 0.71, + "bw": 1, + "gain": 1.0, + "coefficients": { + "float": [ + 1.0943175504186735, + -1.2622021748812131, + 0.4568081257655523, + 1.109228792618427, + -0.39815229392143964 + ], + "q30": [ + "0x46094c7a", + "-0x50c7eba1", + "0x1d3c5826", + "0x46fd9ac3", + "-0x197b53c2" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode7.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode7.json new file mode 100644 index 0000000..29442bc --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode7.json @@ -0,0 +1,202 @@ +{ + "mode_7": { + "sample_rate": 96000.0, + "mode": 7, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 85, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode8.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode8.json new file mode 100644 index 0000000..45939d5 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode8.json @@ -0,0 +1,202 @@ +{ + "mode_8": { + "sample_rate": 96000.0, + "mode": 8, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 130, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode9.json b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode9.json new file mode 100644 index 0000000..dce8571 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_parameters_96000_mode9.json @@ -0,0 +1,202 @@ +{ + "mode_9": { + "sample_rate": 96000.0, + "mode": 9, + "total_bshift": 0, + "post_gain_db": 0, + "bands": [ + { + "enabled": true, + "type": "bypass滤波器", + "fc": 130, + "Q": 0.75, + "bw": 1, + "gain": -4.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 80, + "Q": 0.75, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 2000, + "Q": 0.5, + "bw": 1, + "gain": 1.5, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + }, + { + "enabled": true, + "type": "bypass滤波器", + "fc": 1000, + "Q": 0.71, + "bw": 1, + "gain": 0.0, + "coefficients": { + "float": [ + 1.0, + 0.0, + 0.0, + -0.0, + -0.0 + ], + "q30": [ + "0x40000000", + "0x00000000", + "0x00000000", + "0x00000000", + "0x00000000" + ] + } + } + ] + } +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100.h new file mode 100644 index 0000000..0e0e90b --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100.h @@ -0,0 +1,1648 @@ +// EQ参数头文件 - 44100Hz +// 自动生成,请勿手动修改 + +#include "eq.h" + +// Directly declare sEQ_data_44100HZ, including coefficients +eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { + [0][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 4.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fb113fc, 0x3f64bdba, 0x40c02ea5, 0x433cb275, 0x3dffaca6, 0x37206a56, 0x38354b6d, 0x40000000}, + {-0x7dde6daa, -0x7bc4aba6, -0x79e431a7, -0x73bf050c, -0x4cc819e3, -0x1c16b1ca, 0x30963485, -0x4f4295cb}, + {0x3e32760b, 0x3c740a12, 0x39735b92, 0x31b1a20e, 0x1d322a21, 0x0c1bac94, 0x126ee045, 0x1e236cc7}, + {0x7dde6daa, 0x7bc4aba6, 0x79e431a7, 0x73bf050c, 0x4cc819e3, 0x1c16b1ca, -0x30963485, 0x4f4295cb}, + {-0x3de38a07, -0x3bd8c7cd, -0x3a338a38, -0x34ee5483, -0x1b31d6c7, -0x033c16eb, -0x0aa42bb2, -0x1e236cc7}, + }, + } + }, + [0][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 4.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fb113fc, 0x3f64bdba, 0x40c02ea5, 0x433cb275, 0x3dffaca6, 0x37206a56, 0x38354b6d, 0x40000000}, + {-0x7dde6daa, -0x7bc4aba6, -0x79e431a7, -0x73bf050c, -0x4cc819e3, -0x1c16b1ca, 0x30963485, -0x4f4295cb}, + {0x3e32760b, 0x3c740a12, 0x39735b92, 0x31b1a20e, 0x1d322a21, 0x0c1bac94, 0x126ee045, 0x1e236cc7}, + {0x7dde6daa, 0x7bc4aba6, 0x79e431a7, 0x73bf050c, 0x4cc819e3, 0x1c16b1ca, -0x30963485, 0x4f4295cb}, + {-0x3de38a07, -0x3bd8c7cd, -0x3a338a38, -0x34ee5483, -0x1b31d6c7, -0x033c16eb, -0x0aa42bb2, -0x1e236cc7}, + }, + } + }, + [1][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -3, // -3 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3ff41df7, 0x3fce6059, 0x40000000, 0x40c02ea5, 0x42487f62, 0x3fffffff, 0x3a4e238c, 0x38354b6d}, + {-0x7f242665, -0x7e185409, -0x7cf3cb7a, -0x79e431a7, -0x73bf050c, -0x4e189e14, -0x1e56eff0, 0x30963485}, + {0x3f31581a, 0x3e4f1267, 0x3d0818e1, 0x39735b92, 0x32a5d521, 0x1cc1863f, 0x0e5147e9, 0x126ee045}, + {0x7f242665, 0x7e185409, 0x7cf3cb7a, 0x79e431a7, 0x73bf050c, 0x4e189e14, 0x1e56eff0, -0x30963485}, + {-0x3f257611, -0x3e1d72c0, -0x3d0818e1, -0x3a338a38, -0x34ee5483, -0x1cc1863f, -0x089f6b75, -0x0aa42bb2}, + }, + } + }, + [1][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -3, // -3 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3ff41df7, 0x3fce6059, 0x40000000, 0x40c02ea5, 0x42487f62, 0x3fffffff, 0x3a4e238c, 0x38354b6d}, + {-0x7f242665, -0x7e185409, -0x7cf3cb7a, -0x79e431a7, -0x73bf050c, -0x4e189e14, -0x1e56eff0, 0x30963485}, + {0x3f31581a, 0x3e4f1267, 0x3d0818e1, 0x39735b92, 0x32a5d521, 0x1cc1863f, 0x0e5147e9, 0x126ee045}, + {0x7f242665, 0x7e185409, 0x7cf3cb7a, 0x79e431a7, 0x73bf050c, 0x4e189e14, 0x1e56eff0, -0x30963485}, + {-0x3f257611, -0x3e1d72c0, -0x3d0818e1, -0x3a338a38, -0x34ee5483, -0x1cc1863f, -0x089f6b75, -0x0aa42bb2}, + }, + } + }, + [2][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -3, // -3 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fd7e4c8, 0x3fce6059, 0x3f9e3547, 0x40c02ea5, 0x416edac4, 0x3deb7030, 0x346e8b15, 0x38354b6d}, + {-0x7eec0a91, -0x7e185409, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x4b8ec1f7, -0x1b488775, 0x30963485}, + {0x3f1574e0, 0x3e4f1267, 0x3caad74a, 0x39735b92, 0x337f79bf, 0x1bd23cf6, 0x0ce00e5f, 0x126ee045}, + {0x7eec0a91, 0x7e185409, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x4b8ec1f7, 0x1b488775, -0x30963485}, + {-0x3eed59a9, -0x3e1d72c0, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x19bdad27, -0x014e9974, -0x0aa42bb2}, + }, + } + }, + [2][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -3, // -3 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fd7e4c8, 0x3fce6059, 0x3f9e3547, 0x40c02ea5, 0x416edac4, 0x3deb7030, 0x346e8b15, 0x38354b6d}, + {-0x7eec0a91, -0x7e185409, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x4b8ec1f7, -0x1b488775, 0x30963485}, + {0x3f1574e0, 0x3e4f1267, 0x3caad74a, 0x39735b92, 0x337f79bf, 0x1bd23cf6, 0x0ce00e5f, 0x126ee045}, + {0x7eec0a91, 0x7e185409, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x4b8ec1f7, 0x1b488775, -0x30963485}, + {-0x3eed59a9, -0x3e1d72c0, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x19bdad27, -0x014e9974, -0x0aa42bb2}, + }, + } + }, + [3][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -3, // -3 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fd7e4c8, 0x3fce6059, 0x3f9e3547, 0x405a90d5, 0x40ace148, 0x3fffffff, 0x3d2f1092, 0x38354b6d}, + {-0x7eec0a91, -0x7e185409, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x4e189e14, -0x1fd66711, 0x30963485}, + {0x3f1574e0, 0x3e4f1267, 0x3caad74a, 0x39d8f962, 0x3441733b, 0x1cc1863f, 0x0f063dc7, 0x126ee045}, + {0x7eec0a91, 0x7e185409, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x4e189e14, 0x1fd66711, -0x30963485}, + {-0x3eed59a9, -0x3e1d72c0, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x1cc1863f, -0x0c354e59, -0x0aa42bb2}, + }, + } + }, + [3][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -3, // -3 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fd7e4c8, 0x3fce6059, 0x3f9e3547, 0x405a90d5, 0x40ace148, 0x3fffffff, 0x3d2f1092, 0x38354b6d}, + {-0x7eec0a91, -0x7e185409, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x4e189e14, -0x1fd66711, 0x30963485}, + {0x3f1574e0, 0x3e4f1267, 0x3caad74a, 0x39d8f962, 0x3441733b, 0x1cc1863f, 0x0f063dc7, 0x126ee045}, + {0x7eec0a91, 0x7e185409, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x4e189e14, 0x1fd66711, -0x30963485}, + {-0x3eed59a9, -0x3e1d72c0, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x1cc1863f, -0x0c354e59, -0x0aa42bb2}, + }, + } + }, + [4][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 4.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 4.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40193bef, 0x40706fc7, 0x40de3b22, 0x405a90d5, 0x3f54ecd5, 0x449012f8, 0x464040bd, 0x459182a8}, + {-0x7f3bc607, -0x7e7a6540, -0x7cf3cb7a, -0x79e431a7, -0x7289a001, -0x4e189e14, -0x214d8c10, 0x37527133}, + {0x3f23da02, 0x3e0f182b, 0x3c29ddbf, 0x39d8f962, 0x3460d7e0, 0x18317347, 0x097705ac, 0x0f6b8432}, + {0x7f3bc607, 0x7e7a6540, 0x7cf3cb7a, 0x79e431a7, 0x7289a001, 0x4e189e14, 0x214d8c10, -0x37527133}, + {-0x3f3d15f2, -0x3e7f87f2, -0x3d0818e1, -0x3a338a38, -0x33b5c4b5, -0x1cc1863f, -0x0fb7466a, -0x14fd06da}, + }, + } + }, + [4][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 4.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 4.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40193bef, 0x40706fc7, 0x40de3b22, 0x405a90d5, 0x3f54ecd5, 0x449012f8, 0x464040bd, 0x459182a8}, + {-0x7f3bc607, -0x7e7a6540, -0x7cf3cb7a, -0x79e431a7, -0x7289a001, -0x4e189e14, -0x214d8c10, 0x37527133}, + {0x3f23da02, 0x3e0f182b, 0x3c29ddbf, 0x39d8f962, 0x3460d7e0, 0x18317347, 0x097705ac, 0x0f6b8432}, + {0x7f3bc607, 0x7e7a6540, 0x7cf3cb7a, 0x79e431a7, 0x7289a001, 0x4e189e14, 0x214d8c10, -0x37527133}, + {-0x3f3d15f2, -0x3e7f87f2, -0x3d0818e1, -0x3a338a38, -0x33b5c4b5, -0x1cc1863f, -0x0fb7466a, -0x14fd06da}, + }, + } + }, + [5][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40193bef, 0x40000000, 0x40000000, 0x405a90d5, 0x3f54ecd5, 0x47450e12, 0x49f5a1ad, 0x48df384d}, + {-0x7f3bc607, -0x7e7a6540, -0x7cf3cb7a, -0x79e431a7, -0x7289a001, -0x4e189e14, -0x214d8c10, 0x37527133}, + {0x3f23da02, 0x3e7f87f2, 0x3d0818e1, 0x39d8f962, 0x3460d7e0, 0x157c782d, 0x05c1a4bd, 0x0c1dce8d}, + {0x7f3bc607, 0x7e7a6540, 0x7cf3cb7a, 0x79e431a7, 0x7289a001, 0x4e189e14, 0x214d8c10, -0x37527133}, + {-0x3f3d15f2, -0x3e7f87f2, -0x3d0818e1, -0x3a338a38, -0x33b5c4b5, -0x1cc1863f, -0x0fb7466a, -0x14fd06da}, + }, + } + }, + [5][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40193bef, 0x40000000, 0x40000000, 0x405a90d5, 0x3f54ecd5, 0x47450e12, 0x49f5a1ad, 0x48df384d}, + {-0x7f3bc607, -0x7e7a6540, -0x7cf3cb7a, -0x79e431a7, -0x7289a001, -0x4e189e14, -0x214d8c10, 0x37527133}, + {0x3f23da02, 0x3e7f87f2, 0x3d0818e1, 0x39d8f962, 0x3460d7e0, 0x157c782d, 0x05c1a4bd, 0x0c1dce8d}, + {0x7f3bc607, 0x7e7a6540, 0x7cf3cb7a, 0x79e431a7, 0x7289a001, 0x4e189e14, 0x214d8c10, -0x37527133}, + {-0x3f3d15f2, -0x3e7f87f2, -0x3d0818e1, -0x3a338a38, -0x33b5c4b5, -0x1cc1863f, -0x0fb7466a, -0x14fd06da}, + }, + } + }, + [6][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40283469, 0x404f4dce, 0x3fd1c50d, 0x3ed36b73, 0x3dcba2d2, 0x47450e12, 0x49f5a1ad, 0x48df384d}, + {-0x7f3bc607, -0x7e7a6540, -0x7c998928, -0x77a7b914, -0x6fc2592c, -0x4e189e14, -0x214d8c10, 0x37527133}, + {0x3f14e189, 0x3e303a23, 0x3cdc02d8, 0x39223189, 0x331b932b, 0x157c782d, 0x05c1a4bd, 0x0c1dce8d}, + {0x7f3bc607, 0x7e7a6540, 0x7c998928, 0x77a7b914, 0x6fc2592c, 0x4e189e14, 0x214d8c10, -0x37527133}, + {-0x3f3d15f2, -0x3e7f87f2, -0x3cadc7e6, -0x37f59cfd, -0x30e735fd, -0x1cc1863f, -0x0fb7466a, -0x14fd06da}, + }, + } + }, + [6][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40283469, 0x404f4dce, 0x3fd1c50d, 0x3ed36b73, 0x3dcba2d2, 0x47450e12, 0x49f5a1ad, 0x48df384d}, + {-0x7f3bc607, -0x7e7a6540, -0x7c998928, -0x77a7b914, -0x6fc2592c, -0x4e189e14, -0x214d8c10, 0x37527133}, + {0x3f14e189, 0x3e303a23, 0x3cdc02d8, 0x39223189, 0x331b932b, 0x157c782d, 0x05c1a4bd, 0x0c1dce8d}, + {0x7f3bc607, 0x7e7a6540, 0x7c998928, 0x77a7b914, 0x6fc2592c, 0x4e189e14, 0x214d8c10, -0x37527133}, + {-0x3f3d15f2, -0x3e7f87f2, -0x3cadc7e6, -0x37f59cfd, -0x30e735fd, -0x1cc1863f, -0x0fb7466a, -0x14fd06da}, + }, + } + }, + [7][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = 0, // 0 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_BYPASS, + .fc = 85.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_BYPASS, + .fc = 80.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_BYPASS, + .fc = 2000.00f, + .q = 0.5000f, + .bw = 1.00f, + .gain = 1.50f, + }, + { + .index = 3, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + }, + } + }, + [7][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = 0, // 0 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_BYPASS, + .fc = 85.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_BYPASS, + .fc = 80.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_BYPASS, + .fc = 2000.00f, + .q = 0.5000f, + .bw = 1.00f, + .gain = 1.50f, + }, + { + .index = 3, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + }, + } + }, + [8][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = 0, // 0 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_BYPASS, + .fc = 130.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_BYPASS, + .fc = 80.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_BYPASS, + .fc = 2000.00f, + .q = 0.5000f, + .bw = 1.00f, + .gain = 1.50f, + }, + { + .index = 3, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + }, + } + }, + [8][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = 0, // 0 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_BYPASS, + .fc = 130.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_BYPASS, + .fc = 80.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_BYPASS, + .fc = 2000.00f, + .q = 0.5000f, + .bw = 1.00f, + .gain = 1.50f, + }, + { + .index = 3, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + }, + } + }, + [9][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = 0, // 0 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_BYPASS, + .fc = 130.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_BYPASS, + .fc = 80.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_BYPASS, + .fc = 2000.00f, + .q = 0.5000f, + .bw = 1.00f, + .gain = 1.50f, + }, + { + .index = 3, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + }, + } + }, + [9][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = 0, // 0 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_BYPASS, + .fc = 130.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_BYPASS, + .fc = 80.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_BYPASS, + .fc = 2000.00f, + .q = 0.5000f, + .bw = 1.00f, + .gain = 1.50f, + }, + { + .index = 3, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + }, + } + }, +}; diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode0.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode0.h new file mode 100644 index 0000000..8d28ffc --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode0.h @@ -0,0 +1,172 @@ +// EQ参数头文件 - 44100Hz +// 自动生成,请勿手动修改 + +#include "eq.h" + +// Directly declare sEQ_data_44100HZ, including coefficients +eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { + [0][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 4.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fb113fc, 0x3f64bdba, 0x40c02ea5, 0x433cb275, 0x3dffaca6, 0x37206a56, 0x38354b6d, 0x40000000}, + {-0x7dde6daa, -0x7bc4aba6, -0x79e431a7, -0x73bf050c, -0x4cc819e3, -0x1c16b1ca, 0x30963485, -0x4f4295cb}, + {0x3e32760b, 0x3c740a12, 0x39735b92, 0x31b1a20e, 0x1d322a21, 0x0c1bac94, 0x126ee045, 0x1e236cc7}, + {0x7dde6daa, 0x7bc4aba6, 0x79e431a7, 0x73bf050c, 0x4cc819e3, 0x1c16b1ca, -0x30963485, 0x4f4295cb}, + {-0x3de38a07, -0x3bd8c7cd, -0x3a338a38, -0x34ee5483, -0x1b31d6c7, -0x033c16eb, -0x0aa42bb2, -0x1e236cc7}, + }, + } + }, + [0][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 4.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fb113fc, 0x3f64bdba, 0x40c02ea5, 0x433cb275, 0x3dffaca6, 0x37206a56, 0x38354b6d, 0x40000000}, + {-0x7dde6daa, -0x7bc4aba6, -0x79e431a7, -0x73bf050c, -0x4cc819e3, -0x1c16b1ca, 0x30963485, -0x4f4295cb}, + {0x3e32760b, 0x3c740a12, 0x39735b92, 0x31b1a20e, 0x1d322a21, 0x0c1bac94, 0x126ee045, 0x1e236cc7}, + {0x7dde6daa, 0x7bc4aba6, 0x79e431a7, 0x73bf050c, 0x4cc819e3, 0x1c16b1ca, -0x30963485, 0x4f4295cb}, + {-0x3de38a07, -0x3bd8c7cd, -0x3a338a38, -0x34ee5483, -0x1b31d6c7, -0x033c16eb, -0x0aa42bb2, -0x1e236cc7}, + }, + } + }, +}; diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode1.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode1.h new file mode 100644 index 0000000..74fa6ab --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode1.h @@ -0,0 +1,172 @@ +// EQ参数头文件 - 44100Hz +// 自动生成,请勿手动修改 + +#include "eq.h" + +// Directly declare sEQ_data_44100HZ, including coefficients +eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { + [1][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -3, // -3 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3ff41df7, 0x3fce6059, 0x40000000, 0x40c02ea5, 0x42487f62, 0x3fffffff, 0x3a4e238c, 0x38354b6d}, + {-0x7f242665, -0x7e185409, -0x7cf3cb7a, -0x79e431a7, -0x73bf050c, -0x4e189e14, -0x1e56eff0, 0x30963485}, + {0x3f31581a, 0x3e4f1267, 0x3d0818e1, 0x39735b92, 0x32a5d521, 0x1cc1863f, 0x0e5147e9, 0x126ee045}, + {0x7f242665, 0x7e185409, 0x7cf3cb7a, 0x79e431a7, 0x73bf050c, 0x4e189e14, 0x1e56eff0, -0x30963485}, + {-0x3f257611, -0x3e1d72c0, -0x3d0818e1, -0x3a338a38, -0x34ee5483, -0x1cc1863f, -0x089f6b75, -0x0aa42bb2}, + }, + } + }, + [1][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -3, // -3 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3ff41df7, 0x3fce6059, 0x40000000, 0x40c02ea5, 0x42487f62, 0x3fffffff, 0x3a4e238c, 0x38354b6d}, + {-0x7f242665, -0x7e185409, -0x7cf3cb7a, -0x79e431a7, -0x73bf050c, -0x4e189e14, -0x1e56eff0, 0x30963485}, + {0x3f31581a, 0x3e4f1267, 0x3d0818e1, 0x39735b92, 0x32a5d521, 0x1cc1863f, 0x0e5147e9, 0x126ee045}, + {0x7f242665, 0x7e185409, 0x7cf3cb7a, 0x79e431a7, 0x73bf050c, 0x4e189e14, 0x1e56eff0, -0x30963485}, + {-0x3f257611, -0x3e1d72c0, -0x3d0818e1, -0x3a338a38, -0x34ee5483, -0x1cc1863f, -0x089f6b75, -0x0aa42bb2}, + }, + } + }, +}; diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode2.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode2.h new file mode 100644 index 0000000..29d1e80 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode2.h @@ -0,0 +1,172 @@ +// EQ参数头文件 - 44100Hz +// 自动生成,请勿手动修改 + +#include "eq.h" + +// Directly declare sEQ_data_44100HZ, including coefficients +eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { + [2][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -3, // -3 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fd7e4c8, 0x3fce6059, 0x3f9e3547, 0x40c02ea5, 0x416edac4, 0x3deb7030, 0x346e8b15, 0x38354b6d}, + {-0x7eec0a91, -0x7e185409, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x4b8ec1f7, -0x1b488775, 0x30963485}, + {0x3f1574e0, 0x3e4f1267, 0x3caad74a, 0x39735b92, 0x337f79bf, 0x1bd23cf6, 0x0ce00e5f, 0x126ee045}, + {0x7eec0a91, 0x7e185409, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x4b8ec1f7, 0x1b488775, -0x30963485}, + {-0x3eed59a9, -0x3e1d72c0, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x19bdad27, -0x014e9974, -0x0aa42bb2}, + }, + } + }, + [2][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -3, // -3 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fd7e4c8, 0x3fce6059, 0x3f9e3547, 0x40c02ea5, 0x416edac4, 0x3deb7030, 0x346e8b15, 0x38354b6d}, + {-0x7eec0a91, -0x7e185409, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x4b8ec1f7, -0x1b488775, 0x30963485}, + {0x3f1574e0, 0x3e4f1267, 0x3caad74a, 0x39735b92, 0x337f79bf, 0x1bd23cf6, 0x0ce00e5f, 0x126ee045}, + {0x7eec0a91, 0x7e185409, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x4b8ec1f7, 0x1b488775, -0x30963485}, + {-0x3eed59a9, -0x3e1d72c0, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x19bdad27, -0x014e9974, -0x0aa42bb2}, + }, + } + }, +}; diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode3.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode3.h new file mode 100644 index 0000000..0539673 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode3.h @@ -0,0 +1,172 @@ +// EQ参数头文件 - 44100Hz +// 自动生成,请勿手动修改 + +#include "eq.h" + +// Directly declare sEQ_data_44100HZ, including coefficients +eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { + [3][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -3, // -3 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fd7e4c8, 0x3fce6059, 0x3f9e3547, 0x405a90d5, 0x40ace148, 0x3fffffff, 0x3d2f1092, 0x38354b6d}, + {-0x7eec0a91, -0x7e185409, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x4e189e14, -0x1fd66711, 0x30963485}, + {0x3f1574e0, 0x3e4f1267, 0x3caad74a, 0x39d8f962, 0x3441733b, 0x1cc1863f, 0x0f063dc7, 0x126ee045}, + {0x7eec0a91, 0x7e185409, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x4e189e14, 0x1fd66711, -0x30963485}, + {-0x3eed59a9, -0x3e1d72c0, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x1cc1863f, -0x0c354e59, -0x0aa42bb2}, + }, + } + }, + [3][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -3, // -3 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fd7e4c8, 0x3fce6059, 0x3f9e3547, 0x405a90d5, 0x40ace148, 0x3fffffff, 0x3d2f1092, 0x38354b6d}, + {-0x7eec0a91, -0x7e185409, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x4e189e14, -0x1fd66711, 0x30963485}, + {0x3f1574e0, 0x3e4f1267, 0x3caad74a, 0x39d8f962, 0x3441733b, 0x1cc1863f, 0x0f063dc7, 0x126ee045}, + {0x7eec0a91, 0x7e185409, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x4e189e14, 0x1fd66711, -0x30963485}, + {-0x3eed59a9, -0x3e1d72c0, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x1cc1863f, -0x0c354e59, -0x0aa42bb2}, + }, + } + }, +}; diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode4.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode4.h new file mode 100644 index 0000000..5699fb3 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode4.h @@ -0,0 +1,172 @@ +// EQ参数头文件 - 44100Hz +// 自动生成,请勿手动修改 + +#include "eq.h" + +// Directly declare sEQ_data_44100HZ, including coefficients +eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { + [4][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 4.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 4.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40193bef, 0x40706fc7, 0x40de3b22, 0x405a90d5, 0x3f54ecd5, 0x449012f8, 0x464040bd, 0x459182a8}, + {-0x7f3bc607, -0x7e7a6540, -0x7cf3cb7a, -0x79e431a7, -0x7289a001, -0x4e189e14, -0x214d8c10, 0x37527133}, + {0x3f23da02, 0x3e0f182b, 0x3c29ddbf, 0x39d8f962, 0x3460d7e0, 0x18317347, 0x097705ac, 0x0f6b8432}, + {0x7f3bc607, 0x7e7a6540, 0x7cf3cb7a, 0x79e431a7, 0x7289a001, 0x4e189e14, 0x214d8c10, -0x37527133}, + {-0x3f3d15f2, -0x3e7f87f2, -0x3d0818e1, -0x3a338a38, -0x33b5c4b5, -0x1cc1863f, -0x0fb7466a, -0x14fd06da}, + }, + } + }, + [4][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 4.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 4.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40193bef, 0x40706fc7, 0x40de3b22, 0x405a90d5, 0x3f54ecd5, 0x449012f8, 0x464040bd, 0x459182a8}, + {-0x7f3bc607, -0x7e7a6540, -0x7cf3cb7a, -0x79e431a7, -0x7289a001, -0x4e189e14, -0x214d8c10, 0x37527133}, + {0x3f23da02, 0x3e0f182b, 0x3c29ddbf, 0x39d8f962, 0x3460d7e0, 0x18317347, 0x097705ac, 0x0f6b8432}, + {0x7f3bc607, 0x7e7a6540, 0x7cf3cb7a, 0x79e431a7, 0x7289a001, 0x4e189e14, 0x214d8c10, -0x37527133}, + {-0x3f3d15f2, -0x3e7f87f2, -0x3d0818e1, -0x3a338a38, -0x33b5c4b5, -0x1cc1863f, -0x0fb7466a, -0x14fd06da}, + }, + } + }, +}; diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode5.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode5.h new file mode 100644 index 0000000..dc54e48 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode5.h @@ -0,0 +1,172 @@ +// EQ参数头文件 - 44100Hz +// 自动生成,请勿手动修改 + +#include "eq.h" + +// Directly declare sEQ_data_44100HZ, including coefficients +eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { + [5][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40193bef, 0x40000000, 0x40000000, 0x405a90d5, 0x3f54ecd5, 0x47450e12, 0x49f5a1ad, 0x48df384d}, + {-0x7f3bc607, -0x7e7a6540, -0x7cf3cb7a, -0x79e431a7, -0x7289a001, -0x4e189e14, -0x214d8c10, 0x37527133}, + {0x3f23da02, 0x3e7f87f2, 0x3d0818e1, 0x39d8f962, 0x3460d7e0, 0x157c782d, 0x05c1a4bd, 0x0c1dce8d}, + {0x7f3bc607, 0x7e7a6540, 0x7cf3cb7a, 0x79e431a7, 0x7289a001, 0x4e189e14, 0x214d8c10, -0x37527133}, + {-0x3f3d15f2, -0x3e7f87f2, -0x3d0818e1, -0x3a338a38, -0x33b5c4b5, -0x1cc1863f, -0x0fb7466a, -0x14fd06da}, + }, + } + }, + [5][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40193bef, 0x40000000, 0x40000000, 0x405a90d5, 0x3f54ecd5, 0x47450e12, 0x49f5a1ad, 0x48df384d}, + {-0x7f3bc607, -0x7e7a6540, -0x7cf3cb7a, -0x79e431a7, -0x7289a001, -0x4e189e14, -0x214d8c10, 0x37527133}, + {0x3f23da02, 0x3e7f87f2, 0x3d0818e1, 0x39d8f962, 0x3460d7e0, 0x157c782d, 0x05c1a4bd, 0x0c1dce8d}, + {0x7f3bc607, 0x7e7a6540, 0x7cf3cb7a, 0x79e431a7, 0x7289a001, 0x4e189e14, 0x214d8c10, -0x37527133}, + {-0x3f3d15f2, -0x3e7f87f2, -0x3d0818e1, -0x3a338a38, -0x33b5c4b5, -0x1cc1863f, -0x0fb7466a, -0x14fd06da}, + }, + } + }, +}; diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode6.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode6.h new file mode 100644 index 0000000..914d4db --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode6.h @@ -0,0 +1,172 @@ +// EQ参数头文件 - 44100Hz +// 自动生成,请勿手动修改 + +#include "eq.h" + +// Directly declare sEQ_data_44100HZ, including coefficients +eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { + [6][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40283469, 0x404f4dce, 0x3fd1c50d, 0x3ed36b73, 0x3dcba2d2, 0x47450e12, 0x49f5a1ad, 0x48df384d}, + {-0x7f3bc607, -0x7e7a6540, -0x7c998928, -0x77a7b914, -0x6fc2592c, -0x4e189e14, -0x214d8c10, 0x37527133}, + {0x3f14e189, 0x3e303a23, 0x3cdc02d8, 0x39223189, 0x331b932b, 0x157c782d, 0x05c1a4bd, 0x0c1dce8d}, + {0x7f3bc607, 0x7e7a6540, 0x7c998928, 0x77a7b914, 0x6fc2592c, 0x4e189e14, 0x214d8c10, -0x37527133}, + {-0x3f3d15f2, -0x3e7f87f2, -0x3cadc7e6, -0x37f59cfd, -0x30e735fd, -0x1cc1863f, -0x0fb7466a, -0x14fd06da}, + }, + } + }, + [6][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40283469, 0x404f4dce, 0x3fd1c50d, 0x3ed36b73, 0x3dcba2d2, 0x47450e12, 0x49f5a1ad, 0x48df384d}, + {-0x7f3bc607, -0x7e7a6540, -0x7c998928, -0x77a7b914, -0x6fc2592c, -0x4e189e14, -0x214d8c10, 0x37527133}, + {0x3f14e189, 0x3e303a23, 0x3cdc02d8, 0x39223189, 0x331b932b, 0x157c782d, 0x05c1a4bd, 0x0c1dce8d}, + {0x7f3bc607, 0x7e7a6540, 0x7c998928, 0x77a7b914, 0x6fc2592c, 0x4e189e14, 0x214d8c10, -0x37527133}, + {-0x3f3d15f2, -0x3e7f87f2, -0x3cadc7e6, -0x37f59cfd, -0x30e735fd, -0x1cc1863f, -0x0fb7466a, -0x14fd06da}, + }, + } + }, +}; diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode7.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode7.h new file mode 100644 index 0000000..21bfd1f --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode7.h @@ -0,0 +1,172 @@ +// EQ参数头文件 - 44100Hz +// 自动生成,请勿手动修改 + +#include "eq.h" + +// Directly declare sEQ_data_44100HZ, including coefficients +eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { + [7][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = 0, // 0 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_BYPASS, + .fc = 85.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_BYPASS, + .fc = 80.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_BYPASS, + .fc = 2000.00f, + .q = 0.5000f, + .bw = 1.00f, + .gain = 1.50f, + }, + { + .index = 3, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + }, + } + }, + [7][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = 0, // 0 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_BYPASS, + .fc = 85.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_BYPASS, + .fc = 80.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_BYPASS, + .fc = 2000.00f, + .q = 0.5000f, + .bw = 1.00f, + .gain = 1.50f, + }, + { + .index = 3, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + }, + } + }, +}; diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode8.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode8.h new file mode 100644 index 0000000..a51962e --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode8.h @@ -0,0 +1,172 @@ +// EQ参数头文件 - 44100Hz +// 自动生成,请勿手动修改 + +#include "eq.h" + +// Directly declare sEQ_data_44100HZ, including coefficients +eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { + [8][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = 0, // 0 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_BYPASS, + .fc = 130.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_BYPASS, + .fc = 80.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_BYPASS, + .fc = 2000.00f, + .q = 0.5000f, + .bw = 1.00f, + .gain = 1.50f, + }, + { + .index = 3, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + }, + } + }, + [8][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = 0, // 0 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_BYPASS, + .fc = 130.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_BYPASS, + .fc = 80.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_BYPASS, + .fc = 2000.00f, + .q = 0.5000f, + .bw = 1.00f, + .gain = 1.50f, + }, + { + .index = 3, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + }, + } + }, +}; diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode9.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode9.h new file mode 100644 index 0000000..424644a --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100_mode9.h @@ -0,0 +1,172 @@ +// EQ参数头文件 - 44100Hz +// 自动生成,请勿手动修改 + +#include "eq.h" + +// Directly declare sEQ_data_44100HZ, including coefficients +eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { + [9][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = 0, // 0 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_BYPASS, + .fc = 130.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_BYPASS, + .fc = 80.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_BYPASS, + .fc = 2000.00f, + .q = 0.5000f, + .bw = 1.00f, + .gain = 1.50f, + }, + { + .index = 3, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + }, + } + }, + [9][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = 0, // 0 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_BYPASS, + .fc = 130.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_BYPASS, + .fc = 80.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_BYPASS, + .fc = 2000.00f, + .q = 0.5000f, + .bw = 1.00f, + .gain = 1.50f, + }, + { + .index = 3, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + }, + } + }, +}; diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/extra_i2s.xc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/extra_i2s.xc new file mode 100644 index 0000000..ea318fb --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/extra_i2s.xc @@ -0,0 +1,243 @@ +#if DEBUG_MEMORY_LOG_ENABLED +#define DEBUG_PRINT_ENABLE 1 +#endif +#include +#include +#include +#include +#include +#include "i2s.h" +#include "src.h" +#include "xua.h" +#include "asynchronous_fifo.h" +#include "asrc_timestamp_interpolation.h" +#include "debug_print.h" +#include "xc_ptr.h" + +#if THREE_AUDIO +unsigned g_3d_fps = 2; +#else +unsigned g_3d_fps = 0; +#endif + +/* TODO + - Seperate recording and playback SRC related defines +*/ +#if UAC1 + +#ifndef USE_ASRC +#define USE_ASRC (0)//(0) +#endif + +#define DISABLE_ASRC_HIGHER_THAN_192000 1 + +#ifndef EXTRA_I2S_CHAN_COUNT_IN +#define EXTRA_I2S_CHAN_COUNT_IN (2) +#endif + +#ifndef EXTRA_I2S_CHAN_INDEX_IN +#define EXTRA_I2S_CHAN_INDEX_IN (0)//(0) +#endif + +#ifndef EXTRA_I2S_CHAN_COUNT_OUT +#define EXTRA_I2S_CHAN_COUNT_OUT (0) +#endif + +#ifndef EXTRA_I2S_CHAN_INDEX_OUT +#define EXTRA_I2S_CHAN_INDEX_OUT (0)//(0) +#endif + +#define DATA_BITS (32) + +#define SAMPLE_FREQUENCY (48000) +#define MASTER_CLOCK_FREQUENCY (24576000) + +unsafe chanend uc_i2s; +unsafe chanend uc_br_data; + +/* Note, re-using I2S data lines on MC audio board for LR and Bit clocks */ + +void UserBufferManagementInit(unsigned samFreq) +{ + //debug_printf(" UserBufferManagementInit %d\n", samFreq); +} + +extern void buffer_exchange(chanend c_data, unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[], int num_chan); +void dnr_exchange_buffer(int32_t * unsafe data); +extern unsigned g_dnr_enable; +extern unsigned g_3d_enable; +extern unsigned g_fps_enable; +extern unsigned g_adc_loop; +#if UAC1 +#pragma unsafe arrays + +void unmute_dac(void); + +inline unsigned is_silence(const unsigned samps[], int len) +{ + // -30dB阈值:20*log10(threshold/max_value) = -30 + // threshold = max_value * 10^(-30/20) = max_value * 0.0316 + // 对于32位有符号整数,max_value = 2^31-1 ≈ 0x7FFFFFFF + // threshold ≈ 0x7FFFFFFF * 0.0316 ≈ 0x04000000 + const unsigned int SILENCE_THRESHOLD = 0x10945; // -90db 0x20c49b; // 0x30000; // 0x0246b4e3; -35 // 0x04000000; // 约-30dB + + for (int i = 0; i < len; ++i) { + // 正确的绝对值计算:使用条件运算符 + unsigned int abs_val; + if (samps[i] & 0x80000000) { + // 负数:取反加1 + abs_val = ~samps[i] + 1; + } else { + // 正数:直接使用 + abs_val = samps[i]; + } + + // 检查是否超过静音阈值 + if (abs_val > SILENCE_THRESHOLD) { + //static int count = 0; + //count++; + // if (count % 1000000 == 0) + // debug_printf("abs_val %08x, %08x\n", abs_val, samps[i]); + return 0; // 不是静音 + } + } + return 1; // 是静音 +} + +void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[]) +{ +#if 0 + unsigned dnr_enable = 0; + unsigned adc_loop = 0; + unsigned l_3d_fps = 0; + static int amp_muted = 0; + unsafe + { + GET_SHARED_GLOBAL(dnr_enable, g_dnr_enable); + GET_SHARED_GLOBAL(l_3d_fps, g_3d_fps); + // GET_SHARED_GLOBAL(fps_enable, g_fps_enable); + // GET_SHARED_GLOBAL(three_d_enable, g_3d_enable); + GET_SHARED_GLOBAL(adc_loop, g_adc_loop); + + + if (l_3d_fps == 2) + { + static unsigned mute_count = 0; + static unsigned unmute_count = 0; + static unsigned mute_threshold = 48000; // 静音阈值 + static unsigned unmute_threshold = 4800; // 取消静音阈值,可根据实际调整 + static unsigned unmute_delay = 1000; + + if (is_silence(sampsFromUsbToAudio, 2)) + { + mute_count++; + if (mute_count > unmute_delay) + { + unmute_count = 0; + } + if (mute_count >= mute_threshold) { + amp_muted = 1; +#if 0 + sampsFromUsbToAudio[0] = 0; + sampsFromUsbToAudio[1] = 0; + sampsFromUsbToAudio[2] = 0; + sampsFromUsbToAudio[3] = 0; + sampsFromUsbToAudio[4] = 0; + sampsFromUsbToAudio[5] = 0; + sampsFromUsbToAudio[6] = 0; + sampsFromUsbToAudio[7] = 0; +#endif + // debug_printf("AMP Muted\n"); + } + } + else + { + unmute_count++; + if (unmute_count > unmute_delay) + { + mute_count = 0; + } + if (unmute_count >= unmute_threshold && amp_muted) { + amp_muted = 0; + unmute_dac(); + } + } + + buffer_exchange((chanend) uc_br_data, sampsFromUsbToAudio, sampsFromAudioToUsb, NUM_USB_CHAN_OUT); + } + else + { + + if (sampsFromUsbToAudio[2] != 0) + { + sampsFromUsbToAudio[0] += sampsFromUsbToAudio[2]; + sampsFromUsbToAudio[1] += sampsFromUsbToAudio[2]; + } + + if (l_3d_fps == 1) + { + buffer_exchange((chanend) uc_br_data, sampsFromUsbToAudio, sampsFromAudioToUsb, 2); + } + + } + + if (dnr_enable) + { + dnr_exchange_buffer((int32_t *)&sampsFromAudioToUsb[EXTRA_I2S_CHAN_INDEX_IN]); + } + else + { + sampsFromAudioToUsb[0] = sampsFromAudioToUsb[1]; + } + + if (adc_loop) + { + amp_muted = 0; + unmute_dac(); + sampsFromUsbToAudio[0] = (sampsFromAudioToUsb[1]) + (sampsFromUsbToAudio[0]); + sampsFromUsbToAudio[1] = (sampsFromAudioToUsb[1]) + (sampsFromUsbToAudio[1]); + } + else if (l_3d_fps != 2) + { + + static unsigned mute_count = 0; + static unsigned unmute_count = 0; + static unsigned mute_threshold = 2800; // 静音阈值 + static unsigned unmute_threshold = 4800; // 取消静音阈值,可根据实际调整 + static unsigned unmute_delay = 1000; + + if (is_silence(sampsFromUsbToAudio, 2)) + { + mute_count++; + if (mute_count > unmute_delay) + { + unmute_count = 0; + } + if (mute_count >= mute_threshold) { + amp_muted = 1; + //sampsFromUsbToAudio[0] = 0; + //sampsFromUsbToAudio[1] = 0; + // debug_printf("AMP Muted\n"); + } + } + else + { + unmute_count++; + if (unmute_count > unmute_delay) + { + mute_count = 0; + } + if (unmute_count >= unmute_threshold && amp_muted) { + amp_muted = 0; + unmute_dac(); + } + } + } + + } +#endif +} +#endif + + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/filter_utils.py b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/filter_utils.py new file mode 100644 index 0000000..282b031 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/filter_utils.py @@ -0,0 +1,324 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +滤波器工具类 +包含双二阶滤波器计算器和各种滤波器类型的系数计算函数 +""" + +import math +import numpy as np +from typing import Dict, List, Union + +class BiquadFilterCalculator: + """双二阶滤波器计算器""" + def __init__(self): + self.coefficients = { + 'a0': 0.0, + 'a1': 0.0, + 'a2': 0.0, + 'b1': 0.0, + 'b2': 0.0 + } + + def calculate(self, filter_type: str, Fc: float, Fs: float, Q: float, peak_gain: float, bandwidth: float = None) -> Dict[str, float]: + """ + 计算滤波器系数 + :param filter_type: 滤波器类型 + :param Fc: 截止频率 + :param Fs: 采样率 + :param Q: 品质因数 + :param peak_gain: 峰值增益(dB) + :return: 滤波器系数字典 + """ + V = math.pow(10, abs(peak_gain) / 20) + K = math.tan(math.pi * Fc / Fs) + norm = 0.0 + + filter_type = filter_type.lower() + + if filter_type == "lowpass": + norm = 1 / (1 + K / Q + K * K) + self.coefficients['a0'] = K * K * norm + self.coefficients['a1'] = 2 * self.coefficients['a0'] + self.coefficients['a2'] = self.coefficients['a0'] + self.coefficients['b1'] = 2 * (K * K - 1) * norm + self.coefficients['b2'] = (1 - K / Q + K * K) * norm + + elif filter_type == "highpass": + norm = 1 / (1 + K / Q + K * K) + self.coefficients['a0'] = 1 * norm + self.coefficients['a1'] = -2 * self.coefficients['a0'] + self.coefficients['a2'] = self.coefficients['a0'] + self.coefficients['b1'] = 2 * (K * K - 1) * norm + self.coefficients['b2'] = (1 - K / Q + K * K) * norm + + elif filter_type == "bandpass": + # 使用lib_audio_dsp中biquad.c的算法 + # 使用bandwidth参数,如果没有提供则使用Q作为近似值 + bw = bandwidth if bandwidth is not None else Q + w0 = 2.0 * math.pi * Fc / Fs + sin_w0 = math.sin(w0) + alpha = sin_w0 * math.sinh(math.log(2) / 2.0 * bw * w0 / sin_w0) + + self.coefficients['a0'] = alpha + self.coefficients['a1'] = 0 + self.coefficients['a2'] = -alpha + self.coefficients['b1'] = -2.0 * math.cos(w0) + self.coefficients['b2'] = 1.0 - alpha + + # 归一化 + a0 = 1.0 + alpha + inv_a0 = 1.0 / a0 + self.coefficients['a0'] *= inv_a0 + self.coefficients['a1'] *= inv_a0 + self.coefficients['a2'] *= inv_a0 + self.coefficients['b1'] *= inv_a0 + self.coefficients['b2'] *= inv_a0 + + elif filter_type == "notch": + norm = 1 / (1 + K / Q + K * K) + self.coefficients['a0'] = (1 + K * K) * norm + self.coefficients['a1'] = 2 * (K * K - 1) * norm + self.coefficients['a2'] = self.coefficients['a0'] + self.coefficients['b1'] = self.coefficients['a1'] + self.coefficients['b2'] = (1 - K / Q + K * K) * norm + + elif filter_type == "peak": + if peak_gain >= 0: + norm = 1 / (1 + 1/Q * K + K * K) + self.coefficients['a0'] = (1 + V/Q * K + K * K) * norm + self.coefficients['a1'] = 2 * (K * K - 1) * norm + self.coefficients['a2'] = (1 - V/Q * K + K * K) * norm + self.coefficients['b1'] = self.coefficients['a1'] + self.coefficients['b2'] = (1 - 1/Q * K + K * K) * norm + else: + norm = 1 / (1 + V/Q * K + K * K) + self.coefficients['a0'] = (1 + 1/Q * K + K * K) * norm + self.coefficients['a1'] = 2 * (K * K - 1) * norm + self.coefficients['a2'] = (1 - 1/Q * K + K * K) * norm + self.coefficients['b1'] = self.coefficients['a1'] + self.coefficients['b2'] = (1 - V/Q * K + K * K) * norm + + elif filter_type == "lowshelf": + if peak_gain >= 0: + norm = 1 / (1 + math.sqrt(2) * K + K * K) + self.coefficients['a0'] = (1 + math.sqrt(2*V) * K + V * K * K) * norm + self.coefficients['a1'] = 2 * (V * K * K - 1) * norm + self.coefficients['a2'] = (1 - math.sqrt(2*V) * K + V * K * K) * norm + self.coefficients['b1'] = 2 * (K * K - 1) * norm + self.coefficients['b2'] = (1 - math.sqrt(2) * K + K * K) * norm + else: + norm = 1 / (1 + math.sqrt(2*V) * K + V * K * K) + self.coefficients['a0'] = (1 + math.sqrt(2) * K + K * K) * norm + self.coefficients['a1'] = 2 * (K * K - 1) * norm + self.coefficients['a2'] = (1 - math.sqrt(2) * K + K * K) * norm + self.coefficients['b1'] = 2 * (V * K * K - 1) * norm + self.coefficients['b2'] = (1 - math.sqrt(2*V) * K + V * K * K) * norm + + elif filter_type == "highshelf": + if peak_gain >= 0: + norm = 1 / (1 + math.sqrt(2) * K + K * K) + self.coefficients['a0'] = (V + math.sqrt(2*V) * K + K * K) * norm + self.coefficients['a1'] = 2 * (K * K - V) * norm + self.coefficients['a2'] = (V - math.sqrt(2*V) * K + K * K) * norm + self.coefficients['b1'] = 2 * (K * K - 1) * norm + self.coefficients['b2'] = (1 - math.sqrt(2) * K + K * K) * norm + else: + norm = 1 / (V + math.sqrt(2*V) * K + K * K) + self.coefficients['a0'] = (1 + math.sqrt(2) * K + K * K) * norm + self.coefficients['a1'] = 2 * (K * K - 1) * norm + self.coefficients['a2'] = (1 - math.sqrt(2) * K + K * K) * norm + self.coefficients['b1'] = 2 * (K * K - V) * norm + self.coefficients['b2'] = (V - math.sqrt(2*V) * K + K * K) * norm + + else: + raise ValueError("不支持的滤波器类型") + + return self.coefficients + +def _check_filter_freq(filter_freq: float, fs: int) -> float: + """检查滤波器频率是否有效""" + if filter_freq >= fs / 2: + raise ValueError(f"滤波器频率 ({filter_freq} Hz) 必须小于采样率的一半 ({fs/2} Hz)") + return filter_freq + +def make_biquad_bypass(fs: int) -> List[float]: + """创建旁路滤波器系数""" + return [1.0, 0.0, 0.0, 0.0, 0.0] + +def make_biquad_lowpass(fs: int, filter_freq: float, q_factor: float) -> List[float]: + """创建低通滤波器系数""" + filter_freq = _check_filter_freq(filter_freq, fs) + K = math.tan(math.pi * filter_freq / fs) + norm = 1 / (1 + K / q_factor + K * K) + + b0 = K * K * norm + b1 = 2 * b0 + b2 = b0 + a1 = 2 * (K * K - 1) * norm + a2 = (1 - K / q_factor + K * K) * norm + + return [b0, b1, b2, -a1, -a2] + +def make_biquad_highpass(fs: int, filter_freq: float, q_factor: float) -> List[float]: + """创建高通滤波器系数""" + filter_freq = _check_filter_freq(filter_freq, fs) + K = math.tan(math.pi * filter_freq / fs) + norm = 1 / (1 + K / q_factor + K * K) + + b0 = norm + b1 = -2 * b0 + b2 = b0 + a1 = 2 * (K * K - 1) * norm + a2 = (1 - K / q_factor + K * K) * norm + + return [b0, b1, b2, -a1, -a2] + +def make_biquad_bandpass(fs: int, filter_freq: float, bandwidth: float) -> List[float]: + """创建带通滤波器系数""" + filter_freq = _check_filter_freq(filter_freq, fs) + w0 = 2.0 * math.pi * filter_freq / fs + alpha = math.sin(w0) * math.sinh(math.log(2) / 2 * bandwidth * w0 / math.sin(w0)) + + b0 = alpha + b1 = 0.0 + b2 = -alpha + a0 = 1.0 + alpha + a1 = -2.0 * math.cos(w0) + a2 = 1.0 - alpha + + return [b0/a0, b1/a0, b2/a0, -a1/a0, -a2/a0] + +def make_biquad_bandstop(fs: int, filter_freq: float, bandwidth: float) -> List[float]: + """创建带阻滤波器系数 - 使用lib_audio_dsp中biquad.c的算法""" + filter_freq = _check_filter_freq(filter_freq, fs) + w0 = 2.0 * math.pi * filter_freq / fs + sin_w0 = math.sin(w0) + alpha = sin_w0 * math.sinh(math.log(2) / 2.0 * bandwidth * w0 / sin_w0) + + b0 = 1.0 + b1 = -2.0 * math.cos(w0) + b2 = 1.0 + a0 = 1.0 + alpha + a1 = b1 # 与lib_audio_dsp一致 + a2 = 1.0 - alpha + + return [b0/a0, b1/a0, b2/a0, -a1/a0, -a2/a0] + +def make_biquad_notch(fs: int, filter_freq: float, q_factor: float) -> List[float]: + """创建陷波滤波器系数""" + filter_freq = _check_filter_freq(filter_freq, fs) + K = math.tan(math.pi * filter_freq / fs) + norm = 1 / (1 + K / q_factor + K * K) + + b0 = (1 + K * K) * norm + b1 = 2 * (K * K - 1) * norm + b2 = b0 + a1 = b1 + a2 = (1 - K / q_factor + K * K) * norm + + return [b0, b1, b2, -a1, -a2] + +def make_biquad_allpass(fs: int, filter_freq: float, q_factor: float) -> List[float]: + """创建全通滤波器系数""" + filter_freq = _check_filter_freq(filter_freq, fs) + K = math.tan(math.pi * filter_freq / fs) + norm = 1 / (1 + K / q_factor + K * K) + + b0 = (1 - K / q_factor + K * K) * norm + b1 = 2 * (K * K - 1) * norm + b2 = 1.0 + a1 = b1 + a2 = b0 + + return [b0, b1, b2, -a1, -a2] + +def make_biquad_peaking(fs: int, filter_freq: float, q_factor: float, boost_db: float) -> List[float]: + """创建峰值滤波器系数""" + filter_freq = _check_filter_freq(filter_freq, fs) + A = math.sqrt(10 ** (boost_db / 20)) + w0 = 2.0 * math.pi * filter_freq / fs + alpha = math.sin(w0) / (2.0 * q_factor) + + b0 = 1.0 + alpha * A + b1 = -2.0 * math.cos(w0) + b2 = 1.0 - alpha * A + a0 = 1.0 + alpha / A + a1 = -2.0 * math.cos(w0) + a2 = 1.0 - alpha / A + + return [b0/a0, b1/a0, b2/a0, -a1/a0, -a2/a0] + +def make_biquad_constant_q(fs: int, filter_freq: float, q_factor: float, boost_db: float) -> List[float]: + """创建恒定Q值滤波器系数""" + filter_freq = _check_filter_freq(filter_freq, fs) + V = 10 ** (boost_db / 20) + w0 = 2.0 * math.pi * filter_freq / fs + K = math.tan(w0 / 2) + + if boost_db > 0: + b0 = 1 + V * K / q_factor + K**2 + b1 = 2 * (K**2 - 1) + b2 = 1 - V * K / q_factor + K**2 + a0 = 1 + K / q_factor + K**2 + a1 = 2 * (K**2 - 1) + a2 = 1 - K / q_factor + K**2 + else: + V = 1 / V + b0 = 1 + K / q_factor + K**2 + b1 = 2 * (K**2 - 1) + b2 = 1 - K / q_factor + K**2 + a0 = 1 + V * K / q_factor + K**2 + a1 = 2 * (K**2 - 1) + a2 = 1 - V * K / q_factor + K**2 + + return [b0/a0, b1/a0, b2/a0, -a1/a0, -a2/a0] + +def make_biquad_lowshelf(fs: int, filter_freq: float, q_factor: float, boost_db: float) -> List[float]: + """创建低架滤波器系数""" + filter_freq = _check_filter_freq(filter_freq, fs) + A = math.pow(10, boost_db / 40) + w0 = 2.0 * math.pi * filter_freq / fs + alpha = math.sin(w0) / 2 * math.sqrt((A + 1/A) * (1/q_factor - 1) + 2) + + if boost_db >= 0: + b0 = A * ((A+1) + (A-1)*math.cos(w0) + 2*math.sqrt(A)*alpha) + b1 = -2*A * ((A-1) + (A+1)*math.cos(w0)) + b2 = A * ((A+1) + (A-1)*math.cos(w0) - 2*math.sqrt(A)*alpha) + a0 = (A+1) - (A-1)*math.cos(w0) + 2*math.sqrt(A)*alpha + a1 = 2*((A-1) - (A+1)*math.cos(w0)) + a2 = (A+1) - (A-1)*math.cos(w0) - 2*math.sqrt(A)*alpha + else: + b0 = (A+1) - (A-1)*math.cos(w0) + 2*math.sqrt(A)*alpha + b1 = 2*((A-1) - (A+1)*math.cos(w0)) + b2 = (A+1) - (A-1)*math.cos(w0) - 2*math.sqrt(A)*alpha + a0 = A*((A+1) + (A-1)*math.cos(w0) + 2*math.sqrt(A)*alpha) + a1 = -2*A*((A-1) + (A+1)*math.cos(w0)) + a2 = A*((A+1) + (A-1)*math.cos(w0) - 2*math.sqrt(A)*alpha) + + return [b0/a0, b1/a0, b2/a0, -a1/a0, -a2/a0] + +def make_biquad_highshelf(fs: int, filter_freq: float, q_factor: float, boost_db: float) -> List[float]: + """创建高架滤波器系数""" + filter_freq = _check_filter_freq(filter_freq, fs) + A = math.pow(10, boost_db / 40) # 将dB转换为线性增益 + w0 = 2.0 * math.pi * filter_freq / fs # 归一化角频率 + alpha = math.sin(w0) / 2 * math.sqrt((A + 1/A) * (1/q_factor - 1) + 2) + + if boost_db >= 0: # 增益提升 + b0 = A*((A+1) + (A-1)*math.cos(w0) + 2*math.sqrt(A)*alpha) + b1 = -2*A*((A-1) + (A+1)*math.cos(w0)) + b2 = A*((A+1) + (A-1)*math.cos(w0) - 2*math.sqrt(A)*alpha) + a0 = (A+1) - (A-1)*math.cos(w0) + 2*math.sqrt(A)*alpha + a1 = 2*((A-1) - (A+1)*math.cos(w0)) + a2 = (A+1) - (A-1)*math.cos(w0) - 2*math.sqrt(A)*alpha + else: # 增益衰减 + b0 = (A+1) - (A-1)*math.cos(w0) + 2*math.sqrt(A)*alpha + b1 = 2*((A-1) - (A+1)*math.cos(w0)) + b2 = (A+1) - (A-1)*math.cos(w0) - 2*math.sqrt(A)*alpha + a0 = A*((A+1) + (A-1)*math.cos(w0) + 2*math.sqrt(A)*alpha) + a1 = -2*A*((A-1) + (A+1)*math.cos(w0)) + a2 = A*((A+1) + (A-1)*math.cos(w0) - 2*math.sqrt(A)*alpha) + + return coeffs \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/firmware_upgrade_hid_protocol.md b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/firmware_upgrade_hid_protocol.md new file mode 100644 index 0000000..c7b3a90 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/firmware_upgrade_hid_protocol.md @@ -0,0 +1,499 @@ +# HID固件升级协议详细文档 + +## 1. 协议概述 + +本文档定义了通过HID (Human Interface Device) 协议进行固件升级的完整协议规范。该协议基于现有的EQ HID通信协议扩展,提供高效、稳定、安全的固件升级功能。 + +### 1.1 设计原则 + +- **高效**: 充分利用64字节HID数据包 +- **稳定**: 包含Checksum校验、块序号验证、状态确认机制 +- **安全**: 支持升级前验证、升级中校验、升级后验证 +- **可靠**: 支持断点续传、错误恢复、重试机制 + +### 1.2 协议特性 + +- **数据包大小**: 64字节 (1字节Report ID + 63字节数据) +- **同步头**: 0x77 (与EQ协议保持一致) +- **字节序**: 小端序 (Little Endian) +- **最大数据块**: 57字节 (固定值,63字节 - 5字节头部 - 1字节Checksum) +- **Flash页大小**: 256字节 + +--- + +## 2. 固件升级命令列表 + +| 指令码 | 命令名称 | 功能 | 方向 | 描述 | +|--------|----------|------|------|------| +| 0xA7 | FIRMWARE_UPGRADE_START | 开始固件升级 | 主机→设备 | 初始化升级流程,设置固件大小 | +| 0xA8 | FIRMWARE_UPGRADE_DATA | 传输固件数据块 | 主机→设备 | 传输固件数据块(固定57字节) | +| 0xA9 | FIRMWARE_UPGRADE_END | 结束固件升级 | 主机→设备 | 完成升级,验证镜像 | +| 0xAA | FIRMWARE_UPGRADE_STATUS | 获取升级状态 | 主机→设备 | 查询当前升级状态和进度 | +| 0xAB | FIRMWARE_UPGRADE_ABORT | 中止固件升级 | 主机→设备 | 中止当前升级流程 | +| 0xAC | FIRMWARE_UPGRADE_ERASE | 擦除现有升级镜像 | 主机→设备 | 擦除Flash中的upgrade image | +| 0xAE | DEVICE_REBOOT | 设备重启 | 主机→设备 | 重启设备(通用命令,不仅限于固件升级) | + +--- + +## 3. 详细命令说明 + +### 3.1 0xA7 - FIRMWARE_UPGRADE_START (开始固件升级) + +**功能**: 初始化固件升级流程,设置固件大小,执行强制升级(自动擦除现有upgrade image) + +**方向**: 主机→设备 + +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头 +1 | 1 | 0xA7 | 命令码 +2-5 | 4 | uint32 | 固件大小(字节,小端序,页对齐后的大小) +6-62 | 57 | 0x00 | 保留字节 +``` + +**设备端处理**: +1. 验证固件大小是否在允许范围内 +2. 检查Flash空间是否足够 +3. 初始化升级状态机 +4. 准备Flash写入缓冲区 + +**响应方式**: 设备主动上报(通过HID中断端点) + +**响应数据包格式**(存储在g_hid_pass_data,通过hidSetChangePending触发上报): +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头 +1 | 1 | 0xA7 | 命令码 +2 | 1 | uint8 | 状态码(0x00=成功,0x01=失败,0x02=空间不足,0x03=大小无效) +3-6 | 4 | uint32 | 实际分配的Flash大小(字节,页对齐) +7-8 | 2 | uint16 | 总块数(小端序) +9-62 | 54 | 0x00 | 保留字节 +``` + +**总块数计算公式**: +``` +总块数 = ⌈(页对齐后的固件大小) / MAX_DATA_BLOCK_SIZE⌉ +其中: +- MAX_DATA_BLOCK_SIZE = 57字节(固定值) +- 页对齐后的固件大小 = ⌈原始固件大小 / 256⌉ × 256 +- ⌈x⌉ 表示向上取整(ceiling函数) +``` + +**示例**: +- 如果固件大小为794624字节,页对齐后仍为794624字节 +- 总块数 = ⌈794624 / 57⌉ = ⌈13940.7⌉ = 13941块 + +**状态码说明**: +- `0x00`: 成功,可以开始传输数据 +- `0x01`: 失败,升级初始化失败 +- `0x02`: Flash空间不足 +- `0x03`: 固件大小无效(超出范围或未页对齐) + +--- + +### 3.2 0xA8 - FIRMWARE_UPGRADE_DATA (传输固件数据块) + +**功能**: 传输固件数据块,支持分块传输 + +**方向**: 主机→设备 + +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头 +1 | 1 | 0xA8 | 命令码 +2-3 | 2 | uint16 | 块序号(小端序,从0开始) +4 | 1 | uint8 | 数据长度(固定为57字节) +5-61 | 57 | uint8[57] | 固件数据(固定57字节) +62 | 1 | uint8 | Checksum校验(对同步头+命令码+块序号+数据长度+数据) +``` + +**重要说明**: +- **数据长度固定为57字节**(不包括Checksum) +- 数据包总长度:同步头(1) + 命令码(1) + 块序号(2) + 数据长度(1) + 数据(57) + Checksum(1) = 63字节(不包括Report ID) +- 如果最后一个数据块不足57字节,用0填充 + +**Checksum计算范围**: 同步头(0x77) + 命令码(0xA8) + 块序号(2字节) + 数据长度(1字节) + 数据(57字节) + +**设备端处理**: +1. 验证块序号是否连续(允许重传) +2. 验证数据长度是否为57字节 +3. 验证Checksum校验 +4. 将数据写入Flash缓冲区 +5. 当缓冲区满256字节(一页)时,写入Flash +6. 更新升级进度 +7. HID主动上报响应 + +**响应方式**: 设备主动上报(通过HID中断端点) + +**响应数据包格式**(存储在g_hid_pass_data,通过hidSetChangePending触发上报): +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头 +1 | 1 | 0xA8 | 命令码 +2 | 1 | uint8 | 状态码(0x00=成功,0x01=失败,0x02=块序号错误,0x03=Checksum错误,0x04=数据长度错误) +3-4 | 2 | uint16 | 已确认的块序号(小端序) +5-62 | 58 | 0x00 | 保留字节 +``` + +**状态码说明**: +- `0x00`: 成功,数据已接收并写入缓冲区 +- `0x01`: 失败,写入Flash失败 +- `0x02`: 块序号错误(不连续或超出范围) +- `0x03`: Checksum校验失败 + +--- + +### 3.3 0xA9 - FIRMWARE_UPGRADE_END (结束固件升级) + +**功能**: 完成固件升级,验证镜像完整性 + +**方向**: 主机→设备 + +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头 +1 | 1 | 0xA9 | 命令码 +2-5 | 4 | uint32 | 固件总大小(字节,用于验证) +6-10 | 5 | uint8[5] | 固件校验和 +11-62 | 52 | 0x00 | 保留字节 +``` + +**设备端处理**: +1. 检查是否所有数据块都已接收 +2. 填充最后一页(如果不足256字节,用0填充) +3. 更新升级状态 + +**响应方式**: 设备主动上报(通过HID中断端点) + +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头 +1 | 1 | 0xA9 | 命令码 +2 | 1 | uint8 | 状态码(0x00=成功,0x01=失败,0x02=数据不完整,0x03=镜像验证失败) +3-4 | 2 | uint16 | 已写入的总块数 +5-6 | 2 | uint16 | 已写入的总页数 +7-62 | 56 | 0x00 | 保留字节 +``` + +**状态码说明**: +- `0x00`: 成功,镜像已写入并验证通过 +- `0x01`: 失败,写入或验证过程出错 +- `0x02`: 数据不完整,缺少数据块 +- `0x03`: 镜像验证失败,镜像损坏 + +**注意**: 升级完成后,设备不会自动重启,需要主机发送REBOOT命令。 + +--- + +### 3.4 0xAA - FIRMWARE_UPGRADE_STATUS (获取升级状态) + +**功能**: 查询当前升级状态和进度 + +**方向**: 主机→设备 + +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头 +1 | 1 | 0xAA | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**响应方式**: 设备主动上报(通过HID中断端点) + +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头 +1 | 1 | 0xAA | 命令码 +2 | 1 | uint8 | 升级状态(0x00=空闲,0x01=准备中,0x02=传输中,0x03=完成,0x04=错误,0x05=已中止) +3-4 | 2 | uint16 | 已接收的块数 +5-6 | 2 | uint16 | 总块数 +7-8 | 2 | uint16 | 已写入的页数 +9-10 | 2 | uint16 | 总页数 +11-14 | 4 | uint32 | 已传输的字节数 +15-18 | 4 | uint32 | 总字节数 +19 | 1 | uint8 | 错误码(如果状态为错误) +20-62 | 43 | 0x00 | 保留字节 +``` + +**升级状态说明**: +- `0x00`: 空闲,未开始升级 +- `0x01`: 准备中,已调用START,等待数据传输 +- `0x02`: 传输中,正在接收和写入数据 +- `0x03`: 完成,升级成功完成 +- `0x04`: 错误,升级过程中出现错误 +- `0x05`: 已中止,升级被用户中止 + +--- + +### 3.5 0xAB - FIRMWARE_UPGRADE_ABORT (中止固件升级) + +**功能**: 中止当前升级流程,清理资源 + +**方向**: 主机→设备 + +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头 +1 | 1 | 0xAB | 命令码 +2 | 1 | uint8 | 清理标志(0x00=保留已写入数据,0x01=擦除已写入数据) +3-62 | 60 | 0x00 | 保留字节 +``` + +**设备端处理**: +1. 停止接收数据 +2. 根据清理标志决定是否擦除已写入的数据 +3. 清理升级状态 +4. 释放Flash缓冲区 + +**响应方式**: 设备主动上报(通过HID中断端点) + +**响应数据包格式**(存储在g_hid_pass_data,通过hidSetChangePending触发上报): +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头 +1 | 1 | 0xAB | 命令码 +2 | 1 | uint8 | 状态码(0x00=成功,0x01=失败) +3-62 | 60 | 0x00 | 保留字节 +``` + +--- + +### 3.6 0xAC - FIRMWARE_UPGRADE_ERASE (擦除现有升级镜像) + +**功能**: 擦除Flash中的现有upgrade image + +**方向**: 主机→设备 + +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头 +1 | 1 | 0xAC | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**设备端处理**: +1. 调用 `flash_cmd_erase_all()` 擦除所有upgrade image +2. 验证擦除结果 + +**响应方式**: 设备主动上报(通过HID中断端点) + +**响应数据包格式**(存储在g_hid_pass_data,通过hidSetChangePending触发上报): +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头 +1 | 1 | 0xAC | 命令码 +2 | 1 | uint8 | 状态码(0x00=成功,0x01=失败) +3-62 | 60 | 0x00 | 保留字节 +``` + +--- + +### 3.7 0xAE - DEVICE_REBOOT (设备重启) + +**功能**: 重启设备(通用命令,不仅限于固件升级) + +**方向**: 主机→设备 + +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头 +1 | 1 | 0xAE | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**设备端处理**: +1. 调用 `device_reboot()` 重启设备 +2. 设备会立即重启,不检查任何状态 + +**响应方式**: 无响应(设备收到命令后立即重启) + +**注意事项**: +- ⚠️ **设备收到命令后立即重启** +- ⚠️ **主机不应等待响应** +- ⚠️ **这是通用重启命令,可用于任何需要重启设备的场景** + +--- + +## 4. 升级流程状态机 + +### 4.1 状态定义 + +``` +状态值 | 状态名称 | 说明 +-------|----------|------ +0x00 | IDLE | 空闲状态,未开始升级 +0x01 | PREPARING | 准备状态,已调用START +0x02 | TRANSFERRING | 传输状态,正在接收数据 +0x03 | COMPLETING | 完成中,正在写入最后一页 +0x04 | COMPLETED | 已完成,升级成功 +0x05 | ERROR | 错误状态,升级失败 +0x06 | ABORTED | 已中止,升级被中止 +``` + +### 4.2 状态转换图 + +``` +IDLE + ↓ (START) +PREPARING + ↓ (DATA传输) +TRANSFERRING + ↓ (END) +COMPLETING + ↓ (验证成功) +COMPLETED + ↓ (重置) +IDLE + +任何状态 + ↓ (ABORT) +ABORTED + ↓ (重置) +IDLE + +任何状态 + ↓ (错误) +ERROR + ↓ (重置) +IDLE +``` + +--- + +## 5. 完整升级流程 + +### 5.1 标准升级流程 + +``` +1. ERASE (可选,擦除现有镜像) + ↓ +2. START (设置固件大小和版本) + ↓ +3. 循环 DATA (传输数据块) + ├─ 发送数据块 + ├─ 接收确认 + ├─ 验证块序号 + └─ 更新进度 + ↓ +4. END (完成升级,验证镜像) + ↓ +5. 升级完成,设备重启后加载新镜像 +``` + +### 5.2 错误恢复流程 + +``` +检测到错误 + ↓ +查询 STATUS (获取错误信息) + ↓ +根据错误类型处理: + ├─ 块序号错误 → 重传丢失的块 + ├─ CRC错误 → 重传当前块 + ├─ Flash写入错误 → ABORT后重新开始 + └─ 其他错误 → ABORT后重新开始 +``` + +--- + +## 6. 数据完整性保证 + +### 6.1 Checksum校验 + +**Checksum算法** (用于数据块,参考user_func.c实现): +```c +unsigned char check_sum(unsigned char *pbuf, unsigned len) +{ + unsigned char i; + unsigned short sum; + sum = 0; + for(i = 0; i < len; i++) + { + sum += pbuf[i]; + } + i = sum % 256; + return i; +} +``` + +**校验范围**: 同步头(0x77) + 命令码(0xA8) + 块序号(2字节) + 数据长度(1字节) + 数据(N字节) + +**特点**: +- 简单高效,计算速度快 +- 累加所有字节,取模256 +- 适合HID协议的小数据包传输 + +### 6.2 块序号验证 + +- 块序号从0开始,连续递增 +- 设备验证块序号是否连续 +- 支持重传(如果块序号不匹配,设备返回期望的块序号) + +### 6.3 镜像验证 + +- Flash镜像写入完成后,设备自动验证镜像完整性(Flash库内部CRC) +- 验证镜像版本号(必须高于当前版本) +- 验证镜像大小 + +--- + +## 7. 性能优化 + +### 7.1 数据块大小 + +- **最大数据块**: 57字节(固定值) +- **Flash页大小**: 256字节 +- **每页数据块数**: ⌈256 / 57⌉ = ⌈4.49⌉ = 5块/页 +- **实际**: 每页需要5个完整块(5×57=285字节,但只写入256字节,最后一页可能不足) + +### 7.2 缓冲区管理 + +- 设备维护256字节页缓冲区 +- 当缓冲区满时,立即写入Flash +- 减少Flash写入次数,提高效率 + +### 7.3 进度报告 + +- 每个数据块传输后返回进度信息 +- 主机可以根据进度显示升级百分比 +- 支持断点续传(通过STATUS查询) + +--- + +## 9. 注意事项 + +1. **页对齐**: 固件大小必须向上取整到256字节 +2. **块序号**: 必须从0开始,连续递增 +3. **Checksum校验**: 每个数据块都必须包含有效的Checksum +4. **状态管理**: 必须按照正确的状态顺序执行命令 +5. **错误处理**: 遇到错误时应该查询STATUS获取详细信息 +6. **资源清理**: 升级失败或中止时应该调用ABORT清理资源 +7. **主动上报**: 所有响应通过主动上报,主机需要监听HID中断端点 +8. **设备重启**: 升级完成后必须调用REBOOT命令重启设备 + +--- + +**文档版本**: 1.0 +**创建日期**: 2026-01- 31 +**基于**: EQ HID协议、USB DFU协议、UART DFU协议 +**适用**: XMOS xCORE设备,HID固件升级 diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_wrapper.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_wrapper.c new file mode 100644 index 0000000..93928ed --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_wrapper.c @@ -0,0 +1,147 @@ +// Copyright 2024 XMOS LIMITED. +// This Software is subject to the terms of the XMOS Public Licence: Version 1. +#include +#include +#include +#include +#include +#include +#include +#include "xc_ptr.h" + +#include "xua_conf.h" + +extern void fps_xmos_init(); +extern void fps_xmos_process(int16_t * input, int16_t* output, int channel); + + + +#define FPS_SLOT_NUM 3 +#define FPS_FRAME_SIZE 512 +#define FPS_NUM_OUT 2 +short __attribute__((aligned (4))) dsp_fps_input_buf[FPS_SLOT_NUM][2][FPS_FRAME_SIZE]; +short __attribute__((aligned (4))) dsp_fps_out_buf[FPS_SLOT_NUM][2][FPS_FRAME_SIZE]; + +unsigned fps1_buf_ready = 0; +unsigned fps2_buf_ready = 0; +unsigned fps_write_pos = 0; +unsigned fps_process_pos = 0; + + +void fps_main (chanend_t c_data ) { + + int input[2]; + int output[2]; + int count = 0; + unsigned write_pos = 0; + unsigned process_pos = 0; + unsigned read_pos = 0; + + while (1) { + + chan_in_buf_word (c_data , input, 2) ; + chan_out_buf_word (c_data , output, 2); + if (count == 0) + read_pos = (write_pos + 1 + FPS_SLOT_NUM) % FPS_SLOT_NUM; + + // 修改原因: 写入当前buffer,读取前一个已处理完的buffer,实现1帧延时 + // 写入位置:write_pos(当前正在填充的buffer) + for (int i = 0; i <2; i++) + { + dsp_fps_input_buf[write_pos][i][count] = (short)(input[i] >> 16); + } + + // 读取位置:read_pos(前一个已经DSP处理完成的buffer) + // 这样可以实现最小延时(1帧),避免原来的3帧延时问题 + for (int i = 0; i < 2; i++) + { + output[i] = (int)(dsp_fps_out_buf[read_pos][i][count]) << 16; + } + + if (count != (FPS_FRAME_SIZE - 1)) + { + count ++; + } + else + { + // 一帧完成,进行缓冲区切换 + count = 0; + + // 修改原因: 实现1帧延时的三缓冲机制 + // 步骤1: 将当前完成的写入buffer交给DSP处理任务 + SET_SHARED_GLOBAL(fps_process_pos, write_pos); + + // 步骤2: 切换到下一个buffer进行写入(三缓冲循环:0→1→2→0) + write_pos = (write_pos + 1) % FPS_SLOT_NUM; + SET_SHARED_GLOBAL(fps_write_pos, write_pos); + + SET_SHARED_GLOBAL(fps1_buf_ready, 1); + SET_SHARED_GLOBAL(fps2_buf_ready, 1); + } + } +} + +unsigned long get_reference_time(); +void fps1_dsp_proc_task() +{ + fps_xmos_init(); +#if 1 + while (1) + { + unsigned ready1; + // 修改原因: 使用声道0独立的ready标志,与声道1完全独立,避免竞态 + GET_SHARED_GLOBAL(ready1, fps1_buf_ready); + while (ready1) + { + // 修改原因: 关键修复 - 直接读取fps_main设置好的process_pos,避免自己计算导致的竞态 + unsigned cur_pos; + GET_SHARED_GLOBAL(cur_pos, fps_process_pos); + +#if 0 + for (int i = 0; i < FPS_FRAME_SIZE; i++) + { + dsp_fps_out_buf[cur_pos][0][i] = dsp_fps_input_buf[cur_pos][0][i]; + } +#else + // 处理声道0数据 + fps_xmos_process(&dsp_fps_input_buf[cur_pos][0], &dsp_fps_out_buf[cur_pos][0], 0); +#endif + + ready1 = 0; + SET_SHARED_GLOBAL(fps1_buf_ready, 0); + } + } +#endif +} + +void fps2_dsp_proc_task() +{ +#if 1 + while (1) + { + unsigned ready2; + GET_SHARED_GLOBAL(ready2, fps2_buf_ready); + while (ready2) + { + unsigned cur_pos; + GET_SHARED_GLOBAL(cur_pos, fps_process_pos); + + // 处理声道1数据 + unsigned long start_time = get_reference_time(); +#if 0 + for (int i = 0; i < FPS_FRAME_SIZE; i++) + { + dsp_fps_out_buf[cur_pos][1][i] = dsp_fps_input_buf[cur_pos][1][i]; + } +#else + fps_xmos_process(&dsp_fps_input_buf[cur_pos][1], &dsp_fps_out_buf[cur_pos][1], 1); +#endif + unsigned long end_time = get_reference_time(); + // printf("fps2_dsp_proc_task time: %d ms\n", end_time - start_time); + // 修改原因: 只清除自己的ready标志,不影响声道0 + ready2 = 0; + SET_SHARED_GLOBAL(fps2_buf_ready, 0); + } + } +#endif +} \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/gpio_access.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/gpio_access.c new file mode 100644 index 0000000..573152e --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/gpio_access.c @@ -0,0 +1,50 @@ +#include "gpio_access.h" +#include "swlock.h" +#include + +swlock_t gpo_swlock = SWLOCK_INITIAL_VALUE; + +void p_gpio_lock() +{ + swlock_acquire(&gpo_swlock); +} + +void p_gpio_unlock() +{ + swlock_release(&gpo_swlock); +} + +unsigned p_gpio_peek() +{ + unsigned portId, x; + + // Wrapped in lock to ensure it's safe from multiple logical cores + swlock_acquire(&gpo_swlock); + + asm("ldw %0, dp[p_gpio]":"=r"(portId)); + asm volatile("peek %0, res[%1]":"=r"(x):"r"(portId)); + + return x; +} + +void p_gpio_out(unsigned x) +{ + unsigned portId; + + asm("ldw %0, dp[p_gpio]":"=r"(portId)); + asm volatile("out res[%0], %1"::"r"(portId),"r"(x)); + + // Wrapped in lock to ensure it's safe from multiple logical cores + swlock_release(&gpo_swlock); +} + +void set_gpio(unsigned bit, unsigned value) +{ + unsigned port_shadow; + port_shadow = p_gpio_peek(); // Read port pin value + if (value == 0) port_shadow &= ~bit; // If writing a 0, generate mask and AND with current val + else port_shadow |= bit; // Else use mask and OR to set bit + p_gpio_out(port_shadow); // Write back to port. Will make port an output if not already +} + + diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/gpio_access.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/gpio_access.h new file mode 100644 index 0000000..59f9ae1 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/gpio_access.h @@ -0,0 +1,17 @@ +#ifndef _GPIO_ACCESS_H_ +#define _GPIO_ACCESS_H_ + +/* General output port bit definitions */ +#define P_GPIO_DAC_RST_N (1 << 1) +#define P_GPIO_MUTE (1 << 3) +#define P_GPIO_SET (1 << 2) +#define MUTE (0) +#define UNMUTE (1) + +void set_gpio(unsigned bit, unsigned value); +void p_gpio_lock(); +void p_gpio_unlock(); +unsigned p_gpio_peek(); +void p_gpio_out(unsigned x); + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/hid_report_descriptor.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/hid_report_descriptor.h new file mode 100644 index 0000000..9fecca2 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/hid_report_descriptor.h @@ -0,0 +1,300 @@ +// Copyright 2021 XMOS LIMITED. +// This Software is subject to the terms of the XCORE VocalFusion Licence. + +#ifndef __hid_report_descriptor_h__ +#define __hid_report_descriptor_h__ + +#include "xua_hid_report.h" + +#if 0 +/* Existing static report descriptor kept for reference */ +#ifdef HID_CONTROLS +unsigned char hidReportDescriptor[] = +{ + 0x05, 0x0c, /* Usage Page (Consumer Device) */ + 0x09, 0x01, /* Usage (Consumer Control) */ + 0xa1, 0x01, /* Collection (Application) */ +#ifdef DFU_CONTROL_USB_HID + 0x85, 0x01, // HID_BUTTON_REPORT_ID // TODO: report ID uses the global definition +#endif + 0x15, 0x00, /* Logical Minimum (0) */ + 0x25, 0x01, /* Logical Maximum (1) */ + 0x09, 0xb0, /* Usage (Play) */ + 0x09, 0xb5, /* Usage (Scan Next Track) */ + 0x09, 0xb6, /* Usage (Scan Previous Track) */ + 0x09, 0xe9, /* Usage (Volume Up) */ + 0x09, 0xea, /* Usage (Volume Down) */ + 0x09, 0xe2, /* Usage (Mute) */ + 0x75, 0x01, /* Report Size (1) */ + 0x95, 0x06, /* Report Count (6) */ + 0x81, 0x02, /* Input (Data, Var, Abs) */ + 0x95, 0x02, /* Report Count (2) */ + 0x81, 0x01, /* Input (Cnst, Ary, Abs) */ + 0xc0 /* End collection */ + +#ifdef DFU_CONTROL_USB_HID + ,0x06, 0x82, 0xff, + 0x09, 0x01, + 0xa1, 0x01, + 0x09, 0x03, + 0x85, 0x41, // HID_DFU_REPORT_ID // TODO: report ID uses the global definition + 0x15, 0x00, + 0x26, 0xff, 0x00, + 0x75, 0x08, + 0x95, 0x3f, + 0x81, 0x02, + 0x09, 0x04, + 0x15, 0x00, + 0x26, 0xff, 0x00, + 0x75, 0x08, + 0x95, 0x3f, + 0x91, 0x02, + 0xc0 +#if 0 +Usage Page (Vendor-Defined 131) 06 82 FF +Usage (Vendor-Defined 1) 09 01 +Collection (Application) A1 01 + Usage (Vendor-Defined 3) 09 03 + Report ID (65) 85 41 + Logical Minimum (0) 15 00 + Logical Maximum (255) 26 FF 00 + Report Size (8) 75 08 + Report Count (63) 95 3F + Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02 + Usage (Vendor-Defined 4) 09 04 + Logical Minimum (0) 15 00 + Logical Maximum (255) 26 FF 00 + Report Size (8) 75 08 + Report Count (63) 95 3F + Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02 +End Collection C0 +#endif +#endif +}; +#endif +#endif + +/* + * Define non-configurable items in the HID Report descriptor. + */ +static const USB_HID_Short_Item_t hidCollectionApplication = { + .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_COLLECTION), + .data = { 0x01, 0x00 } }; +static const USB_HID_Short_Item_t hidCollectionApplication2 = { + .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_COLLECTION), + .data = { 0x02, 0x00 } }; + +static const USB_HID_Short_Item_t hidCollectionEnd = { + .header = HID_REPORT_SET_HEADER(0, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_END_COLLECTION), + .data = { 0x00, 0x00 } }; + +static const USB_HID_Short_Item_t hidInputConstArray = { + .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_INPUT), + .data = { 0x01, 0x00 } }; +static const USB_HID_Short_Item_t hidInputDataVar = { + .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_INPUT), + .data = { 0x02, 0x00 } }; + +static const USB_HID_Short_Item_t hidInputFeatureVar = { + .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_MAIN, HID_REPORT_ITEM_TAG_FEATURE), + .data = { 0x01, 0x00 } }; + +static const USB_HID_Short_Item_t hidLogicalMaximum0 = { + .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM), + .data = { 0x00, 0x00 } }; +static const USB_HID_Short_Item_t hidLogicalMaximum1 = { + .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MAXIMUM), + .data = { 0x01, 0x00 } }; +static const USB_HID_Short_Item_t hidLogicalMinimum0 = { + .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_LOGICAL_MINIMUM), + .data = { 0x00, 0x00 } }; + +static const USB_HID_Short_Item_t hidReportCount2 = { + .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT), + .data = { 0x00, 0x00 } }; +static const USB_HID_Short_Item_t hidReportCount8 = { + .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_COUNT), + .data = { 0x08, 0x00 } }; +static const USB_HID_Short_Item_t hidReportSize1 = { + .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_REPORT_SIZE), + .data = { 0x01, 0x00 } }; + +static const USB_HID_Short_Item_t hidUsageConsumerControl = { + .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE), + .data = { 0x01, 0x00 } }; + +static const USB_HID_Short_Item_t hidUsageConsumerControl2 = { + .header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE), + .data = { 0x02, 0x00 } }; + + +/* + * Define the HID Report Descriptor Item, Usage Page, Report ID and length for each HID Report + * For internal purposes, a report element with ID of 0 must be included if report IDs are not being used. + */ +static const USB_HID_Report_Element_t hidReportPageConsumer = { + .item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_USAGE_PAGE), + .item.data = { USB_HID_USAGE_PAGE_ID_CONSUMER, 0x00 }, + .location = HID_REPORT_SET_LOC(0x1, 2, 0, 0 ) +}; + +static const USB_HID_Report_Element_t hidReportPageVendor = { + .item.header = HID_REPORT_SET_HEADER(2, HID_REPORT_ITEM_TYPE_GLOBAL, HID_REPORT_ITEM_TAG_USAGE_PAGE), +#if DEBUG_MEMORY_LOG_ENABLED + .item.data = {0x82, 0xff }, +#else + .item.data = {0x83, 0xff }, +#endif + .location = HID_REPORT_SET_LOC(0x2, 2, 0, 0 ) +}; + + +static const USB_HID_Short_Item_t hidUsagePageConsumer = { .header = 0x05, .data = { 0x0C, 0x00 }}; + +static const USB_HID_Short_Item_t hidUsagePageVendor = { .header = 0x06, .data = { 0x82, 0xff }}; + +static const USB_HID_Short_Item_t hidUsageConsumerVendor = { .header = 0x09, .data = { 0x03, 0x00 }}; + +static const USB_HID_Short_Item_t hidPassReportId = { .header = 0x85, .data = { 0x1, 0x00 }}; +static const USB_HID_Short_Item_t hidButtonReportId = { .header = 0x85, .data = { 0x2, 0x00 }}; + +static const USB_HID_Short_Item_t hidLogicalMaximum2 = { .header = 0x26, .data = { 0xFF, 0x00 }}; + +static const USB_HID_Short_Item_t hidReportSize = { .header = 0x75, .data = { 0x08, 0x00 }}; +#if DEBUG_MEMORY_LOG_ENABLED +static const USB_HID_Short_Item_t hidPassReportCount = { .header = 0x95, .data = { 0x3F, 0x00 }}; +static const USB_HID_Short_Item_t hidPassReportCount2 = { .header = 0x95, .data = { 0x3F, 0x00 }}; +static const USB_HID_Short_Item_t hidPassReportCount3 = { .header = 0x95, .data = { 0x3f, 0x00 }}; +#else +static const USB_HID_Short_Item_t hidPassReportCount = { .header = 0x95, .data = { 0x3f, 0x00 }}; +static const USB_HID_Short_Item_t hidPassReportCount2 = { .header = 0x95, .data = { 0x3f, 0x00 }}; +static const USB_HID_Short_Item_t hidPassReportCount3 = { .header = 0x95, .data = { 0x3f, 0x00 }}; +#endif +static const USB_HID_Short_Item_t hidButtonReportCount = { .header = 0x95, .data = { 0x04, 0x00 }}; +static const USB_HID_Short_Item_t hidUsageVendor = { .header = 0x09, .data = { 0x04, 0x00 }}; +static const USB_HID_Short_Item_t hidUsageVendor2 = { .header = 0x09, .data = { 0x05, 0x00 }}; +static const USB_HID_Short_Item_t hidOutputDataVar = { .header = 0x91, .data = { 0x02, 0x00 }}; + +/* + * Define configurable items in the HID Report descriptor. + */ + +static USB_HID_Report_Element_t hidUsageByte0Bit7 = { + .item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE), + .item.data = { 0xE2, 0x00 }, + .location = HID_REPORT_SET_LOC(0, 0, 0, 5) +}; // Mute +static USB_HID_Report_Element_t hidUsageByte0Bit6 = { + .item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE), + .item.data = { 0xB4, 0x00 }, + .location = HID_REPORT_SET_LOC(0, 0, 0, 5) +}; // rewind +static USB_HID_Report_Element_t hidUsageByte0Bit5 = { + .item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE), + .item.data = { 0xB3, 0x00 }, + .location = HID_REPORT_SET_LOC(0, 0, 0, 5) +}; // forward +static USB_HID_Report_Element_t hidUsageByte0Bit4 = { + .item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE), + .item.data = { 0xB6, 0x00 }, + .location = HID_REPORT_SET_LOC(0, 0, 0, 2) +}; // Scan Prev +static USB_HID_Report_Element_t hidUsageByte0Bit3 = { + .item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE), + .item.data = { 0xB5, 0x00 }, + .location = HID_REPORT_SET_LOC(0, 0, 0, 1) +}; // Scan Next +static USB_HID_Report_Element_t hidUsageByte0Bit2 = { + .item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE), + .item.data = { 0xCD, 0x00 }, + .location = HID_REPORT_SET_LOC(0, 0, 0, 0) +}; // Play +static USB_HID_Report_Element_t hidUsageByte0Bit1 = { + .item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE), + .item.data = { 0xEA, 0x00 }, + .location = HID_REPORT_SET_LOC(0, 0, 0, 4) +}; // Vol- +static USB_HID_Report_Element_t hidUsageByte0Bit0 = { + .item.header = HID_REPORT_SET_HEADER(1, HID_REPORT_ITEM_TYPE_LOCAL, HID_REPORT_ITEM_TAG_USAGE), + .item.data = { 0xE9, 0x00 }, + .location = HID_REPORT_SET_LOC(0, 0, 0, 3) +}; // Vol+ + +/* + * List the configurable elements in the HID Report descriptor. + */ +static USB_HID_Report_Element_t* const hidConfigurableElements[] = { + &hidUsageByte0Bit0, + &hidUsageByte0Bit1, + &hidUsageByte0Bit2, + &hidUsageByte0Bit3, + &hidUsageByte0Bit4, + &hidUsageByte0Bit5, + &hidUsageByte0Bit6, + &hidUsageByte0Bit7 +}; + +/* + * List HID Reports, one per Report ID. This should be a usage page item with the relevant + * If not using report IDs - still have one with report ID 0 + */ +static const USB_HID_Report_Element_t* const hidReports[] = { + &hidReportPageVendor, + &hidReportPageConsumer +}; + +/* + * List all items in the HID Report descriptor. + */ +static const USB_HID_Short_Item_t* const hidReportDescriptorItems[] = { + &(hidReportPageVendor.item), + &hidUsageConsumerControl, + &hidCollectionApplication, + &hidUsageConsumerVendor, + &hidPassReportId, + &hidLogicalMinimum0, + &hidLogicalMaximum2, + &hidReportSize, + &hidPassReportCount2, + &hidInputDataVar, + &hidUsageVendor, + &hidLogicalMinimum0, + &hidLogicalMaximum2, + &hidReportSize, + &hidPassReportCount, + &hidOutputDataVar, + &hidUsageVendor2, + &hidReportSize, + &hidPassReportCount3, + &hidInputFeatureVar, + &hidCollectionEnd, + &(hidReportPageConsumer.item), + &hidUsageConsumerControl, + &hidCollectionApplication, + &hidButtonReportId, + &hidLogicalMinimum0, + &hidLogicalMaximum1, + &(hidUsageByte0Bit0.item), + &(hidUsageByte0Bit1.item), + &(hidUsageByte0Bit2.item), + &(hidUsageByte0Bit3.item), + &(hidUsageByte0Bit4.item), + &(hidUsageByte0Bit5.item), + &(hidUsageByte0Bit6.item), + &(hidUsageByte0Bit7.item), + &hidReportSize1, + &hidReportCount8, + &hidInputDataVar, + &hidReportCount2, + &hidInputConstArray, + &hidCollectionEnd, +}; + +/* + * Define the number of HID Reports + * Due to XC not supporting designated initializers, this constant has a hard-coded value. + * It must equal ( sizeof hidReports / sizeof ( USB_HID_Report_Element_t* )) + */ +#define HID_REPORT_COUNT ( 2 ) + +#endif // __hid_report_descriptor_h__ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/hidbuttons.xc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/hidbuttons.xc new file mode 100644 index 0000000..1ce1b38 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/hidbuttons.xc @@ -0,0 +1,128 @@ +#define DEBUG_PRINT_ENABLE 1 +#include +#include +#include "xua_conf.h" + +#include "user_hid.h" +#include "xua_hid_report.h" + +#include "xc_ptr.h" + +#include "xud.h" +#include "hid.h" +#include "debug_print.h" + +#if HID_CONTROLS > 0 + +#ifdef XSCOPE +#include "print.h" +#endif + +#ifdef DFU_CONTROL_USB_HID +#include + +#define HID_DFU_REPORT_ID 0x41 +#endif + +#define P_GPI_BUTA_SHIFT 0x00 +#define P_GPI_BUTA_MASK (1<= 64) ? 64 : (debug_memory_log_buffer_index - log_index); + if (size > 0) + { + for (int i = 0; i < size; i++) + { + hidLogData[i] = logPtr[log_index + i]; + } + + log_index += size; + + if (log_index >= debug_memory_log_buffer_index) + { + log_index = 0; + SET_SHARED_GLOBAL(debug_memory_log_buffer_index, 0); + } + } + else + { + for (int i = 0; i < 64; i++) + { + hidLogData[i] = 0; + } + + } + + } +} + +#endif + +void UserHIDInit( void ) +{ +} + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/hostactive.xc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/hostactive.xc new file mode 100644 index 0000000..3f1ff9b --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/hostactive.xc @@ -0,0 +1,21 @@ +#include + +/* This is provided as simple example but disabled due to the port clash with audiostream.xc */ + +#if 0 +on tile[0]: out port p_leds = XS1_PORT_4F; + +void UserHostActive(int active) +{ + if(active) + { + /* Turn all LEDs on */ + p_leds <: 0xF; + } + else + { + /* Turn all LEDs off */ + p_leds <: 0x0; + } +} +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/lfs_io.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/lfs_io.h new file mode 100644 index 0000000..8ab5e32 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/lfs_io.h @@ -0,0 +1,14 @@ +#ifndef _LFS_IO_H_ +#define _LFS_IO_H_ +int lfs_init(void); +void lfs_deinit(void); +void lfs_read_config(unsigned char * config, unsigned char * buffer, unsigned size); +void lfs_write_config(unsigned char * config, unsigned char * buffer, unsigned size); + +// EQ参数专用函数 +void lfs_read_eq_config(const char * file_path, unsigned char * buffer, unsigned size); +void lfs_write_eq_config(const char * file_path, unsigned char * buffer, unsigned size); +int lfs_file_exists(const char * file_path); +int lfs_remove_file(const char * file_path); +int lfs_create_directory(const char * dir_path); +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/lfs_services.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/lfs_services.c new file mode 100644 index 0000000..96cc12e --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/lfs_services.c @@ -0,0 +1,250 @@ +#include +#include "xs1.h" +#include +#include "lfs.h" +#include "rtos_qspi_flash.h" +#include "swlock.h" +#include "debug_print.h" +#if HID_DFU_EN +#include "dfu_upgrade.h" +#endif +// variables used by the filesystem +lfs_t lfs; +lfs_file_t file; +swlock_t lfs_lock = SWLOCK_INITIAL_VALUE; + +static rtos_qspi_flash_t qspi_flash_ctx_s; +#define FLASH_CLKBLK XS1_CLKBLK_1 +#ifndef FS_BASE_ADDR +#define FS_BASE_ADDR (2500 * 1024) +#endif +#define SECTOR_SIZE 4096 +rtos_qspi_flash_t *qspi_flash_ctx = &qspi_flash_ctx_s; + +__attribute__((fptrgroup(" local_block_device_read_fptr_grp"))) +int local_block_device_read(const struct lfs_config *c, lfs_block_t block, + lfs_off_t off, void *buffer, lfs_size_t size) +{ + unsigned address = (FS_BASE_ADDR + block * SECTOR_SIZE + off); + qspi_flash_ctx->read(qspi_flash_ctx, buffer, address, size); + return 0; +} + +__attribute__((fptrgroup(" local_block_device_prog_fptr_grp"))) +int local_block_device_prog(const struct lfs_config *c, lfs_block_t block, + lfs_off_t off, const void *buffer, lfs_size_t size) +{ + unsigned address = (FS_BASE_ADDR + block * SECTOR_SIZE + off); + qspi_flash_ctx->write(qspi_flash_ctx, buffer, address, size); + return 0; +} + +__attribute__((fptrgroup(" local_block_device_erase_fptr_grp"))) +int local_block_device_erase(const struct lfs_config *c, lfs_block_t block) +{ + unsigned address = (FS_BASE_ADDR + block * SECTOR_SIZE); + qspi_flash_ctx->erase(qspi_flash_ctx, address, SECTOR_SIZE); + return 0; +} + +__attribute__((fptrgroup(" local_block_device_sync_fptr_grp"))) +int local_block_device_sync(const struct lfs_config *c) +{ + return 0; +} + +// configuration of the filesystem is provided by this struct +const struct lfs_config cfg = { + // block device operations + .read = local_block_device_read, + .prog = local_block_device_prog, + .erase = local_block_device_erase, + .sync = local_block_device_sync, + + // block device configuration + .read_size = 16, + .prog_size = 16, + .block_size = 4096, + .block_count = 128, + .cache_size = 16, + .lookahead_size = 16, + .block_cycles = 500, +}; + +int lfs_init(void) { + swlock_acquire(&lfs_lock); + rtos_qspi_flash_init( + qspi_flash_ctx, + FLASH_CLKBLK, + PORT_SQI_CS, + PORT_SQI_SCLK, + PORT_SQI_SIO, + NULL); + + + // mount the filesystem + int err = lfs_mount(&lfs, &cfg); + + // reformat if we can't mount the filesystem + // this should only happen on the first boot + if (err) { + debug_printf("no lfs partiton is found, formating ...\n"); + lfs_format(&lfs, &cfg); + lfs_mount(&lfs, &cfg); + swlock_release(&lfs_lock); + return -1; + } + swlock_release(&lfs_lock); + return 0; + +} + +void lfs_deinit(void) { + swlock_acquire(&lfs_lock); + lfs_unmount(&lfs); + swlock_release(&lfs_lock); +} + +#pragma stackfunction 1480 +void lfs_read_config(unsigned char * config, unsigned char * buffer, unsigned size) +{ + // 改动原因:升级过程中禁止Flash读操作 +#if HID_DFU_EN + if (firmware_upgrade_get_state() != UPGRADE_IDLE) { + debug_printf("lfs_read_config blocked during firmware upgrade\n"); + return; + } +#endif + swlock_acquire(&lfs_lock); + debug_printf("lfs_read_config: %s, size: %d\n", config, size); + int result = lfs_file_open(&lfs, &file, config, LFS_O_RDWR | LFS_O_CREAT); + debug_printf("lfs_read_config: %s, result: %d\n", config, result); + if (result != 0) { + debug_printf("lfs_read_config: %s, open file failed\n", config); + swlock_release(&lfs_lock); + return; + } + debug_printf("lfs_read_config: %s, file opened\n", config); + result = lfs_file_read(&lfs, &file, buffer, size); + debug_printf("lfs_read_config: %s, result: %d\n", config, result); + if (result < 0) { + debug_printf("lfs_read_config: %s, read file failed, error: %d\n", config, result); + // Update: Added lfs_file_close to ensure file is closed even on error. + // Missing this caused subsequent open calls to assert/crash. + lfs_file_close(&lfs, &file); + swlock_release(&lfs_lock); + return; + } + lfs_file_close(&lfs, &file); + swlock_release(&lfs_lock); +} + +#pragma stackfunction 1480 +void lfs_write_config(unsigned char * config, unsigned char * buffer, unsigned size) +{ + // 改动原因:升级过程中禁止Flash写操作 +#if HID_DFU_EN + if (firmware_upgrade_get_state() != UPGRADE_IDLE) { + debug_printf("lfs_write_config blocked during firmware upgrade\n"); + return; + } +#endif + swlock_acquire(&lfs_lock); + debug_printf("lfs_write_config: %s, size: %d\n", config, size); + int result = lfs_file_open(&lfs, &file, config, LFS_O_RDWR | LFS_O_CREAT); + if (result != 0) { + debug_printf("lfs_write_config: open file failed\n"); + swlock_release(&lfs_lock); + return; + } + result = lfs_file_rewind(&lfs, &file); + if (result != 0) { + debug_printf("lfs_write_config: rewind file failed\n"); + // Update: Added lfs_file_close to prevent file remaining open if rewind fails. + lfs_file_close(&lfs, &file); + swlock_release(&lfs_lock); + return; + } + lfs_file_write(&lfs, &file, buffer, size); + lfs_file_close(&lfs, &file); + swlock_release(&lfs_lock); +} + + +// 检查文件是否存在 +int lfs_file_exists(const char * file_path) +{ + swlock_acquire(&lfs_lock); + lfs_file_t file; + int result = lfs_file_open(&lfs, &file, file_path, LFS_O_RDONLY); + if (result == 0) { + lfs_file_close(&lfs, &file); + swlock_release(&lfs_lock); + return 1; // 文件存在 + } + swlock_release(&lfs_lock); + return 0; // 文件不存在 +} + +// EQ参数专用读写函数 +void lfs_read_eq_config(const char * file_path, unsigned char * buffer, unsigned size) +{ + lfs_file_open(&lfs, &file, file_path, LFS_O_RDONLY); + lfs_file_read(&lfs, &file, buffer, size); + lfs_file_close(&lfs, &file); +} + +void lfs_write_eq_config(const char * file_path, unsigned char * buffer, unsigned size) +{ + lfs_file_open(&lfs, &file, file_path, LFS_O_RDWR | LFS_O_CREAT); + lfs_file_rewind(&lfs, &file); + lfs_file_write(&lfs, &file, buffer, size); + lfs_file_close(&lfs, &file); +} + + +// 删除文件 +int lfs_remove_file(const char * file_path) +{ + return lfs_remove(&lfs, file_path); +} + +// 创建目录(通过创建临时文件然后删除) +int lfs_create_directory(const char * dir_path) +{ + char temp_file[256]; + snprintf(temp_file, sizeof(temp_file), "%s/.dir", dir_path); + + lfs_file_t file; + int result = lfs_file_open(&lfs, &file, temp_file, LFS_O_RDWR | LFS_O_CREAT); + if (result == 0) { + lfs_file_close(&lfs, &file); + lfs_remove(&lfs, temp_file); + return 0; // 成功 + } + return -1; // 失败 +} + + +#if 0 + // read current count + uint32_t boot_count = 0; + lfs_file_open(&lfs, &file, "boot_count", LFS_O_RDWR | LFS_O_CREAT); + lfs_file_read(&lfs, &file, &boot_count, sizeof(boot_count)); + + // update boot count + boot_count += 1; + lfs_file_rewind(&lfs, &file); + for (int i = 0; i < 100; i++) + lfs_file_write(&lfs, &file, &boot_count, sizeof(boot_count)); + + // remember the storage is not updated until the file is closed successfully + lfs_file_close(&lfs, &file); + + // release any resources we were using + lfs_unmount(&lfs); + + // print the boot count + printf("boot_count: %d\n", boot_count); + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/main.xc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/main.xc new file mode 100644 index 0000000..61b9854 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/main.xc @@ -0,0 +1,758 @@ +// Copyright 2012-2024 XMOS LIMITED. +// This Software is subject to the terms of the XMOS Public Licence: Version 1. + +#include "xua.h" /* Device specific defines */ +#ifdef EXCLUDE_USB_AUDIO_MAIN + +/** + * @file main.xc + * @brief Top level for XMOS USB 2.0 Audio 2.0 Reference Designs. + * @author Ross Owen, XMOS Semiconductor Ltd + */ +#include +#include +#include +#include +#include +#ifdef XSCOPE +#include +#endif + +#if XUA_USB_EN +#include "xud_device.h" /* XMOS USB Device Layer defines and functions */ +#include "xua_endpoint0.h" +#endif + +#include "uac_hwresources.h" + +#ifdef IAP +#include "i2c_shared.h" +#include "iap.h" +#endif + +#if (XUA_SPDIF_RX_EN || XUA_SPDIF_TX_EN) +#include "spdif.h" /* From lib_spdif */ +#endif + +#if (XUA_ADAT_RX_EN) +#include "adat_rx.h" +#endif + +#if (XUA_NUM_PDM_MICS > 0) +#include "xua_pdm_mic.h" +#endif + +#if (XUA_DFU_EN == 1) +[[distributable]] +void DFUHandler(server interface i_dfu i, chanend ?c_user_cmd); +#endif + +/* Audio I/O - Port declarations */ +#if I2S_WIRES_DAC > 0 +on tile[AUDIO_IO_TILE] : buffered out port:32 p_i2s_dac[I2S_WIRES_DAC] = + {PORT_I2S_DAC0, +#endif +#if I2S_WIRES_DAC > 1 + PORT_I2S_DAC1, +#endif +#if I2S_WIRES_DAC > 2 + PORT_I2S_DAC2, +#endif +#if I2S_WIRES_DAC > 3 + PORT_I2S_DAC3, +#endif +#if I2S_WIRES_DAC > 4 + PORT_I2S_DAC4, +#endif +#if I2S_WIRES_DAC > 5 + PORT_I2S_DAC5, +#endif +#if I2S_WIRES_DAC > 6 + PORT_I2S_DAC6, +#endif +#if I2S_WIRES_DAC > 7 +#error I2S_WIRES_DAC value is too large! +#endif +#if I2S_WIRES_DAC > 0 + }; +#else + #define p_i2s_dac null +#endif + +#if I2S_WIRES_ADC > 0 +on tile[AUDIO_IO_TILE] : buffered in port:32 p_i2s_adc[I2S_WIRES_ADC] = + {PORT_I2S_ADC0, +#endif +#if I2S_WIRES_ADC > 1 + PORT_I2S_ADC1, +#endif +#if I2S_WIRES_ADC > 2 + PORT_I2S_ADC2, +#endif +#if I2S_WIRES_ADC > 3 + PORT_I2S_ADC3, +#endif +#if I2S_WIRES_ADC > 4 + PORT_I2S_ADC4, +#endif +#if I2S_WIRES_ADC > 5 + PORT_I2S_ADC5, +#endif +#if I2S_WIRES_ADC > 6 + PORT_I2S_ADC6, +#endif +#if I2S_WIRES_ADC > 7 +#error I2S_WIRES_ADC value is too large! +#endif +#if I2S_WIRES_ADC > 0 + }; +#else + #define p_i2s_adc null +#endif + + +#if CODEC_MASTER +on tile[AUDIO_IO_TILE] : buffered in port:32 p_lrclk = PORT_I2S_LRCLK; +on tile[AUDIO_IO_TILE] : buffered in port:32 p_bclk = PORT_I2S_BCLK; +#else +on tile[AUDIO_IO_TILE] : buffered out port:32 p_lrclk = PORT_I2S_LRCLK; +on tile[AUDIO_IO_TILE] : buffered out port:32 p_bclk = PORT_I2S_BCLK; +#endif + +#if (!CODEC_MASTER) || XUA_SPDIF_TX_EN || XUA_ADAT_TX_EN || ((AUDIO_IO_TILE == XUD_TILE) && XUA_USB_EN) +/* Audio master clock input */ +on tile[AUDIO_IO_TILE] : in port p_mclk_in = PORT_MCLK_IN; +#else +#define p_mclk_in null +#endif + +#if (AUDIO_IO_TILE != XUD_TILE) && XUA_USB_EN +/* If audio I/O and USB running on different tiles we need a separate port for + * the master clock input (to use for USB async feedback calculation) */ +on tile[XUD_TILE] : in port p_mclk_in_usb = PORT_MCLK_IN_USB; +#endif + +#if XUA_USB_EN +on tile[XUD_TILE] : in port p_for_mclk_count = PORT_MCLK_COUNT; +#endif + +#if (XUA_SPDIF_TX_EN) +on tile[SPDIF_TX_TILE] : buffered out port:32 p_spdif_tx = PORT_SPDIF_OUT; +#endif + +#if (XUA_ADAT_TX_EN) +on stdcore[AUDIO_IO_TILE] : buffered out port:32 p_adat_tx = PORT_ADAT_OUT; +#endif + +#if (XUA_ADAT_RX_EN) +on stdcore[XUD_TILE] : buffered in port:32 p_adat_rx = PORT_ADAT_IN; +#endif + +#if (XUA_SPDIF_RX_EN) +on tile[XUD_TILE] : in port p_spdif_rx = PORT_SPDIF_IN; +#endif + +#if (XUA_SPDIF_RX_EN) || (XUA_ADAT_RX_EN) || (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) +/* Reference to external clock multiplier */ +on tile[PLL_REF_TILE] : out port p_pll_ref = PORT_PLL_REF; +#ifdef __XS3A__ +on tile[AUDIO_IO_TILE] : port p_for_mclk_count_audio = PORT_MCLK_COUNT_2; +#else /* __XS3A__ */ +#define p_for_mclk_count_audio null +#endif /* __XS3A__ */ +#endif + +#ifdef MIDI +on tile[MIDI_TILE] : port p_midi_tx = PORT_MIDI_OUT; + +#if(MIDI_RX_PORT_WIDTH == 4) +on tile[MIDI_TILE] : buffered in port:4 p_midi_rx = PORT_MIDI_IN; +#elif(MIDI_RX_PORT_WIDTH == 1) +on tile[MIDI_TILE] : buffered in port:1 p_midi_rx = PORT_MIDI_IN; +#endif +#endif + + +#ifdef MIDI +on tile[MIDI_TILE] : clock clk_midi = CLKBLK_MIDI; +#endif + +#if (XUA_SPDIF_TX_EN || XUA_ADAT_TX_EN) +on tile[SPDIF_TX_TILE] : clock clk_mst_spd = CLKBLK_SPDIF_TX; +#endif + +#if (XUA_SPDIF_RX_EN) +on tile[XUD_TILE] : clock clk_spd_rx = CLKBLK_SPDIF_RX; +#endif + +on tile[AUDIO_IO_TILE] : clock clk_audio_mclk = CLKBLK_MCLK; /* Master clock */ + +#if (AUDIO_IO_TILE != XUD_TILE) && XUA_USB_EN +/* Separate clock/port for USB feedback calculation */ +on tile[XUD_TILE] : clock clk_audio_mclk_usb = CLKBLK_MCLK; /* Master clock */ +#endif + +on tile[AUDIO_IO_TILE] : clock clk_audio_bclk = CLKBLK_I2S_BIT; /* Bit clock */ + +#ifdef IAP +/* I2C ports - in a struct for use with module_i2c_shared & module_i2c_simple/module_i2c_single_port */ +#ifdef PORT_I2C +on tile [IAP_TILE] : struct r_i2c r_i2c = {PORT_I2C}; +#else +on tile [IAP_TILE] : struct r_i2c r_i2c = {PORT_I2C_SCL, PORT_I2C_SDA}; +#endif +#endif + +#if XUA_USB_EN +/* Endpoint type tables for XUD */ +XUD_EpType epTypeTableOut[ENDPOINT_COUNT_OUT] = { XUD_EPTYPE_CTL | XUD_STATUS_ENABLE, +#if (NUM_USB_CHAN_IN > 0) + XUD_EPTYPE_ISO, /* Audio */ +#endif +#ifdef MIDI + XUD_EPTYPE_BUL, /* MIDI */ +#endif +#if HID_OUT_REQUIRED + XUD_EPTYPE_INT, +#endif +#ifdef IAP + XUD_EPTYPE_BUL, /* iAP */ +#ifdef IAP_EA_NATIVE_TRANS + XUD_EPTYPE_BUL, /* EA Native Transport */ +#endif +#endif + }; + +XUD_EpType epTypeTableIn[ENDPOINT_COUNT_IN] = { XUD_EPTYPE_CTL | XUD_STATUS_ENABLE, +#if (NUM_USB_CHAN_IN > 0) + XUD_EPTYPE_ISO, +#endif +#if (NUM_USB_CHAN_OUT > 0) && ((NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)) + XUD_EPTYPE_ISO, /* Async feedback endpoint */ +#endif +#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) + XUD_EPTYPE_INT, +#endif +#ifdef MIDI + XUD_EPTYPE_BUL, +#endif +#if XUA_OR_STATIC_HID_ENABLED + XUD_EPTYPE_INT, +#endif +#ifdef IAP + XUD_EPTYPE_BUL | XUD_STATUS_ENABLE, +#ifdef IAP_INT_EP + XUD_EPTYPE_BUL | XUD_STATUS_ENABLE, +#endif +#ifdef IAP_EA_NATIVE_TRANS + XUD_EPTYPE_BUL | XUD_STATUS_ENABLE, +#endif +#endif + }; +#endif /* XUA_USB_EN */ + +void thread_speed() +{ +#ifdef FAST_MODE +#warning Building with fast mode enabled + set_thread_fast_mode_on(); +#else + set_thread_fast_mode_off(); +#endif +} + +#ifdef XSCOPE +void xscope_user_init() +{ + xscope_register(0, 0, "", 0, ""); + + xscope_config_io(XSCOPE_IO_BASIC); +} +#endif + +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE) +void SpdifTxWrapper(chanend c_spdif_tx) +{ + unsigned portId; + //configure_clock_src(clk, p_mclk); + + // TODO could share clock block here.. + // NOTE, Assuming SPDIF tile == USB tile here.. + asm("ldw %0, dp[p_mclk_in_usb]":"=r"(portId)); + asm("setclk res[%0], %1"::"r"(clk_mst_spd), "r"(portId)); + configure_out_port_no_ready(p_spdif_tx, clk_mst_spd, 0); + set_clock_fall_delay(clk_mst_spd, 7); + start_clock(clk_mst_spd); + + while(1) + { + spdif_tx(p_spdif_tx, c_spdif_tx); + } +} +#endif + +void usb_audio_io(chanend ?c_aud_in, +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE) + chanend c_spdif_tx, +#endif +#if (MIXER) + chanend c_mix_ctl, +#endif + streaming chanend ?c_spdif_rx, + streaming chanend ?c_adat_rx, + chanend ?c_clk_ctl, + chanend ?c_clk_int +#if (XUD_TILE != 0) && (AUDIO_IO_TILE == 0) && (XUA_DFU_EN == 1) + , server interface i_dfu ?dfuInterface +#endif +#if (XUA_NUM_PDM_MICS > 0) + , chanend c_pdm_pcm +#endif +#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) + , client interface pll_ref_if i_pll_ref +#endif +#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) + , chanend c_audio_rate_change +#endif +#if ((XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) && XUA_USE_SW_PLL) + , port p_for_mclk_count_aud + , chanend c_sw_pll +#endif +) +{ +#if (MIXER) + chan c_mix_out; +#endif + +#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) + chan c_dig_rx; + chan c_audio_rate_change; /* Notification of new mclk freq to clockgen and synch */ +#if XUA_USE_SW_PLL + /* Connect p_for_mclk_count_aud to clk_audio_mclk so we can count mclks/timestamp in digital rx*/ + unsigned x = 0; + asm("ldw %0, dp[clk_audio_mclk]":"=r"(x)); + asm("setclk res[%0], %1"::"r"(p_for_mclk_count_aud), "r"(x)); +#endif /* XUA_USE_SW_PLL */ +#endif /* (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) */ + + +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE == AUDIO_IO_TILE) + chan c_spdif_tx; + + /* Setup S/PDIF tx port - note this is done before par since sharing clock-block/port */ + spdif_tx_port_config(p_spdif_tx, clk_audio_mclk, p_mclk_in, 7); +#endif + + par + { +#if (MIXER && XUA_USB_EN) + /* Mixer cores(s) */ + { + thread_speed(); + mixer(c_aud_in, c_mix_out, c_mix_ctl); + } +#endif + +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE == AUDIO_IO_TILE) + while(1) + { + spdif_tx(p_spdif_tx, c_spdif_tx); + } +#endif + + /* Audio I/O core (pars additional S/PDIF TX Core) */ + { + thread_speed(); +#if (MIXER) +#define AUDIO_CHANNEL c_mix_out +#else +#define AUDIO_CHANNEL c_aud_in +#endif + XUA_AudioHub(AUDIO_CHANNEL, clk_audio_mclk, clk_audio_bclk, p_mclk_in, p_lrclk, p_bclk, p_i2s_dac, p_i2s_adc +#if (XUA_SPDIF_TX_EN) //&& (SPDIF_TX_TILE != AUDIO_IO_TILE) + , c_spdif_tx +#endif +#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) + , c_dig_rx +#endif +#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC || XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) + , c_audio_rate_change +#endif +#if (XUD_TILE != 0) && (AUDIO_IO_TILE == 0) && (XUA_DFU_EN == 1) + , dfuInterface +#endif +#if (XUA_NUM_PDM_MICS > 0) + , c_pdm_pcm +#endif + ); + } + +#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) + { + /* ClockGen must currently run on same tile as AudioHub due to shared memory buffer + * However, due to the use of an interface the pll reference signal port can be on another tile + */ + thread_speed(); + clockGen( c_spdif_rx, + c_adat_rx, + i_pll_ref, + c_dig_rx, + c_clk_ctl, + c_clk_int, + c_audio_rate_change +#if XUA_USE_SW_PLL + , p_for_mclk_count_aud + , c_sw_pll +#endif + ); + } +#endif + + } // par +} + +#ifndef USER_MAIN_DECLARATIONS +#define USER_MAIN_DECLARATIONS +#endif + +#ifndef USER_MAIN_CORES +#define USER_MAIN_CORES +#endif + +#if XMOS_FPS_EN +extern void fps_main(chanend c_data); +extern void fps1_dsp_proc_task(); +extern void fps2_dsp_proc_task(); +#endif + +/* Main for USB Audio Applications */ +int main() +{ +#if !XUA_USB_EN + #define c_mix_out null +#else + chan c_mix_out; +#endif + +#ifdef MIDI + chan c_midi; +#endif +#ifdef IAP + chan c_iap; +#ifdef IAP_EA_NATIVE_TRANS + chan c_ea_data; +#endif +#endif + +#if (MIXER) + chan c_mix_ctl; +#endif + +#if (XUA_SPDIF_RX_EN) + streaming chan c_spdif_rx; +#else +#define c_spdif_rx null +#endif + +#if (XUA_ADAT_RX_EN) + streaming chan c_adat_rx; +#else +#define c_adat_rx null +#endif + +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE) + chan c_spdif_tx; +#endif + +#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) + chan c_clk_ctl; + chan c_clk_int; +#else +#define c_clk_int null +#define c_clk_ctl null +#endif + +#if (XUA_DFU_EN == 1) + interface i_dfu dfuInterface; +#else + #define dfuInterface null +#endif + +#if (XUA_NUM_PDM_MICS > 0) + chan c_pdm_pcm; +#endif + +#if (((XUA_SYNCMODE == XUA_SYNCMODE_SYNC && !XUA_USE_SW_PLL) || XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) ) + interface pll_ref_if i_pll_ref; +#endif + +#if ((XUA_SYNCMODE == XUA_SYNCMODE_SYNC || XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) && XUA_USE_SW_PLL) + chan c_sw_pll; +#endif +#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) + chan c_audio_rate_change; /* Notification of new mclk freq to ep_buffer */ +#endif + chan c_sof; + chan c_xud_out[ENDPOINT_COUNT_OUT]; /* Endpoint channels for XUD */ + chan c_xud_in[ENDPOINT_COUNT_IN]; + + /* Used to communicate controls/setting from XUA_Endpoint0() to the Audio/Buffering sub-system */ + chan c_aud_ctl; + +#if (!MIXER) +#define c_mix_ctl null +#endif + +#ifdef IAP_EA_NATIVE_TRANS + chan c_EANativeTransport_ctrl; +#else +#define c_EANativeTransport_ctrl null +#endif + +//#if (HID_CONTROLS > 0) +// chan c_hid; +//#endif + + USER_MAIN_DECLARATIONS + + par + { + USER_MAIN_CORES + +#if XMOS_FPS_EN + on tile[1]: { + set_core_high_priority_on(); + fps_main(c_data_transport); + } + on tile[1]: { + set_core_high_priority_on(); + fps1_dsp_proc_task(); + } + on tile[1]: { + set_core_high_priority_on(); + fps2_dsp_proc_task(); + } +#else +#if UAC1 + on tile[1]: { + dsp_main(c_data_transport, cc_br_eof); + } +#endif +#endif +#if (((XUA_SYNCMODE == XUA_SYNCMODE_SYNC && !XUA_USE_SW_PLL) || XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN)) + on tile[PLL_REF_TILE]: PllRefPinTask(i_pll_ref, p_pll_ref); +#endif + on tile[XUD_TILE]: + par + { +#if XUA_USB_EN +#if ((XUD_TILE == 0) && (XUA_DFU_EN == 1)) + /* Check if USB is on the flash tile (tile 0) */ + /* Expect to be distrbuted into XUA_Endpoint0() */ + [[distribute]] + DFUHandler(dfuInterface, null); +#endif + + /* Core USB task, buffering, USB etc */ + { +#ifdef XUD_PRIORITY_HIGH + set_core_high_priority_on(); +#endif + /* Run UAC2.0 at high-speed, UAC1.0 at full-speed */ + unsigned usbSpeed = (AUDIO_CLASS == 2) ? XUD_SPEED_HS : XUD_SPEED_FS; + + unsigned xudPwrCfg = (XUA_POWERMODE == XUA_POWERMODE_SELF) ? XUD_PWR_SELF : XUD_PWR_BUS; + + /* USB interface core */ + XUD_Main(c_xud_out, ENDPOINT_COUNT_OUT, c_xud_in, ENDPOINT_COUNT_IN, + c_sof, epTypeTableOut, epTypeTableIn, usbSpeed, xudPwrCfg); + } + +#if (NUM_USB_CHAN_OUT > 0) || (NUM_USB_CHAN_IN > 0) || XUA_HID_ENABLED || defined(MIDI) + /* Core USB audio task, buffering, USB etc */ + { + unsigned x; + thread_speed(); + + /* Attach mclk count port to mclk clock-block (for feedback) */ + //set_port_clock(p_for_mclk_count, clk_audio_mclk); +#if(AUDIO_IO_TILE != XUD_TILE) + set_clock_src(clk_audio_mclk_usb, p_mclk_in_usb); + set_port_clock(p_for_mclk_count, clk_audio_mclk_usb); + start_clock(clk_audio_mclk_usb); +#else + /* Clock port from same clock-block as I2S */ + /* TODO remove asm() */ + asm("ldw %0, dp[clk_audio_mclk]":"=r"(x)); + asm("setclk res[%0], %1"::"r"(p_for_mclk_count), "r"(x)); +#endif + /* Endpoint & audio buffering cores - buffers all EP's other than 0 */ + XUA_Buffer( +#if (NUM_USB_CHAN_OUT > 0) + c_xud_out[ENDPOINT_NUMBER_OUT_AUDIO], /* Audio Out*/ +#endif +#if (NUM_USB_CHAN_IN > 0) + c_xud_in[ENDPOINT_NUMBER_IN_AUDIO], /* Audio In */ +#endif +#if (NUM_USB_CHAN_OUT > 0) && ((NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)) + c_xud_in[ENDPOINT_NUMBER_IN_FEEDBACK], /* Audio FB */ +#endif +#ifdef MIDI + c_xud_out[ENDPOINT_NUMBER_OUT_MIDI], /* MIDI Out */ // 2 + c_xud_in[ENDPOINT_NUMBER_IN_MIDI], /* MIDI In */ // 4 + c_midi, +#endif +#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) + /* Audio Interrupt - only used for interrupts on external clock change */ + c_xud_in[ENDPOINT_NUMBER_IN_INTERRUPT], + c_clk_int, +#endif + c_sof, c_aud_ctl, p_for_mclk_count +#if (XUA_HID_ENABLED) + , c_xud_in[ENDPOINT_NUMBER_IN_HID] +#endif + , c_mix_out +#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) + , c_audio_rate_change + #if (!XUA_USE_SW_PLL) + , i_pll_ref + #else + , c_sw_pll + #endif +#endif + ); + //: + } +#endif + + /* Endpoint 0 Core */ + { + thread_speed(); +#if (USE_EX3D == 1) && (HID_CONTROLS > 0) + XUA_Endpoint0( c_xud_out[0], c_xud_in[0], c_hidRcvData, c_aud_ctl, c_mix_ctl, c_clk_ctl, c_EANativeTransport_ctrl, dfuInterface VENDOR_REQUESTS_PARAMS_); +#else + XUA_Endpoint0( c_xud_out[0], c_xud_in[0], c_aud_ctl, c_mix_ctl, c_clk_ctl, c_EANativeTransport_ctrl, dfuInterface VENDOR_REQUESTS_PARAMS_); +#endif + } + +#endif /* XUA_USB_EN */ + } + +#if ((XUA_SYNCMODE == XUA_SYNCMODE_SYNC || XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) && XUA_USE_SW_PLL) + on tile[AUDIO_IO_TILE]: sw_pll_task(c_sw_pll); +#endif + + on tile[AUDIO_IO_TILE]: + { + /* Audio I/O task, includes mixing etc */ + usb_audio_io( +#if (NUM_USB_CHAN_OUT > 0) || (NUM_USB_CHAN_IN > 0) + /* Connect audio system to XUA_Buffer(); */ + c_mix_out +#else + /* Connect to XUA_Endpoint0() */ + c_aud_ctl +#endif +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE) + , c_spdif_tx +#endif +#if (MIXER) + , c_mix_ctl +#endif + , c_spdif_rx, c_adat_rx, c_clk_ctl, c_clk_int +#if (XUD_TILE != 0) && (AUDIO_IO_TILE == 0) && (XUA_DFU_EN == 1) + , dfuInterface +#endif +#if (XUA_NUM_PDM_MICS > 0) + , c_pdm_pcm +#endif +#if (XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) + , i_pll_ref +#endif +#if (XUA_SYNCMODE == XUA_SYNCMODE_SYNC) + , c_audio_rate_change +#endif +#if ((XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN) && XUA_USE_SW_PLL) + , p_for_mclk_count_audio + , c_sw_pll +#endif + ); + } + //: + +#if (XUA_SPDIF_TX_EN) && (SPDIF_TX_TILE != AUDIO_IO_TILE) + on tile[SPDIF_TX_TILE]: + { + thread_speed(); + SpdifTxWrapper(c_spdif_tx); + } +#endif + +#if defined(MIDI) && defined(IAP) && (IAP_TILE == MIDI_TILE) + /* MIDI and IAP share a core */ + on tile[IAP_TILE]: + { + thread_speed(); + usb_midi(p_midi_rx, p_midi_tx, clk_midi, c_midi, 0, c_iap, null, null, null); + } +#else +#if defined(MIDI) + /* MIDI core */ + on tile[MIDI_TILE]: + { + thread_speed(); + usb_midi(p_midi_rx, p_midi_tx, clk_midi, c_midi, 0); + } +#endif +#if defined(IAP) + on tile[IAP_TILE]: + { + thread_speed(); + iAP(c_iap, null, null, null); + } +#endif +#endif + +#if (XUA_SPDIF_RX_EN) + on tile[XUD_TILE]: + { + thread_speed(); + spdif_rx(c_spdif_rx, p_spdif_rx, clk_spd_rx, 192000); + } +#endif + +#if (XUA_ADAT_RX_EN) + on stdcore[XUD_TILE] : + { + set_thread_fast_mode_on(); + + while (1) + { + adatReceiver48000(p_adat_rx, c_adat_rx); + adatReceiver44100(p_adat_rx, c_adat_rx); + } + } +#endif + + +#if XUA_USB_EN +#if (XUD_TILE != 0) && (AUDIO_IO_TILE != 0) && (XUA_DFU_EN == 1) + /* Run flash code on its own - hope it gets combined */ + //#warning Running DFU flash code on its own + on stdcore[0]: DFUHandler(dfuInterface, null); +#endif +#endif + +#if (XUA_NUM_PDM_MICS > 0) + /* PDM Mics running on a separate to AudioHub */ + on stdcore[PDM_TILE]: + { + mic_array_task(c_mic_pcm); + } +#endif /*XUA_NUM_PDM_MICS > 0*/ + } + + return 0; +} + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/module_security.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/module_security.c new file mode 100644 index 0000000..3de2c3d --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/module_security.c @@ -0,0 +1,120 @@ +#define DEBUG_PRINT_ENABLE 0 +#include +#include +#include + +#include "debug_print.h" + + +#define ID_ADDR 0x000001E0 + +#define MODULE_INVALID_KEY 0xFFFFFFFF + +#define MODULE_BASE_KEY_XU316_MODULE 0x69C2EDAE + +#define MODULE_FEATURE_ONE_KEY_ADDR 0x00000102 + +// This function checks two consecutive OTP addresses. +// The first address must contain the key defined in expected_key or one of the keys listed in key_list +// The second address must store the bit-inverse value of the first address. This check is only performed if we don't use MODULE_BASE_KEY_XVF3600 and MODULE_BASE_KEY_VOICE_L71 +int check_and_program_addresses(uint32_t address, uint32_t expected_key, unsigned int * returned_key_p, unsigned program, unsigned disable_jtag){ + OTPPorts otp = OTP_PORTS_INITIALIZER; + uint32_t ret = 0; + + // Reading from the OTP + port_enable(otp.otp_data_g); + + if (expected_key != MODULE_INVALID_KEY && program == 1) + { + otp_read_differential(&otp, address, returned_key_p, 1); + if ( *returned_key_p == 0) + { + *returned_key_p = expected_key; + printf("program key .... \n"); + otp_program_differential(&otp, address, returned_key_p, 1); + } + } + + otp_read_differential(&otp, address, returned_key_p, 1); + if ( *returned_key_p == expected_key) + { + ret = 1; + } + +#if 0 + for(int i = 0; i < 0x400; i ++) + { + otp_read_differential(&otp, i, returned_key_p, 1); + if (*returned_key_p != 0) + { + if (*returned_key_p == expected_key) + { + ret = 1; + } + printf("addr[%04x], %08x\n", i, *returned_key_p); + } + } + +#endif + + if (disable_jtag) + { + otp_read_differential(&otp, 0x0, returned_key_p, 1); + if ( *returned_key_p == 0) + { + *returned_key_p = 0x1; + printf("diable_jtag .... \n"); + otp_program_differential(&otp, 0, returned_key_p, 1); + } + + } + port_disable(otp.otp_data_g); + + return ret; +} + +int module_security_bootup_check(void) +{ + unsigned int data; + int ret = 0; + int program = 0; + unsigned disable_jtag = 0; + + /* ************************************ + * Step 1 - Check base key + * ************************************/ + +#if PROGRAM_KEY + program = 1; +#endif + +#if DISABLE_JTAG + disable_jtag = 1; +#endif + ret = check_and_program_addresses(MODULE_FEATURE_ONE_KEY_ADDR, MODULE_BASE_KEY_XU316_MODULE, &data, program, disable_jtag); + + return ret; +} + +int read_addresses(uint32_t address, unsigned int * returned_key_p){ + OTPPorts otp = OTP_PORTS_INITIALIZER; + uint32_t ret = 0; + + port_enable(otp.otp_data_g); + + otp_read_differential(&otp, address, returned_key_p, 1); + debug_printf("%08x : %08x\n", address,*returned_key_p); + + port_disable(otp.otp_data_g); + + return ret; +} + + +unsigned int read_key(void) +{ + unsigned int data = 0; + read_addresses(ID_ADDR, &data); + return data; +} + diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/module_security.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/module_security.h new file mode 100644 index 0000000..f7a3e47 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/module_security.h @@ -0,0 +1,29 @@ +#ifndef MODULE_SECURITY_ +#define MODULE_SECURITY_ + +// Invalid timeout value to indicate security check has been performed +#define MODULE_TIMEOUT_INVALID ( 0xFFFFFFFF ) + +// Values used in security timeout for restricted operation mode +// The value below cannot be an integer, as for 16kHz it is 62.5 +#define MODULE_SECS_PER_MINUTE ( 60 ) +#define MODULE_KEY_CHECK_TIMEOUT_MINS ( 480 ) // 8 hours +#define MODULE_KEY_CHECK_TIMEOUT_SECS ( MODULE_KEY_CHECK_TIMEOUT_MINS * MODULE_SECS_PER_MINUTE ) // mins * secs_in_a_min + +/** + * @brief Check if a tile is authorised to run MODULE code at bootup + * + * @return 0 if check is successful + */ +int module_security_bootup_check(); + +/** + * @brief Check if a tile is authorised to run MODULE code after timeout. + * An exception is raised + * + * @param frame_count_p: frame count to check if timeout has occurred + * @return 0 if check is successful + */ +int module_security_timeout_check(unsigned int * frame_count_p); + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/nau88c21.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/nau88c21.h new file mode 100644 index 0000000..3f751a9 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/nau88c21.h @@ -0,0 +1,98 @@ +/* + * + * nau88c22.h + * + */ + + +#ifndef NAU88C22_H_ +#define NAU88C22_H_ + +uint16_t nau88c22_registers[][4] = { +{0x00, 0x00, 0x00, 0x00}, +{0x00, 0x01, 0x0D, 0xFF}, +{0x00, 0x03, 0x20, 0x50}, +{0x00, 0x04, 0x00, 0x00}, +{0x00, 0x05, 0x00, 0xBC}, +{0x00, 0x06, 0x00, 0x08}, +{0x00, 0x07, 0x00, 0x10}, +{0x00, 0x08, 0x40, 0x00}, +{0x00, 0x09, 0x69, 0x00}, +{0x00, 0x0A, 0x00, 0x31}, +{0x00, 0x0B, 0x26, 0xE9}, +{0x00, 0x0D, 0xC0, 0x00}, +{0x00, 0x0F, 0x00, 0x00}, +{0x00, 0x10, 0x00, 0x00}, +{0x00, 0x11, 0x00, 0x00}, +{0x00, 0x12, 0xFF, 0xFF}, +{0x00, 0x13, 0x00, 0x00}, +{0x00, 0x1A, 0x00, 0x00}, +{0x00, 0x1B, 0x00, 0x00}, +{0x00, 0x1C, 0x00, 0x0E}, +{0x00, 0x1D, 0x20, 0x02}, +{0x00, 0x1E, 0x00, 0x00}, +{0x00, 0x1F, 0x00, 0x00}, +{0x00, 0x21, 0x00, 0x00}, +{0x00, 0x22, 0x00, 0x00}, +{0x00, 0x23, 0x00, 0x00}, +{0x00, 0x24, 0x00, 0x00}, +{0x00, 0x25, 0x00, 0x00}, +{0x00, 0x26, 0x00, 0x00}, +{0x00, 0x27, 0x00, 0x00}, +{0x00, 0x28, 0x00, 0x00}, +{0x00, 0x29, 0x00, 0x00}, +{0x00, 0x2A, 0x00, 0x00}, +{0x00, 0x2B, 0x40, 0x02}, // ADC Right Channel Source Select, bit 3, set to 1, 3rd byte 0x40 = Latch left channel analog data input into the right channel filter +{0x00, 0x2C, 0x00, 0x82}, +{0x00, 0x2D, 0x00, 0x00}, +{0x00, 0x2F, 0x00, 0x00}, +{0x00, 0x30, 0x00, 0x40}, +{0x00, 0x31, 0x00, 0x00}, +{0x00, 0x32, 0x00, 0x00}, +{0x00, 0x34, 0xCF, 0xCF}, +{0x00, 0x35, 0xCF, 0xCF}, +{0x00, 0x36, 0x14, 0x86}, +{0x00, 0x37, 0x0F, 0x12}, +{0x00, 0x38, 0x25, 0xFF}, +{0x00, 0x39, 0x34, 0x57}, +{0x00, 0x3A, 0x14, 0x86}, +{0x00, 0x3B, 0x0F, 0x12}, +{0x00, 0x3C, 0x25, 0xF9}, +{0x00, 0x3D, 0x34, 0x57}, +{0x00, 0x41, 0x00, 0x00}, +{0x00, 0x42, 0x00, 0x00}, +{0x00, 0x43, 0x00, 0x00}, +{0x00, 0x44, 0x00, 0x00}, +{0x00, 0x45, 0x00, 0x00}, +{0x00, 0x46, 0x00, 0x00}, +{0x00, 0x47, 0x00, 0x00}, +{0x00, 0x48, 0x00, 0x00}, +{0x00, 0x49, 0x00, 0x00}, +{0x00, 0x4A, 0x00, 0x00}, +{0x00, 0x4B, 0x20, 0x07}, +{0x00, 0x4C, 0x00, 0x00}, +{0x00, 0x4D, 0x00, 0x00}, +{0x00, 0x53, 0x02, 0x78}, +{0x00, 0x54, 0x00, 0x02}, +{0x00, 0x55, 0x00, 0x00}, +{0x00, 0x58, 0x1B, 0x22}, +{0x00, 0x59, 0x20, 0x00}, +{0x00, 0x66, 0x00, 0x60}, +{0x00, 0x68, 0x00, 0x00}, +{0x00, 0x69, 0x00, 0x00}, +{0x00, 0x6A, 0x10, 0x03}, +{0x00, 0x6B, 0x00, 0x00}, +{0x00, 0x71, 0x00, 0x11}, +{0x00, 0x72, 0x04, 0x70}, +{0x00, 0x73, 0x33, 0x08}, +{0x00, 0x74, 0x15, 0x06}, +{0x00, 0x76, 0x31, 0x40}, +{0x00, 0x77, 0x00, 0x12}, +{0x00, 0x7E, 0x01, 0x01}, +{0x00, 0x7F, 0xC0, 0x3F}, +{0x00, 0x80, 0x07, 0x20}, +{0x00, 0x81, 0x00, 0x08}, +{0x00, 0x82, 0x00, 0x60}, +}; + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/program_key.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/program_key.c new file mode 100644 index 0000000..f5ed25f --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/program_key.c @@ -0,0 +1,655 @@ +#if UART_DEBUG || DEBUG_MEMORY_LOG_ENABLED +#define DEBUG_PRINT_ENABLE 1 +#endif + +#include +#include "debug_print.h" +#include +#include +#include +#include "hmac.h" +#include "xua_conf.h" + + +#define WRITE_ENABLE_COMMAND (0x06) +#define WRITE_DISABLE_COMMAND (0x04) + +#define ERASE_CHIP_COMMAND (0xC7) + + +#define READ_STATUS_REG_COMMAND (0x05) +#define READ_ID_COMMAND (0x9F) + +#define READ_UID_COMMAND (0x4B) + +#define WRITE_ENABLE_STATUS_COMMAND (0x50) + +#define WRITE_STATUS_REG1_COMMAND (0x01) +#define READ_STATUS_REG2_COMMAND (0x35) +#define WRITE_STATUS_REG2_COMMAND (0x31) +#define READ_STATUS_REG3_COMMAND (0x15) +#define WRITE_STATUS_REG3_COMMAND (0x11) + +#define RDSTATUS_COMMAND (0x35) +#define WRSTATUS_COMMAND (0x31) + +#define PRSCUR_COMMAND (0x42) +#define ERSCUR_COMMAND (0x44) +#define RDSCUR_COMMAND (0x48) +#define KEY_BLOCK_LEN 100 +#define HMAC_GEN_LEN 20 + + +extern unsigned short XUA_Endpoint0_getProductId(); +extern unsigned short XUA_Endpoint0_getVendorId(); + +unsigned char hid_reply[64] = {0}; + +void printArrayHex1(uint8_t array[], int size, int elementsPerLine) { + for (int i = 0; i < size; i++) { + debug_printf("0x%x ", array[i]); + + // 在达到每行元素个数时换行 + if ((i + 1) % elementsPerLine == 0) { + debug_printf("\n"); + } + } + debug_printf("\n"); +} + +#define settw(a,b) {__asm__ __volatile__("settw res[%0], %1": : "r" (a) , "r" (b));} +#define setc(a,b) {__asm__ __volatile__("setc res[%0], %1": : "r" (a) , "r" (b));} +#define setclk(a,b) {__asm__ __volatile__("setclk res[%0], %1": : "r" (a) , "r" (b));} +#define portin(a,b) {__asm__ __volatile__("in %0, res[%1]": "=r" (b) : "r" (a));} +#define portout(a,b) {__asm__ __volatile__("out res[%0], %1": : "r" (a) , "r" (b));} + +#ifdef DFU_FLASH_DEVICE + +#if (XUA_QUAD_SPI_FLASH) +/* Using specified flash device rather than all supported in tools */ +fl_QuadDeviceSpec opt_flash_devices[] = {DFU_FLASH_DEVICE}; +#else +/* Using specified flash device rather than all supported in tools */ +fl_DeviceSpec opt_flash_devices[] = {DFU_FLASH_DEVICE}; +#endif +#endif + +/* +typedef struct { + out port qspiCS; + out port qspiSCLK; + out buffered port:32 qspiSIO; + clock qspiClkblk; +} fl_QSPIPorts; +*/ +fl_QSPIPorts p_qflash_tile0 = +{ + XS1_PORT_1B, + XS1_PORT_1C, + XS1_PORT_4B, + XS1_CLKBLK_1 +}; + +fl_QSPIPorts p_qflash_tile1 = +{ + XS1_PORT_1F, + XS1_PORT_1G, + XS1_PORT_4D, + XS1_CLKBLK_1 +}; + +/* return 1 for opened ports successfully */ +int flash_opt_enable_ports(fl_QSPIPorts *p_qflash) +{ + int result = 0; + +#ifdef DFU_FLASH_DEVICE + result = fl_connectToDevice(p_qflash, opt_flash_devices, sizeof(opt_flash_devices) / sizeof(fl_QuadDeviceSpec)); +#else + /* Use default flash list */ + result = fl_connect(p_qflash); +#endif + if (!result) + { + /* All okay.. */ + debug_printf("flash_opt_enable_ports success\n"); + return 1; + } + else + { + debug_printf("flash_opt_enable_ports failed\n"); + return 0; + } +} + +int flash_opt_disable_ports() +{ + fl_disconnect(); + return 1; +} + +void flash_cmd_opt(unsigned int cmd, + unsigned char input[], unsigned int num_in, + unsigned char output[], unsigned int num_out) +{ + fl_command(cmd,input,num_in,output, num_out); +} + +void flash_opt_erase() +{ + uint8_t cmd[4] = {0, 0x10, 0x0, 0}; + uint8_t data[4] = {0, 0x10, 0x0, 0}; + flash_cmd_opt(WRITE_ENABLE_COMMAND, cmd, 0, data, 0); + delay_milliseconds(1); + flash_cmd_opt(ERSCUR_COMMAND, cmd, 3, data, 0); + delay_milliseconds(50); +} + +void flash_opt_read_did(uint8_t data[], unsigned char len) +{ + uint8_t cmd[3] = {0x3, 0x10, 0x0}; + + flash_cmd_opt(READ_ID_COMMAND, cmd, 0, data, len); + // printArrayHex1(data, len, 20); +} + + +void flash_opt_unlock(void) +{ + uint8_t cmd[1] = {0}; + uint8_t data[1] = {0}; + uint8_t sr1, sr2, sr3; + uint8_t did[3]; + + /* Reason: 使用 tile0 端口连接 Flash,保持原有逻辑 */ + if (flash_opt_enable_ports(&p_qflash_tile0) == 0) { + debug_printf("flash_opt_unlock failed\n"); + return; + } + + /* Reason: 增加 Flash 厂商ID检查,仅针对 Winbond (0xEF) 执行特定解锁逻辑 */ + flash_opt_read_did(did, 3); + if (did[0] != 0xEF) + { + debug_printf("Not Winbond flash (DID: %02x), skip unlock\n", did[0]); + flash_opt_disable_ports(); + return; + } + + debug_printf("Unlock Winbond Flash...\n"); + + /* Reason: 解锁 Status Register 1。 + 参考 flash_api_ext.c 逻辑,清除 Bit 2-6 (BP0-BP4, TB, SEC) + Mask: 0x7C (0111 1100) */ + flash_cmd_opt(READ_STATUS_REG_COMMAND, cmd, 0, data, 1); + sr1 = data[0]; + if (sr1 & 0x7C) + { + debug_printf("Unlock SR1: %02x -> %02x\n", sr1, sr1 & ~0x7C); + flash_cmd_opt(WRITE_ENABLE_STATUS_COMMAND, cmd, 0, data, 0); + data[0] = sr1 & ~0x7C; + flash_cmd_opt(WRITE_STATUS_REG1_COMMAND, data, 1, cmd, 0); + delay_milliseconds(10); /* 等待写入完成 */ + } + + /* Reason: 解锁 Status Register 2。 + 参考 flash_api_ext.c 逻辑,清除 Bit 6 (CMP) + Mask: 0x40 (0100 0000) */ + flash_cmd_opt(READ_STATUS_REG2_COMMAND, cmd, 0, data, 1); + sr2 = data[0]; + if ((sr2 & 0x40) || ((sr2 & 0x2) == 0)) + { + debug_printf("Unlock SR2: %02x -> %02x\n", sr2, (sr2 & ~0x40) | 0x2); + flash_cmd_opt(WRITE_ENABLE_STATUS_COMMAND, cmd, 0, data, 0); + data[0] = (sr2 & ~0x40) | 0x2; + flash_cmd_opt(WRITE_STATUS_REG2_COMMAND, data, 1, cmd, 0); + delay_milliseconds(10); + } + + /* Reason: 解锁 Status Register 3。 + 参考 flash_api_ext.c 逻辑,清除 Bit 2 (WPS) + Mask: 0x04 (0000 0100) */ + flash_cmd_opt(READ_STATUS_REG3_COMMAND, cmd, 0, data, 1); + sr3 = data[0]; + if (sr3 & 0x04) + { + debug_printf("Unlock SR3: %02x -> %02x\n", sr3, sr3 & ~0x04); + flash_cmd_opt(WRITE_ENABLE_STATUS_COMMAND, cmd, 0, data, 0); + data[0] = sr3 & ~0x04; + flash_cmd_opt(WRITE_STATUS_REG3_COMMAND, data, 1, cmd, 0); + delay_milliseconds(10); + } + + flash_opt_disable_ports(); + debug_printf("Unlock Winbond Flash done\n"); +} + +void flash_opt_write2(uint8_t data[], unsigned char len) +{ + uint8_t d[1]; + uint8_t cmd[256] = {0, 0x10, 0x0}; + + for (int i = 0; i < len; i++) + { + cmd[i + 3] = data[i]; + } + + flash_opt_erase(); + flash_cmd_opt(WRITE_ENABLE_COMMAND, cmd, 0, d, 0); + flash_cmd_opt(PRSCUR_COMMAND, cmd, 3 + len, d, 0); + delay_milliseconds(50); +} + +void flash_opt_read(uint8_t data[], unsigned char len) +{ + uint8_t cmd[3] = {0x00, 0x10, 0x00}; + + flash_cmd_opt(RDSCUR_COMMAND, cmd, 3, data, len); + debug_printf("read sec key:\n"); + printArrayHex1(data, len, 20); +} + +void flash_opt_read_uid(uint8_t data[], unsigned char len) +{ + uint8_t cmd[3] = {0x3, 0x10, 0x0}; + + flash_cmd_opt(READ_UID_COMMAND, cmd, 0, data, len); + printArrayHex1(data, len, 20); +} + +unsigned compare_buff_diff(const uint8_t* actual, const uint8_t* expected, unsigned len) +{ + for (int i = 0; i < len; ++i) + { + if (actual[i] != expected[i]) + { + debug_printf("compare_buff_diff: %d %02x %02x\n", i, actual[i], expected[i]); + return 0; + } + } + return 1; +} + + +void cal_hmac(uint8_t uid[], uint8_t did[], uint8_t hmac_bin[]) +{ + { + uint8_t key_bin[HMAC_GEN_LEN] = {0x76, 0x37, 0x0b, 0xb8, 0xbd, 0xe5, 0x54, 0x82, 0x8f, 0x13, 0x29, 0xa6, 0x26, 0x07, 0x2d, 0xe1, 0x11, 0x6c, 0xfb, 0x07}; + uint8_t msg_bin[HMAC_GEN_LEN]; + for (int i = 0; i < 3; i++) + { + msg_bin[i] = did[i]; + } + + for (int i = 3; i < 20; i++) + { + msg_bin[i] = uid[i]; + } + +#if 0 + printf("msg_bin: \n"); + printArrayHex1(msg_bin, HMAC_GEN_LEN, 20); +#endif + hmac_sha1(key_bin, HMAC_GEN_LEN, msg_bin, HMAC_GEN_LEN, hmac_bin); + +#if 0 +#endif + } +} + +uint8_t opt_key_read(uint8_t key[], unsigned offset) +{ + uint8_t read_bin[KEY_BLOCK_LEN + 1]; + uint8_t ret = 0; + + if (flash_opt_enable_ports(&p_qflash_tile0) == 0) + { + return 0; + } + + flash_opt_read(read_bin, KEY_BLOCK_LEN + 1); + for (int i = 0; i < 20; i++) + { + key[i] = read_bin[i + offset * 20 + 1]; + } + flash_opt_disable_ports(); + return 1; +} + +uint8_t key_verify_program(unsigned verify_write, uint8_t expected_bin[], unsigned offset) +{ + uint8_t read_bin[KEY_BLOCK_LEN + 1]; + uint8_t comp_bin[KEY_BLOCK_LEN + 1]; + uint8_t uid[20]; + uint8_t did[4]; + uint8_t ret = 0; + uint8_t hmac_bin[20]; + + flash_opt_read(read_bin, KEY_BLOCK_LEN + 1); + flash_opt_read_uid(uid, 20); + flash_opt_read_did(did, 3); + + + if (verify_write) + { + if (offset == 1) + { + cal_hmac(uid, did, hmac_bin); + if (compare_buff_diff(hmac_bin, expected_bin, 20) == 0) + { + return 0; + } + } + + for (int i = 0; i < 20; i++) + { + read_bin[i + offset * 20 + 1] = expected_bin[i]; + } + + flash_opt_write2(&read_bin[1], KEY_BLOCK_LEN); + delay_milliseconds(10); + + flash_opt_read(comp_bin, KEY_BLOCK_LEN + 1); + if (compare_buff_diff(&comp_bin[1], &read_bin[1], KEY_BLOCK_LEN) == 1) + { + debug_printf("compare OK\n"); + ret = 1; + } + } + else + { + + flash_opt_read(read_bin, KEY_BLOCK_LEN + 1); + if (compare_buff_diff(expected_bin, &read_bin[offset * 20 + 1], 20) == 1) + { + debug_printf("key_verified\n"); + ret = 1; + } + } + + return ret; +} + +void get_key_ret(uint8_t *buffer) +{ + //printf("get_key_ret2\n"); + for (int i = 0; i < 64; i ++) + { + buffer[i] = hid_reply[i]; + hid_reply[i] = 0; + } + + //printArrayHex1(buffer, 20, 20); +} + +static chanend_t g_flash_opt_c; + +void flash_opt_set_chan(chanend_t c) { + g_flash_opt_c = c; + //debug_printf("flash_opt_set_chan\n"); +} + +void flash_opt_exchange_buffer(uint8_t in[64], uint8_t out[64]) { + //debug_printf("flash_opt_exchange_buffer\n"); + chan_out_buf_byte (g_flash_opt_c , in, 40) ; + //debug_printf("flash_opt_exchange_buffer1\n"); + chan_in_buf_byte(g_flash_opt_c, out, 40); +} + + +uint8_t key_validate(uint8_t offset) +{ + uint8_t ret = 0; + uint8_t read_bin[KEY_BLOCK_LEN + 1]; + uint8_t uid[20]; + uint8_t did[4]; + uint8_t hmac_bin[20]; + + if (flash_opt_enable_ports(&p_qflash_tile0) == 0) + { + return 0; + } + + flash_opt_read(read_bin, KEY_BLOCK_LEN + 1); + flash_opt_read_uid(uid, 20); + flash_opt_read_did(did, 3); + + cal_hmac(uid, did, hmac_bin); + + if (compare_buff_diff(hmac_bin, &read_bin[offset * 20 + 1], 20) == 1) + { + debug_printf("key_verified\n"); + ret = 1; + } + + flash_opt_disable_ports(); + return ret; +} + + +void read_uid_did(uint8_t uid[]) +{ + if (flash_opt_enable_ports(&p_qflash_tile0) == 0) + { + return; + } + flash_opt_read_uid(uid, 20); + flash_opt_read_did(uid, 3); + flash_opt_disable_ports(); +} + + +void program_key(uint8_t *buffer, int datalength) +{ + if (buffer[0] == 0x77 && buffer[1] == 0x5B) + { + uint8_t ret = 0; + switch (buffer[2]) + { + case 1: + debug_printf("verify key\n"); + if (flash_opt_enable_ports(&p_qflash_tile0) == 0) + { + hid_reply[0] = 0; + } + else + { + ret = key_verify_program(0, &buffer[3], 1); + if (ret == 1) + { + hid_reply[0] = 0x55; + } + else + { + hid_reply[0] = 0; + } + flash_opt_disable_ports(); + } + break; + case 2: + debug_printf("write key\n"); + if (flash_opt_enable_ports(&p_qflash_tile0) == 0) + { + hid_reply[0] = 0; + } + else + { + ret = key_verify_program(1, &buffer[3], 1); + + debug_printf("write key ret %d\n", ret); + if (ret == 1) + { + hid_reply[0] = 0x55; + } + else + { + hid_reply[0] = 0; + } + flash_opt_disable_ports(); + } + + break; + case 3: + if (flash_opt_enable_ports(&p_qflash_tile0) == 0) + { + hid_reply[0] = 0; + } + else + { + flash_opt_read_did(&hid_reply[1], 3); + debug_printf("return did\n"); + hid_reply[0] = 0x55; + flash_opt_disable_ports(); + } + break; + case 4: + if (flash_opt_enable_ports(&p_qflash_tile0) == 0) + { + hid_reply[0] = 0; + } + else + { + debug_printf("return uid\n"); + flash_opt_read_uid(&hid_reply[1], 21); + hid_reply[0] = 0x55; + flash_opt_disable_ports(); + } + break; + case 5: + if (flash_opt_enable_ports(&p_qflash_tile0) == 0) + { + hid_reply[0] = 0; + } + else + { + debug_printf("erase key\n"); + flash_opt_erase(); + hid_reply[0] = 0x55; + flash_opt_disable_ports(); + } + break; + case 6: +#if XUA_USB_EN == 1 + debug_printf("get pid vid\n"); + unsigned short pid = XUA_Endpoint0_getProductId(); + unsigned short vid = XUA_Endpoint0_getVendorId(); + hid_reply[2] = (pid >> 8) & 0xff; + hid_reply[1] = pid & 0xff; + hid_reply[4] = (vid >> 8) & 0xff; + hid_reply[3] = vid & 0xff; + hid_reply[0] = 0x55; +#endif + break; + case 7: + debug_printf("write aizip key\n"); + if (flash_opt_enable_ports(&p_qflash_tile0) == 0) + { + hid_reply[0] = 0; + } + else + { + uint8_t ret = key_verify_program(1, &buffer[3], 0); + + debug_printf("write key ret %d\n", ret); + if (ret == 1) + { + hid_reply[0] = 0x55; + } + else + { + hid_reply[0] = 0; + } + flash_opt_disable_ports(); + } + break; + case 12: + debug_printf("verify aizip key\n"); + if (flash_opt_enable_ports(&p_qflash_tile0) == 0) + { + hid_reply[0] = 0; + } + else + { + ret = key_verify_program(0, &buffer[3], 0); + if (ret == 1) + { + hid_reply[0] = 0x55; + } + else + { + hid_reply[0] = 0; + } + flash_opt_disable_ports(); + } + break; + case 13: + case 15: + case 17: + case 19: + case 21: + case 23: + case 25: + case 27: + case 29: + case 31: + case 33: + debug_printf("write key offset %d\n", ((buffer[2] - 13) / 2) + 2); + if (flash_opt_enable_ports(&p_qflash_tile0) == 0) + { + hid_reply[0] = 0; + } + else + { + uint8_t ret = key_verify_program(1, &buffer[3], ((buffer[2] - 13) / 2) + 2); + + debug_printf("write key ret %d\n", ret); + if (ret == 1) + { + hid_reply[0] = 0x55; + } + else + { + hid_reply[0] = 0; + } + flash_opt_disable_ports(); + } + break; + case 14: + case 16: + case 18: + case 20: + case 22: + case 24: + case 26: + case 28: + case 30: + case 32: + case 34: + debug_printf("verify key offset %d\n", ((buffer[2] - 14) / 2) + 2); + if (flash_opt_enable_ports(&p_qflash_tile0) == 0) + { + hid_reply[0] = 0; + } + else + { + ret = key_verify_program(0, &buffer[3], ((buffer[2] - 14) / 2) + 2); + if (ret == 1) + { + hid_reply[0] = 0x55; + } + else + { + hid_reply[0] = 0; + } + flash_opt_disable_ports(); + } + + break; + case 8: + case 9: + case 10: + case 11: + break; + } + } +} diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/share_buffer.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/share_buffer.c new file mode 100644 index 0000000..f5d7d13 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/share_buffer.c @@ -0,0 +1,95 @@ +#include "share_buffer.h" +#define RING_BUFFER_SIZE 512 + +typedef struct { + int buffer[RING_BUFFER_SIZE]; + int head; + int tail; + int count; +} RingBuffer; + +// 两路环形缓冲区 +RingBuffer ring_buffers[4]; + +// 初始化环形缓冲区 +void init_ring_buffer(int channel) { + if (channel < 0 || channel > 1) return; + + ring_buffers[channel].head = 0; + ring_buffers[channel].tail = 0; + ring_buffers[channel].count = 0; +} + +// 初始化所有环形缓冲区 +void init_all_ring_buffers() { + init_ring_buffer(0); + init_ring_buffer(1); +} + +// 判断环形缓冲区是否为空 +int is_ring_buffer_empty(int channel) { + if (channel < 0 || channel > 3) return 1; + + return (ring_buffers[channel].count == 0); +} + +// 判断环形缓冲区是否已满 +int is_ring_buffer_full(int channel) { + if (channel < 0 || channel > 3) return 0; + + return (ring_buffers[channel].count == RING_BUFFER_SIZE); +} + +// 获取环形缓冲区中的数据数量 +int get_ring_buffer_count(int channel) { + if (channel < 0 || channel > 3) return 0; + + return ring_buffers[channel].count; +} + +// 向环形缓冲区写入数据 +int write_to_ring_buffer(int channel, int value) { + if (channel < 0 || channel > 3) return -1; + + if (is_ring_buffer_full(channel)) { + return -1; // 缓冲区已满 + } + + ring_buffers[channel].buffer[ring_buffers[channel].head] = value; + ring_buffers[channel].head = (ring_buffers[channel].head + 1) % RING_BUFFER_SIZE; + ring_buffers[channel].count++; + + return 0; // 写入成功 +} + +// 从环形缓冲区读取数据 +int read_from_ring_buffer(int channel) { + int value = 0; + if (channel == 0 || channel == 1 || channel == 2 || channel == 3) { + if (is_ring_buffer_empty(channel)) { + return 0; + } + + value = ring_buffers[channel].buffer[ring_buffers[channel].tail]; + ring_buffers[channel].tail = (ring_buffers[channel].tail + 1) % RING_BUFFER_SIZE; + ring_buffers[channel].count--; + } + return value; +} + +// 清空环形缓冲区 +void clear_ring_buffer(int channel) { + if (channel < 0 || channel > 3) return; + + ring_buffers[channel].head = 0; + ring_buffers[channel].tail = 0; + ring_buffers[channel].count = 0; +} + +// 清空所有环形缓冲区 +void clear_all_ring_buffers() { + clear_ring_buffer(0); + clear_ring_buffer(1); + clear_ring_buffer(2); + clear_ring_buffer(3); +} diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/share_buffer.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/share_buffer.h new file mode 100644 index 0000000..1db56cb --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/share_buffer.h @@ -0,0 +1,10 @@ + +void init_ring_buffer(int channel); +void init_all_ring_buffers(); +int is_ring_buffer_empty(int channel); +int is_ring_buffer_full(int channel); +int get_ring_buffer_count(int channel); +int write_to_ring_buffer(int channel, int value); +int read_from_ring_buffer(int channel); +void clear_ring_buffer(int channel); +void clear_all_ring_buffers(); \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/uart_protocol.md b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/uart_protocol.md new file mode 100644 index 0000000..dccd516 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/uart_protocol.md @@ -0,0 +1,1332 @@ +# EQ 串口通信协议详细文档 + +## 1. 总体框架 + +### 1.1 协议概述 +EQ Designer使用串口协议进行MCU与XU316之间的通信。协议基于XU316零代码协议规范,支持EQ参数设置、读取、模式切换等功能。 + +### 1.2 串口协议基础规范 +- **波特率**: 115200 bps +- **数据位**: 8位 +- **停止位**: 1位 +- **校验位**: 无 +- **帧格式**: 55 AA [版本] [命令] [数据长度] [数据] [校验和] + +### 1.3 EQ命令列表 +| 命令码 | 命令名称 | 功能 | 方向 | 描述 | +|--------|----------|------|------|------| +| 0x26 | SET_DAC_VOLUME | 设置DAC音量 | MCU→XU316 | 设置DAC输出音量级别(0-255) | +| 0x30 | SET_ADC_VOLUME | 设置ADC音量 | MCU→XU316 | 设置ADC输入音量级别 | +| 0x31 | SET_ADC_LOOP | 设置ADC环路 | MCU→XU316 | 设置ADC环路模式 | +| 0x33 | SET_3D_FPS | 设置3D FPS | MCU→XU316 | 设置3D FPS音效模式(仅UAC1模式支持) | +| 0x34 | SET_LED_MODE | 设置LED模式 | MCU→XU316 | 设置LED显示模式 | +| 0x40 | SET_EQ_MODE | 切换EQ模式 | MCU→XU316 | 切换EQ模式 | +| 0x41 | GET_EQ_MODE | 获取当前EQ模式信息 | MCU→XU316 | 读取XU316当前EQ模式和名称 | +| 0x42 | SET_MODE_GAIN_AND_NAME | 设置模式整体增益和名称 | MCU→XU316 | 设置模式整体增益和名称 | +| 0x43 | SET_EQ_PARAMS | 发送EQ参数 | MCU→XU316 | 发送单个滤波器的参数 | +| 0x44 | GET_EQ_PARAMS | 读取EQ参数 | MCU→XU316 | 读取单个滤波器的参数 | +| 0x45 | GET_DEVICE_INFO | 获取XU316信息 | MCU→XU316 | 读取XU316PID、VID、产品字符串等信息 | +| 0x46 | RESET_EQ_PARAMS | 复位EQ参数 | MCU→XU316 | 删除Flash中的EQ参数并恢复头文件预设参数 | +| 0x47 | GET_EQ_MODE_COUNT | 获取EQ模式总数 | MCU→XU316 | 返回预定义加用户模式的总数(不包含禁用模式) | +| 0x48 | SET_AND_SAVE_EQ_MODE | 设置并保存EQ模式 | MCU→XU316 | 设置当前EQ模式(0-9)并保存到Flash,开机时自动恢复 | +| 0x49 | SET_VOLUME | 设置音量级别 | MCU→XU316 | 设置XU316音量级别(0-255) | +| 0x4A | GET_VOLUME | 获取音量级别 | MCU→XU316 | 读取XU316当前音量级别(0-255) | +| 0x4B | GET_LED_INFO | 获取LED信息 | MCU→XU316 | 读取LED索引和LED名称 | +| 0x4C | SET_LED_SWITCH | 设置LED开关 | MCU→XU316 | 设置LED开关状态(ON/OFF) | +| 0x4D | GET_LED_SWITCH | 获取LED开关 | MCU→XU316 | 读取LED开关状态(ON/OFF) | +| 0x4E | GET_LED_STATUS | 获取LED状态 | MCU→XU316 | 读取LED RGB颜色和状态(熄灭、常亮、慢闪、快闪、呼吸) | +| 0x4F | GET_LED_COUNT | 获取LED总数 | MCU→XU316 | 读取XU316支持的LED总数 | +| 0x50 | GET_UAC_MODE_INFO | 获取UAC模式信息 | MCU→XU316 | 读取UAC模式总数和模式名称列表 | +| 0x51 | SET_UAC_MODE | 设置UAC模式 | MCU→XU316 | 设置UAC模式(UAC1.0/UAC2.0) | +| 0x52 | GET_CURRENT_UAC_MODE | 获取当前UAC模式 | MCU→XU316 | 读取当前UAC模式(UAC1.0/UAC2.0) | +| 0x53 | SET_EQ_ENABLE | 设置EQ使能开关 | MCU→XU316 | 设置EQ使能开关(ON/OFF),禁用时保存当前模式,启用时恢复之前模式 | +| 0x54 | GET_EQ_ENABLE | 获取EQ使能开关 | MCU→XU316 | 读取EQ使能开关状态(ON/OFF) | +| 0x55 | GET_SAMPLE_FORMAT | 获取采样率和格式 | MCU→XU316 | 读取当前采样率、DSD模式和DAC采样分辨率 | +| 0x5A | SET_GAME_MODE | 设置游戏模式 | XU316→MCU | 设置游戏模式(0=无音效,1=FPS,2=虚拟7.1) | +| 0x5C | GET_FIRMWARE_VERSION | 获取固件版本 | MCU→XU316 | 读取XU316固件版本号(BCD格式:主版本.次版本.修订版本) | +| 0x5D | SET_INPUT_SOURCE | 设置输入源模式 | XU316→MCU | 设置输入源模式(0=USB, 1=OPT, 2=COAX),由HID 0xB0触发后XMOS透传给MCU | +| 0x5E | SET_MUTE_SWITCH | 设置静音开关 | XU316→MCU | 设置静音开关(0=关,1=开),由HID 0xB1触发后XMOS透传给MCU | +| 0x5F | GET_MUTE_SWITCH | 获取静音开关 | XU316↔MCU | 请求:XMOS发0x5F(无数据)给MCU;响应:MCU返回0x5F+1字节静音值给XMOS | +| 0x60 | SET_LISTEN_SWITCH | 设置监听开关 | XU316→MCU | 设置监听开关(0=关,1=开),由HID 0xB3触发后XMOS透传给MCU | +| 0x61 | SET_MCU_MUTE_STATE | 设置MCU静音状态 | MCU→XU316 | 从MCU设置静音状态给XU316 | +| 0x62 | FIRMWARE_UPGRADE_NOTIFY | 固件升级状态通知 | XU316→MCU | XU316 在固件升级开始/结束时主动下发给 MCU,数据 1 字节:1=升级开始,2=升级结束成功,3=升级结束(中止/失败) | + +### 1.4 固件升级与 UART 分工说明 +- **FIRMWARE_UPGRADE_START (0xA7)**:由 HID/主机发起,在 XU316 的 **AudioHwRemote2** 线程中执行(含 Flash 擦除与 begin_write),响应仍通过 HID 上报;成功后 XU316 会向 MCU 发送 **0x62 固件升级状态通知(状态=1,升级开始)**。 +- **其余固件升级命令(0xA8 DATA、0xA9 END、0xAA STATUS、0xAB ABORT、0xAC ERASE)**:在 **process_send_params** 中直接处理,不再经 UART 线程转发;响应通过 HID 上报。 +- **升级结束**:当升级正常结束(END 成功)或中止(ABORT)时,XU316 会向 MCU 发送 **0x62 固件升级状态通知(状态=2 成功 / 3 中止)**。 + +### 1.5 数据包格式 +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 版本 | 协议版本 (0x00或0x01,根据命令类型) +3 | 1 | 命令 | 命令码 (0x26, 0x30-0x31, 0x33-0x34, 0x40-0x62 等) +4 | 1 | 长度 | 数据长度 +5-N | N | 数据 | 命令数据 +N+1 | 1 | 校验 | 校验和 +``` + +## 2. 详细指令说明 + +### 2.0 0x62 - FIRMWARE_UPGRADE_NOTIFY(固件升级状态通知) +**功能**: XU316 在固件升级开始或结束时主动向 MCU 发送,便于 MCU 显示进度、提示用户或禁止其它操作。 +**方向**: XU316→MCU(单向,无需 MCU 回复) + +**数据包格式**(XU316 发出): +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x01 | 版本 +3 | 1 | 0x62 | 命令码 FIRMWARE_UPGRADE_NOTIFY +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 状态:1=升级开始,2=升级结束成功,3=升级结束(中止/失败) +6 | 1 | 校验 | 校验和 +``` + +**发送时机**: +- **状态=1(升级开始)**:HID 收到 FIRMWARE_UPGRADE_START(0xA7) 且在 AudioHwRemote2 中执行成功后发送。 +- **状态=2(升级结束成功)**:HID 收到 FIRMWARE_UPGRADE_END(0xA9) 且校验、写 Flash 全部成功后发送。 +- **状态=3(升级结束中止/失败)**:HID 收到 FIRMWARE_UPGRADE_ABORT(0xAB) 并完成清理后发送。 + +**MCU 建议**:收到状态 1 后可显示“固件升级中”并避免进入省电/关机;收到 2 或 3 后恢复常态,收到 2 可提示“升级成功”,收到 3 可提示“升级已取消/失败”。 + +### 2.1 0x26 - SET_DAC_VOLUME (设置DAC音量) +**功能**: 设置DAC输出音量级别 +**方向**: MCU→XU316 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x01 | 版本 +3 | 1 | 0x26 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 音量级别 (0-255: 0=最小音量, 255=最大音量) +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- 直接设置 `g_dac_vol = data[5]` +- 发送确认响应 + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x01 | 版本 +3 | 1 | 0x26 | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +### 2.2 0x30 - SET_ADC_VOLUME (设置ADC音量) +**功能**: 设置ADC输入音量级别 +**方向**: MCU→XU316 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x01 | 版本 +3 | 1 | 0x30 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | ADC音量级别 +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- 设置 `g_adc_vol = data[5]` +- 发送确认响应 + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x01 | 版本 +3 | 1 | 0x30 | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +### 2.3 0x31 - SET_ADC_LOOP (设置ADC环路) +**功能**: 设置ADC环路模式 +**方向**: MCU→XU316 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x01 | 版本 +3 | 1 | 0x31 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | ADC环路模式值 +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- 设置 `g_adc_loop = data[5]` +- 发送确认响应 + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x01 | 版本 +3 | 1 | 0x31 | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +### 2.4 0x33 - SET_3D_FPS (设置3D FPS) +**功能**: 设置3D FPS音效模式(仅UAC1模式支持) +**方向**: MCU→XU316 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x01 | 版本 +3 | 1 | 0x33 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 3D FPS模式值 +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- 设置 `g_3d_fps = data[5]` +- 发送确认响应 +- 注意:此命令仅在UAC1模式下有效 + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x01 | 版本 +3 | 1 | 0x33 | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +### 2.5 0x34 - SET_LED_MODE (设置LED模式) +**功能**: 设置LED显示模式 +**方向**: MCU→XU316 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x01 | 版本 +3 | 1 | 0x34 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | LED模式值 +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- 设置 `g_led_mode = data[5]` +- 发送确认响应 + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x01 | 版本 +3 | 1 | 0x34 | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +### 2.6 0x40 - SET_EQ_MODE (切换EQ模式) +**功能**: 切换当前EQ模式 +**方向**: MCU→XU316 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x40 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 模式值 (0-5: 预设模式, 6-8: 用户模式, 9: bypass) +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- 直接设置 `g_current_eq_mode = data[5]` +- 不进行参数传输或计算 + +### 2.7 0x41 - GET_EQ_MODE (读取EQ模式信息) +**功能**: 读取EQ模式信息 +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x41 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 模式值 (0-9: 有效模式值, 0xFF: 获取当前模式信息) +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- 如果mode值为0xFF,返回当前模式值、整体增益和模式名称 +- 如果mode值为有效模式值(0-9),返回指定模式值、整体增益和模式名称 + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x41 | 命令码 +4 | 1 | 0x15 | 数据长度 (21字节) +5 | 1 | uint8 | 模式值 (当前模式或指定模式) +6-9 | 4 | int32 | 增益值 (范围0到-50dB,有符号整数) +10-25 | 16 | char | 模式名称 (UTF-8编码,16字节) +26 | 1 | 校验 | 校验和 +``` + +**使用说明**: +- 发送mode=0xFF时,返回当前激活的EQ模式信息 +- 发送mode=0-9时,返回指定模式的增益和名称信息(不切换当前模式) + +### 2.8 0x42 - SET_MODE_GAIN_AND_NAME (设置模式整体增益和名称) +**功能**: 设置EQ模式整体增益和名称 +**方向**: MCU→XU316 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x42 | 命令码 +4 | 1 | 0x15 | 数据长度 (21字节) +5 | 1 | uint8 | 模式值 (0-9) +6-9 | 4 | int32 | 增益值 (范围0到-50dB,有符号整数) +10-25 | 16 | char | 模式名称 (UTF-8编码,16字节) +26 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +1. 解析模式值、增益值和模式名称 +2. 设置指定模式的EQ整体增益和名称到所有采样率的左右通道 +3. 支持所有采样率:44100, 48000, 88200, 96000, 176400, 192000 Hz + +### 2.9 0x43 - SET_EQ_PARAMS (发送EQ参数) +**功能**: 发送单个滤波器的参数 +**方向**: MCU→XU316 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x43 | 命令码 +4 | 1 | 0x13 | 数据长度 (19字节: 1字节模式 + 1字节索引 + 1字节类型 + 4个float参数共16字节) +5 | 1 | uint8 | 模式值 (0-9) +6 | 1 | uint8 | 滤波器Band索引 (0-7) +7 | 1 | uint8 | 滤波器类型 +8-11 | 4 | float | 中心频率 (Hz) +12-15 | 4 | float | Q值 +16-19 | 4 | float | 带宽 (Hz) +20-23 | 4 | float | 增益 (dB) +24 | 1 | 校验 | 校验和 +``` + +**滤波器类型码**: +| 类型码 | 滤波器类型 | +|--------|------------| +| 0x00 | bypass滤波器 | +| 0x01 | 全通滤波器 | +| 0x02 | 峰值滤波器 | +| 0x03 | 低通滤波器 | +| 0x04 | 高通滤波器 | +| 0x05 | 带通滤波器 | +| 0x06 | 带阻滤波器 | +| 0x07 | 陷波滤波器 | +| 0x08 | 恒定Q值滤波器 | +| 0x09 | 低架滤波器 | +| 0x0A | 高架滤波器 | + +**XU316端处理**: +1. 解析参数并存储到所有采样率的对应模式中 +2. 调用 `eq_calculate_coefficients_from_params()` 计算系数 +3. 存储计算出的系数到所有采样率的对应模式中 +4. 自动应用到所有采样率:44100, 48000, 88200, 96000, 176400, 192000 Hz + +### 2.10 0x44 - GET_EQ_PARAMS (读取EQ参数) +**功能**: 读取单个滤波器的参数 +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x44 | 命令码 +4 | 1 | 0x02 | 数据长度 +5 | 1 | uint8 | 模式值 (0-9) +6 | 1 | uint8 | EQ索引 (0-7) +7 | 1 | 校验 | 校验和 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x44 | 命令码 +4 | 1 | 0x13 | 数据长度 (19字节: 1字节模式 + 1字节索引 + 1字节类型 + 4个float参数共16字节) +5 | 1 | uint8 | 模式值 (0-9) +6 | 1 | uint8 | 滤波器Band索引 (0-7) +7 | 1 | uint8 | 滤波器类型 +8-11 | 4 | float | 中心频率 (Hz) +12-15 | 4 | float | Q值 +16-19 | 4 | float | 带宽 (Hz) +20-23 | 4 | float | 增益 (dB) +24 | 1 | 校验 | 校验和 +``` + +### 2.11 0x45 - GET_DEVICE_INFO (获取XU316信息) +**功能**: 获取XU316基本信息 +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x55 | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x55 | 命令码 +4 | 1 | 0x34 | 数据长度 (52字节: 2字节PID + 2字节VID + 16字节产品 + 16字节厂商 + 16字节序列号) +5-6 | 2 | uint16 | 产品ID (PID, 小端序) +7-8 | 2 | uint16 | 厂商ID (VID, 小端序) +9-24 | 16 | char | 产品字符串 (UTF-8编码,16字节) +25-40 | 16 | char | 厂商字符串 (UTF-8编码,16字节) +41-56 | 16 | char | 序列号字符串 (UTF-8编码,16字节) +57 | 1 | 校验 | 校验和 +``` + +### 2.12 0x46 - RESET_EQ_PARAMS (复位EQ参数) +**功能**: 删除客户定制EQ参数并恢复预设参数 +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x56 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 模式号 (0-9, 0xFF表示恢复所有包括EQ参数,总体增益,模式名称 ) +6 | 1 | 校验 | 校验和 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x56 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 状态码 (0x00=成功, 0x01=失败) +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +1. 删除指定模式在Flash中存储的EQ参数文件 +2. 删除增益和模式名称的Flash存储文件 +3. 恢复该模式的头文件预设参数 +4. 如果模式号为0xFF,则复位所有模式 +5. 返回操作状态 + +### 2.13 0x47 - GET_EQ_MODE_COUNT (获取EQ模式总数) +**功能**: 获取预定义加用户模式的总数(不包含禁用模式) +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x57 | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x57 | 命令码 +4 | 1 | 0x02 | 数据长度 (2字节) +5 | 1 | uint8 | 模式总数 (当前为9,包含0-8共9个模式,不包含禁用模式) +6 | 1 | uint8 | 预定义模式数量 (当前为6,包含0-5共6个预设模式) +7 | 1 | 校验 | 校验和 +``` + +### 2.14 0x48 - SET_AND_SAVE_EQ_MODE (设置并保存EQ模式) +**功能**: 设置当前EQ模式并保存到Flash,开机时自动恢复 +**方向**: MCU→XU316 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x58 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 模式值 (0-9: 0-5预设模式, 6-8用户模式, 9: bypass) +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- 将模式值保存到Flash +- 开机时自动从Flash读取并恢复该模式 + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x58 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 状态码 (0x00=成功, 0x01=失败) +6 | 1 | 校验 | 校验和 +``` + +### 2.15 0x49 - SET_VOLUME (设置音量级别) +**功能**: 设置XU316音量级别 +**方向**: MCU→XU316 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x59 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 音量级别 (0-255: 0=最小音量, 255=最大音量) +6 | 1 | 校验 | 校验和 +``` + +**参数说明**: +- **音量级别范围:** 0-255(共256级) +- **说明:** 控制XU316的输出音量级别,直接设置g_dac_vol全局变量 + - 0: 最小音量 + - 255: 最大音量 + - 与SET_DAC_VOLUME命令使用相同的实现方式 + +**XU316端处理**: +- 直接设置 `g_dac_vol = data[5]`,与SET_DAC_VOLUME命令实现方式一致 +- 参数会通过现有的定时保存机制自动保存到Flash + +### 2.16 0x4A - GET_VOLUME (获取音量级别) +**功能**: 读取XU316当前音量级别 +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x5A | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x5A | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 当前音量级别 (0-255) +6 | 1 | 校验 | 校验和 +``` + +### 2.17 0x4B - GET_LED_INFO (获取LED信息) +**功能**: 读取LED索引和LED名称 +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x5B | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | LED索引 (0-7,当前XU316只有1个LED,索引为0) +6 | 1 | 校验 | 校验和 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x5B | 命令码 +4 | 1 | 0x11 | 数据长度 (17字节) +5 | 1 | uint8 | LED索引 (0-7) +6-21 | 16 | char | LED名称 (UTF-8编码,16字节) +22 | 1 | 校验 | 校验和 +``` + +### 2.18 0x4C - SET_LED_SWITCH (设置LED开关) +**功能**: 设置LED开关状态 +**方向**: MCU→XU316 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x5C | 命令码 +4 | 1 | 0x02 | 数据长度 +5 | 1 | uint8 | LED索引 (0-7,当前XU316只有1个LED,索引为0) +6 | 1 | uint8 | LED开关 (0=OFF关闭, 1=ON开启) +7 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- 当LED开关为OFF时,所有LED输出都被禁用,不显示任何LED +- 当LED开关为ON时,LED正常显示 + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x5C | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 状态码 (0x00=成功, 0x01=失败) +6 | 1 | 校验 | 校验和 +``` + +### 2.19 0x4D - GET_LED_SWITCH (获取LED开关) +**功能**: 读取LED开关状态 +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x4D | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | LED索引 (0-7,当前XU316只有1个LED,索引为0) +6 | 1 | 校验 | 校验和 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x4D | 命令码 +4 | 1 | 0x02 | 数据长度 +5 | 1 | uint8 | LED索引 (0-7) +6 | 1 | uint8 | LED开关 (0=OFF关闭, 1=ON开启) +7 | 1 | 校验 | 校验和 +``` + +### 2.20 0x4E - GET_LED_STATUS (获取LED状态) +**功能**: 读取LED RGB颜色和状态 +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x4E | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | LED索引 (0-7,当前XU316只有1个LED,索引为0) +6 | 1 | 校验 | 校验和 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x4E | 命令码 +4 | 1 | 0x05 | 数据长度 +5 | 1 | uint8 | LED索引 (0-7) +6 | 1 | uint8 | R颜色值 (0-255) +7 | 1 | uint8 | G颜色值 (0-255) +8 | 1 | uint8 | B颜色值 (0-255) +9 | 1 | uint8 | LED状态 (0=熄灭, 1=常亮, 2=慢闪, 3=快闪, 4=呼吸) +10 | 1 | 校验 | 校验和 +``` + +**LED状态枚举**: +- 0: LED_STATUS_OFF (熄灭) +- 1: LED_STATUS_SOLID (常亮) +- 2: LED_STATUS_SLOW_BLINK (慢闪) +- 3: LED_STATUS_FAST_BLINK (快闪) +- 4: LED_STATUS_BREATHE (呼吸) + +**注意**: +- RGB颜色值基于当前LED颜色定义转换(低电平有效) +- LED状态基于当前LED显示模式(常亮/闪烁)判断 + +### 2.21 0x4F - GET_LED_COUNT (获取LED总数) +**功能**: 读取XU316支持的LED总数 +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x4F | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x4F | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | LED总数 (当前XU316为1) +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- 返回XU316支持的LED总数 +- 当前XU316只有1个LED,所以返回1 +- LED索引范围为0到(LED总数-1) + +### 2.22 0x50 - GET_UAC_MODE_INFO (获取UAC模式信息) +**功能**: 读取UAC模式总数和模式名称列表 +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x50 | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x50 | 命令码 +4 | 1 | 0x11 | 数据长度 (17字节) +5 | 1 | uint8 | UAC模式总数 (当前为2,包含UAC1.0和UAC2.0) +6-13 | 8 | char | 模式0名称 (UTF-8编码,8字节,如"UAC2.0") +14-21 | 8 | char | 模式1名称 (UTF-8编码,8字节,如"UAC1.0") +22 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- 返回UAC模式总数(当前为2) +- 返回每个模式的名称(不超过8个字符) +- 模式0对应UAC2.0,模式1对应UAC1.0 + +### 2.23 0x51 - SET_UAC_MODE (设置UAC模式) +**功能**: 设置UAC模式(UAC1.0或UAC2.0),透传给MCU处理 +**方向**: MCU→XU316→MCU +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x51 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | UAC模式值 (0=UAC2.0, 1=UAC1.0) +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- XU316接收到0x51命令后,将完整的UART数据包透传给MCU +- MCU负责处理UAC模式切换和XU316重启 +- 注意:XU316重启后不会返回响应 + +**透传机制**: +- HID协议0x9B命令通过调用UART 0x51命令实现 +- UART 0x51命令将完整数据包通过UART接口透传给MCU +- MCU根据UAC模式值执行相应的模式切换操作 + +### 2.24 0x52 - GET_CURRENT_UAC_MODE (获取当前UAC模式) +**功能**: 读取当前UAC模式 +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x52 | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x52 | 命令码 +4 | 1 | 0x09 | 数据长度 (9字节) +5 | 1 | uint8 | 当前UAC模式值 (0=UAC2.0, 1=UAC1.0) +6-13 | 8 | char | 当前UAC模式名称 (UTF-8编码,8字节,如"UAC2.0"或"UAC1.0") +14 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- 返回当前UAC模式名称(不超过8个字符) + +### 2.25 0x53 - SET_EQ_ENABLE (设置EQ使能开关) +**功能**: 设置EQ使能开关(启用/禁用) +**方向**: MCU→XU316 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x53 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | EQ使能开关 (0=OFF禁用, 1=ON启用) +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- 只保存EQ使能状态到Flash(独立文件存储),不影响已保存的模式 + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x53 | 命令码 +4 | 1 | 0x02 | 数据长度 +5 | 1 | uint8 | 状态码 (0x00=成功, 0x01=失败) +6 | 1 | uint8 | 当前EQ使能状态 (0=OFF, 1=ON) +7 | 1 | 校验 | 校验和 +``` + +### 2.26 0x54 - GET_EQ_ENABLE (获取EQ使能开关) +**功能**: 读取EQ使能开关状态 +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x54 | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x54 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | EQ使能开关状态 (0=OFF禁用, 1=ON启用) +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- 返回当前EQ使能开关状态(0=OFF, 1=ON) + +### 2.27 0x55 - GET_SAMPLE_FORMAT (获取采样率和格式) +**功能**: 读取当前采样率和DSD模式 +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x55 | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x55 | 命令码 +4 | 1 | 0x05 | 数据长度 (5字节) +5-8 | 4 | uint32 | 采样率 (samFreq,小端序,单位:Hz) +9 | 1 | uint8 | DSD模式 (dsdMode: 0=PCM, 1=DOP, 2=Native DSD) +10 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- 返回当前采样率(32位无符号整数,小端序,单位:Hz) +- 返回DSD模式(0表示PCM格式,>0表示DSD格式) +- XU316会在采样率或DSD模式发生变化时自动上报此信息(通过UART主动发送) + +**自动上报机制**: +- XU316中监控采样率和DSD模式的变化 +- 当这些值发生变化时,XU316会自动构建0x55响应数据包并通过UART主动发送 + +### 2.28 0x56 - SET_GAIN_MODE (设置增益模式) +**功能**: 设置增益模式 +**方向**: MCU→XU316 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x56 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 增益模式值 (0=低阻, 1=高阻) +6 | 1 | 校验 | 校验和 +``` + +**参数说明**: +- **增益模式范围:** 0-1 +- **说明:** 控制XU316的增益档位 + - 0: 低阻模式(适合高灵敏度耳机) + - 1: 高阻模式(适合高阻抗耳机) + +**XU316端处理**: +- 参数会通过现有的定时保存机制自动保存到Flash + +### 2.29 0x57 - GET_GAIN_MODE (获取增益模式) +**功能**: 读取XU316当前增益模式 +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x57 | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x57 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 当前增益模式 (0=低阻, 1=高阻) +6 | 1 | 校验 | 校验和 +``` + +### 2.30 0x58 - SET_FILTER_MODE (设置滤波器模式) +**功能**: 设置滤波器模式 +**方向**: MCU→XU316 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x58 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 滤波器模式值 (0-7: 8种滤波器模式) +6 | 1 | 校验 | 校验和 +``` + +**参数说明**: +- **滤波器模式范围:** 0-7(共8种模式) +- **说明:** 选择DAC的数字滤波器类型 + - 0: Minimum Phase filter (default) + - 1: Linear Phase Apodizing Fast Roll-off filter + - 2: Linear phase fast roll-off filter + - 3: Linear Phase Fast Roll-off low-ripple filter + - 4: Linear phase slow roll-off filter + - 5: Minimum phase fast roll-off filter + - 6: Minimum phase slow roll-off filter + - 7: Minimum Phase Fast Roll-Off Low Dispersion + +**XU316端处理**: +- 参数会通过现有的定时保存机制自动保存到Flash +- 如果参数超出范围(>7),固件将拒绝设置并返回false + +### 2.31 0x59 - GET_FILTER_MODE (获取滤波器模式) +**功能**: 读取XU316当前滤波器模式 +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x59 | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x59 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 当前滤波器模式 (0-7) +6 | 1 | 校验 | 校验和 +``` + +### 2.32 0x5A - SET_GAME_MODE (设置游戏模式) +**功能**: 设置游戏模式,透传给MCU处理 +**方向**: XU316(XMOS)→MCU +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x5A | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 游戏模式值 (0=无音效, 1=FPS, 2=虚拟7.1) +6 | 1 | 校验 | 校验和 +``` + +**参数说明**: +- **游戏模式范围:** 0-2 +- **说明:** 选择游戏音效模式 + - 0: 无音效(标准立体声) + - 1: FPS模式(增强定位感) + - 2: 虚拟7.1(环绕声效果) + +**XU316端处理**: +- XU316接收到0x5A命令后,将完整的UART数据包透传给MCU +- MCU负责处理游戏模式设置和参数保存 +- 如果参数超出范围(>2),MCU将拒绝设置 + +**透传机制**: +- HID协议0xA4命令通过调用UART 0x5A命令实现 +- UART 0x5A命令将完整数据包通过UART接口透传给MCU +- MCU根据游戏模式值执行相应的模式设置操作 + +### 2.33 0x5B - GET_GAME_MODE (获取游戏模式) +**功能**: 读取XU316当前游戏模式 +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x5B | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x5B | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 当前游戏模式 (0=无音效, 1=FPS, 2=虚拟7.1) +6 | 1 | 校验 | 校验和 +``` + +### 2.34 0x5C - GET_FIRMWARE_VERSION (获取固件版本) +**功能**: 读取XU316固件版本号 +**方向**: MCU→XU316 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x5C | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x5C | 命令码 +4 | 1 | 0x03 | 数据长度 (3字节) +5 | 1 | uint8 | 主版本号 (BCD格式,如0x01表示1) +6 | 1 | uint8 | 次版本号 (BCD格式,如0x00表示0) +7 | 1 | uint8 | 修订版本号 (BCD格式,如0x0C表示12) +8 | 1 | 校验 | 校验和 +``` + +**版本号格式说明**: +- 版本号采用BCD(Binary Coded Decimal)格式 +- 3个字节分别表示:主版本号、次版本号、修订版本号 +- 例如:0x01 0x00 0x0C 表示版本 1.0.12 + +### 2.35 0x5D - SET_INPUT_SOURCE (设置输入源模式) +**功能**: 设置输入源模式(USB/OPT/COAX),由HID 0xB0触发后XMOS透传给MCU处理 +**方向**: XU316→MCU(主机通过HID 0xB0下发,XMOS收到后构建本UART包发给MCU) +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x5D | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 输入源模式值 (0=USB, 1=OPT, 2=COAX) +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- XU316接收到HID 0xB0命令后,构建本UART 0x5D数据包并通过串口发送给MCU +- MCU负责根据输入源模式值执行输入切换(USB/OPT/COAX) +- 本命令不要求MCU返回响应 + +**透传机制**: +- HID 0xB0命令 → XMOS设备转换为UART 0x5D命令 → 透传给MCU +- MCU根据输入源模式值执行相应的输入切换操作 + +### 2.36 0x5E - SET_MUTE_SWITCH (设置静音开关) +**功能**: 设置静音开关(0=关,1=开),由HID 0xB1触发后XMOS透传给MCU +**方向**: XU316→MCU +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x5E | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 静音开关值 (0=关,1=开) +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: 收到HID 0xB1后构建本包并通过串口发给MCU;MCU执行静音开关设置。 + +### 2.37 0x5F - GET_MUTE_SWITCH (获取静音开关) +**功能**: 获取静音开关状态;XMOS发请求,MCU返回1字节状态 +**方向**: 请求 XU316→MCU;响应 MCU→XU316 +**请求数据包格式(XMOS→MCU)**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x5F | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +**响应数据包格式(MCU→XU316)**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x5F | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 静音开关状态 (0=关,1=开) +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: 收到HID 0xB2后向MCU发送0x5F请求;收到MCU的0x5F响应后保存静音值,供HID读报告返回给主机。 + +### 2.38 0x60 - SET_LISTEN_SWITCH (设置监听开关) +**功能**: 设置监听开关(0=关,1=开),由HID 0xB3触发后XMOS透传给MCU +**方向**: XU316→MCU +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x00 | 版本 +3 | 1 | 0x60 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 监听开关值 (0=关,1=开) +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: 收到HID 0xB3后构建本包并通过串口发给MCU;MCU执行监听开关设置(对应 g_adc_loop 语义)。读监听状态仍由HID 0xB4直接读设备 g_adc_loop,不经过串口。 + +### 2.39 0x61 - SET_MCU_MUTE_STATE (设置MCU静音状态) +**功能**: 从MCU设置静音状态给XU316 +**方向**: MCU→XU316 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x01 | 版本 +3 | 1 | 0x61 | 命令码 +4 | 1 | 0x01 | 数据长度 +5 | 1 | uint8 | 静音开关值 (0=关,1=开),与0x5E/0x5F语义一致 +6 | 1 | 校验 | 校验和 +``` + +**XU316端处理**: +- 设置静音状态 +- 发送确认响应 + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x55 | 帧头1 +1 | 1 | 0xAA | 帧头2 +2 | 1 | 0x01 | 版本 +3 | 1 | 0x61 | 命令码 +4 | 1 | 0x00 | 数据长度 +5 | 1 | 校验 | 校验和 +``` + +## 3. 关键特性 + +### 3.1 XU316端系数计算 +- MCU只发送参数 (fc, Q, bw, gain) +- XU316端根据参数实时计算滤波器系数 +- 支持动态bshift计算,确保系数精度 + +### 3.2 参数格式 +- **浮点参数**: fc, Q, bw, gain 使用IEEE 754 float格式传输 +- **字节序**: 所有多字节数据使用小端序 + +### 3.3 错误处理 +- 数据包长度检查 +- 帧头验证 +- 参数范围检查 +- 滤波器索引边界检查 + +### 3.4 模式管理 +- 支持10个EQ模式 (0-9: 0-5预设模式, 6-8用户模式, 9: bypass) +- 支持禁用EQ模式 (10) +- 模式切换时自动清除滤波器状态 + +## 4. 注意事项 + +1. **时序要求**: 发送参数后需要等待XU316处理完成再发送下一条命令 +2. **数据完整性**: 所有8个滤波器的参数都需要发送,即使某些滤波器未使用 +3. **模式同步**: 设置模式后需要调用读取模式确保数据同步 +4. **错误恢复**: 通信失败时需要重新建立连接并重试 +5. **参数验证**: XU316端会验证参数范围,超出范围的值会被限制 +6. **校验和计算**: 所有命令都必须包含正确的校验和,校验和为帧头到数据末尾所有字节的累加和取低8位 diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_func.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_func.c new file mode 100644 index 0000000..2637290 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_func.c @@ -0,0 +1,401 @@ +#include +#include +#include "user_func.h" +#include "lfs_io.h" +#include "debug_print.h" +#include "eq_flash_storage.h" + +ProductInfo productInfo; +AppConfigs appPowerOnConf, appRunningState, appUserConf; +AudioMode appAudioMode; + +#define PRODUCT_INFO_PATH "product_info" +#define POWERON_INFO_PATH "poweron_info" + +uint32_t calculate_crc32(uint8_t *buf, int len) { + uint32_t crc = 0xFFFFFFFF; + uint32_t poly = 0xEDB88320; + for (int i = 0; i < len; i++) { + crc ^= (uint32_t)buf[i]; + for (int j = 8; j > 0; j--) { + if (crc & 1) { + crc = (crc >> 1) ^ poly; + } else { + crc >>= 1; + } + } + } + return ~crc; +} + +unsigned char check_sum(unsigned char *pbuf, unsigned len) +{ + unsigned char i; + unsigned short sum; + sum = 0; + for(i = 0; i < len; i++) + { + sum += pbuf[i]; + } + i = sum % 256; + return i; +} + +uint32_t get_reference_time(); +void load_configs(void) +{ + //uint32_t t = get_reference_time(); + if (lfs_init() == 0) + { + lfs_read_config(PRODUCT_INFO_PATH, (unsigned char*) &productInfo, sizeof(productInfo)); + lfs_read_config(POWERON_INFO_PATH, (unsigned char*) &appPowerOnConf, sizeof(appPowerOnConf)); + //printf("load configs\n"); + // printf("load pid 0x%04x vid 0x%04x\n", productInfo.pid2, productInfo.vid2); + } + lfs_deinit(); + //printf("bytes read time %lu\n", get_reference_time() - t); +} + +void save_configs(unsigned char save) +{ + if (save != 0) + { + //uint32_t t = get_reference_time(); + if (lfs_init() == 0) + { + if (save & 0x1) + lfs_write_config(PRODUCT_INFO_PATH, (unsigned char*) &productInfo, sizeof(productInfo)); + if (save & 0x2) + lfs_write_config(POWERON_INFO_PATH, (unsigned char*) &appPowerOnConf, sizeof(appPowerOnConf)); + } + + //printf("save ... pid 0x%04x vid 0x%04x\n", productInfo.pid2, productInfo.vid2); + lfs_deinit(); + //printf("bytes write time %lu\n", get_reference_time() - t); + } +} + +void save_value(unsigned char *path, unsigned char value) +{ + //uint32_t t = get_reference_time(); + if (lfs_init() == 0) + { + debug_printf("save value %02x to %s\n", value, path); + lfs_write_config(path, (unsigned char*) &value, sizeof(value)); + } + + lfs_deinit(); +} + +unsigned char load_value(unsigned char *path) +{ + unsigned char value = 255; + if (lfs_init() == 0) + { + lfs_read_config(path, (unsigned char*) &value, sizeof(value)); + debug_printf("load value from %s %02x\n", path, value); + } + else + { + debug_printf("lfs_init failed\n"); + } + + lfs_deinit(); + return value; +} + + +#if (NUM_USB_CHAN_OUT != 0) || (NUM_USB_CHAN_IN != 0) +unsigned short XUA_Endpoint0_getProductId(); +unsigned short XUA_Endpoint0_getVendorId(); +void XUA_Endpoint0_setProductId(unsigned short pid); +void XUA_Endpoint0_setVendorStr(char* vendor_str); +void XUA_Endpoint0_setProductStr(char* product_str); +void XUA_Endpoint0_setSerialStr(char* serial_str); +void XUA_Endpoint0_setVendorId(unsigned short vid); + +void get_pid_vid() +{ + unsigned crc; + if ((productInfo.vid1 != 0) || (productInfo.vid2 != 0) + || (productInfo.pid1 != 0 ) || (productInfo.pid2 != 0)) + { + unsigned char tmp[17]; + crc = calculate_crc32((unsigned char *) &productInfo, sizeof(productInfo) - 4); + + if (NTOHL(crc) == productInfo.crc || crc == productInfo.crc) + { + debug_printf("crc is correct\n"); +#if (AUDIO_CLASS == 1) + { + #if (THREE_AUDIO == 1) + XUA_Endpoint0_setProductId(NTOHS(productInfo.pid1 + 1)); + #else + XUA_Endpoint0_setProductId(NTOHS(productInfo.pid1)); + #endif + XUA_Endpoint0_setVendorId(NTOHS(productInfo.vid1)); + debug_printf(" pid %04x vid %04x\n", NTOHS(productInfo.pid1), NTOHS(productInfo.vid1)); + } +#else + { + #if (THREE_AUDIO == 1) + XUA_Endpoint0_setProductId(NTOHS(productInfo.pid2 + 4)); + #else + XUA_Endpoint0_setProductId(NTOHS(productInfo.pid2)); + #endif + XUA_Endpoint0_setVendorId(NTOHS(productInfo.vid2)); + debug_printf(" pid %04x vid %04x\n", NTOHS(productInfo.pid2), NTOHS(productInfo.vid2)); + } +#endif + + memcpy (tmp, productInfo.ManufactureName, 16); + tmp[16] = 0; + XUA_Endpoint0_setVendorStr(tmp); + + memcpy (tmp, productInfo.ProductName, 16); + XUA_Endpoint0_setProductStr(tmp); + + memcpy (tmp, productInfo.SerialNumber, 16); + XUA_Endpoint0_setSerialStr(tmp); + } + else + { + debug_printf("crc error %08x actual %08x\n", NTOHL(crc), productInfo.crc); + } + } + +} + +#endif +void fill_boot_cmd(unsigned char *buffer) +{ + int count = 0; + unsigned short vid, pid; + + buffer[count++] = 0; + if (productInfo.vid1 == 0 && productInfo.vid2 == 0 + && productInfo.pid1 == 0 && productInfo.pid2 == 0) + { + +#if (NUM_USB_CHAN_OUT != 0) || (NUM_USB_CHAN_IN != 0) + pid = XUA_Endpoint0_getProductId(); + vid = XUA_Endpoint0_getVendorId(); + + buffer[count++] = vid >> 8; + buffer[count++] = vid & 0xff; + buffer[count++] = pid >> 8; + buffer[count++] = pid & 0xff; + + buffer[count++] = vid >> 8; + buffer[count++] = vid & 0xff; + buffer[count++] = pid >> 8; + buffer[count++] = pid & 0xff; + + for(int i = 0; i < 8; i++) + buffer[count++] = 0; +#endif + } + else + { + buffer[count++] = productInfo.vid1 & 0xff; + buffer[count++] = productInfo.vid1 >> 8; + buffer[count++] = productInfo.pid1 & 0xff; + buffer[count++] = productInfo.pid1 >> 8; + + buffer[count++] = productInfo.vid2 & 0xff; + buffer[count++] = productInfo.vid2 >> 8; + buffer[count++] = productInfo.pid2 & 0xff; + buffer[count++] = productInfo.pid2 >> 8; + + buffer[count++] = productInfo.crc & 0xff; + buffer[count++] = (productInfo.crc >> 8) & 0xff; + buffer[count++] = (productInfo.crc >> 16) & 0xff; + buffer[count++] = (productInfo.crc >> 24) & 0xff; + + buffer[count++] = appPowerOnConf.crc & 0xff; + buffer[count++] = (appPowerOnConf.crc >> 8) & 0xff; + buffer[count++] = (appPowerOnConf.crc >> 16) & 0xff; + buffer[count++] = (appPowerOnConf.crc >> 24) & 0xff; + } + +} +void fill_finish_cmd(unsigned char *buffer) +{ + memcpy(buffer, (unsigned char *)&appUserConf, sizeof(appUserConf)); +} + +void save_product_info(unsigned char *buffer) +{ + memcpy((unsigned char *)&productInfo, buffer, sizeof(productInfo)); +} + +void save_powerup_info(unsigned char *buffer) +{ + memcpy((unsigned char *)&appPowerOnConf, buffer, sizeof(appPowerOnConf)); +} + +void save_userconfig_info(unsigned char *buffer) +{ + memcpy((unsigned char *)&appUserConf, buffer, sizeof(appUserConf)); +} + +// EQ Flash存储相关接口函数 + +/** + * @brief 获取EQ存储状态 + * @param buffer 输出缓冲区 + * @return 状态信息长度 + */ +int get_eq_storage_status(unsigned char *buffer) +{ + if (buffer == NULL) { + return -1; + } + + eq_storage_status_t status; + if (eq_flash_get_status(&status) != 0) { + return -1; + } + + // 将状态信息打包到缓冲区 + int offset = 0; + buffer[offset++] = status.is_initialized; + buffer[offset++] = status.has_flash_data; + + // 写入时间戳(4字节) + buffer[offset++] = (status.last_sync_time >> 0) & 0xFF; + buffer[offset++] = (status.last_sync_time >> 8) & 0xFF; + buffer[offset++] = (status.last_sync_time >> 16) & 0xFF; + buffer[offset++] = (status.last_sync_time >> 24) & 0xFF; + + // 写入同步次数(4字节) + buffer[offset++] = (status.sync_count >> 0) & 0xFF; + buffer[offset++] = (status.sync_count >> 8) & 0xFF; + buffer[offset++] = (status.sync_count >> 16) & 0xFF; + buffer[offset++] = (status.sync_count >> 24) & 0xFF; + + // 写入错误次数(4字节) + buffer[offset++] = (status.error_count >> 0) & 0xFF; + buffer[offset++] = (status.error_count >> 8) & 0xFF; + buffer[offset++] = (status.error_count >> 16) & 0xFF; + buffer[offset++] = (status.error_count >> 24) & 0xFF; + + return offset; +} + +/** + * @brief 强制同步EQ参数到Flash + * @return 0: 成功, -1: 失败 + */ +int force_eq_sync(void) +{ + debug_printf("Force syncing EQ parameters to Flash\n"); + return eq_flash_sync_all(); +} + +/** + * @brief 清除Flash中的所有EQ参数 + * @return 0: 成功, -1: 失败 + */ +int clear_eq_flash_data(void) +{ + debug_printf("Clearing all EQ parameters from Flash\n"); + return eq_flash_clear_all(); +} + +/** + * @brief 检查EQ参数是否需要同步 + * @return 1: 需要同步, 0: 不需要同步, -1: 错误 + */ +int check_eq_sync_needed(void) +{ + return eq_flash_needs_sync() ? 1 : 0; +} + +/** + * @brief 保存指定模式的EQ参数到Flash + * @param mode 模式号 + * @return 0: 成功, -1: 失败 + */ +int save_eq_mode_to_flash(uint8_t mode) +{ + debug_printf("Saving EQ mode %d to Flash\n", mode); + return eq_flash_save_mode(mode); +} + +/** + * @brief 从Flash加载指定模式的EQ参数 + * @param mode 模式号 + * @return 0: 成功, -1: 失败 + */ +int load_eq_mode_from_flash(uint8_t mode) +{ + debug_printf("Loading EQ mode %d from Flash\n", mode); + return eq_flash_load_mode(mode); +} + +/** + * @brief 验证EQ参数文件完整性 + * @param mode 模式号 + * @return 1: 完整, 0: 损坏, -1: 错误 + */ +int verify_eq_mode_integrity(uint8_t mode) +{ + return eq_flash_verify_mode(mode) ? 1 : 0; +} + +/** + * @brief 重新初始化EQ Flash存储系统 + * @return 0: 成功, -1: 失败 + */ +int reinit_eq_flash_storage(void) +{ + debug_printf("Reinitializing EQ Flash storage system\n"); + eq_flash_deinit(); + return eq_flash_init(); +} + +unsigned char g_hid_pass_data[64]; +/* 改动原因:固件升级开始/结束时通知 MCU;0=无,1=升级开始,2=升级结束成功,3=升级结束(中止/失败)。 + * 由 dfu_upgrade.c 在 handle_firmware_upgrade_start/end/abort 中设置,uart_handler 在 se_tmr 中读取并发送 0x62 串口包后清零。 */ +unsigned g_firmware_upgrade_mcu_notify = 0; +/* 改动原因:标记是否处于固件升级中,供 uart_handler 跳过 heatTick 等;START 时置 1,END/ABORT 时置 0。由 dfu_upgrade.c 设置。 */ +unsigned g_in_fw_upgrade = 0; +extern void hidSetChangePending(unsigned int); + +void user_read_hidpass(unsigned char * hidPassData) +{ + int i = 0; + for (i = 0; i < 64; i++) + { + hidPassData[i] = g_hid_pass_data[i]; + debug_printf("hidPassData[%d] = %02x\n", i, hidPassData[i]); + g_hid_pass_data[i] = 0; + } +} + +void user_set_hidpass(unsigned char *data) +{ +#if HID_CONTROLS + + for (int i = 0; i < 63; i++) + { + g_hid_pass_data[i] = data[i]; + debug_printf("g_hid_pass_data[%d] = %02x\n", i, g_hid_pass_data[i]); + } + + hidSetChangePending(0x1); +#endif +} + +/* 改动原因:供 user_uart 读取/清零固件升级 MCU 通知标志,用于发送 0x62 串口包 */ +unsigned get_firmware_upgrade_mcu_notify(void) +{ + return g_firmware_upgrade_mcu_notify; +} +void clear_firmware_upgrade_mcu_notify(void) +{ + g_firmware_upgrade_mcu_notify = 0; +} + + diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_func.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_func.h new file mode 100644 index 0000000..e0961f7 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_func.h @@ -0,0 +1,66 @@ +#ifndef _USER_FUNC_H_ +#define _USER_FUNC_H_ + +#include +#include +#include +#include +#include +#include +#include "user_uart.h" + +// 32-bit macros for converting between host and network byte order +#define HTONL(value) ( \ + (((value) >> 24) & 0x000000FF) | \ + (((value) >> 8) & 0x0000FF00) | \ + (((value) << 8) & 0x00FF0000) | \ + (((value) << 24) & 0xFF000000) \ +) + +#define NTOHL(value) HTONL(value) // Since the transformation is the same + +// 16-bit macros for converting between host and network byte order +#define HTONS(value) ( \ + (((value) >> 8) & 0x00FF) | \ + (((value) << 8) & 0xFF00) \ +) + +#define NTOHS(value) HTONS(value) // Since the transformation is the same + +#ifdef __XC__ +uint32_t calculate_crc32(uint8_t *unsafe buf, int len); +unsigned char check_sum(uint8_t *unsafe pbuf, unsigned len); +void fill_boot_cmd(unsigned char *unsafe buffer); +void save_product_info(unsigned char *unsafe buffer); +void save_powerup_info(unsigned char *unsafe buffer); +void fill_finish_cmd(unsigned char *unsafe buffer); +void save_userconfig_info(unsigned char *unsafe buffer); +#else +uint32_t calculate_crc32(uint8_t *buf, int len); +unsigned char check_sum(uint8_t *pbuf, unsigned len); +void fill_boot_cmd(unsigned char *buffer); +void save_product_info(unsigned char *buffer); +void save_powerup_info(unsigned char *buffer); +void fill_finish_cmd(unsigned char *buffer); +void save_userconfig_info(unsigned char *buffer); +#endif +void load_configs(void); +void save_configs(unsigned char save); +void get_pid_vid(); + +// EQ Flash存储相关函数声明 +int get_eq_storage_status(unsigned char *buffer); +int force_eq_sync(void); +int clear_eq_flash_data(void); +int check_eq_sync_needed(void); +int save_eq_mode_to_flash(uint8_t mode); +int load_eq_mode_from_flash(uint8_t mode); +int verify_eq_mode_integrity(uint8_t mode); +int reinit_eq_flash_storage(void); + +/* 改动原因:固件升级状态通知 MCU;由 dfu_upgrade 设置,uart_handler 读取并发送 0x62 后清零 */ +unsigned get_firmware_upgrade_mcu_notify(void); +void clear_firmware_upgrade_mcu_notify(void); + +#endif + diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main.h new file mode 100644 index 0000000..b60d35b --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main.h @@ -0,0 +1,94 @@ + +#ifndef _USER_MAIN_H_ +#define _USER_MAIN_H_ + +#ifdef __XC__ +#if (!MQA_EN) + +#include "app_dsp.h" +// 改动原因:mode/mic mute LED物理端口在tile1,定义跨tile的LED控制interface,供tile0按键逻辑调用,tile1统一驱动硬件LED。 +interface c1_led_ctrl_if { + void set_mode_led_color(unsigned color_idx); // 0=R, 1=G, 2=B + void set_mic_mute_state(unsigned mute_switch); // mute_switch: 0=静音(亮红), 1=非静音(灭红) +}; +void switch_handler(void); +void flag_handler(); +/* 改动原因:固件升级 START 在 AudioHwRemote2 处理,需传入 c_dfu;其余升级命令在 process_send_params 直接处理 */ +void AudioHwRemote(streaming chanend c, client interface c1_led_ctrl_if i_c1_led_ctrl, chanend c_erase, streaming chanend c_dfu); +void uart_handler(streaming chanend c_tx, streaming chanend c_rx); +void uart_tx_handler(streaming chanend c_tx); +void uart_rx_handler(streaming chanend c_rx); +void i2s_driver(chanend c); +extern unsafe chanend uc_i2s; +extern unsafe chanend uc_br_data; +extern unsafe chanend uc_eq_data; +extern void UserBufferManagementSetChan(chanend c); +extern void dsp_main (chanend c_data , chanend cc_br_eof); +extern void br_dsp_proc_task(chanend c_validate, chanend cc_br_eof); +extern void validate_algo(chanend c_validate); +void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl, chanend c_eq_data); +extern void dnr_dsp_proc_task(void); +extern void dsp_core0(void); +extern void eq_dsp_main(chanend c_data); +extern unsafe streaming chanend uc_audiohw; +extern unsafe streaming chanend uc_dfu; +extern void fps1_dsp_proc_task(void); +extern void fps2_dsp_proc_task(void); + +#define USER_MAIN_DECLARATIONS streaming chan c_rx; streaming chan c_tx; \ + chan c_i2s; chan c_data_transport, cc_br_eof, c_eq_data, c_validate; \ + streaming chan c_audiohw; streaming chan c_dfu; interface c1_led_ctrl_if i_c1_led_ctrl; \ + chan c_usb_to_io; chan c_io_to_usb; chan c_io_to_dspL; chan c_dspL_to_io; chan c_io_to_dspR; chan c_dspR_to_io; \ + chan c_erase; + + + +#if !UAC1 +#define USER_MAIN_CORES on tile[0]: {\ + unsafe { \ + uc_audiohw = (chanend) c_audiohw;\ + uc_dfu = (chanend) c_dfu;\ + } \ + flag_handler(); \ + uart_handler(c_tx, c_rx);\ + }\ + on tile[0]: {\ + AudioHwRemote(c_audiohw, i_c1_led_ctrl, c_erase, c_dfu);\ + }\ + on tile[AUDIO_IO_TILE]: par {\ + dsp_core0();\ + } \ +\ + on tile[1]: uart_tx_handler(c_tx); \ + on tile[1]: uart_rx_handler(c_rx); \ + on tile[1]: app_control_slave(i_c1_led_ctrl, c_eq_data); \ +\ + +#else +#define USER_MAIN_CORES on tile[0]: {\ + unsafe { \ + uc_audiohw = (chanend) c_audiohw;\ + uc_br_data = (chanend) c_data_transport;\ + uc_i2s = (chanend) c_i2s;\ + uc_eq_data = (chanend) c_eq_data;\ + uc_dfu = (chanend) c_dfu;\ + } \ + validate_algo(c_validate); \ + }\ + on tile[0]: {\ + AudioHwRemote(c_audiohw, i_c1_led_ctrl, c_erase, c_dfu);\ + }\ + on tile[1]: { br_dsp_proc_task(c_validate, cc_br_eof); } \ + on tile[1]: app_control_slave(i_c1_led_ctrl, c_eq_data); \ +\ + +#endif +#else + +#define USER_MAIN_DECLARATIONS_A +#define USER_MAIN_CORES_A // on tile[0]:{board_setup();} +#endif + +#endif + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main_mqa.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main_mqa.h new file mode 100644 index 0000000..ea5fbe3 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main_mqa.h @@ -0,0 +1,91 @@ +#ifndef _USER_MAIN_MQA_H_ +#define _USER_MAIN_MQA_H_ + +#include "MQA_XMOS.h" +#include "MQA_XMOS_Decoder.h" +#include "devicehost.h" + + +// Enable this define to bypass the MQA Decoder for testing + +#ifndef MQA_OUTPUT_TYPE +#define MQA_OUTPUT_TYPE MQAOutputDAC +#endif + +#if 0 //def MQA_BYPASS_DECODER +//#error +// Connect output of USB directly to I2S +//#define USB_AUDIO_INPUT audioOutput +//#define USER_MAIN_DECLARATIONS USER_MAIN_DECLARATIONS_O chan audioOutput; +//#define USER_MAIN_CORES USER_MAIN_CORES_O +//#define XUD_TILE_MQA_HOST_INIT_AND_SET_MODES + +#else + +#ifdef MQA_LEDS +//#error _jian test +#define MQA_STATUS_CHANNEL mqaStatus +#define MQA_STATUS_CHANNEL_DECLARATION chan mqaStatus; +#else +#define MQA_STATUS_CHANNEL null +#define MQA_STATUS_CHANNEL_DECLARATION +#endif + +#ifdef MQA_HOST_INTERRUPT_PIN +#error _jian test +#define MQA_HOST_READ_CHANNEL hostRead +#define MQA_HOST_READ_CHANNEL_DECLARATION chan MQA_HOST_READ_CHANNEL; +#else +#define MQA_HOST_READ_CHANNEL null +#define MQA_HOST_READ_CHANNEL_DECLARATION +#endif + +#define INPUT_SELECT_INPUT_CHANNELS_DECLARATION +#define USB_AUDIO_INPUT audioInput +#define INPUT_CONTROL_CHANNEL null +#define INPUT_CONTROL_DECLARATION +#define DECODER_INPUT_CHANNEL USB_AUDIO_INPUT +#define DECODER_INPUT_CHANNEL_DECLARATION chan DECODER_INPUT_CHANNEL; + + +#define USER_MAIN_DECLARATIONS_MQA chan audioOutput, hostControl; \ + chan signatureData, signatureAndHashISRData; \ + INPUT_SELECT_INPUT_CHANNELS_DECLARATION \ + INPUT_CONTROL_DECLARATION \ + DECODER_INPUT_CHANNEL_DECLARATION \ + MQA_STATUS_CHANNEL_DECLARATION \ + MQA_HOST_READ_CHANNEL_DECLARATION + + +#define XUD_TILE_MQA_HOST_INIT_AND_SET_MODES InitHostAndSetModes(hostControl); + +#if 1 //ndef MQA_CORE_DECODE_ONLY +#define DECODE_CORES on tile[MQA_DECODE_TILE] : MQA_XMOS_Decoder(DECODER_INPUT_CHANNEL, audioOutput, hostControl, MQA_STATUS_CHANNEL, null, null, MAX_I2S_OUTPUT, MQA_OUTPUT_TYPE, signatureData, signatureAndHashISRData); +#else +#define DECODE_CORES on tile[MQA_DECODE_TILE] : MQA_XMOS_CoreDecoder(DECODER_INPUT_CHANNEL, audioOutput, hostControl, MQA_STATUS_CHANNEL, MAX_I2S_OUTPUT, signatureData, signatureAndHashISRData); +#endif + +#define SIGNING_CORE on tile[SIGNING_TILE] : MQA_XMOS_Decoder_HasherAndSignatureVerifier(signatureData, signatureAndHashISRData); + +#if MQA_LEDS +#define LED_CORE on tile[MQA_LED_TILE] : LightManager(mqaStatus, MQA_HOST_READ_CHANNEL); +#else +#define LED_CORE +#endif + + +#if MQA_EN + +extern void uart_handler(void); +void AudioHwRemote(void); +#define AUDIOREMOTE_CORE on tile[0]: AudioHwRemote(); +#define UART_CORE on tile[0]: uart_handler(); + +#define USER_MAIN_CORES_MQA AUDIOREMOTE_CORE UART_CORE DECODE_CORES SIGNING_CORE LED_CORE +#else +#error jian USER_MAIN_CORES_A +#define USER_MAIN_CORES_MQA DECODE_CORES SIGNING_CORE LED_CORE SPI_CORE I2C_CORE INPUT_SWITCH_CORE I2S_INPUT_CORE MODE0_MONITOR_CORE +#endif +#endif // MQA_BYPASS_DECODER + +#endif /* _USER_MAIN_MQA_H_ */ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_uart.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_uart.h new file mode 100644 index 0000000..899977f --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_uart.h @@ -0,0 +1,266 @@ +#ifndef _UART_H_ +#define _UART_H_ + +#include +#include +#include +#include +#include + +typedef enum { + AUDIO_PCM_44100 = 0, + AUDIO_PCM_48000, + AUDIO_PCM_88200, + AUDIO_PCM_96000, + AUDIO_PCM_176400, + AUDIO_PCM_192000, + AUDIO_PCM_352800, + AUDIO_PCM_384000, + AUDIO_PCM_705600, + AUDIO_PCM_768000, + AUDIO_PCM_1441200, + AUDIO_PCM_1536000, + + AUDIO_PCM_32000, + AUDIO_PCM_64000, + AUDIO_PCM_128000, + AUDIO_PCM_256000, + AUDIO_PCM_512000, + + AUDIO_DSD_64, + AUDIO_DSD_128, + AUDIO_DSD_256, + AUDIO_DSD_512, + AUDIO_DSD_1024, + + AUDIO_MQA_44100, + AUDIO_MQA_88200, + AUDIO_MQA_176400, + AUDIO_MQA_352800, + AUDIO_MQA_705600, + AUDIO_MQA_1411200, + AUDIO_MQA_2822400, + AUDIO_MQA_5644800, + + AUDIO_MQA_48000, + AUDIO_MQA_96000, + AUDIO_MQA_192000, + AUDIO_MQA_384000, + AUDIO_MQA_768000, + AUDIO_MQA_1536000, + AUDIO_MQA_3072000, + AUDIO_MQA_6144000, + + AUDIO_MQA_64000, + AUDIO_MQA_128000, + AUDIO_MQA_256000, + AUDIO_MQA_512000, + AUDIO_MQA_1024000, + AUDIO_MQA_2048000, + AUDIO_MQA_4096000, + AUDIO_MQA_8192000, + + AUDIO_NO_USED = 0xFF, +} audio_sampling; + +typedef enum { + PCM = 0, /**< PCM */ + DOP = 1, /**< DoP */ + MQA = 2, /**< MQA */ + MQB = 3, /**< MQB */ + MQA_Studio = 4, /**< MQA Studio */ + DSD = 5, /**< DSD Native*/ +} audio_type; + +typedef enum { + USER_CMD_VOL_UP = 0x00, + USER_CMD_VOL_DOWN, + USER_CMD_PLAY, + USER_CMD_NEXT, + USER_CMD_PREV, + USER_CMD_FORWARD, + USER_CMD_REWIND, + USER_CMD_MUTE +} ButtonEvent; + +typedef enum { + AUDIO_FREQ_44100 = 0, + AUDIO_FREQ_48000, + AUDIO_FREQ_88200, + AUDIO_FREQ_96000, + AUDIO_FREQ_176400, + AUDIO_FREQ_192000, + AUDIO_FREQ_352800, + AUDIO_FREQ_384000, + AUDIO_FREQ_705600, + AUDIO_FREQ_768000, + AUDIO_FREQ_1411200, + AUDIO_FREQ_1536000 +} AudioFreq; + +typedef enum { AUDIO_CLASS_UAC1 = 0, AUDIO_CLASS_UAC2 } AudioClass; + +typedef enum { + AUDIO_WIDTH_16BIT = 0, + AUDIO_WIDTH_24BIT = 1, + AUDIO_WIDTH_32BIT = 2 +} AudioWidth; + +typedef enum { + MODE_USB = 0, + MODE_OPT, + MODE_COAX, + MODE_BT, + MODE_HDMI_ARC, + MODE_WIFI, + MODE_AIRPLAY, + MODE_SPOTIFY +} UserMode; + +typedef enum { + START_BOOT = 0, + READ_PRODUCT = 1, + READ_POR_CONFIG = 2, + READ_AUDIO_MODE = 3, + READ_USER_CONFIG = 4, + START_FINISH = 5, + REPORT_APP_STATUS = 0x20, + MEDIA_CONTROL = 0x21, + SEND_AUDIO_FORMAT = 0x22, + SWITCH_AUDIO_MODE = 0x23, + SEND_OUT_VOLUME = 0x24, + SEND_IN_VOLUME = 0x25, + SET_DAC_VOLUME = 0x26, + SET_DAC_MODE = 0x27, + SET_ADC_VOLUME = 0x30, + SET_ADC_LOOP = 0x31, + SET_3D_FPS = 0x33, + SET_LED_MODE = 0x34, + HID_PASS_THROUGH = 0xEE, + TEST_CMD = 0xF0, + FW_VERSION = 0xF1, + FLASH_ID = 0xF2, + // EQ命令定义 (0x40-0x5C) + SET_EQ_MODE = 0x40, // 切换EQ模式 + GET_EQ_MODE = 0x41, // 获取当前EQ模式信息 + SET_MODE_GAIN_AND_NAME = 0x42, // 设置模式整体增益和名称 + SET_EQ_PARAMS = 0x43, // 发送EQ参数 + GET_EQ_PARAMS = 0x44, // 读取EQ参数 + GET_DEVICE_INFO = 0x45, // 获取设备信息 + RESET_EQ_PARAMS = 0x46, // 复位EQ参数 + GET_EQ_MODE_COUNT = 0x47, // 获取EQ模式总数 + SET_AND_SAVE_EQ_MODE = 0x48, // 设置并保存EQ模式 + SET_VOLUME = 0x49, // 设置音量级别 + GET_VOLUME = 0x4A, // 获取音量级别 + GET_LED_INFO = 0x4B, // 获取LED信息 + SET_LED_SWITCH = 0x4C, // 设置LED开关 + GET_LED_SWITCH = 0x4D, // 获取LED开关 + GET_LED_STATUS = 0x4E, // 获取LED状态 + GET_LED_COUNT = 0x4F, // 获取LED总数 + GET_UAC_MODE_INFO = 0x50, // 获取UAC模式信息 + SET_UAC_MODE = 0x51, // 设置UAC模式 + GET_CURRENT_UAC_MODE = 0x52, // 获取当前UAC模式 + SET_EQ_ENABLE = 0x53, // 设置EQ使能开关 + GET_EQ_ENABLE = 0x54, // 获取EQ使能开关 + GET_SAMPLE_FORMAT = 0x55, // 获取采样率和格式 + SET_GAIN_MODE = 0x56, // 设置增益模式 + GET_GAIN_MODE = 0x57, // 获取增益模式 + SET_FILTER_MODE = 0x58, // 设置滤波器模式 + GET_FILTER_MODE = 0x59, // 获取滤波器模式 + SET_GAME_MODE = 0x5A, // 设置游戏模式 + GET_GAME_MODE = 0x5B, // 获取游戏模式 + GET_FIRMWARE_VERSION = 0x5C, // 获取固件版本 + SET_INPUT_SOURCE = + 0x5D, // 设置输入源模式(0=USB, 1=OPT, 2=COAX),由HID 0xB0触发透传MCU + SET_MUTE_SWITCH = 0x5E, // 设置静音开关(0=关,1=开),由HID 0xB1触发透传MCU + GET_MUTE_SWITCH = 0x5F, // 获取静音开关:XMOS发请求,MCU返回1字节状态 + SET_LISTEN_SWITCH = 0x60, // 设置监听开关(0=关,1=开),由HID 0xB3触发透传MCU + SET_MCU_MUTE_STATE = 0x61, // 设置MCU静音状态 + FIRMWARE_UPGRADE_NOTIFY = 0x62, // XU316→MCU:固件升级状态通知(1=开始 2=结束成功 3=结束中止/失败) + CMD_NONE = 0xFF +} UartCmdType; + +#define CMD_HEAD1_POS 0 +#define CMD_HEAD2_POS 1 +#define CMD_VERSION_POS 2 +#define CMD_CMD_POS 3 +#define CMD_DATA_LEN_POS 4 +#define CMD_DATA_POS 5 + +#define BOOT_CMD_DATA_LEN 17 +#define FINISH_CMD_DATA_LEN 15 +#define PRODUCT_CMD_DATA_LEN 61 +#define CONFIG_CMD_DATA_LEN 14 +#define AUDIO_MODE_CMD_DATA_LEN 5 + +#define UART_HEAD1 0x55 +#define UART_HEAD2 0xAA +#define UART_HEAD 0x55 +#define UART_HEAD_LEN 0x05 + +#if !__XC__ +typedef struct { + uint8_t I2S_Mode : 1; // I2S Mode: 0 - Master, 1 - Slave + uint8_t Sync_Mode : 1; // Sync Mode: 0 - Async, 1 - Sync + uint8_t MIDI_Enable : 1; // MIDI Enable: 0 - Disable, 1 - Enable + uint8_t SPDIF_In : 1; // SPDIF Input: 0 - Disable, 1 - Enable + uint8_t SPDIF_Out : 1; // SPDIF Output: 0 - Disable, 1 - Enable + uint8_t ADAT_In : 1; // ADAT Input: 0 - Disable, 1 - Enable + uint8_t ADAT_Out : 1; // ADAT Output: 0 - Disable, 1 - Enable + uint8_t DSD_Out : 1; // DSD Output: 0 - Disable, 1 - Enable + + uint8_t Audio_Sample_Rate : 4; // Audio Sample Rate + uint8_t MQA_Enable : 1; // MQA Enable: 0 - Disable, 1 - Enable + uint8_t Audio_Class : 1; // Audio Class: 0 - UAC 1.0, 1 - USB UAC 2.0 + uint8_t Audio_Width : 2; // Audio Width: 0 - 16bit, 1 - 24bit, 2 - 32bit + + uint16_t Input_Channel : 6; // Input Channel Count + uint16_t Output_Channel : 6; // Output Channel Count + uint16_t Other_Cfg : 4; // Other Configuration + + UserMode Mode; // Mode +} AudioMode; + +typedef struct { + uint16_t vid1; + uint16_t pid1; + uint16_t vid2; + uint16_t pid2; + uint8_t ManufactureName[16]; + uint8_t ProductName[16]; + uint8_t SerialNumber[16]; + uint32_t crc; +} ProductInfo; + +typedef struct { + AudioMode audioMode; + uint16_t muteTime; + uint8_t micVol; + uint8_t dacLvol; + uint8_t dacRvol; + uint32_t crc; +} AppConfigs; + +#endif + +typedef enum { + USB_MODE = 1, + OPT_MODE, + COAX_MODE, + BT_MODE, + HDMI_ARC_MODE, + WIFI_MODE, + AIRPLAY_MODE, + SPOTIFY_MODE, +} UsbMode; + +typedef struct { + unsigned char startFlag; + unsigned char startConfig; + unsigned char startApp; + unsigned char cmdCount; + unsigned char cmdPending; + unsigned char pendingReboot; +} UserCmdConfig; + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_uart.xc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_uart.xc new file mode 100644 index 0000000..c21a91f --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_uart.xc @@ -0,0 +1,1260 @@ +#if UART_DEBUG || DEBUG_MEMORY_LOG_ENABLED +#define DEBUG_PRINT_ENABLE 0 +#endif + +#include +#include +#include +#include "xc_ptr.h" +#include "user_uart.h" +#include +#include "debug_print.h" +#include +#include +#include "user_func.h" +#include "roleswitchflag.h" +#include "xua_hid_report.h" +#include "flash_interface.h" +#include "uart.h" +#include "eq.h" +#include "xua_conf.h" + +extern "C" { +#include "dfu_upgrade.h" +} +#define UART_BIT_RATE 115200 +#define UART_BIT_TIME XS1_TIMER_HZ / UART_BIT_RATE +//#define MAX_TX_LEN (100 * 1024) +#define MAX_TX_LEN (512) +#define MAX_RX_LEN 512 +#define AUDIO_MODE_CONFIG_ADDR 0xFFFD4 +#define KEY_ADDRESS 0xFFFD0 + +#define MAX_BUFFER_LEN 128 +#define RCV_CMD_TIMEOUT (500000000) //5s +#define SEND_CMD_TIMEOUT (20000000) //200ms +#define VOLUME_TIMEOUT (5500000) //55ms delay +#define START_COUNTS (4) + + + +unsigned long get_reference_time(); + +in port p_uart_rx = PORT_UART_RX; +out port p_uart_tx = PORT_UART_TX; +timer uart_tx_tmr; +timer uart_rx_tmr; +unsigned uart_tx_active = 0; // 1==start active. just for testing +unsigned uart_tx_time; +unsigned uart_tx_data = 0; +char next_uart_tx_byte = 0; +unsigned uart_tx_bit_count=0; +unsigned bytes_sent=0; +unsigned last_byte = 0; +unsigned uart_rx_data=0; +unsigned tx_pending=0; +unsigned uart_rx_active = 0; +unsigned during_startbit = 0; +unsigned uart_rx_time; +unsigned uart_bit_count=0; +unsigned char uart_rx_byte=0; +unsigned char X_TXbuff[MAX_TX_LEN]={0}; +unsigned short X_Txfp=0,X_Txrp=0; +unsigned char X_RXbuff[MAX_RX_LEN]={0}; +unsigned short X_Rxfp=0,X_Rxrp=0; + +unsigned char g_save_configs = 0; +unsigned g_usb_state = 1; +unsigned int g_xu316_id; + +extern audio_sampling g_playback_format; +extern audio_type g_audio_type; +extern unsigned g_led_mode; +extern int volsOut[NUM_USB_CHAN_OUT + 1]; +extern unsigned int mutesOut[NUM_USB_CHAN_OUT + 1]; +extern unsigned int read_key(void); +extern unsigned g_dac_vol; +extern unsigned g_adc_vol; +extern unsigned g_adc_loop; +extern unsigned g_mute_switch; // 改动原因:与g_adc_loop一致,UART收到0x5F响应时直接设置,供HID变化上报 +extern unsigned g_3d_fps; +extern unsigned g_dac_mode; +extern unsigned g_new_dac_mode; +#if EQ_EN +extern unsigned int g_current_eq_mode; // EQ当前模式 +extern unsigned int g_old_eq_mode; // EQ当前模式 +extern int process_eq_params_from_uart(uint8_t eq_mode, uint8_t eq_index, uint32_t sample_rate, float coefficients[5]); +// EQ命令处理函数现在在eq.c中实现 +#endif +extern void read_uid_did(uint8_t uid[]); + +void device_reboot(void); + +uint8_t send_data[MAX_BUFFER_LEN] = {0}; + +UserCmdConfig cmdConfig={0}; + +extern unsigned g_in_fw_upgrade; + +print_buff(unsigned char *buffer, int size) +{ + for(int i = 0; i < size; i ++) + { + debug_printf("%02x ", buffer[i]); + if (i % 32 == 31) + debug_printf("\n"); + } + debug_printf("\n"); +} + +/* Store Flag to fixed address */ +void SetKeyFlag(unsigned x) +{ + asm volatile("stw %0, %1[0]" :: "r"(x), "r"(KEY_ADDRESS)); +} + +/* Load flag from fixed address */ +unsigned GetKeyFlag() +{ + unsigned x; + asm volatile("ldw %0, %1[0]" : "=r"(x) : "r"(KEY_ADDRESS)); + return x; +} + + +inline void store_memory(unsigned char *buff, unsigned len) +{ + for(int i = 0; i < len; i ++) + { + write_byte_via_xc_ptr_indexed(AUDIO_MODE_CONFIG_ADDR, i, buff[i]); + } +} + +inline void load_memory(unsigned char *buff, unsigned len) +{ + for(int i = 0; i < len; i++) + { + read_byte_via_xc_ptr_indexed(buff[i], AUDIO_MODE_CONFIG_ADDR, i); + } +} + +void do_uart_tx(char uart_tx_byte) { + next_uart_tx_byte = uart_tx_byte; + tx_pending = 1; +} +// This function can be called periodically to process a UART rx and tx interface +// It has to be called between time 0 and BIT_TIME/2 of a time slot to catch the cases where timers expire +// Events over time: +// uart_tx_tmr: | | ... +// uart_rx_tmr: | | ... +// bit time slot: | UART_BIT_TIME | + + +int xmos_printf(unsigned char *data, unsigned char len) +{ + unsigned char i=0; + if ( MAX_TX_LEN - ((X_Txfp - X_Txrp + MAX_TX_LEN) % MAX_TX_LEN) >= len) + { + // debug_printf("%d %d data %d\n", X_Txfp, X_Txrp, MAX_TX_LEN - ((X_Txfp - X_Txrp + MAX_TX_LEN) % MAX_TX_LEN)); + + for(i= 0;i= 1) { + unsigned mute_val = (data[CMD_DATA_POS] > 1) ? 0 : (unsigned)data[CMD_DATA_POS]; + SET_SHARED_GLOBAL(g_mute_switch, mute_val); + debug_printf("set mcu mute state (0x61) %d\n", mute_val); + send_len = send_user_cmd(send_data, SET_MCU_MUTE_STATE, 0, 0); + xmos_printf(send_data, send_len); + } + break; +#if UAC1 + case SET_3D_FPS: + SET_SHARED_GLOBAL(g_3d_fps, data[CMD_DATA_POS]); + debug_printf("set 3d fps %d\n", data[CMD_DATA_POS]); + send_len = send_user_cmd(send_data, SET_3D_FPS, 1, 0); + xmos_printf(send_data, send_len); + break; +#endif + case SET_LED_MODE: + SET_SHARED_GLOBAL(g_led_mode, data[CMD_DATA_POS]); + debug_printf("set led mode %d\n", data[CMD_DATA_POS]); + send_len = send_user_cmd(send_data, SET_LED_MODE, 1, 0); + xmos_printf(send_data, send_len); + break; + case FW_VERSION: + send_len = send_user_cmd(send_data, FW_VERSION, 0, 3); + xmos_printf(send_data, send_len); + break; + + case FLASH_ID: + send_len = send_user_cmd(send_data, FLASH_ID, 0, 20); + xmos_printf(send_data, send_len); + break; +#if EQ_EN + // EQ命令处理 - 调用eq.c中的函数 + case SET_EQ_MODE: + { + uint8_t mode = data[CMD_DATA_POS]; + uint8_t result = process_uart_set_eq_mode(mode); + uint8_t send_len = 0; + + // 发送确认响应 + send_len = send_user_cmd(send_data, SET_EQ_MODE, 0, 0); + xmos_printf(send_data, send_len); + } + break; + + case GET_EQ_MODE: + { + uint8_t response[64]; + // 检查是否有模式参数(数据长度>0表示有参数) + if (length > 0) { + uint8_t query_mode = data[CMD_DATA_POS]; + debug_printf("GET_EQ_MODE with mode parameter: %d\n", query_mode); + // 如果mode不是0xFF,临时设置request模式用于查询 + if (query_mode != 0xFF) { + SET_SHARED_GLOBAL(g_request_eq_mode, query_mode); + } + } + uint8_t len = process_uart_get_eq_mode(response, sizeof(response)); + if (len > 0) { + xmos_printf(response, len); + } + } + break; + + case SET_MODE_GAIN_AND_NAME: + { + uint8_t result = process_uart_set_mode_gain_and_name(data); + uint8_t send_len = 0; + + // 发送确认响应 + send_len = send_user_cmd(send_data, SET_MODE_GAIN_AND_NAME, 0, 0); + xmos_printf(send_data, send_len); + } + break; + + case SET_EQ_PARAMS: + { + uint8_t result = process_uart_set_eq_params(data); + uint8_t send_len = 0; + + // 发送确认响应 + send_len = send_user_cmd(send_data, SET_EQ_PARAMS, 0, 0); + xmos_printf(send_data, send_len); + } + break; + + case GET_EQ_PARAMS: + { + uint8_t response[64]; + uint8_t len = process_uart_get_eq_params(data, response, sizeof(response)); + if (len > 0) { + xmos_printf(response, len); + } + } + break; + + case RESET_EQ_PARAMS: + { + uint8_t result = process_uart_reset_eq_params(data); + uint8_t send_len = 0; + + // 发送响应 + send_data[CMD_DATA_POS] = result; + send_len = send_user_cmd(send_data, RESET_EQ_PARAMS, 0, 1); + xmos_printf(send_data, send_len); + } + break; + + case GET_DEVICE_INFO: + { + uint8_t response[64]; + uint8_t len = process_uart_get_device_info(response, sizeof(response)); + if (len > 0) { + xmos_printf(response, len); + } + } + break; + + case GET_EQ_MODE_COUNT: + { + uint8_t response[64]; + uint8_t len = process_uart_get_eq_mode_count(response, sizeof(response)); + if (len > 0) { + xmos_printf(response, len); + } + } + break; + + case SET_AND_SAVE_EQ_MODE: + { + uint8_t result = process_uart_set_and_save_eq_mode(data); + uint8_t send_len = 0; + + // 发送响应 + send_data[CMD_DATA_POS] = result; + send_len = send_user_cmd(send_data, SET_AND_SAVE_EQ_MODE, 0, 1); + xmos_printf(send_data, send_len); + } + break; + + case SET_VOLUME: + // 改动原因:使用g_dac_vol,参考SET_DAC_VOLUME的实现方式,直接设置全局变量 + SET_SHARED_GLOBAL(g_dac_vol, data[CMD_DATA_POS]); + send_len = send_user_cmd(send_data, SET_VOLUME, 1, 0); + SET_SHARED_GLOBAL(g_dac_vol, data[CMD_DATA_POS]); + debug_printf("set volume %d\n", data[CMD_DATA_POS]); + xmos_printf(send_data, send_len); + break; + + case GET_VOLUME: + // 改动原因:直接读取g_dac_vol的值并返回,参考SET_DAC_VOLUME的实现方式 + { + uint8_t response[64]; + unsigned dac_vol; + GET_SHARED_GLOBAL(dac_vol, g_dac_vol); + // 构建响应数据包:0x55 0xAA 0x00 0x4A 0x01 [volume] [checksum] + response[0] = 0x55; // 帧头1 + response[1] = 0xAA; // 帧头2 + response[2] = 0x00; // 版本 + response[3] = GET_VOLUME; // 命令码 + response[4] = 0x01; // 数据长度 + response[5] = (uint8_t)dac_vol; // 音量级别 + // 计算校验和 + uint8_t checksum_pos = 6; + // 改动原因:使用check_sum函数计算校验和,与send_user_cmd函数保持一致 + unsafe { + response[checksum_pos] = check_sum(response, checksum_pos); + } + uint8_t len = checksum_pos + 1; + debug_printf("get volume %d\n", dac_vol); + xmos_printf(response, len); + } + break; + + case GET_LED_INFO: + { + uint8_t led_index = data[CMD_DATA_POS]; + uint8_t response[64]; + uint8_t len = process_uart_get_led_info(led_index, response, sizeof(response)); + if (len > 0) { + xmos_printf(response, len); + } + } + break; + + case SET_LED_SWITCH: + // 改动原因:参考SET_LED_MODE,直接设置g_led_mode的值,0=关,1=开 + { + uint8_t led_index = data[CMD_DATA_POS]; + uint8_t led_switch = data[CMD_DATA_POS + 1]; + SET_SHARED_GLOBAL(g_led_mode, led_switch); + debug_printf("set led switch (g_led_mode) %d\n", led_switch); + uint8_t send_len = 0; + + // 发送响应 + send_data[CMD_DATA_POS] = 0; // 状态码:成功 + send_len = send_user_cmd(send_data, SET_LED_SWITCH, 0, 1); + xmos_printf(send_data, send_len); + } + break; + + case GET_LED_SWITCH: + // 改动原因:参考SET_LED_MODE,直接读取g_led_mode的值,0=关,1=开 + { + uint8_t led_index = data[CMD_DATA_POS]; + uint8_t response[64]; + unsigned led_mode; + GET_SHARED_GLOBAL(led_mode, g_led_mode); + + // 构建响应数据包:0x55 0xAA 0x00 0x4D 0x02 [led_index] [led_mode] [checksum] + response[0] = 0x55; // 帧头1 + response[1] = 0xAA; // 帧头2 + response[2] = 0x00; // 版本 + response[3] = GET_LED_SWITCH; // 命令码 + response[4] = 0x02; // 数据长度 + response[5] = led_index; // LED索引 + response[6] = (uint8_t)led_mode; // LED开关状态 + // 计算校验和 + uint8_t checksum_pos = 7; + unsafe { + response[checksum_pos] = check_sum(response, checksum_pos); + } + uint8_t len = checksum_pos + 1; + debug_printf("get led switch (g_led_mode) %d\n", led_mode); + xmos_printf(response, len); + } + break; + + case GET_LED_STATUS: + { + uint8_t led_index = data[CMD_DATA_POS]; + uint8_t response[64]; + uint8_t len = process_uart_get_led_status(led_index, response, sizeof(response)); + if (len > 0) { + xmos_printf(response, len); + } + } + break; + + case GET_LED_COUNT: + { + uint8_t response[64]; + uint8_t len = process_uart_get_led_count(response, sizeof(response)); + if (len > 0) { + xmos_printf(response, len); + } + } + break; + + case GET_UAC_MODE_INFO: + { + uint8_t response[64]; + uint8_t len = process_uart_get_uac_mode_info(response, sizeof(response)); + if (len > 0) { + xmos_printf(response, len); + } + } + break; + + case SET_UAC_MODE: + { + uint8_t uac_mode = data[CMD_DATA_POS]; + // process_uart_set_uac_mode(uac_mode); + // 设备重启,无响应 + } + break; + + case GET_CURRENT_UAC_MODE: + { + uint8_t response[64]; + uint8_t len = process_uart_get_current_uac_mode(response, sizeof(response)); + if (len > 0) { + xmos_printf(response, len); + } + } + break; + + case SET_EQ_ENABLE: + { + uint8_t enable = data[CMD_DATA_POS]; + uint8_t result = process_uart_set_eq_enable(enable); + uint8_t response[64]; + uint8_t len = process_uart_get_eq_enable_response(result, enable, response, sizeof(response)); + if (len > 0) { + xmos_printf(response, len); + } + } + break; + + case GET_EQ_ENABLE: + { + debug_printf("user_uart.xc: GET_EQ_ENABLE command received, start processing\n"); + uint8_t response[64]; + uint8_t len = process_uart_get_eq_enable(response, sizeof(response)); + debug_printf("user_uart.xc: GET_EQ_ENABLE process_uart_get_eq_enable returned len=%d\n", len); + if (len > 0) { + debug_printf("user_uart.xc: GET_EQ_ENABLE sending response, length=%d, data: ", len); + for (int i = 0; i < len && i < 16; i++) { + debug_printf("%02X ", response[i]); + } + debug_printf("\n"); + xmos_printf(response, len); + debug_printf("user_uart.xc: GET_EQ_ENABLE response sent\n"); + } else { + debug_printf("user_uart.xc: GET_EQ_ENABLE error - process_uart_get_eq_enable returned len=0\n"); + } + } + break; + + case GET_SAMPLE_FORMAT: + { + uint8_t response[64]; + uint8_t len = process_uart_get_sample_format(response, sizeof(response)); + if (len > 0) { + xmos_printf(response, len); + } + } + break; + + case SET_GAIN_MODE: + { + uint8_t gain_mode = data[CMD_DATA_POS]; + uint8_t result = process_uart_set_gain_mode(gain_mode); + // 无需发送响应,根据协议描述 + } + break; + + case GET_GAIN_MODE: + { + uint8_t response[64]; + uint8_t len = process_uart_get_gain_mode(response, sizeof(response)); + if (len > 0) { + xmos_printf(response, len); + } + } + break; + + case SET_FILTER_MODE: + { + uint8_t filter_mode = data[CMD_DATA_POS]; + uint8_t result = process_uart_set_filter_mode(filter_mode); + // 无需发送响应,根据协议描述 + } + break; + + case GET_FILTER_MODE: + { + uint8_t response[64]; + uint8_t len = process_uart_get_filter_mode(response, sizeof(response)); + if (len > 0) { + xmos_printf(response, len); + } + } + break; + + case SET_GAME_MODE: + { + uint8_t game_mode = data[CMD_DATA_POS]; + // 改动原因:UART 0x5A命令透传给MCU处理,MCU负责执行模式设置和参数保存 + // process_uart_set_game_mode(game_mode); + // 无需发送响应,根据协议描述 + } + break; + + case GET_GAME_MODE: + { + uint8_t response[64]; + uint8_t len = process_uart_get_game_mode(response, sizeof(response)); + if (len > 0) { + xmos_printf(response, len); + } + } + break; + + case GET_FIRMWARE_VERSION: + { + uint8_t response[64]; + uint8_t len = process_uart_get_firmware_version(response, sizeof(response)); + if (len > 0) { + xmos_printf(response, len); + } + } + break; + // 改动原因:添加0x5D SET_INPUT_SOURCE,由HID 0xB0触发后XMOS主动发给MCU;若MCU发来0x5D则忽略 + case SET_INPUT_SOURCE: + break; + // 改动原因:添加0x5E SET_MUTE_SWITCH,由HID 0xB1触发后XMOS发给MCU;若MCU发来0x5E则忽略 + case SET_MUTE_SWITCH: + break; + // 改动原因:0x5F GET_MUTE_SWITCH 响应由MCU发来,含1字节静音值;与g_adc_loop一致直接设置g_mute_switch,0xB2读与变化上报均用g_mute_switch + case GET_MUTE_SWITCH: + if (length >= 1) { + unsigned mute_val = (data[CMD_DATA_POS] > 1) ? 0 : (unsigned)data[CMD_DATA_POS]; + SET_SHARED_GLOBAL(g_mute_switch, mute_val); + } + break; + // 改动原因:添加0x60 SET_LISTEN_SWITCH,由HID 0xB3触发后XMOS发给MCU;若MCU发来0x60则忽略 + case SET_LISTEN_SWITCH: + break; +#endif + } + } + + cmdConfig.cmdCount = 0; +} + + +void xmos_uart_receive(void) +{ + static unsigned cmd_start_time = 0; + unsigned char temp = 0; + unsigned long now = get_reference_time(); + unsigned buff_len = (X_Rxfp + MAX_RX_LEN - X_Rxrp) % MAX_RX_LEN; + if (X_Rxfp != X_Rxrp) + { + temp = X_RXbuff[X_Rxrp]; + //debug_printf("head %02x rxrp %d\n", temp, X_Rxrp); + if ((cmd_start_time == 0 && (temp == UART_HEAD1)) || (cmd_start_time == 0 && (temp == UART_HEAD2))) + cmd_start_time = now; + + if(temp == UART_HEAD1) + { + if (buff_len > UART_HEAD_LEN) + { + if (UART_HEAD2 == X_RXbuff[CMD_HEAD2_POS]) + { + if(buff_len>(X_RXbuff[UART_HEAD_LEN-1] + UART_HEAD_LEN)) + { + debug_printf("buff len: %d data: %d\n", buff_len, X_RXbuff[UART_HEAD_LEN-1]); + process_command(X_RXbuff); + cmd_start_time = 0; + X_Rxfp = 0; + X_RXbuff[0]=0; + } + } + else + { + X_Rxfp = 0; + cmd_start_time = 0; + debug_printf("drop data %d\n", temp); + } + } + } + else if(temp == UART_HEAD2) + { + if (buff_len > UART_HEAD_LEN) + { + if ((UART_HEAD1 == X_RXbuff[CMD_HEAD2_POS]) && (buff_len == 8)) + { + // hid_ret_process(X_RXbuff); + cmd_start_time = 0; + X_Rxfp = 0; + X_RXbuff[0]=0; + } + else if (UART_HEAD1 != X_RXbuff[CMD_HEAD2_POS]) + { + X_Rxfp = 0; + cmd_start_time = 0; + debug_printf("drop data %d\n", temp); + } + } + } + else + { + X_Rxrp = X_Rxfp = 0; + cmd_start_time = 0; + debug_printf("drop data %02x\n", temp); + } + } + if((cmd_start_time != 0) && timeafter(now, cmd_start_time + RCV_CMD_TIMEOUT)) + { + debug_printf("drop data len %d\n", buff_len); + print_buff(X_RXbuff, buff_len); + X_Rxrp = X_Rxfp = 0; + cmd_start_time = 0; + } +} + +void uart_tx_handler(streaming chanend c_tx) +{ + p_uart_tx <: 1; + uart_tx_streaming(p_uart_tx, c_tx, UART_BIT_TIME); +} + +void uart_rx_handler(streaming chanend c_rx) +{ + uart_rx_streaming(p_uart_rx, c_rx, UART_BIT_TIME); +} + +void heatTick(unsigned long boot_time) +{ + static unsigned long cmd_send_time = 0; + static unsigned long volume_time = 0; + unsigned long tick_now = get_reference_time(); + uint8_t send_len = 0; + + if ((cmdConfig.cmdPending == CMD_NONE) && (cmdConfig.cmdCount < START_COUNTS)) + { + cmd_send_time = tick_now ; + if(!timeafter(tick_now, boot_time + RCV_CMD_TIMEOUT)) + { +#if BOOT_MODE + if ((cmdConfig.startFlag != 1) ) + { + + debug_printf("startFlag %08x\n", cmdConfig.startFlag ); + send_len = send_user_cmd(send_data, START_BOOT, 0, BOOT_CMD_DATA_LEN); + } + + if (cmdConfig.startFlag == 1) + { + if (cmdConfig.startConfig & 0x1) + { + send_len = send_user_cmd(send_data, READ_PRODUCT, 0, 0); + } + else if (cmdConfig.startConfig & 0x2) + { + send_len = send_user_cmd(send_data, READ_POR_CONFIG, 0, 0); + } + else if (cmdConfig.startConfig == 0) + { + send_len = send_user_cmd(send_data, READ_AUDIO_MODE, 0, 0); + } + cmdConfig.cmdCount = START_COUNTS; + } +#else + + if (cmdConfig.startApp & 1) + { + send_len = send_user_cmd(send_data, READ_USER_CONFIG, 0, 0); + cmdConfig.cmdCount = START_COUNTS; + } + else if (cmdConfig.startApp & 2) + { + send_len = send_user_cmd(send_data, START_FINISH, 0, FINISH_CMD_DATA_LEN); + cmdConfig.cmdCount = START_COUNTS; + } + +#endif + } + if (send_len > 0) + { + // debug_printf("count %d cmd %02x\n", cmdConfig.cmdCount, send_data[CMD_CMD_POS]); + // print_buff(send_data, send_len); + xmos_printf(send_data, send_len); + } + + } + + if(timeafter(tick_now, cmd_send_time + SEND_CMD_TIMEOUT)) + { + cmdConfig.cmdPending = CMD_NONE; + } + +#if BOOT_MODE + if(timeafter(tick_now, boot_time + RCV_CMD_TIMEOUT)) + { + unsigned usb_state; + GET_SHARED_GLOBAL(usb_state, g_usb_state); + if (usb_state == 0) + { + get_pid_vid(); + SET_SHARED_GLOBAL(g_usb_state, 1); + } + } +#endif + +#if !BOOT_MODE + static audio_sampling old_format = AUDIO_NO_USED; + static audio_type old_type = 0; + static int lmute = 0, rmute = 0, mmute = 0; + static int lvolume = 0, rvolume = 0, mvolume = 0; + audio_sampling new_format; + audio_type new_type; + + if (!g_in_fw_upgrade) + { + static unsigned char first_format = 0; + if((first_format == 1) || timeafter(tick_now, boot_time + RCV_CMD_TIMEOUT)) + { + first_format = 1; + GET_SHARED_GLOBAL(new_format, g_playback_format); + GET_SHARED_GLOBAL(new_type, g_audio_type); + if ((new_format != old_format) || (new_type != old_type)) + { + old_format = new_format; + old_type = new_type; + send_data[CMD_DATA_POS] = new_format; + send_data[CMD_DATA_POS + 1] = new_type; + + send_len = send_user_cmd(send_data, SEND_AUDIO_FORMAT, 3, 2); + xmos_printf(send_data, send_len); + + } + } + +#if (NUM_USB_CHAN_OUT != 0) || (NUM_USB_CHAN_IN != 0) + unsafe + { + unsigned int * unsafe volsOutPtr = volsOut; + unsigned int * unsafe mutesOutPtr = mutesOut; + if (volume_time == 0) + volume_time = boot_time; + if(timeafter(tick_now, volume_time + VOLUME_TIMEOUT)) + { + if(lvolume != volsOutPtr[1] || rvolume != volsOutPtr[2] || lmute != mutesOut[1] || rmute != mutesOut[2]) + { + lvolume = volsOutPtr[1]; + rvolume = volsOutPtr[2]; + mvolume = volsOutPtr[0]; +// debug_printf("master %d lvolume %d rvolume %d\n", mvolume, lvolume, rvolume); + lmute = mutesOut[1]; + rmute = mutesOut[2]; + send_data[CMD_DATA_POS] = mutesOut[1] ? 0xff : ((0 - lvolume) >> 8); + send_data[CMD_DATA_POS + 1] = mutesOut[2] ? 0xff : ((0 - rvolume) >> 8); + send_len = send_user_cmd(send_data, SEND_OUT_VOLUME, 3, 2); + // print_buff(send_data, send_len); + xmos_printf(send_data, send_len); + + } else if(mvolume != volsOutPtr[0] || mmute != mutesOut[0]) + { + mvolume = volsOutPtr[0]; + mmute = mutesOut[0]; + + // debug_printf("master %d mvolume %d\n", mvolume, mmute); + send_data[CMD_DATA_POS] = mutesOut[0] ? 0xff : ((0 - mvolume) >> 8); + send_data[CMD_DATA_POS + 1] = mutesOut[0] ? 0xff : ((0 - mvolume) >> 8); + send_len = send_user_cmd(send_data, SEND_OUT_VOLUME, 3, 2); + // print_buff(send_data, send_len); + xmos_printf(send_data, send_len); + } + + volume_time = tick_now; + } + } +#endif + } +#endif + +} + +extern unsigned GetDFUFlag(); +extern uint8_t key_validate(uint8_t offset); +extern void flash_opt_unlock(void); + +/* 改动原因:固件升级 START 已移至 AudioHwRemote2,不再在此接收 c_dfu */ +void uart_handler(streaming chanend c_tx, streaming chanend c_rx) +{ + unsigned long boot_time = get_reference_time(); + long int flag = 0; + long int dfu_flag = 0x11042011; + uint8_t uart_rx_byte; + g_xu316_id = read_key(); + cmdConfig.cmdPending = CMD_NONE; + unsigned long se_time = 0; + timer se_tmr; + se_tmr :> se_time; + se_time += 2000000; + +#if UAC1 + delay_milliseconds(100); +#endif + +#if XUA_DFU_EN + flag = GetDFUFlag(); +#endif + + if (key_validate(1) == 1) + { + SetKeyFlag(0x20241224); + } + + + flash_opt_unlock(); + +#if BOOT_MODE + + load_configs(); + +#if (XUA_DFU_EN == 1) + get_pid_vid(); + if (flag == dfu_flag) + SET_SHARED_GLOBAL(g_usb_state, 1); + +#if (FACT_MODE == 1) + SET_SHARED_GLOBAL(g_usb_state, 1); + return; +#endif + +#endif + +#else + cmdConfig.startApp = 3; + +#if (NUM_USB_CHAN_OUT != 0) || (NUM_USB_CHAN_IN != 0) + load_configs(); + get_pid_vid(); + SET_SHARED_GLOBAL(g_usb_state, 1); +#endif + + +#endif + + boot_time = get_reference_time(); + + while(1) + { + select { + case c_rx :> uart_rx_byte: +#if HID_DFU_EN + if (!g_in_fw_upgrade) +#endif + { + X_RXbuff[X_Rxfp] = uart_rx_byte; + X_Rxfp = (X_Rxfp + 1) % MAX_RX_LEN; + //debug_printf("in[%02x] %d %d len %d\n", uart_rx_byte, X_Rxfp, X_Rxrp, MAX_RX_LEN - ((X_Rxfp - X_Rxrp + MAX_RX_LEN) % MAX_RX_LEN)); + xmos_uart_receive(); + } + break; + case se_tmr when timerafter(se_time) :> void : + se_time += 400000; + /* 改动原因:若有固件升级开始/结束通知,先组包 0x62 发给 MCU,再清零标志 */ +#if HID_DFU_EN + { + unsigned notify = get_firmware_upgrade_mcu_notify(); + if (notify != 0) + { + unsigned char response[8]; + response[0] = 0x55; + response[1] = 0xAA; + response[2] = 0x01; + response[3] = (unsigned char)FIRMWARE_UPGRADE_NOTIFY; + response[4] = 0x01; + response[5] = (unsigned char)notify; + unsafe { + response[6] = check_sum((unsigned char *)response, 6); + } + xmos_printf(response, 7); + clear_firmware_upgrade_mcu_notify(); + } + } +#endif + #if XUA_DFU_EN + if (flag != dfu_flag) + #endif + { + xmos_printf_pross(c_tx); + heatTick(boot_time); + } + + + if (cmdConfig.pendingReboot == 1) + { + delay_milliseconds(5); + device_reboot(); + while(1); + } + + break; + } + } +} diff --git a/sw_usb_audio/deps.cmake b/sw_usb_audio/deps.cmake index 8e5cc8f..484b5c0 100644 --- a/sw_usb_audio/deps.cmake +++ b/sw_usb_audio/deps.cmake @@ -4,7 +4,10 @@ set(APP_DEPENDENT_MODULES "lib_xua(5.0.0)" "lib_adat(2.0.1)" "lib_locks(2.3.1)" "lib_i2c(6.2.0)" + "lib_src" "lib_hmac" + "lib_uart" + "lib_gpio" "lib_littlefs" "lib_qspi_flash" "lib_i2s(5.1.0)"