Files
TIMERS/timer_exe.py

170 lines
6.8 KiB
Python

import tkinter as tk
from tkinter import filedialog, ttk, messagebox
import threading
import serial
import socket
import json
import os
import time
from data_sender import send_data_to_ips
class ConnectionApp:
def __init__(self, root):
self.root = root
self.root.title("Connection and Parser Application")
# Variables
self.connection_type = tk.StringVar(value="IP")
self.log_file_path = tk.StringVar(value="No file selected")
self.parser_type = tk.StringVar(value="Parser 1")
self.ip_address = tk.StringVar(value="127.0.0.1")
self.port = tk.IntVar(value=8080)
self.com_port = tk.StringVar(value="COM1")
self.baud_rate = tk.IntVar(value=9600)
self.data = ""
self.http_destinations = []
# Thread control
self.connection_thread = None
self.is_running = False
# UI
self.create_widgets()
def create_widgets(self):
# Connection Type Selection
tk.Label(self.root, text="Connection Type:").grid(row=0, column=0, pady=5, sticky="e")
connection_menu = ttk.Combobox(
self.root, textvariable=self.connection_type, values=["IP", "Log File", "COM"], state="readonly"
)
connection_menu.grid(row=0, column=1, pady=5, sticky="w")
# IP Settings
tk.Label(self.root, text="IP Address:").grid(row=1, column=0, pady=5, sticky="e")
tk.Entry(self.root, textvariable=self.ip_address).grid(row=1, column=1, pady=5, sticky="w")
tk.Label(self.root, text="Port:").grid(row=2, column=0, pady=5, sticky="e")
tk.Entry(self.root, textvariable=self.port).grid(row=2, column=1, pady=5, sticky="w")
# Log File Selection
tk.Label(self.root, text="Log File:").grid(row=3, column=0, pady=5, sticky="e")
tk.Button(self.root, text="Select File", command=self.select_log_file).grid(row=3, column=1, pady=5, sticky="w")
tk.Label(self.root, textvariable=self.log_file_path).grid(row=4, column=0, columnspan=2, sticky="w")
# COM Port Settings
tk.Label(self.root, text="COM Port:").grid(row=5, column=0, pady=5, sticky="e")
tk.Entry(self.root, textvariable=self.com_port).grid(row=5, column=1, pady=5, sticky="w")
tk.Label(self.root, text="Baud Rate:").grid(row=6, column=0, pady=5, sticky="e")
tk.Entry(self.root, textvariable=self.baud_rate).grid(row=6, column=1, pady=5, sticky="w")
# Parser Selection
tk.Label(self.root, text="Parser:").grid(row=7, column=0, pady=5, sticky="e")
parser_menu = ttk.Combobox(
self.root, textvariable=self.parser_type, values=["Parser 1", "Parser 2", "Parser 3"], state="readonly"
)
parser_menu.grid(row=7, column=1, pady=5, sticky="w")
# Control Buttons
tk.Button(self.root, text="Start", command=self.start_connection).grid(row=8, column=0, pady=10)
tk.Button(self.root, text="Stop", command=self.stop_connection).grid(row=8, column=1, pady=10)
# Destination Management
tk.Button(self.root, text="Add HTTP Destination", command=self.add_http_destination).grid(row=9, column=0, pady=10)
tk.Button(self.root, text="Show Destinations", command=self.show_destinations).grid(row=9, column=1, pady=10)
def select_log_file(self):
file_path = filedialog.askopenfilename(
title="Select Log File", filetypes=[("Log files", "*.log"), ("All files", "*.*")]
)
if file_path:
self.log_file_path.set(file_path)
def start_connection(self):
if self.connection_thread and self.connection_thread.is_alive():
messagebox.showinfo("Info", "Connection is already running.")
return
self.is_running = True
connection_type = self.connection_type.get()
if connection_type == "IP":
self.connection_thread = threading.Thread(target=self.connect_via_ip, daemon=True)
elif connection_type == "Log File":
self.connection_thread = threading.Thread(target=self.read_log_file, daemon=True)
elif connection_type == "COM":
self.connection_thread = threading.Thread(target=self.connect_via_com, daemon=True)
else:
messagebox.showerror("Error", "Unknown connection type.")
return
self.connection_thread.start()
def stop_connection(self):
self.is_running = False
if self.connection_thread and self.connection_thread.is_alive():
self.connection_thread.join()
messagebox.showinfo("Info", "Connection stopped.")
def connect_via_ip(self):
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((self.ip_address.get(), self.port.get()))
while self.is_running:
data = s.recv(1024).decode()
self.process_data(data)
except Exception as e:
messagebox.showerror("Error", f"IP connection error: {e}")
def read_log_file(self):
try:
with open(self.log_file_path.get(), "r") as file:
while self.is_running:
line = file.readline()
if not line:
time.sleep(0.1)
continue
self.process_data(line)
except Exception as e:
messagebox.showerror("Error", f"Log file error: {e}")
def connect_via_com(self):
try:
with serial.Serial(self.com_port.get(), self.baud_rate.get(), timeout=1) as ser:
while self.is_running:
data = ser.readline().decode()
self.process_data(data)
except Exception as e:
messagebox.showerror("Error", f"COM port error: {e}")
def process_data(self, data):
parser = self.get_parser(self.parser_type.get())
parsed_data = parser(data)
self.data = parsed_data
send_data_to_ips(parsed_data, self.http_destinations)
def get_parser(self, parser_name):
if parser_name == "Parser 1":
return lambda x: {"parsed": f"Parser 1 processed {x}"}
elif parser_name == "Parser 2":
return lambda x: {"parsed": f"Parser 2 processed {x}"}
elif parser_name == "Parser 3":
return lambda x: {"parsed": f"Parser 3 processed {x}"}
else:
return lambda x: {"error": "No valid parser selected"}
def add_http_destination(self):
ip = tk.simpledialog.askstring("Add HTTP Destination", "Enter IP (http://<ip>:port):")
if ip:
self.http_destinations.append(ip)
def show_destinations(self):
messagebox.showinfo("HTTP Destinations", "\n".join(self.http_destinations))
if __name__ == "__main__":
root = tk.Tk()
app = ConnectionApp(root)
root.mainloop()