59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
# pyright: reportGeneralTypeIssues=false
|
|
|
|
import math
|
|
import random
|
|
import threading
|
|
import time
|
|
|
|
import dearpygui.dearpygui as dpg
|
|
|
|
import dpg_gauges as dpgg
|
|
|
|
|
|
def main() -> None:
|
|
latest = {"rpm": 0.0, "boost": 0.0, "fuel": 0.0, "battery": 0.0}
|
|
lock = threading.Lock()
|
|
stop = threading.Event()
|
|
|
|
def producer() -> None:
|
|
started = time.monotonic()
|
|
while not stop.is_set():
|
|
elapsed = time.monotonic() - started
|
|
with lock:
|
|
latest["rpm"] = random.uniform(0, 8000)
|
|
latest["boost"] = 15 + math.sin(elapsed * 25.0) * 15
|
|
latest["fuel"] = 50 + math.sin(elapsed * 4.0) * 50
|
|
latest["battery"] = random.uniform(0, 100)
|
|
time.sleep(1 / 500)
|
|
|
|
def gui_update() -> None:
|
|
with lock:
|
|
snapshot = dict(latest)
|
|
for tag, value in snapshot.items():
|
|
dpgg.set_value(tag, value)
|
|
dpg.set_frame_callback(dpg.get_frame_count() + 1, gui_update)
|
|
|
|
dpg.create_context()
|
|
thread = threading.Thread(target=producer, daemon=True)
|
|
try:
|
|
with dpg.window(label="Worst Case", width=760, height=420), dpgg.gauge_grid(columns=4):
|
|
dpgg.analog_gauge(tag="rpm", label="RPM", max_value=8000, width=180, height=180)
|
|
dpgg.bar_gauge(tag="boost", label="Boost", max_value=30, width=180, height=90)
|
|
dpgg.level_gauge(tag="fuel", label="Fuel", width=120, height=180)
|
|
dpgg.battery_gauge(tag="battery", label="Battery", width=180, height=90)
|
|
|
|
dpg.create_viewport(title="dpg-gauges worst case", width=800, height=460)
|
|
dpg.setup_dearpygui()
|
|
thread.start()
|
|
dpg.set_frame_callback(1, gui_update)
|
|
dpg.show_viewport()
|
|
dpg.start_dearpygui()
|
|
finally:
|
|
stop.set()
|
|
thread.join(timeout=1.0)
|
|
dpg.destroy_context()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|