148 lines
4.6 KiB
Python
148 lines
4.6 KiB
Python
import dearpygui.dearpygui as dpg
|
|
import struct
|
|
from defaults import d
|
|
import common as c
|
|
import gpu as g
|
|
import re
|
|
import settings as s
|
|
|
|
g_freq_str = None
|
|
kip_file_path = None
|
|
|
|
|
|
def make_struct_format(vars_list):
|
|
fmt = "="
|
|
for name, t in vars_list:
|
|
fmt += s.fmt_map[t]
|
|
if name == "tFAW":
|
|
fmt += "4x" # i hate hardcoding but this is what it is
|
|
return fmt
|
|
|
|
|
|
|
|
def freq_to_label(freq):
|
|
if freq > 1382400:
|
|
return f"{freq / 1000:.1f} MHz (DANGEROUS)"
|
|
elif freq > 1152000:
|
|
return f"{freq / 1000:.1f} MHz (UNSAFE)"
|
|
else:
|
|
return f"{freq / 1000:.1f} MHz"
|
|
|
|
def store(sender, app_data):
|
|
global kip_file_path
|
|
kip_file_path = app_data['file_path_name']
|
|
print("Selected" + kip_file_path)
|
|
read_kip(kip_file_path)
|
|
s.load_all_vars()
|
|
|
|
def grab_kip_storage_values(sender, app_data):
|
|
tag = dpg.get_item_alias(sender)
|
|
if tag and hasattr(d, tag):
|
|
numeric_str = str(app_data).split(" ")[0]
|
|
try:
|
|
value = int(float(numeric_str) * 1000)
|
|
except (ValueError, TypeError):
|
|
c.show_popup("Error", f"Invalid numeric value for {tag}: {app_data}")
|
|
return
|
|
setattr(d, tag, value)
|
|
print(tag, app_data, getattr(d, tag))
|
|
if d.autosave:
|
|
write_kip()
|
|
|
|
def grab_kip_storage_values_no_mult(sender, app_data):
|
|
tag = dpg.get_item_alias(sender)
|
|
if not tag or not hasattr(d, tag):
|
|
return
|
|
if isinstance(app_data, str):
|
|
numeric_str = re.sub(r"[^0-9.]", "", app_data)
|
|
if numeric_str == "":
|
|
c.show_popup("Error", f"Invalid numeric value for {tag}: {app_data}")
|
|
return
|
|
try:
|
|
value = int(float(numeric_str))
|
|
except (ValueError, TypeError):
|
|
c.show_popup("Error", f"Invalid numeric value for {tag}: {app_data}")
|
|
return
|
|
else:
|
|
value = app_data
|
|
setattr(d, tag, value)
|
|
print(tag, app_data, getattr(d, tag))
|
|
if d.autosave:
|
|
write_kip()
|
|
|
|
def grab_value_freq_conversion(sender, app_data):
|
|
global g_freq_str
|
|
g_freq_str = app_data
|
|
try:
|
|
g_freq_val = int(float(g_freq_str.replace(" MHz", "")) * 1000)
|
|
except Exception:
|
|
return
|
|
print(g_freq_val)
|
|
|
|
def write_kip():
|
|
global kip_file_path
|
|
MAGIC = b"CUST"
|
|
struct_fmt = make_struct_format(s.variables)
|
|
struct_size = struct.calcsize(struct_fmt)
|
|
if kip_file_path is None:
|
|
msg = "You need to select a file to use Autosave!" if d.autosave else "You need to select a file to save the KIP!"
|
|
c.show_popup("Error", msg)
|
|
return
|
|
with open(kip_file_path, "r+b") as f:
|
|
data = f.read()
|
|
idx = data.find(MAGIC)
|
|
if idx == -1:
|
|
c.show_popup("Error", "KIP is invalid!")
|
|
return
|
|
pos = idx + len(MAGIC)
|
|
values = []
|
|
for attr_name, t in s.variables:
|
|
val = getattr(d, attr_name)
|
|
if t == "u32":
|
|
val = int(val) & 0xFFFFFFFF
|
|
else:
|
|
val = float(val)
|
|
values.append(val)
|
|
try:
|
|
packed = struct.pack(struct_fmt, *values)
|
|
except Exception as e:
|
|
c.show_popup("Error", f"Packing error: {e}")
|
|
return
|
|
f.seek(pos)
|
|
f.write(packed)
|
|
if not d.autosave:
|
|
c.show_popup("Success", "KIP saved successfully!")
|
|
|
|
def read_kip(filename):
|
|
MAGIC = b"CUST"
|
|
struct_fmt = make_struct_format(s.variables)
|
|
struct_size = struct.calcsize(struct_fmt)
|
|
with open(filename, "rb") as f:
|
|
data = f.read()
|
|
idx = data.find(MAGIC)
|
|
if idx == -1:
|
|
c.show_popup("Fatal Error", "Unable to find CUST header in kip\nTry reinstalling the kip using the install option")
|
|
pos = idx + len(MAGIC)
|
|
raw = data[pos:pos + struct_size]
|
|
values = struct.unpack(struct_fmt, raw)
|
|
for (attr_name, _), val in zip(s.variables, values):
|
|
setattr(d, attr_name, val)
|
|
print("=== value layout ===")
|
|
offset = 0
|
|
for (attr_name, t) in s.variables:
|
|
code = s.fmt_map[t]
|
|
align = 8 if code == "d" else 4
|
|
padding = (-offset) % align
|
|
if padding:
|
|
offset += padding
|
|
size = struct.calcsize(code)
|
|
raw_bytes = raw[offset:offset + size]
|
|
val = getattr(d, attr_name)
|
|
print(f"{attr_name:<20} | type={t:<6} | offset={offset:<4} | size={size:<2} | raw=0x{raw_bytes.hex()} | val={val}")
|
|
offset += size
|
|
print("========================")
|
|
dpg.set_value("gpu_sched", g.check_gpu_sched())
|
|
dpg.show_item("gpu_tab")
|
|
dpg.show_item("cpu_tab")
|
|
dpg.show_item("emc_tab")
|
|
dpg.show_item("misc_tab") |