新代码

This commit is contained in:
RB 2025-04-28 20:54:21 +08:00
parent 5cbcadbb31
commit 4539cfb332
19 changed files with 33390 additions and 80 deletions

View File

@ -1,4 +1,5 @@
import tkinter as tk import tkinter as tk
import sys
import os import os
import threading import threading
import shutil import shutil
@ -218,7 +219,7 @@ class MRobotApp:
root.protocol("WM_DELETE_WINDOW", lambda: self.on_closing(root)) root.protocol("WM_DELETE_WINDOW", lambda: self.on_closing(root))
root.mainloop() root.mainloop()
# 更新任务管理 UI # 修改 update_task_ui 方法
def update_task_ui(self): def update_task_ui(self):
# 检查是否有已存在的任务文件 # 检查是否有已存在的任务文件
task_dir = os.path.join("User", "task") task_dir = os.path.join("User", "task")
@ -226,42 +227,44 @@ class MRobotApp:
for file_name in os.listdir(task_dir): for file_name in os.listdir(task_dir):
file_base, file_ext = os.path.splitext(file_name) file_base, file_ext = os.path.splitext(file_name)
# 忽略 init 和 user_task 文件 # 忽略 init 和 user_task 文件
if file_ext == ".c" and file_base not in ["init", "user_task"] and file_base not in [task_var.get() for task_var in self.task_vars]: if file_ext == ".c" and file_base not in ["init", "user_task"] and file_base not in [task_var.get() for task_var, _ in self.task_vars]:
# 自动添加已存在的任务名 # 自动添加已存在的任务名
new_task_var = tk.StringVar(value=file_base) new_task_var = tk.StringVar(value=file_base)
self.task_vars.append(new_task_var) self.task_vars.append((new_task_var, tk.IntVar(value=100))) # 默认频率为 100
# 清空任务框架中的所有子组件 # 清空任务框架中的所有子组件
for widget in self.task_frame.winfo_children(): for widget in self.task_frame.winfo_children():
widget.destroy() widget.destroy()
# 设置任务管理框的固定宽度 # 设置任务管理框的固定宽度
self.task_frame.config(width=300) # 将宽度固定为 300 像素 self.task_frame.config(width=400) # 将宽度固定为 400 像素
# 显示任务列表 # 显示任务列表
for i, task_var in enumerate(self.task_vars): for i, (task_var, freq_var) in enumerate(self.task_vars):
task_row = tk.Frame(self.task_frame, width=300) # 设置任务行的宽度 task_row = tk.Frame(self.task_frame, width=400) # 设置任务行的宽度
task_row.pack(fill="x", pady=5) task_row.pack(fill="x", pady=5)
# 调整输入框和按钮的宽度 # 调整输入框和按钮的宽度
tk.Entry(task_row, textvariable=task_var, width=25).pack(side="left", padx=5) # 输入框宽度 tk.Entry(task_row, textvariable=task_var, width=20).pack(side="left", padx=5) # 输入框宽度
tk.Label(task_row, text="频率:").pack(side="left", padx=5)
tk.Spinbox(task_row, from_=1, to=1000, textvariable=freq_var, width=5).pack(side="left", padx=5) # 数字选择框
tk.Button(task_row, text="删除", command=lambda idx=i: self.remove_task(idx), bg="red", fg="white").pack(side="left", padx=5) tk.Button(task_row, text="删除", command=lambda idx=i: self.remove_task(idx), bg="red", fg="white").pack(side="left", padx=5)
# 添加新任务按钮 # 添加新任务按钮
add_task_button = tk.Button(self.task_frame, text="添加任务", command=self.add_task, bg="blue", fg="white") add_task_button = tk.Button(self.task_frame, text="添加任务", command=self.add_task, bg="blue", fg="white")
add_task_button.pack(pady=10) add_task_button.pack(pady=10)
# 添加任务 # 修改 add_task 方法
def add_task(self): def add_task(self):
new_task_var = tk.StringVar(value=f"Task_{len(self.task_vars) + 1}") new_task_var = tk.StringVar(value=f"Task_{len(self.task_vars) + 1}")
self.task_vars.append(new_task_var) new_freq_var = tk.IntVar(value=100) # 默认频率为 100
self.task_vars.append((new_task_var, new_freq_var))
self.update_task_ui() self.update_task_ui()
# 删除任务 # 修改 remove_task 方法
def remove_task(self, idx): def remove_task(self, idx):
del self.task_vars[idx] del self.task_vars[idx]
self.update_task_ui() self.update_task_ui()
# 更新文件夹显示 # 更新文件夹显示
def update_folder_display(self): def update_folder_display(self):
for widget in self.folder_frame.winfo_children(): for widget in self.folder_frame.winfo_children():
@ -347,20 +350,17 @@ class MRobotApp:
template_file_path = os.path.join(REPO_DIR, "User", "task", "task.c.template") template_file_path = os.path.join(REPO_DIR, "User", "task", "task.c.template")
task_dir = os.path.join("User", "task") task_dir = os.path.join("User", "task")
# 检查模板文件是否存在
if not os.path.exists(template_file_path): if not os.path.exists(template_file_path):
print(f"模板文件 {template_file_path} 不存在,无法生成 task.c 文件!") print(f"模板文件 {template_file_path} 不存在,无法生成 task.c 文件!")
return return
# 创建目标目录(如果不存在)
os.makedirs(task_dir, exist_ok=True) os.makedirs(task_dir, exist_ok=True)
# 读取模板内容
with open(template_file_path, "r", encoding="utf-8") as f: with open(template_file_path, "r", encoding="utf-8") as f:
template_content = f.read() template_content = f.read()
# 为每个任务生成对应的 task.c 文件 # 为每个任务生成对应的 task.c 文件
for task_var in self.task_vars: for task_var, _ in self.task_vars: # 解包元组
task_name = task_var.get() task_name = task_var.get()
task_file_path = os.path.join(task_dir, f"{task_name.lower()}.c") task_file_path = os.path.join(task_dir, f"{task_name.lower()}.c")
@ -371,7 +371,6 @@ class MRobotApp:
task_content = task_content.replace("{{task_delay}}", f"TASK_INIT_DELAY_{task_name.upper()}") task_content = task_content.replace("{{task_delay}}", f"TASK_INIT_DELAY_{task_name.upper()}")
task_content = task_content.replace("{{task_variable}}", task_name) task_content = task_content.replace("{{task_variable}}", task_name)
# 写入生成的内容到文件
with open(task_file_path, "w", encoding="utf-8") as f: with open(task_file_path, "w", encoding="utf-8") as f:
f.write(task_content) f.write(task_content)
@ -394,9 +393,6 @@ class MRobotApp:
with open(template_file_path, "r", encoding="utf-8") as f: with open(template_file_path, "r", encoding="utf-8") as f:
template_content = f.read() template_content = f.read()
# 打印模板内容
# print(f"模板内容: {template_content}")
# 生成任务属性定义 # 生成任务属性定义
task_attr_definitions = "\n".join([ task_attr_definitions = "\n".join([
f"""const osThreadAttr_t attr_{task_var.get().lower()} = {{ f"""const osThreadAttr_t attr_{task_var.get().lower()} = {{
@ -404,12 +400,9 @@ class MRobotApp:
.priority = osPriorityNormal, .priority = osPriorityNormal,
.stack_size = 128 * 4, .stack_size = 128 * 4,
}};""" }};"""
for task_var in self.task_vars for task_var, _ in self.task_vars # 解包元组
]) ])
# 打印生成的任务属性定义
# print(f"生成的任务属性定义: {task_attr_definitions}")
# 替换模板中的占位符 # 替换模板中的占位符
task_content = template_content.replace("{{task_attr_definitions}}", task_attr_definitions) task_content = template_content.replace("{{task_attr_definitions}}", task_attr_definitions)
@ -419,8 +412,6 @@ class MRobotApp:
print(f"已成功生成 {generated_task_file_path} 文件!") print(f"已成功生成 {generated_task_file_path} 文件!")
except Exception as e: except Exception as e:
print(f"修改 user_task.c 文件时出错: {e}") print(f"修改 user_task.c 文件时出错: {e}")
import traceback
traceback.print_exc()
# 生成 user_task.h 文件 # 生成 user_task.h 文件
def generate_user_task_header(self): def generate_user_task_header(self):
@ -437,34 +428,18 @@ class MRobotApp:
with open(template_file_path, "r", encoding="utf-8") as f: with open(template_file_path, "r", encoding="utf-8") as f:
template_content = f.read() template_content = f.read()
# 打印模板内容
# print(f"模板内容: {template_content}")
# 定义占位符内容 # 定义占位符内容
thread_definitions = "\n".join([f" osThreadId_t {task_var.get()};" for task_var in self.task_vars]) thread_definitions = "\n".join([f" osThreadId_t {task_var.get()};" for task_var, _ in self.task_vars])
# heap_water_mark_definitions = "\n".join([f" uint32_t {task_var.get()};" for task_var in self.task_vars]) freq_definitions = "\n".join([f" float {task_var.get()};" for task_var, _ in self.task_vars])
freq_definitions = "\n".join([f" float {task_var.get()};" for task_var in self.task_vars]) last_up_time_definitions = "\n".join([f" uint32_t {task_var.get()};" for task_var, _ in self.task_vars])
last_up_time_definitions = "\n".join([f" uint32_t {task_var.get()};" for task_var in self.task_vars]) task_handle_definitions = "\n".join([f" osThreadId_t {task_var.get()};" for task_var, _ in self.task_vars])
task_handle_definitions = "\n".join([f" osThreadId_t {task_var.get()};" for task_var in self.task_vars]) task_attr_declarations = "\n".join([f"extern const osThreadAttr_t attr_{task_var.get().lower()};" for task_var, _ in self.task_vars])
task_attr_declarations = "\n".join([f"extern const osThreadAttr_t attr_{task_var.get().lower()};" for task_var in self.task_vars]) task_function_declarations = "\n".join([f"void {task_var.get()}(void *argument);" for task_var, _ in self.task_vars])
task_function_declarations = "\n".join([f"void {task_var.get()}(void *argument);" for task_var in self.task_vars]) task_frequency_definitions = "\n".join([f"#define TASK_FREQ_{task_var.get().upper()} (100u)" for task_var, _ in self.task_vars])
task_frequency_definitions = "\n".join([f"#define TASK_FREQ_{task_var.get().upper()} (100u)" for task_var in self.task_vars]) task_init_delay_definitions = "\n".join([f"#define TASK_INIT_DELAY_{task_var.get().upper()} (0u)" for task_var, _ in self.task_vars])
task_init_delay_definitions = "\n".join([f"#define TASK_INIT_DELAY_{task_var.get().upper()} (100u)" for task_var in self.task_vars])
# 打印生成的占位符内容
# print(f"thread_definitions: {thread_definitions}")
# print(f"heap_water_mark_definitions: {heap_water_mark_definitions}")
# print(f"freq_definitions: {freq_definitions}")
# print(f"last_up_time_definitions: {last_up_time_definitions}")
# print(f"task_handle_definitions: {task_handle_definitions}")
# print(f"task_attr_declarations: {task_attr_declarations}")
# print(f"task_function_declarations: {task_function_declarations}")
# print(f"task_frequency_definitions: {task_frequency_definitions}")
# print(f"task_init_delay_definitions: {task_init_delay_definitions}")
# 替换模板中的占位符 # 替换模板中的占位符
header_content = template_content.replace("{{thread_definitions}}", thread_definitions) header_content = template_content.replace("{{thread_definitions}}", thread_definitions)
# header_content = header_content.replace("{{heap_water_mark_definitions}}", heap_water_mark_definitions)
header_content = header_content.replace("{{freq_definitions}}", freq_definitions) header_content = header_content.replace("{{freq_definitions}}", freq_definitions)
header_content = header_content.replace("{{last_up_time_definitions}}", last_up_time_definitions) header_content = header_content.replace("{{last_up_time_definitions}}", last_up_time_definitions)
header_content = header_content.replace("{{task_handle_definitions}}", task_handle_definitions) header_content = header_content.replace("{{task_handle_definitions}}", task_handle_definitions)
@ -479,38 +454,30 @@ class MRobotApp:
print(f"已成功生成 {header_file_path} 文件!") print(f"已成功生成 {header_file_path} 文件!")
except Exception as e: except Exception as e:
print(f"生成 user_task.h 文件时出错: {e}") print(f"生成 user_task.h 文件时出错: {e}")
import traceback
traceback.print_exc()
def generate_init_file(self): def generate_init_file(self):
try: try:
# 定义模板文件路径和生成文件路径
template_file_path = os.path.join(REPO_DIR, "User", "task", "init.c.template") template_file_path = os.path.join(REPO_DIR, "User", "task", "init.c.template")
generated_file_path = os.path.join("User", "task", "init.c") generated_file_path = os.path.join("User", "task", "init.c")
# 检查模板文件是否存在
if not os.path.exists(template_file_path): if not os.path.exists(template_file_path):
print(f"模板文件 {template_file_path} 不存在,无法生成 init.c 文件!") print(f"模板文件 {template_file_path} 不存在,无法生成 init.c 文件!")
return return
# 创建目标目录(如果不存在)
os.makedirs(os.path.dirname(generated_file_path), exist_ok=True) os.makedirs(os.path.dirname(generated_file_path), exist_ok=True)
# 读取模板内容
with open(template_file_path, "r", encoding="utf-8") as f: with open(template_file_path, "r", encoding="utf-8") as f:
template_content = f.read() template_content = f.read()
# 生成任务创建代码 # 生成任务创建代码
thread_creation_code = "\n".join([ thread_creation_code = "\n".join([
f" task_runtime.thread.{task_var.get().lower()} = osThreadNew({task_var.get()}, NULL, &attr_{task_var.get().lower()});" f" task_runtime.thread.{task_var.get().lower()} = osThreadNew({task_var.get()}, NULL, &attr_{task_var.get().lower()});"
for task_var in self.task_vars for task_var, _ in self.task_vars # 解包元组
]) ])
# 替换模板中的占位符 # 替换模板中的占位符
init_content = template_content.replace("{{thread_creation_code}}", thread_creation_code) init_content = template_content.replace("{{thread_creation_code}}", thread_creation_code)
# 写入生成的内容到文件
with open(generated_file_path, "w", encoding="utf-8") as f: with open(generated_file_path, "w", encoding="utf-8") as f:
f.write(init_content) f.write(init_content)

38
MRobot.spec Normal file
View File

@ -0,0 +1,38 @@
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['MRobot.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='MRobot',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)

View File

@ -1,2 +1,5 @@
# MRobot # MRobot
用于快速生成MRobot代码 用于快速生成MRobot代码
# 构建exe
pyinstaller --onefile --windowed MRobot.py

View File

@ -1,3 +1,13 @@
/*
* @file oled_i2c.c
* @brief OLED I2C驱动程序
* @version 1.0
* @date 2023-10-01
* @note OLED显示屏的I2C通信和基本绘图功能
*/
*/
/* Includes ----------------------------------------------------------------- */ /* Includes ----------------------------------------------------------------- */
#include "device/oled_i2c.h" #include "device/oled_i2c.h"
#include "bsp/i2c.h" #include "bsp/i2c.h"

4487
build/MRobot/Analysis-00.toc Normal file

File diff suppressed because it is too large Load Diff

2986
build/MRobot/EXE-00.toc Normal file

File diff suppressed because it is too large Load Diff

BIN
build/MRobot/MRobot.pkg Normal file

Binary file not shown.

2964
build/MRobot/PKG-00.toc Normal file

File diff suppressed because it is too large Load Diff

BIN
build/MRobot/PYZ-00.pyz Normal file

Binary file not shown.

1542
build/MRobot/PYZ-00.toc Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,61 @@
This file lists modules PyInstaller was not able to find. This does not
necessarily mean this module is required for running your program. Python and
Python 3rd-party packages include a lot of conditional or optional modules. For
example the module 'ntpath' only exists on Windows, whereas the module
'posixpath' only exists on Posix systems.
Types if import:
* top-level: imported at the top-level - look at these first
* conditional: imported within an if-statement
* delayed: imported within a function
* optional: imported within a try-except-statement
IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
tracking down the missing module yourself. Thanks!
missing module named pyimod02_importers - imported by C:\Users\lvzucheng\AppData\Local\Programs\Python\Python313\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (delayed), C:\Users\lvzucheng\AppData\Local\Programs\Python\Python313\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgres.py (delayed)
missing module named pwd - imported by posixpath (delayed, conditional, optional), shutil (delayed, optional), tarfile (optional), pathlib._local (optional), subprocess (delayed, conditional, optional), getpass (delayed, optional), setuptools._distutils.util (delayed, conditional, optional), netrc (delayed, conditional), setuptools._vendor.backports.tarfile (optional), setuptools._distutils.archive_util (optional), http.server (delayed, optional)
missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib._local (optional), subprocess (delayed, conditional, optional), setuptools._vendor.backports.tarfile (optional), setuptools._distutils.archive_util (optional)
missing module named _posixsubprocess - imported by subprocess (conditional), multiprocessing.util (delayed)
missing module named fcntl - imported by subprocess (optional), _pyrepl.unix_console (top-level)
missing module named _manylinux - imported by packaging._manylinux (delayed, optional), setuptools._vendor.packaging._manylinux (delayed, optional), setuptools._vendor.wheel.vendored.packaging._manylinux (delayed, optional)
missing module named posix - imported by os (conditional, optional), posixpath (optional), shutil (conditional), importlib._bootstrap_external (conditional), _pyrepl.unix_console (delayed, optional)
missing module named resource - imported by posix (top-level)
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
missing module named typing_extensions.TypeAlias - imported by setuptools._vendor.typing_extensions (top-level), setuptools._distutils.compilers.C.base (conditional), setuptools._reqs (conditional), setuptools.warnings (conditional), setuptools._path (conditional), setuptools._distutils.dist (conditional), setuptools.config.setupcfg (conditional), setuptools.config._apply_pyprojecttoml (conditional), setuptools.dist (conditional), pkg_resources (conditional), setuptools.command.bdist_egg (conditional), setuptools.compat.py311 (conditional)
missing module named typing_extensions.Self - imported by setuptools._vendor.typing_extensions (top-level), setuptools.config.expand (conditional), setuptools.config.pyprojecttoml (conditional), setuptools.config._validate_pyproject.error_reporting (conditional), pkg_resources (conditional)
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional)
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
missing module named _scproxy - imported by urllib.request (conditional)
missing module named termios - imported by getpass (optional), tty (top-level), _pyrepl.pager (delayed, optional), _pyrepl.unix_console (top-level), _pyrepl.fancy_termios (top-level), _pyrepl.unix_eventqueue (top-level)
missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
missing module named usercustomize - imported by site (delayed, optional)
missing module named sitecustomize - imported by site (delayed, optional)
missing module named _curses - imported by curses (top-level), curses.has_key (top-level), _pyrepl.curses (optional)
missing module named readline - imported by site (delayed, optional), rlcompleter (optional), code (delayed, conditional, optional)
missing module named trove_classifiers - imported by setuptools.config._validate_pyproject.formats (optional)
missing module named typing_extensions.Buffer - imported by setuptools._vendor.typing_extensions (top-level), setuptools._vendor.wheel.wheelfile (conditional)
missing module named typing_extensions.Literal - imported by setuptools._vendor.typing_extensions (top-level), setuptools.config._validate_pyproject.formats (conditional)
missing module named typing_extensions.deprecated - imported by setuptools._vendor.typing_extensions (top-level), setuptools._distutils.sysconfig (conditional), setuptools._distutils.command.bdist (conditional)
missing module named typing_extensions.Unpack - imported by setuptools._vendor.typing_extensions (top-level), setuptools._distutils.util (conditional), setuptools._distutils.compilers.C.base (conditional), setuptools._distutils.cmd (conditional)
missing module named typing_extensions.TypeVarTuple - imported by setuptools._vendor.typing_extensions (top-level), setuptools._distutils.util (conditional), setuptools._distutils.compilers.C.base (conditional), setuptools._distutils.cmd (conditional)
missing module named '_typeshed.importlib' - imported by pkg_resources (conditional)
missing module named _typeshed - imported by setuptools._distutils.dist (conditional), pkg_resources (conditional), setuptools.glob (conditional), setuptools.compat.py311 (conditional), git.objects.fun (conditional)
missing module named jnius - imported by setuptools._vendor.platformdirs.android (delayed, conditional, optional)
missing module named android - imported by setuptools._vendor.platformdirs.android (delayed, conditional, optional)
missing module named importlib_resources - imported by setuptools._vendor.jaraco.text (optional)
missing module named 'collections.abc' - imported by traceback (top-level), inspect (top-level), logging (top-level), typing (top-level), importlib.resources.readers (top-level), selectors (top-level), tracemalloc (top-level), setuptools (top-level), setuptools._distutils.filelist (top-level), setuptools._distutils.util (top-level), setuptools._vendor.jaraco.functools (top-level), setuptools._vendor.more_itertools.more (top-level), setuptools._vendor.more_itertools.recipes (top-level), setuptools._distutils._modified (top-level), setuptools._distutils.compat (top-level), setuptools._distutils.spawn (top-level), setuptools._distutils.compilers.C.base (top-level), setuptools._distutils.fancy_getopt (top-level), setuptools._reqs (top-level), http.client (top-level), setuptools.discovery (top-level), setuptools.dist (top-level), setuptools._distutils.command.bdist (top-level), setuptools._distutils.core (top-level), setuptools._distutils.cmd (top-level), setuptools._distutils.dist (top-level), configparser (top-level), setuptools._distutils.extension (top-level), setuptools.config.setupcfg (top-level), setuptools.config.expand (top-level), setuptools.config.pyprojecttoml (top-level), setuptools.config._apply_pyprojecttoml (top-level), tomllib._parser (top-level), setuptools._vendor.tomli._parser (top-level), pkg_resources (top-level), setuptools._vendor.platformdirs.windows (conditional), setuptools.command.egg_info (top-level), setuptools._distutils.command.build (top-level), setuptools._distutils.command.sdist (top-level), setuptools.glob (top-level), setuptools.command._requirestxt (top-level), setuptools.command.bdist_wheel (top-level), setuptools._vendor.wheel.cli.convert (top-level), setuptools._vendor.wheel.cli.tags (top-level), setuptools._vendor.typing_extensions (top-level), asyncio.base_events (top-level), asyncio.coroutines (top-level), setuptools._distutils.command.build_ext (top-level), _pyrepl.types (top-level), _pyrepl.readline (top-level), setuptools._distutils.compilers.C.msvc (top-level)
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
missing module named vms_lib - imported by platform (delayed, optional)
missing module named 'java.lang' - imported by platform (delayed, optional)
missing module named java - imported by platform (delayed)
missing module named _suggestions - imported by traceback (delayed, optional)
missing module named gitdb_speedups - imported by gitdb.fun (optional)
missing module named 'gitdb_speedups._perf' - imported by gitdb.stream (optional), gitdb.pack (optional)
missing module named sha - imported by gitdb.util (delayed, optional)

21252
build/MRobot/xref-MRobot.html Normal file

File diff suppressed because it is too large Load Diff

BIN
dist/MRobot.exe vendored Normal file

Binary file not shown.