Add TFTP server functionality to the application
- Implement TFTP server tab with IP and port configuration - Create methods to start and stop TFTP server - Add logging functionality for TFTP server events - Integrate TFTPServer class into the main application - Re-enable Firmware directory creation
This commit is contained in:
@@ -37,13 +37,14 @@ import serial
|
||||
import serial.tools.list_ports
|
||||
from serial.serialutil import SerialException
|
||||
from about_window import AboutWindow
|
||||
from TFTPServer import TFTPServer
|
||||
# from TFTPServer import TFTPServerThread
|
||||
|
||||
# Создаем необходимые папки
|
||||
os.makedirs("Logs", exist_ok=True)
|
||||
os.makedirs("Configs", exist_ok=True)
|
||||
os.makedirs("Settings", exist_ok=True)
|
||||
# os.makedirs("Firmware", exist_ok=True)
|
||||
os.makedirs("Firmware", exist_ok=True)
|
||||
|
||||
# Файл настроек находится в папке Settings
|
||||
SETTINGS_FILE = os.path.join("Settings", "settings.json")
|
||||
@@ -535,6 +536,7 @@ class SerialAppGUI(tk.Tk):
|
||||
self.option_add("*Font", default_font)
|
||||
self.settings = settings
|
||||
self.connection = None
|
||||
self.tftp_server = None
|
||||
|
||||
# Глобальные биндинги
|
||||
self.bind_class("Text", "<Control-c>", lambda event: event.widget.event_generate("<<Copy>>"))
|
||||
@@ -613,14 +615,17 @@ class SerialAppGUI(tk.Tk):
|
||||
interactive_frame = ttk.Frame(self.notebook)
|
||||
file_exec_frame = ttk.Frame(self.notebook)
|
||||
config_editor_frame = ttk.Frame(self.notebook)
|
||||
tftp_frame = ttk.Frame(self.notebook)
|
||||
|
||||
self.notebook.add(interactive_frame, text="Интерактивный режим")
|
||||
self.notebook.add(file_exec_frame, text="Выполнение файла")
|
||||
self.notebook.add(config_editor_frame, text="Редактор конфигурации")
|
||||
self.notebook.add(tftp_frame, text="TFTP Сервер")
|
||||
|
||||
self.create_interactive_tab(interactive_frame)
|
||||
self.create_file_exec_tab(file_exec_frame)
|
||||
self.create_config_editor_tab(config_editor_frame)
|
||||
self.create_tftp_tab(tftp_frame)
|
||||
|
||||
# -------------- Вкладка "Интерактивный режим" --------------
|
||||
def create_interactive_tab(self, frame):
|
||||
@@ -823,6 +828,88 @@ class SerialAppGUI(tk.Tk):
|
||||
about_window.transient(self)
|
||||
about_window.grab_set()
|
||||
|
||||
def create_tftp_tab(self, frame):
|
||||
# Создаем фрейм для управления TFTP сервером
|
||||
control_frame = ttk.Frame(frame)
|
||||
control_frame.pack(fill=X, pady=5)
|
||||
|
||||
# IP адрес
|
||||
ip_frame = ttk.Frame(control_frame)
|
||||
ip_frame.pack(fill=X, pady=5)
|
||||
ttk.Label(ip_frame, text="IP адрес:").pack(side=LEFT, padx=5)
|
||||
self.tftp_ip_var = StringVar(value="0.0.0.0")
|
||||
ttk.Entry(ip_frame, textvariable=self.tftp_ip_var, width=15).pack(side=LEFT, padx=5)
|
||||
|
||||
# Порт
|
||||
port_frame = ttk.Frame(control_frame)
|
||||
port_frame.pack(fill=X, pady=5)
|
||||
ttk.Label(port_frame, text="Порт:").pack(side=LEFT, padx=5)
|
||||
self.tftp_port_var = StringVar(value="69")
|
||||
ttk.Entry(port_frame, textvariable=self.tftp_port_var, width=6).pack(side=LEFT, padx=5)
|
||||
|
||||
# Кнопки управления
|
||||
button_frame = ttk.Frame(control_frame)
|
||||
button_frame.pack(fill=X, pady=5)
|
||||
self.start_tftp_button = ttk.Button(button_frame, text="Запустить сервер", command=self.start_tftp_server)
|
||||
self.start_tftp_button.pack(side=LEFT, padx=5)
|
||||
self.stop_tftp_button = ttk.Button(button_frame, text="Остановить сервер", command=self.stop_tftp_server, state="disabled")
|
||||
self.stop_tftp_button.pack(side=LEFT, padx=5)
|
||||
|
||||
# Лог TFTP сервера
|
||||
log_frame = ttk.Frame(frame)
|
||||
log_frame.pack(fill=BOTH, expand=True, pady=5)
|
||||
ttk.Label(log_frame, text="Лог сервера:").pack(anchor=W, padx=5)
|
||||
self.tftp_log_text = tk.Text(log_frame, wrap="word", height=15)
|
||||
self.tftp_log_text.pack(fill=BOTH, expand=True, padx=5, pady=5)
|
||||
|
||||
def start_tftp_server(self):
|
||||
try:
|
||||
ip = self.tftp_ip_var.get()
|
||||
port = int(self.tftp_port_var.get())
|
||||
|
||||
if not self.tftp_server:
|
||||
self.tftp_server = TFTPServer("Firmware")
|
||||
|
||||
# Устанавливаем функцию обратного вызова для логирования
|
||||
def log_callback(message):
|
||||
self.tftp_log_text.insert(END, f"{message}\n")
|
||||
self.tftp_log_text.see(END)
|
||||
|
||||
self.tftp_server.set_log_callback(log_callback)
|
||||
|
||||
threading.Thread(
|
||||
target=self.run_tftp_server,
|
||||
args=(ip, port),
|
||||
daemon=True
|
||||
).start()
|
||||
|
||||
self.start_tftp_button.config(state="disabled")
|
||||
self.stop_tftp_button.config(state="normal")
|
||||
|
||||
except ValueError:
|
||||
messagebox.showerror("Ошибка", "Некорректный порт")
|
||||
except Exception as e:
|
||||
messagebox.showerror("Ошибка", f"Не удалось запустить TFTP сервер: {str(e)}")
|
||||
|
||||
def run_tftp_server(self, ip, port):
|
||||
try:
|
||||
self.tftp_server.start_server(ip, port)
|
||||
except Exception as e:
|
||||
self.tftp_log_text.insert(END, f"[ERROR] Ошибка TFTP сервера: {str(e)}\n")
|
||||
self.stop_tftp_server()
|
||||
|
||||
def stop_tftp_server(self):
|
||||
if self.tftp_server:
|
||||
try:
|
||||
self.tftp_server.stop_server()
|
||||
self.tftp_server = None
|
||||
self.tftp_log_text.insert(END, "[INFO] TFTP сервер остановлен\n")
|
||||
except Exception as e:
|
||||
self.tftp_log_text.insert(END, f"[ERROR] Ошибка при остановке TFTP сервера: {str(e)}\n")
|
||||
finally:
|
||||
self.start_tftp_button.config(state="normal")
|
||||
self.stop_tftp_button.config(state="disabled")
|
||||
|
||||
# ==========================
|
||||
# Парсер аргументов (не используется)
|
||||
# ==========================
|
||||
|
||||
Reference in New Issue
Block a user