├── .clang-format ├── .github └── workflows │ └── actions.yml ├── .gitignore ├── CMakeLists.txt ├── README.md ├── include ├── R_gen.hpp └── z_gen.hpp ├── libs └── qtcoro │ ├── awaitable.hpp │ ├── library.json │ └── qtcoro.hpp ├── res ├── Screenshot_20240213_075625.png ├── dcdc.png ├── llc.png └── logo.png ├── src ├── I_Calc.cpp ├── I_Calc.hpp ├── I_Calc.ui ├── LLC_window.cpp ├── LLC_window.hpp ├── LLC_window.ui ├── RCD_window.cpp ├── RCD_window.hpp ├── RCD_window.ui ├── R_gen.cpp ├── R_select_window.cpp ├── R_select_window.hpp ├── R_select_window.ui ├── main.cpp ├── mainwindow.cpp ├── mainwindow.hpp └── mainwindow.ui ├── tools ├── index.ts ├── package.json ├── tsconfig.json └── yarn.lock └── 免换料费专区.xlsx /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | Language: Cpp 3 | BasedOnStyle: WebKit 4 | 5 | ColumnLimit: '120' 6 | UseTab: Always 7 | TabWidth: '4' 8 | IndentWidth: '4' 9 | ContinuationIndentWidth: '4' 10 | 11 | 12 | AllowAllArgumentsOnNextLine: true 13 | AllowShortBlocksOnASingleLine: false 14 | AllowShortIfStatementsOnASingleLine: false 15 | AlignAfterOpenBracket: DontAlign 16 | AlignConsecutiveAssignments: true 17 | AlignTrailingComments: true 18 | 19 | AlwaysBreakTemplateDeclarations: true 20 | 21 | BinPackArguments: false 22 | BinPackParameters: true 23 | 24 | BreakBeforeBinaryOperators: All 25 | BreakConstructorInitializers: BeforeComma 26 | BreakInheritanceList: BeforeComma 27 | BreakBeforeBraces: Custom 28 | BraceWrapping: 29 | AfterCaseLabel: true 30 | AfterClass: true 31 | AfterControlStatement: true 32 | AfterEnum: true 33 | AfterFunction: true 34 | AfterNamespace: true 35 | AfterObjCDeclaration: true 36 | AfterStruct: true 37 | AfterUnion: true 38 | BeforeCatch: true 39 | BeforeElse: true 40 | BeforeLambdaBody: true 41 | IndentBraces: false 42 | 43 | Cpp11BracedListStyle: false 44 | 45 | IndentCaseLabels: 'true' 46 | 47 | NamespaceIndentation: All 48 | 49 | SpaceBeforeCpp11BracedList: 'false' 50 | 51 | ... 52 | -------------------------------------------------------------------------------- /.github/workflows/actions.yml: -------------------------------------------------------------------------------- 1 | name: auto-builds 2 | 3 | on: [push, pull_request, workflow_dispatch] 4 | 5 | jobs: 6 | build: 7 | # Skip building pull requests from the same repository 8 | if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != '${{ github.repository }}' 9 | runs-on: ${{ matrix.os }} 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | os: [ubuntu-24.04, windows-latest] 14 | build_type: [Release] 15 | c_compiler: [clang, cl] 16 | include: 17 | - os: windows-latest 18 | c_compiler: cl 19 | cpp_compiler: cl 20 | - os: ubuntu-24.04 21 | c_compiler: clang 22 | cpp_compiler: clang++ 23 | exclude: 24 | - os: windows-latest 25 | c_compiler: clang 26 | - os: ubuntu-24.04 27 | c_compiler: cl 28 | 29 | steps: 30 | - name: Checkout 31 | uses: actions/checkout@v4 32 | 33 | - name: Install ninja-build tool 34 | uses: seanmiddleditch/gha-setup-ninja@v5 35 | 36 | - name: Cache Static Qt Install 37 | id: cache-qt6 38 | if: startsWith(runner.os, 'Windows') 39 | uses: actions/cache@v4.2.1 40 | with: 41 | path: msvc-qt 42 | key: qt6-win64-vc2022-static 43 | 44 | - name: Install Static Qt 45 | if: startsWith(runner.os, 'Windows') && (steps.cache-qt6.outputs.cache-hit != 'true') 46 | run: | 47 | Invoke-WebRequest https://github.com/microcai/static-build-qt6/releases/download/qt6_683/qt6_683_win64-msvc2022_static-release.zip -OutFile .\msvc-qt.zip 48 | expand-archive -path "msvc-qt.zip" 49 | 50 | - name: setup env for cmake to pickup QT 51 | if: startsWith(runner.os, 'Windows') 52 | shell: bash 53 | run: | 54 | echo "QT_ROOT_DIR=${{ github.workspace }}\\msvc-qt" >> $GITHUB_ENV 55 | echo "QT_PLUGIN_PATH=${{ github.workspace }}\\msvc-qt\\plugins" >> $GITHUB_ENV 56 | echo "CMAKE_PREFIX_PATH=${{ github.workspace }}\\msvc-qt" >> $GITHUB_ENV 57 | 58 | - name: setup env for cmake to pickup Clang 59 | if: startsWith(runner.os, 'Linux') 60 | shell: bash 61 | run: | 62 | echo "CC=${{ matrix.c_compiler }}" >> $GITHUB_ENV 63 | echo "CXX=${{ matrix.cpp_compiler }}" >> $GITHUB_ENV 64 | 65 | - name: Install System Qt 66 | if: startsWith(runner.os, 'Linux') 67 | run: | 68 | sudo apt-get update 69 | sudo apt-get install -y qt6-.+-dev 70 | 71 | - name: Enable Developer Command Prompt 72 | if: startsWith(runner.os, 'Windows') 73 | uses: ilammy/msvc-dev-cmd@v1.13.0 74 | 75 | - name: Configure Sources 76 | run: > 77 | cmake -G Ninja 78 | -S ${{ github.workspace }} 79 | -B ${{ github.workspace }}/build 80 | -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} 81 | -DCMAKE_INSTALL_PREFIX="${{ github.workspace }}/install" 82 | 83 | - name: Build Souces 84 | run: cmake --build ${{ github.workspace }}/build 85 | - name: Install Result 86 | run: cmake --install ${{ github.workspace }}/build 87 | 88 | - name: zip the result elf 89 | if: startsWith(github.ref, 'refs/tags/') && startsWith(runner.os, 'Linux') && matrix.build_type == 'Release' 90 | run: | 91 | cd install/bin 92 | 7z a eda-tool-linux.zip edatool 93 | 94 | - name: zip the result exe 95 | if: startsWith(github.ref, 'refs/tags/') && startsWith(runner.os, 'Windows') && matrix.build_type == 'Release' 96 | run: | 97 | cd install/bin 98 | 7z a eda-tool-win64.zip edatool.exe 99 | 100 | - name: upload exe Release 101 | if: startsWith(github.ref, 'refs/tags/') && startsWith(runner.os, 'Windows') && matrix.build_type == 'Release' 102 | uses: softprops/action-gh-release@v2.2.1 103 | with: 104 | files: install/bin/eda-tool-win64.zip 105 | 106 | - name: upload linux Release 107 | if: startsWith(github.ref, 'refs/tags/') && startsWith(runner.os, 'Linux') && matrix.build_type == 'Release' 108 | uses: softprops/action-gh-release@v2.2.1 109 | with: 110 | files: install/bin/eda-tool-linux.zip 111 | 112 | - name: Upload generic artifacts 113 | uses: actions/upload-artifact@v4.6.0 114 | with: 115 | name: eda-tool-${{ runner.os }} 116 | path: install/bin 117 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | .cache/ 3 | .vscode/ 4 | tools/node_modules/ 5 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.30) 2 | 3 | set(CMAKE_CXX_STANDARD 20) 4 | set(CMAKE_CXX_STANDARD_REQUIRED ON) 5 | # cmake_policy(SET CMP0091 NEW) 6 | 7 | set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") 8 | 9 | project(minitoolsets CXX) 10 | 11 | if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") 12 | add_compile_options(-foptimize-sibling-calls) 13 | endif() 14 | 15 | if (MSVC) 16 | add_link_options(/NODEFAULTLIB:libucrt$<$:d>.lib) 17 | link_libraries(ucrt$<$:d>.lib) 18 | endif(MSVC) 19 | 20 | find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets ) 21 | 22 | qt_standard_project_setup() 23 | 24 | include_directories(include) 25 | include_directories(src) 26 | include_directories(libs/qtcoro) 27 | 28 | qt_add_executable(edatool 29 | src/mainwindow.ui 30 | src/R_select_window.ui 31 | src/I_Calc.ui 32 | src/LLC_window.ui 33 | 34 | src/R_select_window.hpp 35 | src/mainwindow.hpp 36 | src/I_Calc.hpp 37 | src/LLC_window.hpp 38 | src/RCD_window.hpp 39 | 40 | src/R_select_window.cpp 41 | src/mainwindow.cpp 42 | src/I_Calc.cpp 43 | src/LLC_window.cpp 44 | src/RCD_window.cpp 45 | src/main.cpp 46 | src/R_gen.cpp 47 | ) 48 | 49 | target_link_libraries(edatool PRIVATE Qt6::Widgets) 50 | 51 | if (MSVC) 52 | target_link_options(edatool PRIVATE "/NODEFAULTLIB") 53 | target_link_libraries(edatool PRIVATE ucrt$<$:d>.lib msvcrt.lib libvcruntime.lib libcpmt$<$:d>.lib) 54 | endif() 55 | 56 | set_target_properties(edatool PROPERTIES 57 | WIN32_EXECUTABLE ON 58 | MACOSX_BUNDLE ON 59 | ) 60 | 61 | qt_add_resources(edatool imageresources 62 | PREFIX "/images" 63 | FILES res/dcdc.png res/logo.png res/llc.png 64 | ) 65 | 66 | install(TARGETS edatool DESTINATION bin) 67 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # FB电阻选型工具 3 | 4 | 快速找出能实现所要的 FB 分压的电阻组合。并且可以专门找到 JLC 的基础库电阻。省去换料费。 5 | 6 | ![截图](./res/Screenshot_20240213_075625.png) 7 | 8 | # LLC 快速计算器 9 | 10 | 快速计算谐振频率。和分压比。 11 | 12 | # 下载 13 | 14 | 点击 [Releases](https://github.com/microcai/JLC_R_util/releases) 按钮,到下载页面。 15 | 然后根据你的系统,选择下载 eda-tool-win64.zip 或着 eda-tool-linux.zip。 16 | 17 | 解压后运行里面的可执行程序即可。 18 | 19 | -------------------------------------------------------------------------------- /include/R_gen.hpp: -------------------------------------------------------------------------------- 1 | 2 | #pragma once 3 | 4 | #include 5 | 6 | struct Resistance 7 | { 8 | double value; 9 | char const* display_text; 10 | const char* jlc_part_number; 11 | 12 | operator double() const 13 | { 14 | return value; 15 | }; 16 | 17 | Resistance(const Resistance&) = default; 18 | Resistance(double value) : value(value), display_text(0), jlc_part_number(0){} 19 | Resistance(double value, const char* d, const char* jlc) : value(value), display_text(d), jlc_part_number(jlc){} 20 | 21 | operator QString() const 22 | { 23 | if (display_text) 24 | return QString::fromUtf8(display_text); 25 | if (value<1000) 26 | return QString("%1Ω").arg(value); 27 | if (value<1000000) 28 | { 29 | if (value / 1000 * 1000 == value) 30 | return QString("%1kΩ").arg(value/1000); 31 | else 32 | return QString("%1kΩ").arg(value/1000.0f); 33 | } 34 | if (value<1000000000) 35 | { 36 | if (value / 1000000 * 1000000 == value) 37 | return QString("%1kΩ").arg(value/1000); 38 | else 39 | return QString("%1MΩ").arg(value/1000000); 40 | } 41 | return QString("%1MΩ").arg(value/1000000); 42 | } 43 | }; 44 | 45 | struct R_lib 46 | { 47 | enum R_type { 48 | good_R, // 1% 49 | regular_R, // 5% 50 | free_R, // jlc free R 51 | } current_type; 52 | 53 | R_lib(int _type) : current_type((R_type)_type) 54 | {} 55 | 56 | Resistance operator()(int idx) const; 57 | 58 | int get_R_counts() const; 59 | }; 60 | -------------------------------------------------------------------------------- /include/z_gen.hpp: -------------------------------------------------------------------------------- 1 | 2 | #pragma once 3 | 4 | #include 5 | #include 6 | 7 | // Z walker generator 8 | struct Zgen 9 | { 10 | int x, y; 11 | int max_x, max_y; 12 | 13 | Zgen() : x(0), y(0), max_x(INT_MAX), max_y(INT_MAX) {} 14 | 15 | void set_size(int x, int y) 16 | { 17 | max_x = x; 18 | max_y = y; 19 | } 20 | 21 | enum direction { 22 | dir_right, 23 | dir_leftdown, 24 | dir_down, 25 | dir_right_up, 26 | dir_stop, 27 | }; 28 | 29 | direction prefered_dir = dir_leftdown; 30 | 31 | int condition() 32 | { 33 | if ( (x > 0) && (y > 0)) 34 | { 35 | if ((x >= max_x) && (y >= max_y)) 36 | { 37 | return dir_stop; 38 | } 39 | else if ( x >= max_x) 40 | { 41 | if (prefered_dir == dir_right_up) 42 | { 43 | prefered_dir = dir_leftdown; 44 | return dir_down; 45 | } 46 | } 47 | else if ( y >= max_x) 48 | { 49 | if (prefered_dir == dir_leftdown) 50 | { 51 | prefered_dir = dir_right_up; 52 | return dir_right; 53 | } 54 | } 55 | 56 | return prefered_dir; 57 | } 58 | else if ( x == 0 && y > 0) 59 | { 60 | if (prefered_dir == dir_leftdown) 61 | { 62 | prefered_dir = dir_right_up; 63 | if ( y == max_y) 64 | { 65 | return dir_right; 66 | } 67 | return dir_down; 68 | } 69 | return prefered_dir; 70 | } 71 | else if ( y == 0 && x > 0) 72 | { 73 | if (prefered_dir == dir_right_up) 74 | { 75 | prefered_dir = dir_leftdown; 76 | if ( x == max_y) 77 | { 78 | return dir_down; 79 | } 80 | return dir_right; 81 | } 82 | return prefered_dir; 83 | } 84 | else if (x == 0 && y == 0) 85 | { 86 | return dir_right; 87 | } 88 | return dir_right; 89 | } 90 | 91 | std::pair operator()() 92 | { 93 | std::pair ret = {x, y}; 94 | 95 | switch (condition()) 96 | { 97 | case dir_right_up: 98 | x ++; 99 | y --; 100 | break; 101 | case dir_leftdown: 102 | x --; 103 | y ++; 104 | break; 105 | case dir_down: 106 | y ++; 107 | // x = 0; 108 | break; 109 | case dir_right: 110 | x ++; 111 | // y = 0; 112 | break; 113 | case dir_stop: 114 | if ((x == 9999999) && (y == 9999999)) 115 | { 116 | throw std::out_of_range("eof"); 117 | } 118 | x = y = 9999999; 119 | break; 120 | } 121 | 122 | return ret; 123 | } 124 | 125 | }; 126 | -------------------------------------------------------------------------------- /libs/qtcoro/awaitable.hpp: -------------------------------------------------------------------------------- 1 | // 2 | // Distributed under the Boost Software License, Version 1.0. (See accompanying 3 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 4 | // 5 | 6 | #pragma once 7 | 8 | #include 9 | #include 10 | 11 | #if defined(__has_include) 12 | 13 | #if __has_include() 14 | #include 15 | #else 16 | #include 17 | namespace std 18 | { 19 | using std::experimental::coroutine_handle; 20 | using std::experimental::coroutine_traits; 21 | using std::experimental::noop_coroutine; 22 | using std::experimental::suspend_always; 23 | using std::experimental::suspend_never; 24 | } // namespace std 25 | #endif 26 | 27 | #else 28 | 29 | #error "Compiler version too low to support coroutine !!!" 30 | 31 | #endif 32 | 33 | #include 34 | #include 35 | #include 36 | #include 37 | #include 38 | #include 39 | #include 40 | 41 | #if defined(DEBUG) || defined(_DEBUG) 42 | #if defined(ENABLE_DEBUG_CORO_LEAK) 43 | 44 | #define DEBUG_CORO_PROMISE_LEAK 45 | 46 | #include 47 | inline std::unordered_set debug_coro_leak; 48 | 49 | #endif 50 | #endif 51 | 52 | namespace ucoro 53 | { 54 | template 55 | struct await_transformer; 56 | 57 | template 58 | struct awaitable; 59 | 60 | template 61 | struct awaitable_promise; 62 | 63 | template 64 | struct ExecutorAwaiter; 65 | 66 | template 67 | struct CallbackAwaiter; 68 | 69 | template 70 | struct local_storage_t 71 | { 72 | }; 73 | inline constexpr local_storage_t local_storage; 74 | 75 | ////////////////////////////////////////////////////////////////////////// 76 | namespace detail 77 | { 78 | template 79 | concept is_valid_await_suspend_return_value = 80 | std::convertible_to> || std::is_void_v || std::is_same_v; 81 | 82 | // 用于判定 T 是否是一个 awaiter 的类型, 即: 拥有 await_ready,await_suspend,await_resume 成员函数的结构或类. 83 | template 84 | concept is_awaiter_v = requires (T a) { 85 | { a.await_ready() } -> std::convertible_to; 86 | { a.await_suspend(std::coroutine_handle<>{}) } -> is_valid_await_suspend_return_value; 87 | { a.await_resume() }; 88 | }; 89 | 90 | // 用于判定 T 是否是一个 awaitable<>::promise_type 的类型, 即: 拥有 local_ 成员。 91 | template 92 | concept is_awaitable_promise_type_v = requires (T a) { 93 | { a.local_ } -> std::convertible_to>; 94 | }; 95 | } // namespace detail 96 | 97 | struct debug_coro_promise 98 | { 99 | #if defined(DEBUG_CORO_PROMISE_LEAK) 100 | 101 | void* operator new(std::size_t size) 102 | { 103 | void* ptr = std::malloc(size); 104 | if (!ptr) 105 | { 106 | throw std::bad_alloc{}; 107 | } 108 | debug_coro_leak.insert(ptr); 109 | return ptr; 110 | } 111 | 112 | void operator delete(void* ptr, [[maybe_unused]] std::size_t size) 113 | { 114 | debug_coro_leak.erase(ptr); 115 | std::free(ptr); 116 | } 117 | 118 | #endif // DEBUG_CORO_PROMISE_LEAK 119 | }; 120 | 121 | ////////////////////////////////////////////////////////////////////////// 122 | // 存储协程 promise 的返回值 123 | template 124 | struct awaitable_promise_value 125 | { 126 | template 127 | void return_value(V&& val) noexcept 128 | { 129 | value_.template emplace(std::forward(val)); 130 | } 131 | 132 | void unhandled_exception() noexcept 133 | { 134 | value_.template emplace(std::current_exception()); 135 | } 136 | 137 | std::variant value_{nullptr}; 138 | }; 139 | 140 | ////////////////////////////////////////////////////////////////////////// 141 | // 存储协程 promise 的返回值 void 的特化实现 142 | template<> 143 | struct awaitable_promise_value 144 | { 145 | std::exception_ptr exception_{nullptr}; 146 | 147 | constexpr void return_void() noexcept 148 | { 149 | } 150 | 151 | void unhandled_exception() noexcept 152 | { 153 | exception_ = std::current_exception(); 154 | } 155 | }; 156 | 157 | ////////////////////////////////////////////////////////////////////////// 158 | // 使用 .detach() 后创建的独立的协程的入口点 159 | // 由它开始链式使用 awaitable<> 160 | template 161 | struct awaitable_detached 162 | { 163 | awaitable_detached(const awaitable_detached&) = delete; 164 | 165 | struct promise_type : public awaitable_promise_value, public debug_coro_promise 166 | { 167 | awaitable_detached get_return_object() 168 | { 169 | return awaitable_detached{std::coroutine_handle::from_promise(*this)}; 170 | } 171 | 172 | struct final_awaiter : std::suspend_always 173 | { 174 | std::coroutine_handle<> await_suspend(std::coroutine_handle final_coro_handle) const noexcept 175 | { 176 | if (final_coro_handle.promise().continuation_) 177 | { 178 | // continuation_ 不为空,则 说明 .detach() 被 co_await 179 | // 因此,awaitable_detached 析构的时候会顺便撤销自己,所以这里不用 destory 180 | // 返回 continuation_,以便让协程框架调用 continuation_.resume() 181 | // 这样就把等它的协程唤醒了. 182 | return final_coro_handle.promise().continuation_; 183 | } 184 | // 如果 continuation_ 为空,则说明 .detach() 没有被 co_await 185 | // 因此,awaitable_detached 对象其实已经析构 186 | // 所以必须主动调用 destroy() 以免内存泄漏. 187 | final_coro_handle.destroy(); 188 | return std::noop_coroutine(); 189 | } 190 | }; 191 | 192 | auto initial_suspend() noexcept 193 | { 194 | return std::suspend_always{}; 195 | } 196 | 197 | auto final_suspend() noexcept 198 | { 199 | return final_awaiter{}; 200 | } 201 | 202 | // 对 detached 的 coro 调用 co_await 相当于 thread.join() 203 | // 因此记录这个 continuation 以便在 final awaiter 里唤醒 204 | std::coroutine_handle<> continuation_; 205 | }; 206 | 207 | explicit awaitable_detached(std::coroutine_handle promise_handle) 208 | : current_coro_handle_(promise_handle) 209 | { 210 | } 211 | 212 | awaitable_detached(awaitable_detached&& other) 213 | : current_coro_handle_(other.current_coro_handle_) 214 | { 215 | other.current_coro_handle_ = nullptr; 216 | } 217 | 218 | ~awaitable_detached() 219 | { 220 | if (current_coro_handle_) 221 | { 222 | if (current_coro_handle_.done()) 223 | { 224 | current_coro_handle_.destroy(); 225 | } 226 | else 227 | { 228 | // 由于 initial_supend 为 suspend_always 229 | // 因此 如果不对 .detach() 的返回值调用 co_await 230 | // 此协程将不会运行。 231 | // 因此,在本对象析构时,协程其实完全没运行过。 232 | // 正因为本对象析构的时候,协程都没有运行,就意味着 233 | // 其实用户只是调用了 .detach() 并没有对返回值进行 234 | // co_await 操作。 235 | // 因此为了能把协程运行起来,这里强制调用 resume 236 | current_coro_handle_.resume(); 237 | } 238 | } 239 | } 240 | 241 | bool await_ready() noexcept 242 | { 243 | return false; 244 | } 245 | 246 | auto await_suspend(std::coroutine_handle<> continuation) noexcept 247 | { 248 | current_coro_handle_.promise().continuation_ = continuation; 249 | return current_coro_handle_; 250 | } 251 | 252 | T await_resume() 253 | { 254 | if constexpr (std::is_void_v) 255 | { 256 | auto exception = current_coro_handle_.promise().exception_; 257 | if (exception) 258 | { 259 | std::rethrow_exception(exception); 260 | } 261 | } 262 | else 263 | { 264 | auto ret = std::move(current_coro_handle_.promise().value_); 265 | if (std::holds_alternative(ret)) 266 | { 267 | std::rethrow_exception(std::get(ret)); 268 | } 269 | 270 | return std::get(ret); 271 | } 272 | } 273 | 274 | std::coroutine_handle current_coro_handle_; 275 | }; 276 | 277 | ////////////////////////////////////////////////////////////////////////// 278 | 279 | template 280 | struct final_awaitable : std::suspend_always 281 | { 282 | std::coroutine_handle<> await_suspend(std::coroutine_handle> h) noexcept 283 | { 284 | if (h.promise().continuation_) 285 | { 286 | return h.promise().continuation_; 287 | } 288 | return std::noop_coroutine(); 289 | } 290 | }; 291 | 292 | ////////////////////////////////////////////////////////////////////////// 293 | // 返回 T 的协程 awaitable_promise 实现. 294 | 295 | // Promise 类型实现... 296 | template 297 | struct awaitable_promise : public awaitable_promise_value, public debug_coro_promise 298 | { 299 | awaitable get_return_object(); 300 | 301 | auto final_suspend() noexcept 302 | { 303 | return final_awaitable{}; 304 | } 305 | 306 | auto initial_suspend() 307 | { 308 | return std::suspend_always{}; 309 | } 310 | 311 | template requires (detail::is_awaiter_v>) 312 | auto await_transform(A&& awaiter) const 313 | { 314 | static_assert(std::is_rvalue_reference_v, "co_await must be used on rvalue"); 315 | return std::forward(awaiter); 316 | } 317 | 318 | template requires (!detail::is_awaiter_v>) 319 | auto await_transform(A&& awaiter) const 320 | { 321 | return await_transformer::await_transform(std::move(awaiter)); 322 | } 323 | 324 | void set_local(std::any local) 325 | { 326 | local_ = std::make_shared(local); 327 | } 328 | 329 | template 330 | struct local_storage_awaiter 331 | { 332 | awaitable_promise* this_; 333 | 334 | constexpr bool await_ready() const noexcept 335 | { 336 | return true; 337 | } 338 | void await_suspend(std::coroutine_handle) noexcept 339 | { 340 | } 341 | 342 | auto await_resume() const noexcept 343 | { 344 | if constexpr (std::is_void_v) 345 | { 346 | return *this_->local_; 347 | } 348 | else 349 | { 350 | return std::any_cast(*this_->local_); 351 | } 352 | } 353 | }; 354 | 355 | template 356 | auto await_transform(local_storage_t) 357 | { 358 | return local_storage_awaiter{this}; 359 | } 360 | 361 | std::coroutine_handle<> continuation_; 362 | std::shared_ptr local_; 363 | }; 364 | 365 | ////////////////////////////////////////////////////////////////////////// 366 | 367 | // awaitable 协程包装... 368 | template 369 | struct awaitable 370 | { 371 | using promise_type = awaitable_promise; 372 | 373 | explicit awaitable(std::coroutine_handle h) : current_coro_handle_(h) 374 | { 375 | } 376 | 377 | ~awaitable() 378 | { 379 | if (current_coro_handle_ && current_coro_handle_.done()) 380 | { 381 | current_coro_handle_.destroy(); 382 | } 383 | } 384 | 385 | awaitable(awaitable&& t) noexcept : current_coro_handle_(t.current_coro_handle_) 386 | { 387 | t.current_coro_handle_ = nullptr; 388 | } 389 | 390 | awaitable& operator=(awaitable&& t) noexcept 391 | { 392 | if (&t != this) 393 | { 394 | if (current_coro_handle_) 395 | { 396 | current_coro_handle_.destroy(); 397 | } 398 | current_coro_handle_ = t.current_coro_handle_; 399 | t.current_coro_handle_ = nullptr; 400 | } 401 | return *this; 402 | } 403 | 404 | awaitable(const awaitable&) = delete; 405 | awaitable(awaitable&) = delete; 406 | awaitable& operator=(const awaitable&) = delete; 407 | awaitable& operator=(awaitable&) = delete; 408 | 409 | T operator()() 410 | { 411 | return get(); 412 | } 413 | 414 | T get() 415 | { 416 | if constexpr (!std::is_void_v) 417 | { 418 | return std::move(current_coro_handle_.promise().value_); 419 | } 420 | } 421 | 422 | constexpr bool await_ready() const noexcept 423 | { 424 | return false; 425 | } 426 | 427 | T await_resume() 428 | { 429 | if constexpr (std::is_void_v) 430 | { 431 | auto exception = current_coro_handle_.promise().exception_; 432 | if (exception) 433 | { 434 | std::rethrow_exception(exception); 435 | } 436 | 437 | current_coro_handle_.destroy(); 438 | current_coro_handle_ = nullptr; 439 | } 440 | else 441 | { 442 | auto ret = std::move(current_coro_handle_.promise().value_); 443 | if (std::holds_alternative(ret)) 444 | { 445 | std::rethrow_exception(std::get(ret)); 446 | } 447 | 448 | current_coro_handle_.destroy(); 449 | current_coro_handle_ = nullptr; 450 | 451 | return std::get(ret); 452 | } 453 | } 454 | 455 | template 456 | auto await_suspend(std::coroutine_handle continuation) 457 | { 458 | if constexpr (detail::is_awaitable_promise_type_v) 459 | { 460 | current_coro_handle_.promise().local_ = continuation.promise().local_; 461 | } 462 | 463 | current_coro_handle_.promise().continuation_ = continuation; 464 | return current_coro_handle_; 465 | } 466 | 467 | void set_local(std::any local) 468 | { 469 | assert("local has value" && !current_coro_handle_.promise().local_); 470 | current_coro_handle_.promise().set_local(local); 471 | } 472 | 473 | auto detach() 474 | { 475 | auto launch_coro = [](awaitable lazy) -> awaitable_detached { co_return co_await lazy; }; 476 | return launch_coro(std::move(*this)); 477 | } 478 | 479 | auto detach(std::any local) 480 | { 481 | if (local.has_value()) 482 | { 483 | set_local(local); 484 | } 485 | 486 | auto launch_coro = [](awaitable lazy) -> awaitable_detached { co_return co_await lazy; }; 487 | return launch_coro(std::move(*this)); 488 | } 489 | 490 | std::coroutine_handle current_coro_handle_; 491 | }; 492 | 493 | ////////////////////////////////////////////////////////////////////////// 494 | 495 | template 496 | awaitable awaitable_promise::get_return_object() 497 | { 498 | auto result = awaitable{std::coroutine_handle>::from_promise(*this)}; 499 | return result; 500 | } 501 | } // namespace ucoro 502 | 503 | ////////////////////////////////////////////////////////////////////////// 504 | 505 | namespace ucoro 506 | { 507 | template 508 | struct CallbackAwaiterBase 509 | { 510 | T await_resume() noexcept 511 | { 512 | return std::move(result_); 513 | } 514 | 515 | T result_; 516 | }; 517 | 518 | template<> 519 | struct CallbackAwaiterBase 520 | { 521 | void await_resume() noexcept 522 | { 523 | } 524 | }; 525 | 526 | template 527 | struct CallbackAwaiter : public CallbackAwaiterBase 528 | { 529 | CallbackAwaiter(const CallbackAwaiter&) = delete; 530 | CallbackAwaiter& operator = (const CallbackAwaiter&) = delete; 531 | public: 532 | explicit CallbackAwaiter(CallbackFunction&& callback_function) 533 | : callback_function_(std::forward(callback_function)) 534 | { 535 | } 536 | 537 | CallbackAwaiter(CallbackAwaiter&&) = default; 538 | 539 | constexpr bool await_ready() noexcept 540 | { 541 | return false; 542 | } 543 | 544 | // 用户调用 handle( ret_value ) 就是在这里执行的. 545 | void resume_coro(std::coroutine_handle<> handle, std::shared_ptr executor_detect_flag) 546 | { 547 | if (executor_detect_flag->test_and_set()) 548 | { 549 | // 如果执行到这里,说明 executor_detect_flag 运行在 callback_function_ 返回之后,所以也就 550 | // 是说运行在 executor 中。 551 | handle.resume(); 552 | } 553 | } 554 | 555 | std::coroutine_handle<> await_suspend(std::coroutine_handle<> handle) 556 | { 557 | auto executor_detect_flag = std::make_shared(); 558 | 559 | if constexpr (std::is_void_v) 560 | { 561 | callback_function_([this, handle, executor_detect_flag]() mutable 562 | { 563 | return resume_coro(handle, executor_detect_flag); 564 | }); 565 | } 566 | else 567 | { 568 | callback_function_([this, executor_detect_flag, handle](T t) mutable 569 | { 570 | this->result_ = std::move(t); 571 | return resume_coro(handle, executor_detect_flag); 572 | }); 573 | } 574 | 575 | if (executor_detect_flag->test_and_set()) 576 | { 577 | // 如果执行到这里,说明 executor_detect_flag 已经被执行,这里分 2 种情况: 578 | // 579 | // 第一种情况就是 580 | // 在 executor 线程中执行了 executor_detect_flag executor 线程快于当前线程。 581 | // 582 | // executor 线程快于当前线程的情况下,executor_detect_flag 什么都不会做,仅仅只设置 flag。 583 | // 如果 executor 线程慢于当前线程,则上面的 flag.test_and_set() 会返回 false 并 584 | // 设置 flag,然后执行 return std::noop_coroutine(); 在此后的 executor_detect_flag 中 585 | // 因为 flag.test_and_set() 为 true 将会 resume 协程。 586 | // 587 | // 第二种情况就是 executor_detect_flag 直接被 callback_function_ executor_detect_flag 588 | // 也仅仅只设置 flag。 589 | // 590 | // 无论哪一种情况,我们都可以在这里直接返回 handle 让协程框架维护协程 resume。 591 | return handle; 592 | } 593 | else 594 | { 595 | // 如果执行到这里,说明 executor_detect_flag 肯定没被执行,说明是由 executor 驱动. 596 | // executor 驱动即返回 noop_coroutine 即可. 597 | return std::noop_coroutine(); 598 | } 599 | } 600 | 601 | private: 602 | CallbackFunction callback_function_; 603 | }; 604 | 605 | } // namespace ucoro 606 | 607 | ////////////////////////////////////////////////////////////////////////// 608 | 609 | template 610 | ucoro::CallbackAwaiter callback_awaitable(callback&& cb) 611 | { 612 | return ucoro::CallbackAwaiter{std::forward(cb)}; 613 | } 614 | 615 | template 616 | auto coro_start(Awaitable&& coro, Local&& local) 617 | { 618 | return coro.detach(local); 619 | } 620 | 621 | template 622 | auto coro_start(Awaitable&& coro) 623 | { 624 | return coro.detach(); 625 | } 626 | -------------------------------------------------------------------------------- /libs/qtcoro/library.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/platformio/platformio-core/develop/platformio/assets/schema/library.json", 3 | "name": "libmcu_coro", 4 | "version": "1.0.0", 5 | "build": { 6 | "srcDir": ".", 7 | } 8 | } -------------------------------------------------------------------------------- /libs/qtcoro/qtcoro.hpp: -------------------------------------------------------------------------------- 1 | 2 | #pragma once 3 | 4 | #include 5 | #include "awaitable.hpp" 6 | 7 | namespace mocutil 8 | { 9 | // The maximum Size of a string literal is 2 GB on 32-bit and 4 GB on 64-bit 10 | // (but the compiler is likely to give up before you get anywhere near that much) 11 | static constexpr size_t MaxStringSize = 12 | (std::min)(size_t((std::numeric_limits::max)()), 13 | size_t((std::numeric_limits::max)())); 14 | 15 | template constexpr size_t stringDataSizeHelper(std::integer_sequence) 16 | { 17 | // same as: 18 | // return (0 + ... + Nx); 19 | // but not using the fold expression to avoid exceeding compiler limits 20 | size_t total = 0; 21 | uint sizes[] = { Nx... }; 22 | for (uint n : sizes) 23 | total += n; 24 | return total; 25 | } 26 | 27 | template struct StringData 28 | { 29 | static_assert(StringSize <= MaxStringSize, "Meta Object data is too big"); 30 | uint offsetsAndSizes[Count] = {}; 31 | char stringdata0[StringSize] = {}; 32 | constexpr StringData() = default; 33 | }; 34 | 35 | template constexpr auto stringData(const char (&...strings)[Nx]) 36 | { 37 | constexpr size_t StringSize = stringDataSizeHelper({}); 38 | constexpr size_t Count = 2 * sizeof...(Nx); 39 | 40 | StringData result; 41 | const char *inputs[] = { strings... }; 42 | uint sizes[] = { Nx... }; 43 | 44 | uint offset = 0; 45 | char *output = result.stringdata0; 46 | for (size_t i = 0; i < sizeof...(Nx); ++i) { 47 | // copy the input string, including the terminating null 48 | uint len = sizes[i]; 49 | for (uint j = 0; j < len; ++j) 50 | output[offset + j] = inputs[i][j]; 51 | result.offsetsAndSizes[2 * i] = offset + sizeof(result.offsetsAndSizes); 52 | result.offsetsAndSizes[2 * i + 1] = len - 1; 53 | offset += len; 54 | } 55 | 56 | return result; 57 | } 58 | 59 | } 60 | 61 | namespace qtcoro 62 | { 63 | using namespace ucoro; 64 | 65 | using ::coro_start; 66 | 67 | template 68 | awaitable coro_delay_ms(INT ms) 69 | { 70 | co_await callback_awaitable([ms](auto continuation) 71 | { 72 | QTimer::singleShot(std::chrono::milliseconds(ms), [continuation]() mutable { 73 | continuation(); 74 | }); 75 | }); 76 | } 77 | 78 | } // namespace qtcoro 79 | 80 | -------------------------------------------------------------------------------- /res/Screenshot_20240213_075625.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microcai/JLC_R_util/d22a0810aeec6c2fa3497767fe0a7d6327c4e58c/res/Screenshot_20240213_075625.png -------------------------------------------------------------------------------- /res/dcdc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microcai/JLC_R_util/d22a0810aeec6c2fa3497767fe0a7d6327c4e58c/res/dcdc.png -------------------------------------------------------------------------------- /res/llc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microcai/JLC_R_util/d22a0810aeec6c2fa3497767fe0a7d6327c4e58c/res/llc.png -------------------------------------------------------------------------------- /res/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microcai/JLC_R_util/d22a0810aeec6c2fa3497767fe0a7d6327c4e58c/res/logo.png -------------------------------------------------------------------------------- /src/I_Calc.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include "I_Calc.hpp" 3 | #include 4 | #include "qtcoro.hpp" 5 | #include "R_gen.hpp" 6 | #include "z_gen.hpp" 7 | 8 | #include "I_Calc.moc" 9 | 10 | I_Calc::I_Calc(QWidget* parent, Qt::WindowFlags f) 11 | : QWidget(parent, f) 12 | { 13 | setupUi(this); 14 | } 15 | 16 | qtcoro::awaitable I_Calc::do_calc() 17 | { 18 | auto Vout = this->Vout->value(); 19 | auto Vin = this->Vin->value(); 20 | auto Fsw = this->Fsw->value() * 1000; 21 | auto Iout = this->Iout->value(); 22 | auto Ripple = this->Kind->value(); 23 | 24 | auto Lmin = Vout * (Vin - Vout) / (Vin * Ripple * Iout * Fsw); 25 | 26 | auto row = 0; 27 | 28 | result->setText(QString("%1uH").arg(static_cast(Lmin*1000000))); 29 | 30 | begin_calc->setEnabled(true); 31 | 32 | co_return; 33 | } 34 | 35 | void I_Calc::on_begin_calc_clicked() 36 | { 37 | begin_calc->setEnabled(false); 38 | qtcoro::coro_start(do_calc()); 39 | } 40 | 41 | void I_Calc::check_caculatable() 42 | { 43 | 44 | } 45 | 46 | -------------------------------------------------------------------------------- /src/I_Calc.hpp: -------------------------------------------------------------------------------- 1 | 2 | #pragma once 3 | 4 | #include 5 | #include "ui_I_Calc.h" 6 | #include "qtcoro.hpp" 7 | 8 | class I_Calc : public QWidget, Ui_I_Calc 9 | { 10 | Q_OBJECT 11 | 12 | public: 13 | explicit I_Calc(QWidget* parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); 14 | 15 | private: 16 | qtcoro::awaitable do_calc(); 17 | 18 | public Q_SLOTS: 19 | void check_caculatable(); 20 | void on_begin_calc_clicked(); 21 | }; 22 | 23 | -------------------------------------------------------------------------------- /src/I_Calc.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | I_Calc 4 | 5 | 6 | 7 | 0 8 | 0 9 | 412 10 | 344 11 | 12 | 13 | 14 | Icalc 15 | 16 | 17 | 18 | 19 | 20 | 输出电流 21 | 22 | 23 | 24 | 25 | 26 | 27 | Qt::Orientation::Horizontal 28 | 29 | 30 | 31 | 40 32 | 20 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | V 41 | 42 | 43 | 999.000000000000000 44 | 45 | 46 | 24.000000000000000 47 | 48 | 49 | 50 | 51 | 52 | 53 | 输出电压: 54 | 55 | 56 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 57 | 58 | 59 | 60 | 61 | 62 | 63 | Qt::Orientation::Horizontal 64 | 65 | 66 | 67 | 40 68 | 20 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | A 77 | 78 | 79 | 3 80 | 81 | 82 | 0.100000000000000 83 | 84 | 85 | 1.000000000000000 86 | 87 | 88 | 89 | 90 | 91 | 92 | 输入电压: 93 | 94 | 95 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 96 | 97 | 98 | 99 | 100 | 101 | 102 | QAbstractSpinBox::CorrectionMode::CorrectToPreviousValue 103 | 104 | 105 | V 106 | 107 | 108 | 12.000000000000000 109 | 110 | 111 | 112 | 113 | 114 | 115 | 开关频率: 116 | 117 | 118 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 119 | 120 | 121 | 122 | 123 | 124 | 125 | 计算 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 0.100000000000000 136 | 137 | 138 | 0.200000000000000 139 | 140 | 141 | 142 | 143 | 144 | 145 | 纹波: 146 | 147 | 148 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 149 | 150 | 151 | 152 | 153 | 154 | 155 | QAbstractSpinBox::CorrectionMode::CorrectToNearestValue 156 | 157 | 158 | kHz 159 | 160 | 161 | 162 | 163 | 164 | 1 165 | 166 | 167 | 99999999 168 | 169 | 170 | 1 171 | 172 | 173 | QAbstractSpinBox::StepType::AdaptiveDecimalStepType 174 | 175 | 176 | 300 177 | 178 | 179 | 180 | 181 | 182 | 183 | QFrame::Shape::StyledPanel 184 | 185 | 186 | QFrame::Shadow::Raised 187 | 188 | 189 | 190 | 191 | 192 | 最低电感量: 193 | 194 | 195 | Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 30 204 | 0 205 | 206 | 207 | 208 | 209 | 210 | 211 | Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | Vin 222 | Vout 223 | Fsw 224 | Iout 225 | Kind 226 | begin_calc 227 | 228 | 229 | 230 | 231 | -------------------------------------------------------------------------------- /src/LLC_window.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | #include 4 | #include "LLC_window.hpp" 5 | #include 6 | #include "qtcoro.hpp" 7 | #include "R_gen.hpp" 8 | #include "z_gen.hpp" 9 | 10 | #include "LLC_window.moc" 11 | 12 | LLC_window::LLC_window(QWidget* parent, Qt::WindowFlags f) 13 | : QWidget(parent, f) 14 | { 15 | setupUi(this); 16 | 17 | connect(this->freq_slide, SIGNAL(sliderMoved(int)), this, SLOT(freqSlided(int))); 18 | connect(this->load_slide, SIGNAL(sliderMoved(int)), this, SLOT(loadSlided(int))); 19 | connect(this->Rload, SIGNAL(valueChanged(double)), this, SLOT(updateLoadSlide(double))); 20 | updateLoadSlide(Rload->value()); 21 | } 22 | 23 | qtcoro::awaitable LLC_window::do_calc() 24 | { 25 | auto Lm = this->Lm->value() * 0.0000001; 26 | auto Lr = this->Lr->value() * 0.0000001; 27 | auto C = this->Cf->value() * 0.0000001; 28 | auto R = this->Rload->value(); 29 | 30 | freq1 = 1.0 / (2 * std::numbers::pi * sqrt( Lm * C)); 31 | freq2 = 1.0 / (2 * std::numbers::pi * sqrt( Lr * C)); 32 | 33 | freq = freq1 + (1.0/((R + 1)*(R + 1)))*(freq2-freq1); 34 | 35 | this->Resonant_frequency->setText(tr("%1").arg(freq/1000)); 36 | this->Resonant_frequency1->setText(tr("%1").arg(freq1/1000)); 37 | this->Resonant_frequency2->setText(tr("%1").arg(freq2/1000)); 38 | 39 | auto R_C = 1.0 / (2.0*std::numbers::pi * C * freq ); 40 | auto R_Lr = 2.0*std::numbers::pi * Lr * freq; 41 | 42 | auto R_Lm = 2.0*std::numbers::pi * freq * (Lm - Lr) * R / ( R + Lm - Lr); 43 | 44 | auto zengyi = 2.0* (R_Lm) / (R_C + R_Lr + R_Lm); 45 | 46 | this->gain->setText(tr("%1").arg(zengyi)); 47 | 48 | begin_calc->setEnabled(true); 49 | 50 | co_return; 51 | } 52 | 53 | void LLC_window::loadSlided(int pos) 54 | { 55 | auto Z = tan( sin( static_cast(pos) / 1000.0 * (std::numbers::pi/2.0) ) * (std::numbers::pi/2.0) ); 56 | this->Rload->setValue(Z); 57 | } 58 | 59 | void LLC_window::updateLoadSlide(double v) 60 | { 61 | int pos = asin( atan(v) / (std::numbers::pi/2.0) ) / (std::numbers::pi/2.0) * 1000.0; 62 | load_slide->setSliderPosition(pos); 63 | } 64 | 65 | void LLC_window::freqSlided(int pos) 66 | { 67 | freq = freq1 + (freq2-freq1)* (pos) / freq_slide->maximum(); 68 | this->Resonant_frequency->setText(tr("%1").arg(freq/1000)); 69 | 70 | auto Lm = this->Lm->value() * 0.0000001; 71 | auto Lr = this->Lr->value() * 0.0000001; 72 | auto C = this->Cf->value() * 0.0000001; 73 | auto R = this->Rload->value(); 74 | 75 | auto R_C = 1.0 / (2.0*std::numbers::pi * C * freq ); 76 | auto R_Lr = 2.0*std::numbers::pi * Lr * freq; 77 | 78 | auto R_Lm = 2.0*std::numbers::pi * freq * (Lm - Lr) * R / ( R + Lm - Lr); 79 | 80 | auto zengyi = 2.0* (R_Lm) / (R_C + R_Lr + R_Lm); 81 | 82 | this->gain->setText(tr("%1").arg(zengyi)); 83 | } 84 | 85 | void LLC_window::on_begin_calc_clicked() 86 | { 87 | begin_calc->setEnabled(false); 88 | qtcoro::coro_start(do_calc()); 89 | } 90 | 91 | void LLC_window::check_caculatable() 92 | { 93 | 94 | } 95 | 96 | -------------------------------------------------------------------------------- /src/LLC_window.hpp: -------------------------------------------------------------------------------- 1 | 2 | #pragma once 3 | 4 | #include 5 | #include "ui_LLC_window.h" 6 | #include "qtcoro.hpp" 7 | 8 | class LLC_window : public QWidget, Ui_LLC_window 9 | { 10 | Q_OBJECT 11 | 12 | public: 13 | explicit LLC_window(QWidget* parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); 14 | 15 | private: 16 | qtcoro::awaitable do_calc(); 17 | 18 | public Q_SLOTS: 19 | void check_caculatable(); 20 | void on_begin_calc_clicked(); 21 | void freqSlided(int); 22 | void loadSlided(int); 23 | void updateLoadSlide(double); 24 | 25 | private: 26 | qreal freq1, freq2, freq; 27 | }; 28 | 29 | -------------------------------------------------------------------------------- /src/LLC_window.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | LLC_window 4 | 5 | 6 | 7 | 0 8 | 0 9 | 527 10 | 367 11 | 12 | 13 | 14 | Icalc 15 | 16 | 17 | 18 | 19 | 20 | 1 21 | 22 | 23 | 1 24 | 25 | 26 | 1 27 | 28 | 29 | 1 30 | 31 | 32 | 33 | 34 | 等效负载电阻: 35 | 36 | 37 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 38 | 39 | 40 | 41 | 42 | 43 | 44 | 匝比: 45 | 46 | 47 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 200 56 | 0 57 | 58 | 59 | 60 | QAbstractSpinBox::CorrectionMode::CorrectToPreviousValue 61 | 62 | 63 | uH 64 | 65 | 66 | 6 67 | 68 | 69 | 999999.000000000000000 70 | 71 | 72 | 50.000000000000000 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 200 81 | 0 82 | 83 | 84 | 85 | QAbstractSpinBox::CorrectionMode::CorrectToPreviousValue 86 | 87 | 88 | Ω 89 | 90 | 91 | 11 92 | 93 | 94 | 999999999.000000000000000 95 | 96 | 97 | 50.000000000000000 98 | 99 | 100 | 101 | 102 | 103 | 104 | 变压器电感: 105 | 106 | 107 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 50 118 | 0 119 | 120 | 121 | 122 | 123 | 124 | 125 | 0 126 | 127 | 128 | 1.000000000000000 129 | 130 | 131 | 9999.000000000000000 132 | 133 | 134 | 1.000000000000000 135 | 136 | 137 | 1.000000000000000 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | Qt::AlignmentFlag::AlignCenter 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 50 156 | 0 157 | 158 | 159 | 160 | 161 | 162 | 163 | 0 164 | 165 | 166 | 1.000000000000000 167 | 168 | 169 | 9999.000000000000000 170 | 171 | 172 | 1.000000000000000 173 | 174 | 175 | 1.000000000000000 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 200 186 | 0 187 | 188 | 189 | 190 | uF 191 | 192 | 193 | 6 194 | 195 | 196 | 9999.000000000000000 197 | 198 | 199 | 22.000000000000000 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 200 208 | 0 209 | 210 | 211 | 212 | QAbstractSpinBox::CorrectionMode::CorrectToPreviousValue 213 | 214 | 215 | uH 216 | 217 | 218 | 6 219 | 220 | 221 | 999999.000000000000000 222 | 223 | 224 | 20.000000000000000 225 | 226 | 227 | 228 | 229 | 230 | 231 | 谐振电容: 232 | 233 | 234 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 235 | 236 | 237 | 238 | 239 | 240 | 241 | 变压器漏感: 242 | 243 | 244 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 245 | 246 | 247 | 248 | 249 | 250 | 251 | 计算 252 | 253 | 254 | true 255 | 256 | 257 | false 258 | 259 | 260 | 261 | 262 | 263 | 264 | Qt::Orientation::Horizontal 265 | 266 | 267 | 268 | 300 269 | 20 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 0 278 | 279 | 280 | 1000 281 | 282 | 283 | 1 284 | 285 | 286 | 10 287 | 288 | 289 | 0 290 | 291 | 292 | 0 293 | 294 | 295 | Qt::Orientation::Horizontal 296 | 297 | 298 | false 299 | 300 | 301 | false 302 | 303 | 304 | QSlider::TickPosition::NoTicks 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 8 317 | 8 318 | 319 | 320 | 321 | 322 | 323 | 324 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 8 333 | 8 334 | 335 | 336 | 337 | 338 | 339 | 340 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 341 | 342 | 343 | 344 | 345 | 346 | 347 | 增益: 348 | 349 | 350 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 351 | 352 | 353 | 354 | 355 | 356 | 357 | 带载谐振频率: 358 | 359 | 360 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 361 | 362 | 363 | 364 | 365 | 366 | 367 | KHZ 368 | 369 | 370 | Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter 371 | 372 | 373 | 374 | 375 | 376 | 377 | 空载谐振频率: 378 | 379 | 380 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 8 389 | 8 390 | 391 | 392 | 393 | 394 | 395 | 396 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 8 405 | 8 406 | 407 | 408 | 409 | 410 | 411 | 412 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 413 | 414 | 415 | 416 | 417 | 418 | 419 | Qt::Orientation::Horizontal 420 | 421 | 422 | 423 | 40 424 | 20 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | KHZ 433 | 434 | 435 | Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter 436 | 437 | 438 | 439 | 440 | 441 | 442 | KHZ 443 | 444 | 445 | Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter 446 | 447 | 448 | 449 | 450 | 451 | 452 | 重载谐振频率: 453 | 454 | 455 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 456 | 457 | 458 | 459 | 460 | 461 | 462 | 0 463 | 464 | 465 | 1000 466 | 467 | 468 | 1 469 | 470 | 471 | 10 472 | 473 | 474 | 0 475 | 476 | 477 | 0 478 | 479 | 480 | Qt::Orientation::Horizontal 481 | 482 | 483 | false 484 | 485 | 486 | false 487 | 488 | 489 | QSlider::TickPosition::NoTicks 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 0 500 | 0 501 | 502 | 503 | 504 | 505 | 500 506 | 250 507 | 508 | 509 | 510 | 511 | 512 | 513 | :/images/res/llc.png 514 | 515 | 516 | true 517 | 518 | 519 | Qt::AlignmentFlag::AlignCenter 520 | 521 | 522 | 523 | 524 | 525 | 526 | Cf 527 | Lm 528 | 529 | 530 | 531 | 532 | -------------------------------------------------------------------------------- /src/RCD_window.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | #include 4 | #include "RCD_window.hpp" 5 | #include 6 | #include "qtcoro.hpp" 7 | #include "R_gen.hpp" 8 | #include "z_gen.hpp" 9 | 10 | #include "RCD_window.moc" 11 | 12 | RCD_window::RCD_window(QWidget* parent, Qt::WindowFlags f) 13 | : QWidget(parent, f) 14 | { 15 | setupUi(this); 16 | connect(this->duty_slide, SIGNAL(sliderMoved(int)), this, SLOT(DutySlided(int))); 17 | DutySlided(this->duty_slide->value()); 18 | } 19 | 20 | void RCD_window::DutySlided(int pos) 21 | { 22 | if (pos > 50) 23 | { 24 | this->duty_slide->setSliderPosition(50); 25 | pos = 50; 26 | } 27 | 28 | this->label_duty->setText(tr("%1%").arg(pos)); 29 | 30 | qtcoro::coro_start(do_calc()); 31 | } 32 | 33 | 34 | void RCD_window::on_begin_calc_clicked() 35 | { 36 | begin_calc->setEnabled(false); 37 | qtcoro::coro_start(do_calc()); 38 | } 39 | 40 | void RCD_window::check_caculatable() 41 | { 42 | 43 | } 44 | 45 | qtcoro::awaitable RCD_window::do_calc() 46 | { 47 | begin_calc->setEnabled(true); 48 | 49 | // 根据占空比,计算反射电压 50 | 51 | 52 | co_return; 53 | } 54 | -------------------------------------------------------------------------------- /src/RCD_window.hpp: -------------------------------------------------------------------------------- 1 | 2 | #pragma once 3 | 4 | #include 5 | #include "ui_RCD_window.h" 6 | #include "qtcoro.hpp" 7 | 8 | class RCD_window : public QWidget, Ui_RCD_window 9 | { 10 | Q_OBJECT 11 | 12 | public: 13 | explicit RCD_window(QWidget* parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); 14 | 15 | private: 16 | qtcoro::awaitable do_calc(); 17 | 18 | public Q_SLOTS: 19 | void check_caculatable(); 20 | void on_begin_calc_clicked(); 21 | void DutySlided(int); 22 | 23 | private: 24 | qreal freq1, freq2, freq; 25 | }; 26 | 27 | -------------------------------------------------------------------------------- /src/RCD_window.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | RCD_window 4 | 5 | 6 | 7 | 0 8 | 0 9 | 715 10 | 317 11 | 12 | 13 | 14 | RCD 15 | 16 | 17 | 18 | 19 | 20 | 0 21 | 22 | 23 | 0 24 | 25 | 26 | 0 27 | 28 | 29 | 0 30 | 31 | 32 | 0 33 | 34 | 35 | 36 | 37 | 38 | 40 39 | 0 40 | 41 | 42 | 43 | 50% 44 | 45 | 46 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 47 | 48 | 49 | 1 50 | 51 | 52 | 53 | 54 | 55 | 56 | 100 57 | 58 | 59 | 0 60 | 61 | 62 | 50 63 | 64 | 65 | Qt::Orientation::Horizontal 66 | 67 | 68 | false 69 | 70 | 71 | false 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 200 82 | 0 83 | 84 | 85 | 86 | QAbstractSpinBox::CorrectionMode::CorrectToPreviousValue 87 | 88 | 89 | uH 90 | 91 | 92 | 6 93 | 94 | 95 | 999999.000000000000000 96 | 97 | 98 | 50.000000000000000 99 | 100 | 101 | 102 | 103 | 104 | 105 | 初级线圈峰值电流: 106 | 107 | 108 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 50 117 | 0 118 | 119 | 120 | 121 | 122 | 123 | 124 | 0 125 | 126 | 127 | 1.000000000000000 128 | 129 | 130 | 9999.000000000000000 131 | 132 | 133 | 1.000000000000000 134 | 135 | 136 | 1.000000000000000 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 200 145 | 0 146 | 147 | 148 | 149 | QAbstractSpinBox::CorrectionMode::CorrectToPreviousValue 150 | 151 | 152 | V 153 | 154 | 155 | 1 156 | 157 | 158 | 10.000000000000000 159 | 160 | 161 | 999999.000000000000000 162 | 163 | 164 | 20.000000000000000 165 | 166 | 167 | 168 | 169 | 170 | 171 | 反射电压: 172 | 173 | 174 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 175 | 176 | 177 | 178 | 179 | 180 | 181 | 匝比: 182 | 183 | 184 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 40 193 | 0 194 | 195 | 196 | 197 | 0V 198 | 199 | 200 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 201 | 202 | 203 | 204 | 205 | 206 | 207 | 0uF 208 | 209 | 210 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 50 219 | 0 220 | 221 | 222 | 223 | 224 | 225 | 226 | 0 227 | 228 | 229 | 1.000000000000000 230 | 231 | 232 | 9999.000000000000000 233 | 234 | 235 | 1.000000000000000 236 | 237 | 238 | 1.000000000000000 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 0 247 | 0 248 | 249 | 250 | 251 | 252 | 500 253 | 250 254 | 255 | 256 | 257 | 258 | 259 | 260 | :/images/res/flyback.png 261 | 262 | 263 | true 264 | 265 | 266 | Qt::AlignmentFlag::AlignCenter 267 | 268 | 269 | 270 | 271 | 272 | 273 | Qt::Orientation::Horizontal 274 | 275 | 276 | 277 | 137 278 | 20 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 建议钳位电阻: 287 | 288 | 289 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | Qt::AlignmentFlag::AlignCenter 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 200 308 | 0 309 | 310 | 311 | 312 | QAbstractSpinBox::CorrectionMode::CorrectToPreviousValue 313 | 314 | 315 | V 316 | 317 | 318 | 1 319 | 320 | 321 | 60.000000000000000 322 | 323 | 324 | 999999.000000000000000 325 | 326 | 327 | 600.000000000000000 328 | 329 | 330 | 331 | 332 | 333 | 334 | 变压器初级电感: 335 | 336 | 337 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 200 346 | 0 347 | 348 | 349 | 350 | QAbstractSpinBox::CorrectionMode::CorrectToPreviousValue 351 | 352 | 353 | uH 354 | 355 | 356 | 6 357 | 358 | 359 | 999999.000000000000000 360 | 361 | 362 | 20.000000000000000 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 373 | 374 | 375 | 376 | 377 | 378 | 379 | 建议钳位电容: 380 | 381 | 382 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 383 | 384 | 385 | 386 | 387 | 388 | 389 | 最大占空比: 390 | 391 | 392 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 393 | 394 | 395 | 396 | 397 | 398 | 399 | 输出电压: 400 | 401 | 402 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 403 | 404 | 405 | 406 | 407 | 408 | 409 | 变压器初级漏感: 410 | 411 | 412 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 413 | 414 | 415 | 416 | 417 | 418 | 419 | 开关管耐压压: 420 | 421 | 422 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 200 431 | 0 432 | 433 | 434 | 435 | QAbstractSpinBox::CorrectionMode::CorrectToPreviousValue 436 | 437 | 438 | V 439 | 440 | 441 | 1 442 | 443 | 444 | 10.000000000000000 445 | 446 | 447 | 999999.000000000000000 448 | 449 | 450 | 310.000000000000000 451 | 452 | 453 | 454 | 455 | 456 | 457 | 供电电压: 458 | 459 | 460 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 461 | 462 | 463 | 464 | 465 | 466 | 467 | 计算 468 | 469 | 470 | true 471 | 472 | 473 | false 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 40 482 | 0 483 | 484 | 485 | 486 | 0V 487 | 488 | 489 | Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | -------------------------------------------------------------------------------- /src/R_gen.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | #include "R_gen.hpp" 4 | 5 | static const uint64_t E24_R[] = { 6 | 10, 11, 12, 13, 15, 16, 18, 20, 7 | 22, 24, 27, 30, 33, 36, 39, 43, 8 | 47, 51, 56, 62, 68, 75, 82, 91, 9 | }; 10 | 11 | static const uint64_t E96_R[] = { 12 | 100, 102, 105, 107, 110, 113, 115, 118, 121, 13 | 124, 127, 130, 133, 137, 140, 143, 147, 150, 14 | 154, 158, 162, 165, 169, 174, 178, 182, 187, 15 | 191, 196, 200, 205, 210, 215, 221, 226, 232, 16 | 237, 243, 249, 255, 261, 267, 274, 280, 287, 17 | 294, 301, 309, 316, 324, 332, 340, 348, 357, 18 | 365, 374, 383, 392, 402, 412, 422, 432, 442, 19 | 453, 464, 475, 487, 499, 511, 523, 536, 549, 20 | 562, 576, 590, 604, 619, 634, 649, 665, 681, 21 | 698, 715, 732, 750, 768, 787, 806, 825, 845, 22 | 866, 887, 908, 931, 953, 976, 23 | 24 | 1000, 1020, 1050, 1070, 1100, 1130, 1150, 1180, 1210, 25 | 1240, 1270, 1300, 1330, 1370, 1400, 1430, 1470, 1500, 26 | 1540, 1580, 1620, 1650, 1690, 1740, 1780, 1820, 1870, 27 | 1910, 1960, 2000, 2050, 2100, 2150, 2210, 2260, 2320, 28 | 2370, 2430, 2490, 2550, 2610, 2670, 2740, 2800, 2870, 29 | 2940, 3010, 3090, 3160, 3240, 3320, 3400, 3480, 3570, 30 | 3650, 3740, 3830, 3920, 4020, 4120, 4220, 4320, 4420, 31 | 4530, 4640, 4750, 4870, 4990, 5110, 5230, 5360, 5490, 32 | 5620, 5760, 5900, 6040, 6190, 6340, 6490, 6650, 6810, 33 | 6980, 7150, 7320, 7500, 7680, 7870, 8060, 8250, 8450, 34 | 8660, 8870, 9090, 9310, 9530, 9760, 35 | 36 | 10000, 10200, 10500, 10700, 11000, 11300, 11500, 11800, 12100, 37 | 12400, 12700, 13000, 13300, 13700, 14000, 14300, 14700, 15000, 38 | 15400, 15800, 16200, 16500, 16900, 17400, 17800, 18200, 18700, 39 | 19100, 19600, 20000, 20500, 21000, 21500, 22100, 22600, 23200, 40 | 23700, 24300, 24900, 25500, 26100, 26700, 27400, 28000, 28700, 41 | 29400, 30100, 30900, 31600, 32400, 33200, 34000, 34800, 35700, 42 | 36500, 37400, 38300, 39200, 40200, 41200, 42200, 43200, 44200, 43 | 45300, 46400, 47500, 48700, 49900, 51100, 52300, 53600, 54900, 44 | 56200, 57600, 59000, 60400, 61900, 63400, 64900, 66500, 68100, 45 | 69800, 71500, 73200, 75000, 76800, 78700, 80600, 82500, 84500, 46 | 86600, 88700, 90900, 93100, 95300, 97600, 47 | 48 | 100000, 102000, 105000, 107000, 110000, 113000, 115000, 118000, 121000, 49 | 124000, 127000, 130000, 133000, 137000, 140000, 143000, 147000, 150000, 50 | 154000, 158000, 162000, 165000, 169000, 174000, 178000, 182000, 187000, 51 | 191000, 196000, 200000, 205000, 210000, 215000, 221000, 226000, 232000, 52 | 237000, 243000, 249000, 255000, 261000, 267000, 274000, 280000, 287000, 53 | 294000, 301000, 309000, 316000, 324000, 332000, 340000, 348000, 357000, 54 | 365000, 374000, 383000, 392000, 402000, 412000, 422000, 432000, 442000, 55 | 453000, 464000, 475000, 487000, 499000, 511000, 523000, 536000, 549000, 56 | 562000, 576000, 590000, 604000, 619000, 634000, 649000, 665000, 681000, 57 | 698000, 715000, 732000, 750000, 768000, 787000, 806000, 825000, 845000, 58 | 866000, 887000, 909000, 931000, 953000, 976000, 59 | }; 60 | 61 | static const struct Resistance JLC_free[] = { 62 | { 0, "0Ω ±1% 100mW 厚膜电阻", "C21189" }, 63 | { 0, "0Ω ±1% 62.5mW 厚膜电阻", "C17168" }, 64 | { 0, "0Ω ±1% 125mW 厚膜电阻", "C17477" }, 65 | { 0, "0Ω ±1% 250mW 厚膜电阻", "C17888" }, 66 | { 0.1, "100mΩ ±1% 250mW 厚膜电阻", "C25334" }, 67 | { 1, "1Ω ±1% 250mW 厚膜电阻", "C17928" }, 68 | { 1, "1Ω ±1% 100mW 厚膜电阻", "C22936" }, 69 | { 1, "1Ω ±1% 125mW 厚膜电阻", "C25271" }, 70 | { 1, "1Ω ±1% 62.5mW 厚膜电阻", "C25086" }, 71 | { 2, "2Ω ±1% 100mW 厚膜电阻", "C22977" }, 72 | { 2, "2Ω ±1% 125mW 厚膜电阻", "C17606" }, 73 | { 2.2, "2.2Ω ±1% 100mW 厚膜电阻", "C22939" }, 74 | { 2.2, "2.2Ω ±1% 125mW 厚膜电阻", "C17521" }, 75 | { 4.7, "4.7Ω ±1% 100mW 厚膜电阻", "C23164" }, 76 | { 4.7, "4.7Ω ±1% 125mW 厚膜电阻", "C17675" }, 77 | { 5.1, "5.1Ω ±1% 100mW 厚膜电阻", "C25197" }, 78 | { 5.1, "5.1Ω ±1% 125mW 厚膜电阻", "C17724" }, 79 | { 10, "10Ω ±1% 250mW 厚膜电阻", "C17903" }, 80 | { 10, "10Ω ±1% 100mW 厚膜电阻", "C22859" }, 81 | { 10, "10Ω ±1% 125mW 厚膜电阻", "C17415" }, 82 | { 10, "10Ω ±1% 62.5mW 厚膜电阻", "C25077" }, 83 | { 15, "15Ω ±1% 100mW 厚膜电阻", "C22810" }, 84 | { 15, "15Ω ±1% 125mW 厚膜电阻", "C17480" }, 85 | { 20, "20Ω ±1% 125mW 厚膜电阻", "C17544" }, 86 | { 20, "20Ω ±1% 100mW 厚膜电阻", "C22950" }, 87 | { 20, "20Ω ±1% 250mW 厚膜电阻", "C17955" }, 88 | { 22, "22Ω ±1% 100mW 厚膜电阻", "C23345" }, 89 | { 22, "22Ω ±1% 125mW 厚膜电阻", "C17561" }, 90 | { 22, "22Ω ±1% 250mW 厚膜电阻", "C17958" }, 91 | { 22, "22Ω ±1% 62.5mW 厚膜电阻", "C25092" }, 92 | { 27, "27Ω ±1% 100mW 厚膜电阻", "C25190" }, 93 | { 27, "27Ω ±1% 125mW 厚膜电阻", "C17594" }, 94 | { 33, "33Ω ±1% 100mW 厚膜电阻", "C23140" }, 95 | { 33, "33Ω ±1% 62.5mW 厚膜电阻", "C25105" }, 96 | { 33, "33Ω ±1% 125mW 厚膜电阻", "C17634" }, 97 | { 47, "47Ω ±1% 125mW 厚膜电阻", "C17714" }, 98 | { 47, "47Ω ±1% 100mW 厚膜电阻", "C23182" }, 99 | { 47, "47Ω ±1% 62.5mW 厚膜电阻", "C25118" }, 100 | { 49.9, "49.9Ω ±1% 125mW 厚膜电阻", "C17720" }, 101 | { 49.9, "49.9Ω ±1% 100mW 厚膜电阻", "C23185" }, 102 | { 49.9, "49.9Ω ±1% 62.5mW 厚膜电阻", "C25120" }, 103 | { 51, "51Ω ±1% 62.5mW 厚膜电阻", "C25125" }, 104 | { 51, "51Ω ±1% 125mW 厚膜电阻", "C17738" }, 105 | { 51, "51Ω ±1% 100mW 厚膜电阻", "C23197" }, 106 | { 56, "56Ω ±1% 100mW 厚膜电阻", "C25196" }, 107 | { 56, "56Ω ±1% 125mW 厚膜电阻", "C17757" }, 108 | { 68, "68Ω ±1% 100mW 厚膜电阻", "C27592" }, 109 | { 68, "68Ω ±1% 125mW 厚膜电阻", "C17802" }, 110 | { 75, "75Ω ±1% 62.5mW 厚膜电阻", "C25133" }, 111 | { 75, "75Ω ±1%", "C20638" }, 112 | { 75, "75Ω ±1% 100mW 厚膜电阻", "C4275" }, 113 | { 82, "82Ω ±1% 100mW 厚膜电阻", "C23255" }, 114 | { 100, "100Ω ±1% 250mW 厚膜电阻", "C17901" }, 115 | { 100, "100Ω ±1% 100mW 厚膜电阻", "C22775" }, 116 | { 100, "100Ω ±1% 62.5mW 厚膜电阻", "C25076" }, 117 | { 100, "100Ω ±1% 125mW 厚膜电阻", "C17408" }, 118 | { 120, "120Ω ±1% 250mW 厚膜电阻", "C17909" }, 119 | { 120, "120Ω ±1% 100mW 厚膜电阻", "C22787" }, 120 | { 120, "120Ω ±1% 125mW 厚膜电阻", "C17437" }, 121 | { 120, "120Ω ±1% 62.5mW 厚膜电阻", "C25079" }, 122 | { 150, "150Ω ±1% 62.5mW 厚膜电阻", "C25082" }, 123 | { 150, "150Ω ±1% 100mW 厚膜电阻", "C22808" }, 124 | { 150, "150Ω ±1% 125mW 厚膜电阻", "C17471" }, 125 | { 180, "180Ω ±1% 250mW 厚膜电阻", "C17924" }, 126 | { 180, "180Ω ±1% 125mW 厚膜电阻", "C25270" }, 127 | { 180, "180Ω ±1% 100mW 厚膜电阻", "C22828" }, 128 | { 200, "200Ω ±1% 125mW 厚膜电阻", "C17540" }, 129 | { 200, "200Ω ±1% 62.5mW 厚膜电阻", "C25087" }, 130 | { 200, "200Ω ±1% 100mW 厚膜电阻", "C8218" }, 131 | { 220, "220Ω ±1% 125mW 厚膜电阻", "C17557" }, 132 | { 220, "220Ω ±1% 100mW 厚膜电阻", "C22962" }, 133 | { 220, "220Ω ±1% 62.5mW 厚膜电阻", "C25091" }, 134 | { 240, "240Ω ±1% 100mW 厚膜电阻", "C23350" }, 135 | { 240, "240Ω ±1% 125mW 厚膜电阻", "C17572" }, 136 | { 270, "270Ω ±1% 125mW 厚膜电阻", "C17590" }, 137 | { 270, "270Ω ±1% 100mW 厚膜电阻", "C22966" }, 138 | { 300, "300Ω ±1% 62.5mW 厚膜电阻", "C25102" }, 139 | { 300, "300Ω ±1% 100mW 厚膜电阻", "C23025" }, 140 | { 300, "300Ω ±1% 125mW 厚膜电阻", "C17617" }, 141 | { 300, "300Ω ±1% 250mW 厚膜电阻", "C17887" }, 142 | { 330, "330Ω ±1% 100mW 厚膜电阻", "C23138" }, 143 | { 330, "330Ω ±1% 62.5mW 厚膜电阻", "C25104" }, 144 | { 330, "330Ω ±1% 125mW 厚膜电阻", "C17630" }, 145 | { 360, "360Ω ±1% 100mW 厚膜电阻", "C25194" }, 146 | { 390, "390Ω ±1% 100mW 厚膜电阻", "C23151" }, 147 | { 390, "390Ω ±1% 125mW 厚膜电阻", "C17655" }, 148 | { 430, "430Ω ±1% 100mW 厚膜电阻", "C23170" }, 149 | { 470, "470Ω ±5%", "C25510" }, 150 | { 470, "470Ω ±1% 125mW 厚膜电阻", "C17710" }, 151 | { 470, "470Ω ±1% 100mW 厚膜电阻", "C23179" }, 152 | { 470, "470Ω ±1% 62.5mW 厚膜电阻", "C25117" }, 153 | { 510, "510Ω ±1% 62.5mW 厚膜电阻", "C25123" }, 154 | { 510, "510Ω ±1% 125mW 厚膜电阻", "C17734" }, 155 | { 510, "510Ω ±1% 100mW 厚膜电阻", "C23193" }, 156 | { 560, "560Ω ±1% 125mW 厚膜电阻", "C28636" }, 157 | { 560, "560Ω ±1% 100mW 厚膜电阻", "C23204" }, 158 | { 620, "620Ω ±1% 100mW 厚膜电阻", "C23220" }, 159 | { 680, "680Ω ±1% 125mW 厚膜电阻", "C17798" }, 160 | { 680, "680Ω ±1% 62.5mW 厚膜电阻", "C25130" }, 161 | { 680, "680Ω ±1% 100mW 厚膜电阻", "C23228" }, 162 | { 750, "750Ω ±1% 250mW 厚膜电阻", "C17985" }, 163 | { 750, "750Ω ±1% 100mW 厚膜电阻", "C23241" }, 164 | { 750, "750Ω ±1% 125mW 厚膜电阻", "C17818" }, 165 | { 820, "820Ω ±1% 100mW 厚膜电阻", "C23253" }, 166 | { 820, "820Ω ±1% 125mW 厚膜电阻", "C17837" }, 167 | { 1000, "1kΩ ±1% 250mW 厚膜电阻", "C4410" }, 168 | { 1000, "1kΩ ±1% 100mW 厚膜电阻", "C21190" }, 169 | { 1000, "1kΩ ±1% 125mW 厚膜电阻", "C17513" }, 170 | { 1000, "1kΩ ±5%", "C20197" }, 171 | { 1000, "1kΩ ±1% 62.5mW 厚膜电阻", "C11702" }, 172 | { 1100, "1.1kΩ ±1% 100mW 厚膜电阻", "C22764" }, 173 | { 1200, "1.2kΩ ±1% 62.5mW 厚膜电阻", "C25862" }, 174 | { 1200, "1.2kΩ ±1% 125mW 厚膜电阻", "C17379" }, 175 | { 1200, "1.2kΩ ±1% 100mW 厚膜电阻", "C22765" }, 176 | { 1500, "1.5kΩ ±1% 100mW 厚膜电阻", "C22843" }, 177 | { 1500, "1.5kΩ ±1% 62.5mW 厚膜电阻", "C25867" }, 178 | { 1500, "1.5kΩ ±1% 125mW 厚膜电阻", "C4310" }, 179 | { 1800, "1.8kΩ ±1% 100mW 厚膜电阻", "C4177" }, 180 | { 1800, "1.8kΩ ±1% 125mW 厚膜电阻", "C17398" }, 181 | { 2000, "2kΩ ±1% 250mW 厚膜电阻", "C17944" }, 182 | { 2000, "2kΩ ±1% 62.5mW 厚膜电阻", "C4109" }, 183 | { 2000, "2kΩ ±1% 100mW 厚膜电阻", "C22975" }, 184 | { 2000, "2kΩ ±1% 125mW 厚膜电阻", "C17604" }, 185 | { 2200, "2.2kΩ ±1% 100mW 厚膜电阻", "C4190" }, 186 | { 2200, "2.2kΩ ±1% 125mW 厚膜电阻", "C17520" }, 187 | { 2200, "2.2kΩ ±1% 62.5mW 厚膜电阻", "C25879" }, 188 | { 2400, "2.4kΩ ±1% 100mW 厚膜电阻", "C22940" }, 189 | { 2400, "2.4kΩ ±1% 125mW 厚膜电阻", "C17526" }, 190 | { 2400, "2.4kΩ ±1% 62.5mW 厚膜电阻", "C25882" }, 191 | { 2700, "2.7kΩ ±1% 125mW 厚膜电阻", "C17530" }, 192 | { 2700, "2.7kΩ ±1% 100mW 厚膜电阻", "C13167" }, 193 | { 3000, "3kΩ ±1% 100mW 厚膜电阻", "C4211" }, 194 | { 3000, "3kΩ ±1% 125mW 厚膜电阻", "C17661" }, 195 | { 3300, "3.3kΩ ±1% 125mW 厚膜电阻", "C26010" }, 196 | { 3300, "3.3kΩ ±1% 62.5mW 厚膜电阻", "C25890" }, 197 | { 3300, "3.3kΩ ±1% 100mW 厚膜电阻", "C22978" }, 198 | { 3600, "3.6kΩ ±1% 125mW 厚膜电阻", "C18359" }, 199 | { 3600, "3.6kΩ ±1% 100mW 厚膜电阻", "C22980" }, 200 | { 3900, "3.9kΩ ±1% 100mW 厚膜电阻", "C23018" }, 201 | { 3900, "3.9kΩ ±1% 62.5mW 厚膜电阻", "C51721" }, 202 | { 3900, "3.9kΩ ±1% 125mW 厚膜电阻", "C17614" }, 203 | { 4300, "4.3kΩ ±1% 100mW 厚膜电阻", "C23159" }, 204 | { 4300, "4.3kΩ ±1% 125mW 厚膜电阻", "C17667" }, 205 | { 4700, "4.7kΩ ±1% 62.5mW 厚膜电阻", "C25900" }, 206 | { 4700, "4.7kΩ ±5%", "C1980" }, 207 | { 4700, "4.7kΩ ±1% 250mW 厚膜电阻", "C17936" }, 208 | { 4700, "4.7kΩ ±1% 100mW 厚膜电阻", "C23162" }, 209 | { 4700, "4.7kΩ ±1% 125mW 厚膜电阻", "C17673" }, 210 | { 4990, "4.99kΩ ±1% 125mW 厚膜电阻", "C17677" }, 211 | { 4990, "4.99kΩ ±1% 100mW 厚膜电阻", "C23046" }, 212 | { 5100, "5.1kΩ ±1% 62.5mW 厚膜电阻", "C25905" }, 213 | { 5100, "5.1kΩ ±1% 100mW 厚膜电阻", "C23186" }, 214 | { 5100, "5.1kΩ ±1% 125mW 厚膜电阻", "C27834" }, 215 | { 5600, "5.6kΩ ±1% 62.5mW 厚膜电阻", "C25908" }, 216 | { 5600, "5.6kΩ ±1% 100mW 厚膜电阻", "C23189" }, 217 | { 5600, "5.6kΩ ±1% 125mW 厚膜电阻", "C4382" }, 218 | { 6200, "6.2kΩ ±1% 125mW 厚膜电阻", "C17767" }, 219 | { 6200, "6.2kΩ ±1% 100mW 厚膜电阻", "C4260" }, 220 | { 6800, "6.8kΩ ±1% 62.5mW 厚膜电阻", "C25917" }, 221 | { 6800, "6.8kΩ ±1% 125mW 厚膜电阻", "C17772" }, 222 | { 6800, "6.8kΩ ±1% 100mW 厚膜电阻", "C23212" }, 223 | { 7500, "7.5kΩ ±1% 62.5mW 厚膜电阻", "C25918" }, 224 | { 7500, "7.5kΩ ±1% 125mW 厚膜电阻", "C17807" }, 225 | { 7500, "7.5kΩ ±1% 100mW 厚膜电阻", "C23234" }, 226 | { 8200, "8.2kΩ ±1% 100mW 厚膜电阻", "C25981" }, 227 | { 8200, "8.2kΩ ±1% 62.5mW 厚膜电阻", "C25924" }, 228 | { 8200, "8.2kΩ ±1% 125mW 厚膜电阻", "C17828" }, 229 | { 9100, "9.1kΩ ±1% 100mW 厚膜电阻", "C23260" }, 230 | { 9100, "9.1kΩ ±1% 125mW 厚膜电阻", "C17855" }, 231 | { 10000, "10kΩ ±5%", "C25725" }, 232 | { 10000, "10kΩ ±1% 62.5mW 厚膜电阻", "C25744" }, 233 | { 10000, "10kΩ ±1% 250mW 厚膜电阻", "C17902" }, 234 | { 10000, "10kΩ ±5%", "C29718" }, 235 | { 10000, "厚膜电阻 10kΩ ±1% 100mW", "C25804" }, 236 | { 10000, "10kΩ ±1% 125mW 厚膜电阻", "C17414" }, 237 | { 11000, "11kΩ ±1% 100mW 厚膜电阻", "C25950" }, 238 | { 11000, "11kΩ ±1% 125mW 厚膜电阻", "C17429" }, 239 | { 12000, "12kΩ ±1% 62.5mW 厚膜电阻", "C25752" }, 240 | { 12000, "12kΩ ±1% 100mW 厚膜电阻", "C22790" }, 241 | { 12000, "12kΩ ±1% 125mW 厚膜电阻", "C17444" }, 242 | { 13000, "13kΩ ±1% 100mW 厚膜电阻", "C22797" }, 243 | { 13000, "13kΩ ±1% 125mW 厚膜电阻", "C17455" }, 244 | { 15000, "15kΩ ±1% 62.5mW 厚膜电阻", "C25756" }, 245 | { 15000, "15kΩ ±1% 100mW 厚膜电阻", "C22809" }, 246 | { 15000, "15kΩ ±1% 125mW 厚膜电阻", "C17475" }, 247 | { 16000, "16kΩ ±1% 125mW 厚膜电阻", "C17490" }, 248 | { 16000, "16kΩ ±1%", "C22818" }, 249 | { 18000, "18kΩ ±1% 62.5mW 厚膜电阻", "C25762" }, 250 | { 18000, "18kΩ ±1% 125mW 厚膜电阻", "C17506" }, 251 | { 18000, "18kΩ ±1% 100mW 厚膜电阻", "C25810" }, 252 | { 20000, "20kΩ ±1% 62.5mW 厚膜电阻", "C25765" }, 253 | { 20000, "20kΩ ±1% 100mW 厚膜电阻", "C4184" }, 254 | { 20000, "20kΩ ±1% 125mW 厚膜电阻", "C4328" }, 255 | { 22000, "22kΩ ±1% 62.5mW 厚膜电阻", "C25768" }, 256 | { 22000, "22kΩ ±1% 125mW 厚膜电阻", "C17560" }, 257 | { 22000, "22kΩ ±1% 100mW 厚膜电阻", "C31850" }, 258 | { 24000, "24kΩ ±1% 62.5mW 厚膜电阻", "C25769" }, 259 | { 24000, "24kΩ ±1% 100mW 厚膜电阻", "C23352" }, 260 | { 24000, "24kΩ ±1% 125mW 厚膜电阻", "C17575" }, 261 | { 27000, "27kΩ ±1% 62.5mW 厚膜电阻", "C25771" }, 262 | { 27000, "27kΩ ±1% 125mW 厚膜电阻", "C17593" }, 263 | { 27000, "27kΩ ±1% 100mW 厚膜电阻", "C22967" }, 264 | { 30000, "30kΩ ±1% 100mW 厚膜电阻", "C22984" }, 265 | { 30000, "30kΩ ±1% 125mW 厚膜电阻", "C17621" }, 266 | { 33000, "33kΩ ±1% 100mW 厚膜电阻", "C4216" }, 267 | { 33000, "33kΩ ±1% 62.5mW 厚膜电阻", "C25779" }, 268 | { 33000, "33kΩ ±1% 125mW 厚膜电阻", "C17633" }, 269 | { 36000, "36kΩ ±1% 100mW 厚膜电阻", "C23147" }, 270 | { 36000, "36kΩ ±1% 125mW 厚膜电阻", "C4360" }, 271 | { 39000, "39kΩ ±1% 62.5mW 厚膜电阻", "C25783" }, 272 | { 39000, "39kΩ ±1% 100mW 厚膜电阻", "C23153" }, 273 | { 39000, "39kΩ ±1% 125mW 厚膜电阻", "C25826" }, 274 | { 40200, "40.2kΩ ±1% 100mW 厚膜电阻", "C12447" }, 275 | { 43000, "43kΩ ±1% 100mW 厚膜电阻", "C23172" }, 276 | { 43000, "43kΩ ±1% 125mW 厚膜电阻", "C17695" }, 277 | { 47000, "47kΩ ±1% 62.5mW 厚膜电阻", "C25792" }, 278 | { 47000, "47kΩ ±1% 125mW 厚膜电阻", "C17713" }, 279 | { 47000, "47kΩ ±1% 100mW 厚膜电阻", "C25819" }, 280 | { 49900, "49.9kΩ ±1% 125mW 厚膜电阻", "C17719" }, 281 | { 49900, "49.9kΩ ±1% 100mW 厚膜电阻", "C23184" }, 282 | { 49900, "49.9kΩ ±1% 62.5mW 厚膜电阻", "C25897" }, 283 | { 51000, "51kΩ ±1% 62.5mW 厚膜电阻", "C25794" }, 284 | { 51000, "51kΩ ±1% 125mW 厚膜电阻", "C17737" }, 285 | { 51000, "51kΩ ±1% 100mW 厚膜电阻", "C23196" }, 286 | { 56000, "56kΩ ±1% 62.5mW 厚膜电阻", "C25796" }, 287 | { 56000, "56kΩ ±1% 125mW 厚膜电阻", "C17756" }, 288 | { 56000, "56kΩ ±1% 100mW 厚膜电阻", "C23206" }, 289 | { 62000, "62kΩ ±1% 125mW 厚膜电阻", "C17783" }, 290 | { 62000, "62kΩ ±1% 100mW 厚膜电阻", "C23221" }, 291 | { 68000, "68kΩ ±1% 62.5mW 厚膜电阻", "C36871" }, 292 | { 68000, "68kΩ ±1% 125mW 厚膜电阻", "C17801" }, 293 | { 68000, "68kΩ ±1% 100mW 厚膜电阻", "C23231" }, 294 | { 75000, "75kΩ ±1% 62.5mW 厚膜电阻", "C25798" }, 295 | { 75000, "75kΩ ±1% 100mW 厚膜电阻", "C23242" }, 296 | { 75000, "75kΩ ±1% 125mW 厚膜电阻", "C17819" }, 297 | { 82000, "82kΩ ±1% 100mW 厚膜电阻", "C23254" }, 298 | { 82000, "82kΩ ±1% 125mW 厚膜电阻", "C17840" }, 299 | { 91000, "91kΩ ±1% 100mW 厚膜电阻", "C23265" }, 300 | { 100000, "100kΩ ±1% 62.5mW 厚膜电阻", "C25741" }, 301 | { 100000, "100kΩ ±1% 250mW 厚膜电阻", "C17900" }, 302 | { 100000, "100kΩ ±1% 125mW 厚膜电阻", "C149504" }, 303 | { 100000, "100kΩ ±1% 100mW 厚膜电阻", "C25803" }, 304 | { 110000, "110kΩ ±1% 100mW 厚膜电阻", "C25805" }, 305 | { 120000, "120kΩ ±1% 62.5mW 厚膜电阻", "C25750" }, 306 | { 120000, "120kΩ ±1% 100mW 厚膜电阻", "C25808" }, 307 | { 120000, "120kΩ ±1% 125mW 厚膜电阻", "C17436" }, 308 | { 130000, "130kΩ ±1% 100mW 厚膜电阻", "C22795" }, 309 | { 150000, "150kΩ ±1% 62.5mW 厚膜电阻", "C25755" }, 310 | { 150000, "150kΩ ±1% 100mW 厚膜电阻", "C22807" }, 311 | { 150000, "150kΩ ±1% 125mW 厚膜电阻", "C17470" }, 312 | { 160000, "160kΩ ±1% 100mW 厚膜电阻", "C22813" }, 313 | { 180000, "180kΩ ±1% 125mW 厚膜电阻", "C17501" }, 314 | { 180000, "180kΩ ±1% 100mW 厚膜电阻", "C22827" }, 315 | { 200000, "200kΩ ±1% 62.5mW 厚膜电阻", "C25764" }, 316 | { 200000, "200kΩ ±1% 125mW 厚膜电阻", "C17539" }, 317 | { 200000, "200kΩ ±1% 100mW 厚膜电阻", "C25811" }, 318 | { 220000, "220kΩ ±1% 62.5mW 厚膜电阻", "C25767" }, 319 | { 220000, "220kΩ ±1% 125mW 厚膜电阻", "C17556" }, 320 | { 220000, "220kΩ ±1% 100mW 厚膜电阻", "C22961" }, 321 | { 240000, "240kΩ ±1% 100mW 厚膜电阻", "C4197" }, 322 | { 270000, "270kΩ ±1% 125mW 厚膜电阻", "C17589" }, 323 | { 270000, "270kΩ ±1% 100mW 厚膜电阻", "C22965" }, 324 | { 300000, "300kΩ ±1% 62.5mW 厚膜电阻", "C25774" }, 325 | { 300000, "300kΩ ±1% 100mW 厚膜电阻", "C23024" }, 326 | { 300000, "300kΩ ±1% 125mW 厚膜电阻", "C17616" }, 327 | { 330000, "330kΩ ±1% 62.5mW 厚膜电阻", "C25778" }, 328 | { 330000, "330kΩ ±1% 100mW 厚膜电阻", "C23137" }, 329 | { 330000, "330kΩ ±1% 125mW 厚膜电阻", "C17629" }, 330 | { 360000, "360kΩ ±1% 100mW 厚膜电阻", "C23146" }, 331 | { 390000, "390kΩ ±1% 100mW 厚膜电阻", "C23150" }, 332 | { 390000, "390kΩ ±1% 125mW 厚膜电阻", "C17656" }, 333 | { 430000, "430kΩ ±1% 100mW 厚膜电阻", "C25969" }, 334 | { 470000, "470kΩ ±1% 125mW 厚膜电阻", "C17709" }, 335 | { 470000, "470kΩ ±1% 62.5mW 厚膜电阻", "C25790" }, 336 | { 470000, "470kΩ ±1% 100mW 厚膜电阻", "C23178" }, 337 | { 510000, "510kΩ ±1% 125mW 厚膜电阻", "C17733" }, 338 | { 510000, "510kΩ ±1% 100mW 厚膜电阻", "C23192" }, 339 | { 510000, "510kΩ ±1% 62.5mW 厚膜电阻", "C11616" }, 340 | { 560000, "560kΩ ±1% 100mW 厚膜电阻", "C23203" }, 341 | { 680000, "680kΩ ±1% 125mW 厚膜电阻", "C17797" }, 342 | { 680000, "680kΩ ±1% 100mW 厚膜电阻", "C25822" }, 343 | { 750000, "750kΩ ±1% 100mW 厚膜电阻", "C23240" }, 344 | { 1000000, "1MΩ ±1% 250mW 厚膜电阻", "C17927" }, 345 | { 1000000, "1MΩ ±1% 100mW 厚膜电阻", "C22935" }, 346 | { 1000000, "1MΩ ±1% 125mW 厚膜电阻", "C17514" }, 347 | { 1000000, "1MΩ ±1% 62.5mW 厚膜电阻", "C26083" }, 348 | { 1200000, "1.2MΩ ±1% 250mW 厚膜电阻", "C22107" }, 349 | { 1500000, "1.5MΩ ±1% 100mW 厚膜电阻", "C4172" }, 350 | { 2000000, "2MΩ ±1% 100mW 厚膜电阻", "C22976" }, 351 | { 2000000, "2MΩ ±1% 125mW 厚膜电阻", "C26112" }, 352 | { 2200000, "2.2MΩ ±1% 100mW 厚膜电阻", "C22938" }, 353 | { 2200000, "2.2MΩ ±1% 125mW 厚膜电阻", "C26113" }, 354 | { 3000000, "3MΩ ±1% 100mW 厚膜电阻", "C23156" }, 355 | { 4700000, "4.7MΩ ±1% 100mW 厚膜电阻", "C23163" }, 356 | { 5100000, "5.1MΩ ±1% 100mW 厚膜电阻", "C13320" }, 357 | { 10000000, "10MΩ ±1% 100mW 厚膜电阻", "C7250" }, 358 | { 10000000, "10MΩ ±1% 62.5mW 厚膜电阻", "C26082" }, 359 | { 10000000, "10MΩ ±1% 125mW 厚膜电阻", "C26108" }, 360 | }; 361 | 362 | template 363 | constexpr unsigned array_size(T(&)[S]) 364 | { 365 | return S; 366 | } 367 | 368 | inline uint64_t tenpow(int pow) 369 | { 370 | uint64_t s = 1; 371 | while(pow) 372 | { 373 | s *=10; 374 | pow --; 375 | } 376 | return s; 377 | } 378 | 379 | int R_lib::get_R_counts() const 380 | { 381 | switch (current_type) 382 | { 383 | case regular_R: 384 | { 385 | return 12*24; 386 | } 387 | case good_R: 388 | { 389 | return 13* 96; 390 | } 391 | case free_R: 392 | return array_size(JLC_free); 393 | } 394 | return 0; 395 | } 396 | 397 | Resistance R_lib::operator()(int idx) const 398 | { 399 | if (idx >= get_R_counts()) 400 | throw std::out_of_range("range out"); 401 | 402 | switch (current_type) 403 | { 404 | case regular_R: 405 | { 406 | auto dangci = idx /24; 407 | auto dangci_idx = idx % 24; 408 | 409 | return E24_R[dangci_idx] * tenpow(dangci); 410 | } 411 | case good_R: 412 | { 413 | auto dangci = idx /96; 414 | auto dangci_idx = idx % 96; 415 | 416 | return E96_R[dangci_idx] * tenpow(dangci); 417 | } 418 | case free_R: 419 | return JLC_free[idx]; 420 | } 421 | return 0; 422 | } 423 | -------------------------------------------------------------------------------- /src/R_select_window.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | #include "R_select_window.hpp" 4 | #include 5 | #include "qtcoro.hpp" 6 | #include "R_gen.hpp" 7 | #include "z_gen.hpp" 8 | 9 | #include "R_select_window.moc" 10 | 11 | R_select_window::R_select_window(QWidget* parent, Qt::WindowFlags f) 12 | : QWidget(parent, f) 13 | { 14 | setupUi(this); 15 | pic_show->setPixmap(QPixmap(":/images/res/dcdc.png").scaledToWidth(550)); 16 | 17 | connect(fb_voltage, SIGNAL(editingFinished()), this, SLOT(check_caculatable())); 18 | connect(out_voltage, SIGNAL(editingFinished()), this, SLOT(check_caculatable())); 19 | connect(resistance_type, SIGNAL(currentIndexChanged(int)), this, SLOT(check_caculatable())); 20 | connect(output_accuracy, SIGNAL(currentIndexChanged(int)), this, SLOT(check_caculatable())); 21 | 22 | auto Validator = new QDoubleValidator(0.0, 9999.0, 5, this); 23 | 24 | Validator->setNotation(QDoubleValidator::StandardNotation); 25 | 26 | fb_voltage->setValidator(Validator); 27 | out_voltage->setValidator(Validator); 28 | } 29 | 30 | qtcoro::awaitable R_select_window::do_calc() 31 | { 32 | static const std::pair accuracy_config[] = { 33 | {0.99, 1.01}, 34 | {0.95, 1.05}, 35 | {0.90, 1.10}, 36 | }; 37 | 38 | auto r_type = resistance_type->currentIndex(); 39 | auto is_jlc = r_type == 2; 40 | auto Vout = out_voltage->text().toDouble(); 41 | auto Vref = fb_voltage->text().toDouble(); 42 | 43 | auto accuracy = accuracy_config[output_accuracy->currentIndex()]; 44 | 45 | R_lib r{r_type}; 46 | Zgen z; 47 | 48 | if (is_jlc) 49 | { 50 | z.set_size(r.get_R_counts()-1, r.get_R_counts()-1); 51 | } 52 | 53 | int row = 0; 54 | 55 | tableWidget->clearContents(); 56 | 57 | std::pair Zidx; 58 | 59 | try 60 | { 61 | std::chrono::steady_clock::time_point ecliped_time = std::chrono::steady_clock::now(); 62 | 63 | for(int c = 1;;c++) 64 | { 65 | Zidx = z(); 66 | 67 | auto R1 = r(Zidx.first); 68 | auto R2 = r(Zidx.second); 69 | 70 | const double Vout_calculated = Vref * (static_cast(R1) + static_cast(R2)) / static_cast(R2); 71 | auto Err = Vout_calculated / Vout - 1; 72 | 73 | if (((Vout_calculated / Vout) >= accuracy.first) && ( (Vout_calculated / Vout) <= accuracy.second )) 74 | { 75 | tableWidget->setRowCount(row+1); 76 | tableWidget->setItem(row, 0, new QTableWidgetItem(static_cast(R1))); 77 | tableWidget->setItem(row, 1, new QTableWidgetItem(static_cast(R2))); 78 | tableWidget->setItem(row, 2, new QTableWidgetItem(QString("%1").arg(Vout_calculated))); 79 | tableWidget->setItem(row, 3, new QTableWidgetItem(QString("%1%").arg(Err*100))); 80 | if (is_jlc) 81 | { 82 | // R_lib 83 | tableWidget->setItem(row, 4, new QTableWidgetItem(QString("%1 %2").arg(R1.jlc_part_number).arg(R2.jlc_part_number))); 84 | } 85 | 86 | row ++; 87 | 88 | result_box->setTitle(QString("计算结果: %1 个").arg(row)); 89 | 90 | 91 | } 92 | 93 | if ( (std::chrono::steady_clock::now() - ecliped_time) > std::chrono::milliseconds(2) ) 94 | { 95 | // printf("tryed (%d, %d) [row %d], try count = %d, and preempt fiber\n" , Zidx.first, Zidx.second, row, c); 96 | co_await qtcoro::coro_delay_ms(0); 97 | ecliped_time = std::chrono::steady_clock::now(); 98 | } 99 | else 100 | { 101 | // printf("tryed (%d, %d) [row %d], try count = %d\n" , Zidx.first, Zidx.second, row, c); 102 | 103 | } 104 | 105 | } 106 | }catch(const std::out_of_range&) 107 | { 108 | // QMessageBox::warning(this, "d", QString("oom on (%1,%2)").arg(Zidx.first).arg(Zidx.second)); 109 | } 110 | 111 | tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); 112 | 113 | 114 | begin_calc->setEnabled(true); 115 | 116 | co_return; 117 | } 118 | 119 | void R_select_window::on_begin_calc_clicked() 120 | { 121 | begin_calc->setEnabled(false); 122 | qtcoro::coro_start(do_calc()); 123 | } 124 | 125 | void R_select_window::check_caculatable() 126 | { 127 | 128 | } 129 | 130 | -------------------------------------------------------------------------------- /src/R_select_window.hpp: -------------------------------------------------------------------------------- 1 | 2 | #pragma once 3 | 4 | #include 5 | #include "ui_R_select_window.h" 6 | #include "qtcoro.hpp" 7 | 8 | class R_select_window : public QWidget, Ui_R_select_window 9 | { 10 | Q_OBJECT 11 | 12 | public: 13 | explicit R_select_window(QWidget* parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); 14 | 15 | private: 16 | qtcoro::awaitable do_calc(); 17 | 18 | public Q_SLOTS: 19 | void check_caculatable(); 20 | void on_begin_calc_clicked(); 21 | }; 22 | 23 | -------------------------------------------------------------------------------- /src/R_select_window.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | R_select_window 4 | 5 | 6 | 7 | 0 8 | 0 9 | 502 10 | 516 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | Qt::Horizontal 20 | 21 | 22 | 23 | 40 24 | 20 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | Qt::Horizontal 33 | 34 | 35 | 36 | 40 37 | 20 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | TextLabel 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | QLayout::SetMaximumSize 59 | 60 | 61 | Qt::AlignCenter 62 | 63 | 64 | 65 | 66 | FB电压: 67 | 68 | 69 | 70 | 71 | 72 | 73 | Qt::DefaultContextMenu 74 | 75 | 76 | false 77 | 78 | 79 | Qt::ImhDialableCharactersOnly|Qt::ImhDigitsOnly 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 32767 89 | 90 | 91 | QLineEdit::Normal 92 | 93 | 94 | 输入FB引脚的内部比较电压 95 | 96 | 97 | 98 | 99 | 100 | 101 | 输出电压: 102 | 103 | 104 | 105 | 106 | 107 | 108 | Qt::ImhDialableCharactersOnly|Qt::ImhDigitsOnly 109 | 110 | 111 | 输入期望的输出电压 112 | 113 | 114 | 115 | 116 | 117 | 118 | 电阻系列: 119 | 120 | 121 | 122 | 123 | 124 | 125 | 输出误差: 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 1% 134 | 135 | 136 | 137 | 138 | 5% 139 | 140 | 141 | 142 | 143 | 10% 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 计算 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 1% 160 | 161 | 162 | 163 | 164 | 5% 165 | 166 | 167 | 168 | 169 | 立创基础库电阻 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 使用说明 182 | 183 | 184 | 185 | QLayout::SetFixedSize 186 | 187 | 188 | 189 | 190 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> 191 | <html><head><meta name="qrichtext" content="1" /><style type="text/css"> 192 | p, li { white-space: pre-wrap; } 193 | </style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> 194 | <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1. 输入反馈电压和输出电压</p> 195 | <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2. 选择的电阻精度系列</p> 196 | <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3. 选择输出误差允许范围</p> 197 | <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">4. 从结果中选常用阻值</p></body></html> 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 计算结果: 210 | 211 | 212 | Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 213 | 214 | 215 | false 216 | 217 | 218 | false 219 | 220 | 221 | 222 | 223 | 224 | 5 225 | 226 | 227 | false 228 | 229 | 230 | 60 231 | 232 | 233 | 160 234 | 235 | 236 | true 237 | 238 | 239 | 240 | R1 241 | 242 | 243 | 244 | 245 | R2 246 | 247 | 248 | 249 | 250 | Vout 251 | 252 | 253 | 254 | 255 | Err 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | #include 4 | #include 5 | #include "mainwindow.hpp" 6 | #include 7 | 8 | static const char desktop_file_content[] = R"ss([Desktop Entry] 9 | Categories=Development;Electronics; 10 | Comment=免费、强大、易用的PCB设计辅助工具 11 | Icon=edatool 12 | Name=JLC EDA Tool 13 | Type=Application 14 | StartupWMClass=edatool 15 | Exec=)ss"; 16 | 17 | int main(int argc, char* argv[]) 18 | { 19 | QApplication app(argc, argv); 20 | 21 | if (app.platformName() == "wayland") 22 | { 23 | // 解决 wayland 下 没 icon 的问题 24 | QFile iconfile(QDir::homePath() + "/.local/share/icons/edatool.png"); 25 | QFile resiconfile(":/images/res/logo.png"); 26 | resiconfile.open(QIODeviceBase::ReadOnly); 27 | iconfile.open(QIODeviceBase::ReadWrite); 28 | 29 | iconfile.write(resiconfile.readAll()); 30 | resiconfile.close(); iconfile.close(); 31 | 32 | QFile desktopfile(QDir::homePath() + "/.local/share/applications/edatool.desktop"); 33 | if (desktopfile.open(QIODeviceBase::ReadWrite)) 34 | { 35 | desktopfile.resize(sizeof (desktop_file_content)); 36 | desktopfile.write(desktop_file_content, sizeof (desktop_file_content) - 1); 37 | desktopfile.write(app.applicationFilePath().toUtf8()); 38 | desktopfile.write("\n", 1); 39 | } 40 | desktopfile.close(); 41 | 42 | app.setDesktopFileName("edatool"); 43 | } 44 | 45 | QIcon ico(":/images/res/logo.png"); 46 | app.setWindowIcon(ico); 47 | 48 | MainWindow mywin; 49 | 50 | mywin.setWindowIcon(ico); 51 | 52 | mywin.show(); 53 | 54 | return app.exec(); 55 | } 56 | -------------------------------------------------------------------------------- /src/mainwindow.cpp: -------------------------------------------------------------------------------- 1 | 2 | 3 | #include "mainwindow.hpp" 4 | #include 5 | #include "awaitable.hpp" 6 | 7 | #include "mainwindow.moc" 8 | 9 | MainWindow::MainWindow(QWidget *parent, Qt::WindowFlags flags) 10 | : QMainWindow(parent, flags) 11 | { 12 | setupUi(this); 13 | } 14 | 15 | MainWindow::~MainWindow(){} 16 | 17 | void MainWindow::on_action_About_triggered() 18 | { 19 | QMessageBox::about(this, "关于..", "本工具 DR 出品。"); 20 | } 21 | 22 | void MainWindow::on_action_About_Qt_triggered() 23 | { 24 | QMessageBox::aboutQt(this); 25 | } 26 | -------------------------------------------------------------------------------- /src/mainwindow.hpp: -------------------------------------------------------------------------------- 1 | 2 | #pragma once 3 | 4 | #include 5 | #include 6 | #include "awaitable.hpp" 7 | 8 | #include "ui_mainwindow.h" 9 | #include "mainwindow.moc" 10 | 11 | class MainWindow : public QMainWindow, public Ui_MainWindow 12 | { 13 | Q_OBJECT 14 | public: 15 | MainWindow(QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags()); 16 | ~MainWindow(); 17 | 18 | public Q_SLOTS: 19 | void on_action_About_triggered(); 20 | 21 | void on_action_About_Qt_triggered(); 22 | }; 23 | 24 | -------------------------------------------------------------------------------- /src/mainwindow.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 807 10 | 608 11 | 12 | 13 | 14 | 快速选型器 15 | 16 | 17 | 18 | 19 | 20 | 21 | 0 22 | 23 | 24 | 25 | 电阻选型工具 26 | 27 | 28 | 29 | 30 | 电感快速选型 31 | 32 | 33 | 34 | 35 | LLC计算 36 | 37 | 38 | 39 | 40 | 反激电源宝典 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 0 51 | 0 52 | 807 53 | 30 54 | 55 | 56 | 57 | 58 | 帮助(&H) 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 关于(&A)... 69 | 70 | 71 | 72 | 73 | 关于&Qt... 74 | 75 | 76 | 77 | 78 | 79 | R_select_window 80 | QWidget 81 |
R_select_window.hpp
82 | 1 83 |
84 | 85 | I_Calc 86 | QWidget 87 |
I_Calc.hpp
88 | 1 89 |
90 | 91 | LLC_window 92 | QWidget 93 |
LLC_window.hpp
94 | 1 95 |
96 | 97 | RCD_window 98 | QWidget 99 |
RCD_window.hpp
100 | 1 101 |
102 |
103 | 104 | 105 |
106 | -------------------------------------------------------------------------------- /tools/index.ts: -------------------------------------------------------------------------------- 1 | 2 | import xlsx from 'node-xlsx'; 3 | import fs from "fs/promises"; 4 | import Decimal from "decimal.js"; 5 | 6 | interface SheetRow { 7 | partID : string; 8 | name: string; 9 | 10 | 11 | }; 12 | 13 | function extractNumberWithSurfix(number_string_with_surfix) : number 14 | { 15 | var reg_result = /([\.0-9kMm]+?)Ω/.exec(number_string_with_surfix); 16 | 17 | number_string_with_surfix = reg_result[1]; 18 | 19 | 20 | var reg_result = /([\.0-9]+?)k/.exec(number_string_with_surfix); 21 | 22 | if (reg_result) 23 | { 24 | return Decimal(reg_result[1]).mul(1000).toNumber(); 25 | } 26 | 27 | reg_result = /([\.0-9]+?)M/.exec(number_string_with_surfix); 28 | 29 | if (reg_result) 30 | { 31 | return Decimal(reg_result[1]).mul(1000000).toNumber(); 32 | } 33 | reg_result = /([\.0-9]+?)m/.exec(number_string_with_surfix); 34 | 35 | if (reg_result) 36 | { 37 | return Decimal(reg_result[1]).div(1000).toNumber(); 38 | } 39 | return Decimal(number_string_with_surfix).toNumber(); 40 | } 41 | 42 | async function main() { 43 | 44 | const workSheetsFromFile = xlsx.parse(`${__dirname}/../免换料费专区.xlsx`); 45 | 46 | const SheetData : any[][] = workSheetsFromFile[0].data; 47 | 48 | const OnlyResistor = SheetData.filter( (value : any[]) => { 49 | const reg_result = /([0-9kMm]+?)Ω ±/.exec(value[1]); 50 | return reg_result&& reg_result.length > 1 51 | }) 52 | 53 | console.log(OnlyResistor); 54 | 55 | 56 | // now sort it ! 57 | 58 | OnlyResistor.sort( (a: any[], b:any[])=>{ 59 | return extractNumberWithSurfix(a[1]) - extractNumberWithSurfix(b[1]); 60 | }); 61 | 62 | console.log(OnlyResistor); 63 | 64 | 65 | const Carray = OnlyResistor.map((value : string[])=>{ 66 | 67 | return [ 68 | extractNumberWithSurfix(value[1]), value[1], value[0] 69 | ]; 70 | }); 71 | 72 | console.log(Carray); 73 | 74 | 75 | Carray.forEach( (value)=>{ 76 | console.log(`{ ${value[0]}, "${value[1]}", "${value[2]}" },`); 77 | }); 78 | 79 | } 80 | 81 | main() 82 | -------------------------------------------------------------------------------- /tools/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodetest", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.ts", 6 | "scripts": { 7 | "start": "node -r ts-node/register index.ts", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "@types/node": "^22.15.17", 14 | "axios": "^1.9.0", 15 | "decimal.js": "^10.5.0", 16 | "node-xlsx": "^0.24.0", 17 | "ts-node": "^10.9.2", 18 | "tslib": "^2.8.1", 19 | "typescript": "^5.8.3" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /tools/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "sourceMap": true, 5 | "esModuleInterop": true, 6 | "typeRoots": [ 7 | "./node_modules/@types", 8 | "./typings" 9 | ], 10 | "noImplicitThis": true, 11 | "moduleResolution": "node", 12 | "importHelpers": true, 13 | "lib": [ 14 | "es2018" 15 | ], 16 | "target": "ES2018" 17 | } 18 | } -------------------------------------------------------------------------------- /tools/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@cspotcode/source-map-support@^0.8.0": 6 | version "0.8.1" 7 | resolved "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" 8 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 9 | dependencies: 10 | "@jridgewell/trace-mapping" "0.3.9" 11 | 12 | "@jridgewell/resolve-uri@^3.0.3": 13 | version "3.1.2" 14 | resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" 15 | integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== 16 | 17 | "@jridgewell/sourcemap-codec@^1.4.10": 18 | version "1.5.0" 19 | resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" 20 | integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== 21 | 22 | "@jridgewell/trace-mapping@0.3.9": 23 | version "0.3.9" 24 | resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" 25 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 26 | dependencies: 27 | "@jridgewell/resolve-uri" "^3.0.3" 28 | "@jridgewell/sourcemap-codec" "^1.4.10" 29 | 30 | "@tsconfig/node10@^1.0.7": 31 | version "1.0.11" 32 | resolved "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" 33 | integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== 34 | 35 | "@tsconfig/node12@^1.0.7": 36 | version "1.0.11" 37 | resolved "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" 38 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 39 | 40 | "@tsconfig/node14@^1.0.0": 41 | version "1.0.3" 42 | resolved "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" 43 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 44 | 45 | "@tsconfig/node16@^1.0.2": 46 | version "1.0.4" 47 | resolved "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" 48 | integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== 49 | 50 | "@types/node@^22.15.17": 51 | version "22.15.17" 52 | resolved "https://registry.npmmirror.com/@types/node/-/node-22.15.17.tgz#355ccec95f705b664e4332bb64a7f07db30b7055" 53 | integrity sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw== 54 | dependencies: 55 | undici-types "~6.21.0" 56 | 57 | acorn-walk@^8.1.1: 58 | version "8.3.4" 59 | resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" 60 | integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== 61 | dependencies: 62 | acorn "^8.11.0" 63 | 64 | acorn@^8.11.0, acorn@^8.4.1: 65 | version "8.14.1" 66 | resolved "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" 67 | integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== 68 | 69 | arg@^4.1.0: 70 | version "4.1.3" 71 | resolved "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 72 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 73 | 74 | asynckit@^0.4.0: 75 | version "0.4.0" 76 | resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 77 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 78 | 79 | axios@^1.9.0: 80 | version "1.9.0" 81 | resolved "https://registry.npmmirror.com/axios/-/axios-1.9.0.tgz#25534e3b72b54540077d33046f77e3b8d7081901" 82 | integrity sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg== 83 | dependencies: 84 | follow-redirects "^1.15.6" 85 | form-data "^4.0.0" 86 | proxy-from-env "^1.1.0" 87 | 88 | call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: 89 | version "1.0.2" 90 | resolved "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" 91 | integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== 92 | dependencies: 93 | es-errors "^1.3.0" 94 | function-bind "^1.1.2" 95 | 96 | combined-stream@^1.0.8: 97 | version "1.0.8" 98 | resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 99 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 100 | dependencies: 101 | delayed-stream "~1.0.0" 102 | 103 | create-require@^1.1.0: 104 | version "1.1.1" 105 | resolved "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 106 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 107 | 108 | decimal.js@^10.5.0: 109 | version "10.5.0" 110 | resolved "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.5.0.tgz#0f371c7cf6c4898ce0afb09836db73cd82010f22" 111 | integrity sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw== 112 | 113 | delayed-stream@~1.0.0: 114 | version "1.0.0" 115 | resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 116 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 117 | 118 | diff@^4.0.1: 119 | version "4.0.2" 120 | resolved "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 121 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 122 | 123 | dunder-proto@^1.0.1: 124 | version "1.0.1" 125 | resolved "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" 126 | integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== 127 | dependencies: 128 | call-bind-apply-helpers "^1.0.1" 129 | es-errors "^1.3.0" 130 | gopd "^1.2.0" 131 | 132 | es-define-property@^1.0.1: 133 | version "1.0.1" 134 | resolved "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" 135 | integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== 136 | 137 | es-errors@^1.3.0: 138 | version "1.3.0" 139 | resolved "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" 140 | integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== 141 | 142 | es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: 143 | version "1.1.1" 144 | resolved "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" 145 | integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== 146 | dependencies: 147 | es-errors "^1.3.0" 148 | 149 | es-set-tostringtag@^2.1.0: 150 | version "2.1.0" 151 | resolved "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" 152 | integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== 153 | dependencies: 154 | es-errors "^1.3.0" 155 | get-intrinsic "^1.2.6" 156 | has-tostringtag "^1.0.2" 157 | hasown "^2.0.2" 158 | 159 | follow-redirects@^1.15.6: 160 | version "1.15.9" 161 | resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" 162 | integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== 163 | 164 | form-data@^4.0.0: 165 | version "4.0.2" 166 | resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c" 167 | integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w== 168 | dependencies: 169 | asynckit "^0.4.0" 170 | combined-stream "^1.0.8" 171 | es-set-tostringtag "^2.1.0" 172 | mime-types "^2.1.12" 173 | 174 | function-bind@^1.1.2: 175 | version "1.1.2" 176 | resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 177 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 178 | 179 | get-intrinsic@^1.2.6: 180 | version "1.3.0" 181 | resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" 182 | integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== 183 | dependencies: 184 | call-bind-apply-helpers "^1.0.2" 185 | es-define-property "^1.0.1" 186 | es-errors "^1.3.0" 187 | es-object-atoms "^1.1.1" 188 | function-bind "^1.1.2" 189 | get-proto "^1.0.1" 190 | gopd "^1.2.0" 191 | has-symbols "^1.1.0" 192 | hasown "^2.0.2" 193 | math-intrinsics "^1.1.0" 194 | 195 | get-proto@^1.0.1: 196 | version "1.0.1" 197 | resolved "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" 198 | integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== 199 | dependencies: 200 | dunder-proto "^1.0.1" 201 | es-object-atoms "^1.0.0" 202 | 203 | gopd@^1.2.0: 204 | version "1.2.0" 205 | resolved "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" 206 | integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== 207 | 208 | has-symbols@^1.0.3, has-symbols@^1.1.0: 209 | version "1.1.0" 210 | resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" 211 | integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== 212 | 213 | has-tostringtag@^1.0.2: 214 | version "1.0.2" 215 | resolved "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" 216 | integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== 217 | dependencies: 218 | has-symbols "^1.0.3" 219 | 220 | hasown@^2.0.2: 221 | version "2.0.2" 222 | resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" 223 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 224 | dependencies: 225 | function-bind "^1.1.2" 226 | 227 | make-error@^1.1.1: 228 | version "1.3.6" 229 | resolved "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 230 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 231 | 232 | math-intrinsics@^1.1.0: 233 | version "1.1.0" 234 | resolved "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" 235 | integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== 236 | 237 | mime-db@1.52.0: 238 | version "1.52.0" 239 | resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 240 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 241 | 242 | mime-types@^2.1.12: 243 | version "2.1.35" 244 | resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 245 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 246 | dependencies: 247 | mime-db "1.52.0" 248 | 249 | node-xlsx@^0.24.0: 250 | version "0.24.0" 251 | resolved "https://registry.npmmirror.com/node-xlsx/-/node-xlsx-0.24.0.tgz#a6a365acb18ad37c66c2b254b6ebe0c22dc9dc6f" 252 | integrity sha512-1olwK48XK9nXZsyH/FCltvGrQYvXXZuxVitxXXv2GIuRm51aBi1+5KwR4rWM4KeO61sFU+00913WLZTD+AcXEg== 253 | dependencies: 254 | xlsx "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz" 255 | 256 | proxy-from-env@^1.1.0: 257 | version "1.1.0" 258 | resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 259 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 260 | 261 | ts-node@^10.9.2: 262 | version "10.9.2" 263 | resolved "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" 264 | integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== 265 | dependencies: 266 | "@cspotcode/source-map-support" "^0.8.0" 267 | "@tsconfig/node10" "^1.0.7" 268 | "@tsconfig/node12" "^1.0.7" 269 | "@tsconfig/node14" "^1.0.0" 270 | "@tsconfig/node16" "^1.0.2" 271 | acorn "^8.4.1" 272 | acorn-walk "^8.1.1" 273 | arg "^4.1.0" 274 | create-require "^1.1.0" 275 | diff "^4.0.1" 276 | make-error "^1.1.1" 277 | v8-compile-cache-lib "^3.0.1" 278 | yn "3.1.1" 279 | 280 | tslib@^2.8.1: 281 | version "2.8.1" 282 | resolved "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" 283 | integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== 284 | 285 | typescript@^5.8.3: 286 | version "5.8.3" 287 | resolved "https://registry.npmmirror.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" 288 | integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== 289 | 290 | undici-types@~6.21.0: 291 | version "6.21.0" 292 | resolved "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" 293 | integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== 294 | 295 | v8-compile-cache-lib@^3.0.1: 296 | version "3.0.1" 297 | resolved "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" 298 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 299 | 300 | "xlsx@https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz": 301 | version "0.20.2" 302 | resolved "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz#0f64eeed3f1a46e64724620c3553f2dbd3cd2d7d" 303 | 304 | yn@3.1.1: 305 | version "3.1.1" 306 | resolved "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 307 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 308 | -------------------------------------------------------------------------------- /免换料费专区.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microcai/JLC_R_util/d22a0810aeec6c2fa3497767fe0a7d6327c4e58c/免换料费专区.xlsx --------------------------------------------------------------------------------