Add PTPLogger/PTPLogger_Graphing.py
This commit is contained in:
@@ -0,0 +1,85 @@
|
|||||||
|
import re
|
||||||
|
import datetime as dt
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import tkinter as tk
|
||||||
|
from tkinter import filedialog, messagebox
|
||||||
|
|
||||||
|
def parse_log(file_path):
|
||||||
|
t = []
|
||||||
|
rms = []
|
||||||
|
freq = []
|
||||||
|
|
||||||
|
with open(file_path, encoding='utf-8', errors='ignore') as f:
|
||||||
|
for line in f:
|
||||||
|
# Match only valid ptp4l stat lines
|
||||||
|
match = re.search(
|
||||||
|
r'^(\w+ \d+ \d+:\d+:\d+).*rms (\d+).*freq ([+-]?\d+)',
|
||||||
|
line
|
||||||
|
)
|
||||||
|
if match:
|
||||||
|
try:
|
||||||
|
# Add year (needed for parsing)
|
||||||
|
timestr = match.group(1) + " 2026"
|
||||||
|
timestamp = dt.datetime.strptime(
|
||||||
|
timestr, "%b %d %H:%M:%S %Y"
|
||||||
|
)
|
||||||
|
|
||||||
|
t.append(timestamp)
|
||||||
|
rms.append(int(match.group(2)))
|
||||||
|
freq.append(int(match.group(3)))
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
# Skip malformed lines safely
|
||||||
|
pass
|
||||||
|
|
||||||
|
return t, rms, freq
|
||||||
|
|
||||||
|
|
||||||
|
def plot_data(t, rms, freq):
|
||||||
|
if not t:
|
||||||
|
messagebox.showerror("Error", "No valid PTP lines found.")
|
||||||
|
return
|
||||||
|
|
||||||
|
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
|
||||||
|
|
||||||
|
ax1.plot(t, rms)
|
||||||
|
ax1.set_ylabel("RMS (ns)")
|
||||||
|
ax1.set_title("PTP RMS Offset")
|
||||||
|
|
||||||
|
ax2.plot(t, freq)
|
||||||
|
ax2.set_ylabel("Frequency deviation")
|
||||||
|
ax2.set_xlabel("Time")
|
||||||
|
ax2.set_title("PTP Frequency Deviation")
|
||||||
|
|
||||||
|
plt.xticks(rotation=30)
|
||||||
|
plt.tight_layout()
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
|
||||||
|
def open_file():
|
||||||
|
file_path = filedialog.askopenfilename(
|
||||||
|
title="Select PTP log file",
|
||||||
|
filetypes=[("Log files", "*.log *.txt"), ("All files", "*.*")]
|
||||||
|
)
|
||||||
|
|
||||||
|
if not file_path:
|
||||||
|
return
|
||||||
|
|
||||||
|
t, rms, freq = parse_log(file_path)
|
||||||
|
|
||||||
|
plot_data(t, rms, freq)
|
||||||
|
|
||||||
|
|
||||||
|
# --- GUI setup ---
|
||||||
|
root = tk.Tk()
|
||||||
|
root.title("PTP Log Viewer")
|
||||||
|
|
||||||
|
root.geometry("300x150")
|
||||||
|
|
||||||
|
label = tk.Label(root, text="PTP Log Plotter", font=("Arial", 14))
|
||||||
|
label.pack(pady=10)
|
||||||
|
|
||||||
|
btn = tk.Button(root, text="Open Log File", command=open_file)
|
||||||
|
btn.pack(pady=10)
|
||||||
|
|
||||||
|
root.mainloop()
|
||||||
Reference in New Issue
Block a user