From 412139f02d1a51fd7228fb2fd823d94580d01568 Mon Sep 17 00:00:00 2001 From: Kirubakaran Date: Thu, 21 Aug 2025 00:26:09 +0530 Subject: [PATCH] chore: initial project setup - Added base project structure (core, ui, proto, assets, logs, utils) - Added requirements.txt for dependencies - Added main.py entry point - Configured .gitignore to exclude __pycache__, build, dist, venv, logs, and .spec files --- .gitignore | 27 + assets/icon.ico | Bin 0 -> 4022 bytes assets/icon.png | Bin 0 -> 111066 bytes core/__init__.py | 0 core/csv_logger.py | 159 ++++ core/mqtt_client.py | 131 +++ logo/black.png | Bin 0 -> 13538 bytes logo/v_logo.png | Bin 0 -> 68980 bytes logo/vec_logo.png | Bin 0 -> 88949 bytes logo/vec_logo_svg.svg | 24 + logo/white.jpeg | Bin 0 -> 6023 bytes main.py | 16 + proto/__init__.py | 0 proto/vec_payload_chgSt.options | 28 + proto/vec_payload_chgSt.proto | 162 ++++ proto/vec_payload_chgSt_pb2.py | 70 ++ proto/vec_payload_chgSt_pb2.pyi | 287 ++++++ requirements.txt | Bin 0 -> 294 bytes ui/__init__.py | 0 ui/main_window.py | 1521 +++++++++++++++++++++++++++++++ ui/styles.py | 218 +++++ ui/widgets.py | 153 ++++ utils.py | 13 + 23 files changed, 2809 insertions(+) create mode 100644 .gitignore create mode 100644 assets/icon.ico create mode 100644 assets/icon.png create mode 100644 core/__init__.py create mode 100644 core/csv_logger.py create mode 100644 core/mqtt_client.py create mode 100644 logo/black.png create mode 100644 logo/v_logo.png create mode 100644 logo/vec_logo.png create mode 100644 logo/vec_logo_svg.svg create mode 100644 logo/white.jpeg create mode 100644 main.py create mode 100644 proto/__init__.py create mode 100644 proto/vec_payload_chgSt.options create mode 100644 proto/vec_payload_chgSt.proto create mode 100644 proto/vec_payload_chgSt_pb2.py create mode 100644 proto/vec_payload_chgSt_pb2.pyi create mode 100644 requirements.txt create mode 100644 ui/__init__.py create mode 100644 ui/main_window.py create mode 100644 ui/styles.py create mode 100644 ui/widgets.py create mode 100644 utils.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..04fee25 --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# Python cache +__pycache__/ +*.py[cod] +*.pyo +*.pyd + +# Build / distribution +build/ +dist/ +*.egg-info/ + +# PyInstaller spec files +*.spec + +# Virtual environment +venv/ +.env/ +.venv/ + +# Logs +logs/ + +# IDE / editor specific +.vscode/ +.idea/ +*.swp +*.swo diff --git a/assets/icon.ico b/assets/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0389c523c4f4270ec964c6d7026f3ef6f636b3bc GIT binary patch literal 4022 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 New log file created: {filepath}") + return writer + except Exception as e: + print(f"❌ Failed to create CSV writer for {writer_key}: {e}") + return None + + @pyqtSlot(list) + def log_data(self, data_list): + self.queue.put(data_list) + + def _process_queue(self): + while not self.queue.empty(): + # ========================================================== + # ===== EDITED SECTION STARTS HERE ========================= + # ========================================================== + item = None # Define item outside the try block for better error reporting + try: + # First, get the whole item from the queue. + item = self.queue.get() + + # Now, try to unpack it. This is where the ValueError can happen. + timestamp_obj, topic, data, raw_payload = item + + # The rest of your logic remains the same + parts = topic.split('/') + if len(parts) < 5: continue + device_id = parts[3] + file_group = 'PERIODIC' if topic.endswith('/PERIODIC') else 'EVENTS_RPC' + + writer = self._get_writer(device_id, file_group) + if not writer: continue + + if file_group == 'PERIODIC': + # --- Build one single WIDE row --- + row_data = [ + datetime.fromtimestamp(data.get("ts")).strftime("%Y-%m-%d %H:%M:%S"), + device_id, + data.get("stationDiagnosticCode", "N/A") + ] + + all_slots_data = [] + slots = data.get("slotLevelPayload", []) + num_slot_fields = 14 + + for i in range(self.num_slots): + if i < len(slots): + slot = slots[i] + all_slots_data.extend([ + slot.get('batteryIdentification', ''), + "TRUE" if slot.get("batteryPresent") == 1 else "FALSE", + "TRUE" if slot.get("chargerPresent") == 1 else "FALSE", + "OPEN" if slot.get("doorStatus") == 1 else "CLOSED", + "LOCKED" if slot.get("doorLockStatus") == 1 else "UNLOCKED", + slot.get('voltage', 0) / 1000.0, + slot.get('current', 0) / 1000.0, + slot.get('soc', 0), + slot.get('batteryMaxTemp', 0) / 10.0, + slot.get('slotTemperature', 0) / 10.0, + slot.get('batteryFaultCode', 0), + slot.get('chargerFaultCode', 0), + slot.get('batteryMode', 0), + slot.get('chargerMode', 0) + ]) + else: + all_slots_data.extend([''] * num_slot_fields) + + final_row = row_data + all_slots_data + [raw_payload.hex()] + writer.writerow(final_row) + else: + # Logic for EVENTS and RPC remains the same + payload_json_string = json.dumps(data) + row = [ + timestamp_obj.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3], + topic, + payload_json_string, + raw_payload.hex() + ] + writer.writerow(row) + + writer_key = (device_id, file_group) + if file_handle := self.files.get(writer_key): + file_handle.flush() + + except ValueError: + # This specifically catches the unpacking error and prints a helpful message. + print(f"❌ Error: Malformed item in log queue. Expected 4 values, but got {len(item)}. Item: {item}") + continue # Continue to the next item in the queue + + except Exception as e: + # A general catch-all for any other unexpected errors. + # This message is safe because it doesn't use variables from the try block. + print(f"❌ An unexpected error occurred in the logger thread: {e}") + continue + + def stop_logging(self): + self.timer.stop() + self._process_queue() + for file in self.files.values(): + file.close() + self.files.clear() + self.writers.clear() + print(f"🛑 CSV logging stopped for session: {self.session_name}") \ No newline at end of file diff --git a/core/mqtt_client.py b/core/mqtt_client.py new file mode 100644 index 0000000..0620158 --- /dev/null +++ b/core/mqtt_client.py @@ -0,0 +1,131 @@ +# In core/mqtt_client.py +import socket +from PyQt6.QtCore import QObject, pyqtSignal, pyqtSlot +import paho.mqtt.client as mqtt + +class MqttClient(QObject): + # --- MODIFIED SIGNAL: Now sends a bool and a string --- + connection_status_changed = pyqtSignal(bool, str) + message_received = pyqtSignal(str, bytes) + connection_error = pyqtSignal(str) + stop_logging_signal = pyqtSignal() + connected = pyqtSignal() + disconnected = pyqtSignal() + + def __init__(self, broker, port, user, password, client_id): + super().__init__() + self.broker = broker + self.port = port + + self.client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id) + if user and password: + self.client.username_pw_set(user, password) + + self.client.on_connect = self.on_connect + self.client.on_disconnect = self.on_disconnect + self.client.on_message = self.on_message + # self.client.on_subscribe = self.on_subscribe + + def on_connect(self, client, userdata, flags, rc, properties): + if rc == 0: + print("Connection to MQTT Broker successful!") + # --- MODIFIED EMIT: Send a success message --- + self.connection_status_changed.emit(True, "✅ Connected") + else: + print(f"Failed to connect, return code {rc}\n") + # --- MODIFIED EMIT: Send a failure message --- + self.connection_status_changed.emit(False, f"❌ Connection failed (Code: {rc})") + self.stop_logging_signal.emit() # Emit the signal + self.disconnected.emit() + + def on_message(self, client, userdata, msg): + # print(f"Received {len(msg.payload)} bytes of binary data from topic `{msg.topic}`") + self.message_received.emit(msg.topic, msg.payload) + + def on_disconnect(self, client, userdata, flags, rc, properties): + print("Disconnected from MQTT Broker.") + # Change the icon in the line below from 🔌 to 🔴 ❌ 🚫 💔 + self.connection_status_changed.emit(False, "💔 Disconnected") + self.disconnected.emit() + + # --- MODIFIED connect_to_broker METHOD --- + def connect_to_broker(self): + print(f"Attempting to connect to {self.broker}:{self.port}...") + try: + self.client.connect(self.broker, self.port, 60) + self.client.loop_start() + except socket.gaierror: + msg = "Host not found. Check internet." + print(f"❌ Connection Error: {msg}") + self.connection_status_changed.emit(False, f"❌ {msg}") + except (socket.error, TimeoutError): + msg = "Connection failed. Server offline?" + print(f"❌ Connection Error: {msg}") + self.connection_status_changed.emit(False, f"❌ {msg}") + except Exception as e: + msg = f"An unexpected error occurred: {e}" + print(f"❌ {msg}") + self.connection_status_changed.emit(False, f"❌ Error") + + + def run(self): + """ + Connects to the broker and starts the network loop. + Handles all common connection errors gracefully. + """ + print(f"Attempting to connect to {self.broker}:{self.port}...") + try: + # 1. Attempt to connect + self.client.connect(self.broker, self.port, 60) + + # 2. Run the blocking network loop + # This will run until self.client.disconnect() is called + self.client.loop_forever() + + except socket.gaierror: + msg = "Host not found. Check the broker address or your internet connection." + print(f"❌ {msg}") + self.connection_error.emit(msg) # Report error to the main window + + except (socket.error, ConnectionRefusedError): + msg = "Connection refused. Is the server offline or the port incorrect?" + print(f"❌ {msg}") + self.connection_error.emit(msg) + + except TimeoutError: + msg = "Connection timed out. The server is not responding." + print(f"❌ {msg}") + self.connection_error.emit(msg) + + except Exception as e: + # Catch any other unexpected errors during connection or loop + msg = f"An unexpected error occurred: {e}" + print(f"❌ {msg}") + self.connection_error.emit(msg) + + # def on_subscribe(self, client, userdata, mid, reason_code_list, properties): + # """Callback function for when the broker responds to a subscription request.""" + # if reason_code_list[0].is_failure: + # print(f"❌ Broker rejected subscription: {reason_code_list[0]}") + # else: + # print(f"✅ Broker accepted subscription with QoS: {reason_code_list[0].value}") + + # --- (The rest of the file remains the same) --- + @pyqtSlot() + def disconnect_from_broker(self): + """Stops the MQTT client's network loop.""" + if self.client: + self.client.loop_stop() + self.client.disconnect() + print("Stopping MQTT network loop.") + + def subscribe_to_topic(self, topic): # Add qos parameter + print(f"Subscribing to topic: {topic}") + self.client.subscribe(topic) + + def publish_message(self, topic, payload): + self.client.publish(topic, payload) + + def cleanup(self): + print("Stopping MQTT network loop.") + self.client.loop_stop() \ No newline at end of file diff --git a/logo/black.png b/logo/black.png new file mode 100644 index 0000000000000000000000000000000000000000..af3961d12bd484e06c3a0e58534c83d18de64315 GIT binary patch literal 13538 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%0D(=ii&Jtn6ML@g#_#n4ZlX-@1Nz0d0GwAqjX) znS3=#R|w}uiH$^j8jAmoT$xJb_>|prOajQ3YVrqWNc_BW8iyle6Okw+3@gw=0!E|q zn58f}>}C}IZkjtf{9=@oF!F*p4Cccnxt8?`7aQbWa%kfo#Kr6+zAJ45NAEk7%Gzm{ zSZn!sUG1mp5l+-mW-N4K!SN6t&v_g%V1;lUB!Dg;Y)?(JWS(>UNdKg5y?#KXE(m0o z+YdH8{WeQ8*iuDZrUARzQ4jV6XB>6DJDae41yYyjMo;&Y9m2gGBn?$^c`Yo3GO7nX zQgF#jS)dpw!#F{?BskelH@Gxpom)=~wP_&C{7ZGpY;~N~dm!j24<#ZpyqfUZBJ)EK zSc2G>qtJ+!iT3k~fC>%NPW*)pK1imd&bQRY)-ACkS@p(IvgIzyfqPNFNt?jO&S1XL zT8A0lmD-`CW<5sObkp;=)wbT~K?yh>%Xe)=%7~c1 zkZO3lGtPa9E0f6QG4tMP@6-9Jt@Be75JKoYTmPkDDa1FPGL&M(+Iga2;Vx@;$f~%YW#=@ATfI6rBGu z%|^mk;QEh~qWXLWKY6pD5o_=lYIbw7jl$46@OW)K%t<_ycj4|sX_pZ{RW3YtzN!u)T(xazVqM^8*;eWYL`;v}h1+xaB&<%5w(z41$Kl*%8XW%7=mn#>Mik-H;D`^m=rKAfo6ojVQtTS`)y?C2-oon-)^nJ z;fk-#BZl@+M;r%UiHN0qSdB(13U+CFCfIEJXtA+9&T;s&X0lL_KSVZNhq4# zn;03?Ze<2dQt&;W6(#wp*HV)!O85G%1763^8khBi&1l9J(Yh!EwqQJD>pavu7r&=+ z{_wn_)pR;)C3&9&(C%&!W1kVo39D;06*fl03DYzUwFGH4R&NPeX+Z zLW6wP6xk^VbLBU<7&Xf4|BhwJT9YdD z-`0U*IeD~)j0XfididOR7OFfAlD;dWglq8^_{Fr-B zD9Y>8vLb(Z14?xG4c>B{lfdFXE%gE_XQPwy-p=~Y&tL4nCAT0radKt_jzm;{M8qAv z&g8eejStYTED;1Nm(pr+6?lRc$hBeD{VMu|6qmC^h0M^=G_-iJY* z<}{qVZhzx8ZOTNGBcfQ;E)!=fczVdXv9|F*&7dN@a4VLX-(E*`jc;RBvy){cHWN7W zcC`fH61rM^VGw#k?GG^Kr#NCBb}m1)dD70{T#vI{TD7o(RekGqQFgh;A)Nc_uE$|) z4;c6M17Z(B%ygqXLLh&5q7|c))ZC}QXVT@To#z?VB!GznjUaa0sgikJNBHIrvd^YX zLr~}8(;2^R*&z)p)G>TR2H#82%^5m-2LBf+epBp|P=o*1oAzT$ur%5Aq}=s5eD&l#g; zd@y4*@GAB|Q_JagD|r5>=i3nOsw^1&4JyJ+0%ov?Gr?h+udueqw5HQ^ha^A?4_*@q zP9lfndsKt~Ov#2978p7wKc%xpA_Kqx?Ww$RS7GOt5_ju`yRh^P2T@oXdn8mTa4qaJ z6SeN&mvq_Qn&5mAP(MV-80v!IFCd7KAJ-9R1NiC91Wsam`r_HGUy|5U5|FBlt0E&m zOEODFPC|)v3S>m!{e=YlvA~l6-C>%M%=)eh(c8G%yg+))JD#*(jy|xbgL5XUT%FN3 z36I|2pe$j+p`fF=7oHO#1ob5C*H3H4zxgqE-n;uN?Z$#mryLDc0B?x1(l*yrM=tsy zEV`+3&aWw+ObAd?!N$;s~7z{1QI=Ao+c&W$9fR$AR+L&w^W`1%&RN*6>~1lUTxoCrjrSPaaJOi#xjHI8t|S zyy#Qre~p@{Hx9uL1i!)C5bhJlTEg4YWa8dP83cCV)``o`Qk!z@urU-zZ6Ra@D@OE;^ z2P%f~{2M0umiKPXQ5rYZ7uEv)gFj#k$Zqj|opS9*HXb>2F`mf)}& zE)tNw4s^$~mf^bU@{$fjMThqg^a*?hM1&C_dtH6P<1j_mi~1v)^m*@`0mqURgtcp3%nkDZ+2xG;veQuD=hDdIF-MFq&+nHd4Bp?iFt(<+-jl5D&P?FEg&bkpAyhbRa}#ZC^o!7f z#S)47hbq3ZhIwJMjAgVv!eB=uj7|4hKu2zrfH3A-m74z zl?Nsm)@Dxv+_Xr5Obb86?g|W7hRIDt)G2l)&8Un@%J2r3c~ppSL9lk8jXa+{@|EU! ztW5K{&W&=99O15JPmkxWocA+*b^liMSpCs&(<8V)S@!Bw62RzDLH4$?M&NTUkAqaK z`*{`NHD1DI2ZIxl|KgV(Jx2oEturEp784qrh4ynuKwlF)aS?598Vjp&?Rc|D9oWQA z?VFYH<#S#3)2AQgJsX0%W|P`OH0u7rBhZnjMka5Tu;o6vqEL7N9WU;#8ZKP}7wo&1 zs_ak9O9`KsfwM$FV_&?gPk(mkyHbZgrTi;CjCk;GbyZx^%>09eKXPcd{tL;_@?x0X0mUl z_Q9>?x!|(@=aCcEEBUac(tk|KTcN@q*%9<$p{R6T&-IBr!G`O=_q%c~E%` z*-cAW9kMek=0!wi;MDHuR=4f76A!rZJvie%B?08HHM4Us+ze>>38AhHuzHf5>*L1L)P9Wx+Hi66Z22%l<=BGMn?Z@YqLG{9t? zRA89<6nHkgEA*JNitu_mR01j(=fNUJHm{_+VO+br z=25x_!@$7aYq&DnD?tGs)gn|q)vQ`J@7C0n^0f^aZTFV2H zT|rKnFKWM9ZJz}fa@MqjipErpiM58GKJ<#z;KfHnVc zJ=d4`khdNfUcG)UzS2bCDLQ{Z2$%z(f zSljIuDdG?qB;CxrEH1Azvimj77w;FEX)=0iz2A#}lX4q^lSa>063DXyHz6Chb{&~j zT}pz~G;IYDOVK{oKfS6Q(#LCL6k6_o@=>D{P3XtBsz1QzKqb!$As${}=!BvMI16dv zKB^I!T2zdEn-?Bq$T{CTbXJQj)~H>FGGo#z(D*KE%jhFsh0YxAOGP3Jf($F9QL#9k*S>Pm~8Xn)QS7{rVYd>BaH}Lhu ztTAQJUz5W)Mb<@-Ib0Z{$$j4}@Jk52*#FXKF2;&cy0#Mqf1z6%9m}>3f7PxP_RCvz zzh(rPk`uxlf;=wN6{Fe~1dEowJ1uHge+f1uuE&VTfiYUHz2dVRb*Msic`w7bdY6A0 zZuE`$g_X0Z1}D!kv*TZYufyh#D)~$_0&P$K?$aHAzL{y=iH{l35{}!qP}`<4ES3sw z^0s}ihpPQ5=YH{RS+&vK6iwQm0nLLlRP0encMoRAq%IM%GSo?{!51iGHt{F?6=z>9 znXBge#=O`{rqO+#Wkw8^zgC|ZA5!n!b4oE_w)*oq#q^cO4D6XhY$-~HrzN9!&}r1S z-7!A@R3w-%>Ubp3-mH-IvZ5a1u^eB!hEq_9TgWMt5*JfAe`?0*m{-3WZ(Li zdauD5EPk6@0UT$&sH9o#t`?s2Fajqgji0hZdL`TA;jPqm-$Sf(obS#-C1K;leIh9c zAoy;+3>2y=mv!f?*XLnSUN=r|Qp$+*iFcxhHkP(DmM=V$lRzrW4avvw>^_j{Tms$o zI9eocwCJ9{hkZ#l0SBBHQUE-9l&xp!#WLWcTkN?mo=}voe#3xQbI^_Q@WTGxhVP$r zeAqg!P}KEA+*NGw9O<3a*wjAD`)AAlNi??(PG;Xs`t=dZRrPl31f|Lln<4 z^5#<u!vBw2k!Lv*5SnQAaMt#TExm3FeMtl@0f$$pGQaO~0jN9H3)dB-7hkYA-(=m!s zc@tiFb!JsrVS5o_Awb`kjl{dALF69}yJxNa7Vm<4CK+uJm=JL)el^lU=Vx-;ksz3i zg0wS5>yuM-X0{D~_nnu>FPO52r zeWdT-<>$wKUC)fWJ$FNsg^B0*TPE82H?~awrqpvY$MZbdvk8gw&I#hR8N$u;3IYXQ zc9Y1AJ`27%UIRXg7O4eE=3aB9+E`OMQ103A-j5|f&-2uTzT!Zrq@-r$g6^kd@)iCE zqZ8b591$XqV-0pfWOI%v+GlNy{MVJ9zRu;I<+-eMymasSxAh+xD>L4nHLJ!Mg6U5fIFlx`5Kl>yR;va!+&JBs_Y1e*b4 zy>TWed>kBPO|VOQU2#0i&z4k)#>Kz8ry!R2Tm`}40_ayQ<=(#yqM;>{8aTb#oflyeb1+IL(ble zj$sFP`XF+WyC9sfdLbvGwp!1d(WhHYHMq^$tV8w7#>K|P84v6cW~y6;IWVeKr80E6 z+>Up54LbGYu?337(0}=4$(2j(l^Er!%Tw`h~YvOc0qZuFJ|q5|IxkislWS3@C-=%Jeep+P(w54FC_>R~KEuq`=N7zx%&znzY>7xZFy-O*tJQ*{sXofVyqe}`=FSA7X-Z`=l6 z%CmLpW!}`J*!g!Y;9u92li##nVh;+Fl@oOY%f;KM_`)Q*wK}54voS>9oPkN zxoG0x`PzKxEbPkyGB+zIL_7B+=|EwjSEBg&)W+i95zKvpJm#;1N5+)i`0ZJ{>rkDI z)%QtQ0}Y&TfWpa+k{{FiK3y&T9S)OgQ1Q+NnUWRd0(AeAl;0II&BfRd+y`>f$iJ|l z%?yWjGuXczNm@yTzgRflN>7)yp6yo~yc#KTeGf@-pE1Sb@C23HiNs}~-1kT3{%ESj z-SO$s`pmW$l>3Uj%YcthAx&zCe+UxBdxlk8UOnWi=1U#VIcg1*Z}-*_IziUHADbj| zA6ox@1m#DNl|=|z-!wvicm+wk(*z$9s6DcbgL%l{3`l?zgg%(XizyEFSN)Dd!ecwO z_24o77W>6BkDWh3W;BD(OrT#0{J1qAygJ#rNjFQb{4@n^E{Nt5S*><2W>S)P_s&Sjj4a{^o+J5pKPk5!n~ni3>sFx;mp3}3RhPepuP_ugPtNo` z9<@`t@(GBI3v2b`XJ?V+@?LXI$BtR!~6)I1hMhDw9<3wMzu&X@51+dG?J3PNG zbNSZ0c)sAmQ+0i!#4^HTapnr_nN0i?RMmtL_tv#KZ0fHIYLEmxY?%Md+_<&7uPHE1 zrWRA46DL^(mk?22tr}4$ekY25drSV{@L18QU>&Ie#TWu)`K?!bfa0r5Mo5;As2+j1 zYVKo&Q&&6~Ix+(7cetF}owBLdsXSKv{c`!sE0XJ;r}Z4_x6Ul{h=Z_tXJjjkjCW7{b4DzR&eR1144sSOR08y191{?nPcF68G*S}jobei~iGJ>yL+~?)qajo* z;SBzxWJLy+N$7=+71K!htlT?=- zC2!4&eXj_*IJ@>HY0=0QMqqso>vj)xB{nO7&aVYwa%YmTsZ)?=4lzS3^Dd)Ia$=sN z-5n-%!bp!7g&%EmilsU~Gq;SBfN4E!nAdb1>UtJxb!5u^jo5X;%O;8+zymR_0cXnP+q;TH`l_cRTTqEf zBCFdOnX{E^{WBX_GE@(i6!*+}b(35Y;p7&|hle-YtR!f66R%AKYn2;cSFp3#HtH|E z9kD1CZR1pU*2jU5S=U50>gx>K#t3+Tar*qLFAQ;;$k(`7ao4Nh1Rfvf{lP9xyEZcQP6G;2IE2TG@cMG>8U5T$n?OWt<#(Z%zTA}e&@t|-!{A76&ALT75kOi^cZ_yx5IsCH>Ko3Ub9YQl{!j9v5 zQ5k--tQ9Xmy&WP@iu^nr3Ia~82S?z0`So!E&nv6)UaY>SCU5;2N^hEqBjirAVbh0M zjb;-hcXN1KQXUmG)+IPPveL0cGnOUZKW^uEzDiFhOVo=97y2Rh{qg;!FcokKeAttL zye^!nBXXl_5$`f@RbX5?Oo@Z_7>CSDDvsG()i1e+DDcBH9Wa(=A<+=EH!BcEQ#sp# zf@f@h)G!+!pH`iPU8}lbJnI3JGqnVh6*AY(6&QDKO2MFIr1Y7koZVc1{fjOBI9cTQ zr0$#jn{!M?G7yIJj{5fFF!C*vA_K>auJa==D6*_m}k5 zZ>3;=3s9mfZTNV~)05Yd`_Ru~t$#U`Qd*2ETyq!LG}mDV{@u1U4fYK(#VE!J<5orU znyfDI<8MmlHJP7d!VOFYxbtYj^>6O{b3x~$`%HcOMIOz1CIj94n pyYu_TUqZl59~5bd^bA#aX#8&+e+i$ArTV}6H-&%w?Eyxb{%@*lw4(q3 literal 0 HcmV?d00001 diff --git a/logo/v_logo.png b/logo/v_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9de36e5fae6359e78d618ec13d46c4cd8a6c3ae5 GIT binary patch literal 68980 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 J^A%0s{tutBT@e5P literal 0 HcmV?d00001 diff --git a/logo/vec_logo.png b/logo/vec_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..55ec9787da2376c12de5d8392806bcd342242699 GIT binary patch literal 88949 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 H?#BNC>U7?7 literal 0 HcmV?d00001 diff --git a/logo/vec_logo_svg.svg b/logo/vec_logo_svg.svg new file mode 100644 index 0000000..e3f588f --- /dev/null +++ b/logo/vec_logo_svg.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/logo/white.jpeg b/logo/white.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..46061dd161b4aa83ac5040e03ea64af4bf7bc2f1 GIT binary patch literal 6023 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 None: ... + +class mainPayload(_message.Message): + __slots__ = ("ts", "deviceId", "sessionId", "slotLevelPayload", "backupSupplyStatus", "switchStatus", "stationStatus", "stationDiagnosticCode", "coordinates") + TS_FIELD_NUMBER: _ClassVar[int] + DEVICEID_FIELD_NUMBER: _ClassVar[int] + SESSIONID_FIELD_NUMBER: _ClassVar[int] + SLOTLEVELPAYLOAD_FIELD_NUMBER: _ClassVar[int] + BACKUPSUPPLYSTATUS_FIELD_NUMBER: _ClassVar[int] + SWITCHSTATUS_FIELD_NUMBER: _ClassVar[int] + STATIONSTATUS_FIELD_NUMBER: _ClassVar[int] + STATIONDIAGNOSTICCODE_FIELD_NUMBER: _ClassVar[int] + COORDINATES_FIELD_NUMBER: _ClassVar[int] + ts: int + deviceId: str + sessionId: str + slotLevelPayload: _containers.RepeatedCompositeFieldContainer[slotLevelPayload] + backupSupplyStatus: int + switchStatus: _containers.RepeatedScalarFieldContainer[int] + stationStatus: int + stationDiagnosticCode: int + coordinates: _containers.RepeatedScalarFieldContainer[float] + def __init__(self, ts: _Optional[int] = ..., deviceId: _Optional[str] = ..., sessionId: _Optional[str] = ..., slotLevelPayload: _Optional[_Iterable[_Union[slotLevelPayload, _Mapping]]] = ..., backupSupplyStatus: _Optional[int] = ..., switchStatus: _Optional[_Iterable[int]] = ..., stationStatus: _Optional[int] = ..., stationDiagnosticCode: _Optional[int] = ..., coordinates: _Optional[_Iterable[float]] = ...) -> None: ... + +class nfcPayload_s(_message.Message): + __slots__ = ("manufacturingData", "customData") + MANUFACTURINGDATA_FIELD_NUMBER: _ClassVar[int] + CUSTOMDATA_FIELD_NUMBER: _ClassVar[int] + manufacturingData: str + customData: str + def __init__(self, manufacturingData: _Optional[str] = ..., customData: _Optional[str] = ...) -> None: ... + +class eventData_s(_message.Message): + __slots__ = ("nfcData", "batteryIdentification", "activityFailureReason", "swapAbortReason", "swapTime", "faultCode", "doorStatus", "slotId") + NFCDATA_FIELD_NUMBER: _ClassVar[int] + BATTERYIDENTIFICATION_FIELD_NUMBER: _ClassVar[int] + ACTIVITYFAILUREREASON_FIELD_NUMBER: _ClassVar[int] + SWAPABORTREASON_FIELD_NUMBER: _ClassVar[int] + SWAPTIME_FIELD_NUMBER: _ClassVar[int] + FAULTCODE_FIELD_NUMBER: _ClassVar[int] + DOORSTATUS_FIELD_NUMBER: _ClassVar[int] + SLOTID_FIELD_NUMBER: _ClassVar[int] + nfcData: nfcPayload_s + batteryIdentification: str + activityFailureReason: int + swapAbortReason: swapAbortReason_e + swapTime: int + faultCode: int + doorStatus: int + slotId: int + def __init__(self, nfcData: _Optional[_Union[nfcPayload_s, _Mapping]] = ..., batteryIdentification: _Optional[str] = ..., activityFailureReason: _Optional[int] = ..., swapAbortReason: _Optional[_Union[swapAbortReason_e, str]] = ..., swapTime: _Optional[int] = ..., faultCode: _Optional[int] = ..., doorStatus: _Optional[int] = ..., slotId: _Optional[int] = ...) -> None: ... + +class eventPayload(_message.Message): + __slots__ = ("ts", "deviceId", "eventType", "sessionId", "eventData") + TS_FIELD_NUMBER: _ClassVar[int] + DEVICEID_FIELD_NUMBER: _ClassVar[int] + EVENTTYPE_FIELD_NUMBER: _ClassVar[int] + SESSIONID_FIELD_NUMBER: _ClassVar[int] + EVENTDATA_FIELD_NUMBER: _ClassVar[int] + ts: int + deviceId: str + eventType: eventType_e + sessionId: str + eventData: eventData_s + def __init__(self, ts: _Optional[int] = ..., deviceId: _Optional[str] = ..., eventType: _Optional[_Union[eventType_e, str]] = ..., sessionId: _Optional[str] = ..., eventData: _Optional[_Union[eventData_s, _Mapping]] = ...) -> None: ... + +class rpcData_s(_message.Message): + __slots__ = ("sessionId", "slotsData") + SESSIONID_FIELD_NUMBER: _ClassVar[int] + SLOTSDATA_FIELD_NUMBER: _ClassVar[int] + sessionId: str + slotsData: _containers.RepeatedScalarFieldContainer[int] + def __init__(self, sessionId: _Optional[str] = ..., slotsData: _Optional[_Iterable[int]] = ...) -> None: ... + +class slotControl_s(_message.Message): + __slots__ = ("slotId", "state") + SLOTID_FIELD_NUMBER: _ClassVar[int] + STATE_FIELD_NUMBER: _ClassVar[int] + slotId: int + state: int + def __init__(self, slotId: _Optional[int] = ..., state: _Optional[int] = ...) -> None: ... + +class getJobStatusByJobId_s(_message.Message): + __slots__ = ("jobId",) + JOBID_FIELD_NUMBER: _ClassVar[int] + jobId: str + def __init__(self, jobId: _Optional[str] = ...) -> None: ... + +class rpcRequest(_message.Message): + __slots__ = ("ts", "jobId", "jobType", "rpcData", "slotInfo", "swapDeny", "getJobStatusByJobId", "languageType") + TS_FIELD_NUMBER: _ClassVar[int] + JOBID_FIELD_NUMBER: _ClassVar[int] + JOBTYPE_FIELD_NUMBER: _ClassVar[int] + RPCDATA_FIELD_NUMBER: _ClassVar[int] + SLOTINFO_FIELD_NUMBER: _ClassVar[int] + SWAPDENY_FIELD_NUMBER: _ClassVar[int] + GETJOBSTATUSBYJOBID_FIELD_NUMBER: _ClassVar[int] + LANGUAGETYPE_FIELD_NUMBER: _ClassVar[int] + ts: int + jobId: str + jobType: jobType_e + rpcData: rpcData_s + slotInfo: slotControl_s + swapDeny: swapDenyReason_e + getJobStatusByJobId: getJobStatusByJobId_s + languageType: languageType_e + def __init__(self, ts: _Optional[int] = ..., jobId: _Optional[str] = ..., jobType: _Optional[_Union[jobType_e, str]] = ..., rpcData: _Optional[_Union[rpcData_s, _Mapping]] = ..., slotInfo: _Optional[_Union[slotControl_s, _Mapping]] = ..., swapDeny: _Optional[_Union[swapDenyReason_e, str]] = ..., getJobStatusByJobId: _Optional[_Union[getJobStatusByJobId_s, _Mapping]] = ..., languageType: _Optional[_Union[languageType_e, str]] = ...) -> None: ... + +class jobStatusByJobIdResponse_s(_message.Message): + __slots__ = ("jobId", "jobStatus", "jobResult") + JOBID_FIELD_NUMBER: _ClassVar[int] + JOBSTATUS_FIELD_NUMBER: _ClassVar[int] + JOBRESULT_FIELD_NUMBER: _ClassVar[int] + jobId: str + jobStatus: jobStatus_e + jobResult: jobResult_e + def __init__(self, jobId: _Optional[str] = ..., jobStatus: _Optional[_Union[jobStatus_e, str]] = ..., jobResult: _Optional[_Union[jobResult_e, str]] = ...) -> None: ... + +class rpcResponse(_message.Message): + __slots__ = ("ts", "deviceId", "jobId", "jobStatus", "jobResult", "jobStatusByJobIdResponse") + TS_FIELD_NUMBER: _ClassVar[int] + DEVICEID_FIELD_NUMBER: _ClassVar[int] + JOBID_FIELD_NUMBER: _ClassVar[int] + JOBSTATUS_FIELD_NUMBER: _ClassVar[int] + JOBRESULT_FIELD_NUMBER: _ClassVar[int] + JOBSTATUSBYJOBIDRESPONSE_FIELD_NUMBER: _ClassVar[int] + ts: int + deviceId: str + jobId: str + jobStatus: jobStatus_e + jobResult: jobResult_e + jobStatusByJobIdResponse: jobStatusByJobIdResponse_s + def __init__(self, ts: _Optional[int] = ..., deviceId: _Optional[str] = ..., jobId: _Optional[str] = ..., jobStatus: _Optional[_Union[jobStatus_e, str]] = ..., jobResult: _Optional[_Union[jobResult_e, str]] = ..., jobStatusByJobIdResponse: _Optional[_Union[jobStatusByJobIdResponse_s, _Mapping]] = ...) -> None: ... diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..6483d9ec6b5ab5eead5d3e1248da5d47f26b84b3 GIT binary patch literal 294 zcma)%NeaS15Jlfw@F*Q(B2gFKK~ErwI0Te#O|tOv>hEfB02fkFoB#O3<9^^uU`vZ< zshf~7W2&DsX2hrN=tX%>bU)cZ%~87J%tdT(R3WeEn*4(Dy!kW??2V|TmP9TwD{idC qR4;X59*Dq{a$4)7O^zU7B^~i{ssm~KFyed}! literal 0 HcmV?d00001 diff --git a/ui/__init__.py b/ui/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ui/main_window.py b/ui/main_window.py new file mode 100644 index 0000000..15f411f --- /dev/null +++ b/ui/main_window.py @@ -0,0 +1,1521 @@ +import datetime +import json +import os +import sys +import time +from functools import partial + +from PyQt6.QtCore import pyqtSignal, QThread, Qt, QPropertyAnimation, QEasingCurve, QSettings, pyqtSlot +from PyQt6.QtGui import QIcon, QFont, QPixmap, QCloseEvent +from PyQt6.QtWidgets import ( + QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QTabWidget, + QGroupBox, QFormLayout, QLineEdit, QPushButton, QLabel, QSpacerItem, + QSizePolicy, QGridLayout, QMessageBox, QComboBox, QPlainTextEdit, + QCheckBox, QFileDialog, QLayout, QFrame, QSizePolicy, QGraphicsOpacityEffect, QVBoxLayout, QTextBrowser, QScrollArea +) +from PyQt6.QtSvgWidgets import QSvgWidget +from google.protobuf.json_format import MessageToDict +from math import floor + + +# Make sure your proto import is correct for your project structure +from proto.vec_payload_chgSt_pb2 import mainPayload as periodicData, eventPayload, rpcRequest, jobType_e, eventType_e, languageType_e +from .styles import get_light_theme_styles, get_dark_theme_styles +from .widgets import ChamberWidget +from core.mqtt_client import MqttClient +from core.csv_logger import CsvLogger + +def resource_path(relative_path): + """ Get absolute path to resource, works for dev and for PyInstaller """ + try: + base_path = sys._MEIPASS + except Exception: + base_path = os.path.abspath(".") + return os.path.join(base_path, relative_path) + + +class MainWindow(QMainWindow): + log_data_signal = pyqtSignal(list) + + def __init__(self, scale_factor=1.0): + super().__init__() + # self.setWindowIcon(QIcon("logo/v_logo.png")) + self.scale_factor = scale_factor + self.setWindowTitle("Battery Swap Station Dashboard") + self.setWindowIcon(QIcon(resource_path("assets/icon.ico"))) + + self.settings = QSettings("VECMOCON", "BatterySwapDashboard") + + self.is_dark_theme = True + + self.mqtt_thread = None + self.mqtt_client = None + self.swap_sequence = [] + self.logger_thread = None + self.csv_logger = None + self.swap_button_clicks = {i: 0 for i in range(1, 10)} + + self.animation = None + self.instance_log_area = None + + self.DIAGNOSTIC_ERRORS = [ + "Lock Power Cut Failure", + "Main Power Cut Failure", + "Relayboard Can Failure", + "DB Can Failure", + "MB Can Reception Failure", + "Smoke Alarm", + "Water Alarm", + "Phase Failure", + "Earth Leakage" + ] + + self.AUDIO_LANGUAGES = {"English": 1, "Hindi": 2, "Kannada": 3, "Telugu": 4, "Tamil": 5} + + self.central_widget = QWidget() + self.setCentralWidget(self.central_widget) + self.main_layout = QVBoxLayout(self.central_widget) + self.main_layout.setContentsMargins(0, 0, 0, 0) + self.main_layout.setSpacing(0) + + self.create_status_bar() + + self.tabs = QTabWidget() + self.main_layout.addWidget(self.tabs) + + self.config_tab = QWidget() + self.main_tab = QWidget() + self.logs_tab = QWidget() + self.help_tab = QWidget() + self.about_tab = QWidget() + + self.tabs.addTab(self.config_tab, "Config") + self.tabs.addTab(self.main_tab, "Main") + self.tabs.addTab(self.logs_tab, "Logs") + self.tabs.addTab(self.help_tab, "Help") + self.tabs.addTab(self.about_tab, "About") + + self.setup_config_ui() + self.setup_main_ui() + self.setup_logs_ui() + self.setup_help_ui() + self.setup_about_ui() + + self.load_settings() + self._apply_theme() + + def setup_help_ui(self): + """ + Polished Help page: + - Card-style container with title + - Sections: Quick Start, Warnings, Troubleshooting, Shortcuts + - Colored callouts for warnings/tips + - Scrollable if content grows + """ + # Clear existing layout + def clear_layout(w: QWidget): + lay = w.layout() + if not lay: return + while lay.count(): + it = lay.takeAt(0) + if it.widget(): it.widget().deleteLater() + elif it.layout(): + while it.layout().count(): + sub = it.layout().takeAt(0) + if sub.widget(): sub.widget().deleteLater() + it.layout().deleteLater() + lay.deleteLater() + + clear_layout(self.help_tab) + + root = QVBoxLayout(self.help_tab) + root.setContentsMargins(12, 12, 12, 12) + root.setSpacing(10) + + # Scroll area so long help stays usable + scroll = QScrollArea() + scroll.setWidgetResizable(True) + scroll.setFrameShape(QFrame.Shape.NoFrame) + + host = QWidget() + scroll_lay = QVBoxLayout(host) + scroll_lay.setContentsMargins(0, 0, 0, 0) + scroll_lay.setSpacing(12) + + # Card container + card = QFrame() + card.setObjectName("helpCard") + card.setStyleSheet(""" + #helpCard { + background: #2a2a2a; + border: 1px solid #3a3a3a; + border-radius: 12px; + } + QLabel.title { + color: #eaeaea; + font-weight: 700; + font-size: 18px; + } + QLabel.subtitle { + color: #c8c8c8; + font-size: 12px; + } + QFrame.divider { + background: #3a3a3a; + min-height: 1px; max-height: 1px; border: none; + } + QLabel.h3 { + color: #e6e6e6; + font-weight: 600; + margin-top: 6px; + } + QLabel.body { + color: #dcdcdc; + } + /* Callouts */ + QFrame.warn { + background: #3b2e1b; + border: 1px solid #ffb74d; + border-radius: 8px; + } + QLabel.warnTitle { color: #ffd561; font-weight: 700; } + QLabel.warnText { color: #f0e0c0; } + QFrame.tip { + background: #1f3326; + border: 1px solid #62d39b; + border-radius: 8px; + } + QLabel.tipTitle { color: #a8f5c9; font-weight: 700; } + QLabel.tipText { color: #d6ffe9; } + QLabel.link { color: #6aa9ff; } + """) + card_lay = QVBoxLayout(card) + card_lay.setContentsMargins(18, 16, 18, 16) + card_lay.setSpacing(12) + + # Header + title = QLabel("Help & User Guide") + title.setProperty("class", "title") + subtitle = QLabel("Follow these steps to get connected, monitor the station, and troubleshoot issues.") + subtitle.setProperty("class", "subtitle") + + card_lay.addWidget(title) + card_lay.addWidget(subtitle) + + div1 = QFrame(); div1.setObjectName("divider"); div1.setFrameShape(QFrame.Shape.NoFrame); div1.setProperty("class", "divider") + card_lay.addWidget(div1) + + # Quick Start + qs_title = QLabel("Quick Start") + qs_title.setProperty("class", "h3") + qs = QLabel( + "
    " + "
  • Configure: Open Config, fill MQTT details, click Connect.
  • " + "
  • Verify: Status bar should show Connected.
  • " + "
  • Monitor: Use Main to view live slots.
  • " + "
  • Swap: Start only on a slot marked Available.
  • " + "
  • Logs: See history and export in Logs.
  • " + "
" + ) + qs.setOpenExternalLinks(True) + qs.setProperty("class", "body") + + card_lay.addWidget(qs_title) + card_lay.addWidget(qs) + + # Tips (green) + tip_box = QFrame(); tip_box.setObjectName("tip"); tip_box.setProperty("class", "tip") + tip_lay = QVBoxLayout(tip_box); tip_lay.setContentsMargins(12, 10, 12, 10) + tip_h = QLabel("💡 Tips") + tip_h.setProperty("class", "tipTitle") + tip_b = QLabel( + "
    " + "
  • Use a stable, low-latency network for best live updates.
  • " + "
  • Keep Device ID consistent with the configured topic.
  • " + "
  • Use Logs → Export before clearing or reinstalling.
  • " + "
" + ) + tip_b.setProperty("class", "tipText") + tip_b.setOpenExternalLinks(True) + tip_lay.addWidget(tip_h) + tip_lay.addWidget(tip_b) + card_lay.addWidget(tip_box) + + # Warnings (amber) + warn_box = QFrame(); warn_box.setObjectName("warn"); warn_box.setProperty("class", "warn") + warn_lay = QVBoxLayout(warn_box); warn_lay.setContentsMargins(12, 10, 12, 10) + warn_h = QLabel("⚠️ Important Warnings") + warn_h.setProperty("class", "warnTitle") + warn_b = QLabel( + "
    " + "
  • Disconnected state means no live data. Check server, network, and credentials.
  • " + "
  • Start swaps only on slots marked Available to avoid conflicts.
  • " + "
  • Commands during disconnect may be lost. Reconnect before critical actions.
  • " + "
" + ) + warn_b.setProperty("class", "warnText") + warn_lay.addWidget(warn_h) + warn_lay.addWidget(warn_b) + card_lay.addWidget(warn_box) + + # Troubleshooting + tr_title = QLabel("Troubleshooting") + tr_title.setProperty("class", "h3") + tr = QLabel( + "
    " + "
  • Cannot connect: Verify broker/port, username/password, and firewall.
  • " + "
  • No messages: Check Device ID and topic version; ensure the device is publishing.
  • " + "
  • UI not updating: See Logs for errors; restart after changing config.
  • " + "
  • Wrong station showing: Confirm the Device ID matches the station you expect.
  • " + "
" + ) + tr.setProperty("class", "body") + card_lay.addWidget(tr_title) + card_lay.addWidget(tr) + + # Footer + div2 = QFrame(); div2.setObjectName("divider"); div2.setProperty("class", "divider") + card_lay.addWidget(div2) + foot = QLabel("Need help? Email
kirubakaran@vecmocon.com") + foot.setOpenExternalLinks(True) + foot.setProperty("class", "body") + card_lay.addWidget(foot) + + scroll_lay.addWidget(card) + scroll_lay.addStretch(1) + scroll.setWidget(host) + root.addWidget(scroll) + + def setup_about_ui(self): + """ + A clean, native-Qt About page: + - Card-style container with rounded corners + - Bold title + subtitle + - Small badges for version/build + - Left/right aligned key–value grid + """ + + # Clear existing layout if re-building + def clear_layout(w: QWidget): + lay = w.layout() + if lay: + while lay.count(): + item = lay.takeAt(0) + if item.widget(): + item.widget().deleteLater() + elif item.layout(): + while item.layout().count(): + sub = item.layout().takeAt(0) + if sub.widget(): + sub.widget().deleteLater() + item.layout().deleteLater() + lay.deleteLater() + + clear_layout(self.about_tab) + + build_num = "4.0" + + # ---- Main container ---- + root = QVBoxLayout(self.about_tab) + root.setContentsMargins(16, 16, 16, 16) + root.setSpacing(12) + + card = QFrame() + card.setObjectName("aboutCard") + card.setFrameShape(QFrame.Shape.NoFrame) + card.setStyleSheet(""" + #aboutCard { + background: #2a2a2a; + border: 1px solid #3a3a3a; + border-radius: 12px; + } + QLabel#title { + color: #eaeaea; + font-weight: 700; + } + QLabel#subtitle { + color: #c7c7c7; + } + QLabel#label { + color: #b6b6b6; + font-weight: 600; + } + QLabel#value { + color: #e6e6e6; + } + QLabel.badge { + background: #343a40; + border: 1px solid #454d55; + border-radius: 999px; + padding: 2px 10px; + color: #e6e6e6; + font-size: 11px; + } + QFrame#divider { + background: #3a3a3a; + min-height: 1px; + max-height: 1px; + border: none; + } + QLabel.link { + color: #6aa9ff; + } + """) + card_lay = QVBoxLayout(card) + card_lay.setContentsMargins(18, 16, 18, 16) + card_lay.setSpacing(10) + + # ---- Header ---- + title = QLabel("About This Application") + title.setObjectName("title") + tfont = QFont() + tfont.setPointSize(16) + tfont.setBold(True) + title.setFont(tfont) + + subtitle = QLabel("Battery Swap Station Dashboard") + subtitle.setObjectName("subtitle") + + header = QVBoxLayout() + header.setSpacing(4) + header.addWidget(title) + header.addWidget(subtitle) + + # badges row + badges = QHBoxLayout() + badges.setSpacing(8) + ver = QLabel(f"Version: {build_num}") + ver.setObjectName("") + ver.setProperty("class", "badge") + ver.setAlignment(Qt.AlignmentFlag.AlignCenter) + ver.setMinimumHeight(20) + ver.setStyleSheet("") + + badges.addWidget(ver, 0, Qt.AlignmentFlag.AlignLeft) + badges.addStretch(1) + + card_lay.addLayout(header) + card_lay.addLayout(badges) + + # divider + div = QFrame() + div.setObjectName("divider") + card_lay.addWidget(div) + + # ---- Key–Value grid ---- + grid = QGridLayout() + grid.setHorizontalSpacing(24) + grid.setVerticalSpacing(10) + + def add_row(r, key, val, is_link=False): + l = QLabel(key) + l.setObjectName("label") + v = QLabel(val) + v.setObjectName("value") + if is_link: + v.setText(f'{val}') + v.setOpenExternalLinks(True) + v.setTextInteractionFlags(Qt.TextInteractionFlag.TextBrowserInteraction) + v.setObjectName("") # style via link class + v.setProperty("class", "link") + grid.addWidget(l, r, 0, Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) + grid.addWidget(v, r, 1, Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter) + + add_row(0, "Company", "VECMOCON TECHNOLOGIES") + add_row(1, "Developed by", "Kirubakaran S") + add_row(2, "Support", "kirubakaran@vecmocon.com", is_link=True) # mailto auto-handled by client + add_row(3, "Website", "https://www.vecmocon.com", is_link=True) + + card_lay.addLayout(grid) + + # footer + footer = QLabel("© 2025 VECMOCON TECHNOLOGIES. All rights reserved. • Made with ♥ for reliability & clarity.") + footer.setAlignment(Qt.AlignmentFlag.AlignLeft) + footer.setObjectName("subtitle") # subtle color + card_lay.addSpacing(6) + card_lay.addWidget(footer) + + # center the card horizontally + root.addWidget(card) + root.addStretch(1) + + + def load_settings(self): + + broker = self.settings.value("broker_address", "DEFAULT_BROKER") + port = self.settings.value("port", "DEFAULT_PORT") + username = self.settings.value("username", "DEFAULT_USERNAME") + password = self.settings.value("password", "DEFAULT_PASSWORD") + + client_id = self.settings.value("client_id", "DEFAULT_CLIENT_ID") + version = self.settings.value("version", "DEFAULT_VERSION") + device_id = self.settings.value("device_id", "DEFAULT_DEVICE_ID") + + self.broker_input.setText(broker) + self.port_input.setText(port) + self.username_input.setText(username) + self.password_input.setText(password) + + self.client_id_input.setText(client_id) + self.version_input.setText(version) + self.device_id_input.setText(device_id) + + self.settings.sync() + + # --- START: New Decoding Logic Integration --- + + def _read_varint(self, b: bytes, i: int): + """Helper to read a varint from a raw byte buffer.""" + shift = 0 + val = 0 + while True: + if i >= len(b): raise ValueError("truncated varint") + c = b[i] + i += 1 + val |= (c & 0x7F) << shift + if not (c & 0x80): break + shift += 7 + if shift > 64: raise ValueError("varint too long") + return val, i + + def _skip_field(self, b: bytes, i: int, wt: int): + """Helper to skip a field in the buffer based on its wire type.""" + if wt == 0: # VARINT + _, i = self._read_varint(b, i) + return i + if wt == 1: # 64-BIT + return i + 8 + if wt == 2: # LENGTH-DELIMITED + ln, i = self._read_varint(b, i) + return i + ln + if wt == 5: # 32-BIT + return i + 4 + raise ValueError(f"unsupported wire type to skip: {wt}") + + def _extract_field3_varint(self, b: bytes): + """Manually parses the byte string to find the integer value of field number 3.""" + i = 0 + n = len(b) + while i < n: + key, i2 = self._read_varint(b, i) + wt = key & 0x7 + fn = key >> 3 + i = i2 + if fn == 3 and wt == 0: + v, _ = self._read_varint(b, i) + return v + i = self._skip_field(b, i, wt) + return None + + def _decode_event_payload(self, payload_bytes: bytes) -> str: + """ + Decodes an event payload robustly, ensuring the correct eventType is used. + """ + # 1. Standard parsing to get a base dictionary + msg = eventPayload() + msg.ParseFromString(payload_bytes) + d = MessageToDict(msg, preserving_proto_field_name=True) + + # 2. Manually extract the true enum value from the raw bytes (Authoritative value) + wire_num = self._extract_field3_varint(payload_bytes) + wire_name = None + if wire_num is not None: + try: + # Find the string name corresponding to the integer value + wire_name = eventType_e.Name(wire_num) + except ValueError: + # If the number is valid but not in our .proto file, use the number itself + wire_name = f"UNKNOWN_ENUM_VALUE_{wire_num}" + + # 3. Always prefer the manually extracted "wire value" + if wire_name: + d["eventType"] = wire_name + + # 4. Ensure consistent structure with default values + ed = d.setdefault("eventData", {}) + ed.setdefault("nfcData", None) + ed.setdefault("batteryIdentification", "") + ed.setdefault("activityFailureReason", 0) + ed.setdefault("swapAbortReason", "ABORT_UNKNOWN") + ed.setdefault("swapTime", 0) + ed.setdefault("faultCode", 0) + ed.setdefault("doorStatus", 0) + ed.setdefault("slotId", 0) + + # 5. Reorder for clean logs and return as a formatted JSON string + ordered = { + "ts": d.get("ts"), + "deviceId": d.get("deviceId"), + "eventType": d.get("eventType"), + "sessionId": d.get("sessionId"), + "eventData": d.get("eventData"), + } + return json.dumps(ordered, indent=2, ensure_ascii=False) + + # --- END: New Decoding Logic Integration --- + + def _apply_theme(self): + if self.is_dark_theme: + self.theme_button.setText("☀️") + self.theme_button.setToolTip("Switch to Light Theme") + self.setStyleSheet(get_dark_theme_styles(self.scale_factor)) + else: + self.theme_button.setText("🌙") + self.theme_button.setToolTip("Switch to Dark Theme") + self.setStyleSheet(get_light_theme_styles(self.scale_factor)) + self.timestamp_label.setStyleSheet("color: #ecf0f1; background-color: transparent;") + self.apply_config_tab_styles() + + def _on_fade_finished(self, overlay): + """Safely delete the overlay widget after the animation is done.""" + overlay.deleteLater() + self.animation = None # Clear the animation reference + + def toggle_theme(self): + """Toggles the UI theme with a smooth cross-fade animation.""" + # Prevent starting a new animation if one is already running + if self.animation and self.animation.state() == self.animation.State.Running: + return + + # 1. Take a "screenshot" of the current UI + pixmap = self.central_widget.grab() + + # 2. Create a temporary overlay label with that screenshot + overlay = QLabel(self.central_widget) + overlay.setPixmap(pixmap) + overlay.setGeometry(self.central_widget.geometry()) + overlay.show() + overlay.raise_() + + # 3. Immediately apply the new theme underneath the overlay + self.is_dark_theme = not self.is_dark_theme + self._apply_theme() + + # 4. Set up the opacity effect and animation for the overlay + opacity_effect = QGraphicsOpacityEffect(overlay) + overlay.setGraphicsEffect(opacity_effect) + + self.animation = QPropertyAnimation(opacity_effect, b"opacity") + self.animation.setDuration(500) # Animation duration in milliseconds + self.animation.setStartValue(1.0) + self.animation.setEndValue(0.0) + self.animation.setEasingCurve(QEasingCurve.Type.InOutQuad) + + # 5. Connect the animation's finish signal to our cleanup method + # We use a lambda to pass the overlay widget to the cleanup function + self.animation.finished.connect(lambda: self._on_fade_finished(overlay)) + + # 6. Start the fade-out animation + self.animation.start(self.animation.DeletionPolicy.DeleteWhenStopped) + + def create_status_bar(self): + status_bar_widget = QWidget() + status_bar_widget.setStyleSheet(f"background-color: #2c3e50; padding: {int(6*self.scale_factor)}px;") + status_bar_layout = QHBoxLayout(status_bar_widget) + status_bar_layout.setContentsMargins(10, 0, 10, 0) + left_layout = QHBoxLayout() + logo_label = QLabel("BSS Dashboard") + logo_label.setFont(QFont("Arial", max(9, int(11 * self.scale_factor)), QFont.Weight.Bold)) + logo_label.setStyleSheet("color: #ecf0f1; background-color: transparent;") + self.timestamp_label = QLabel("Last Update: N/A") + self.timestamp_label.setFont(QFont("Arial", max(8, int(9 * self.scale_factor)))) + left_layout.addWidget(logo_label) + left_layout.addWidget(self.timestamp_label) + left_layout.addStretch() + + company_logo = QSvgWidget(resource_path("logo/vec_logo_svg.svg")) + company_logo.setStyleSheet("background: transparent;") + ds = company_logo.renderer().defaultSize() + target_h = max(24, int(36 * self.scale_factor)) + target_w = int(ds.width() * (target_h / ds.height())) if ds.height() > 0 else target_h + company_logo.setFixedSize(target_w, target_h) + + right_layout = QHBoxLayout() + right_layout.addStretch() + self.connect_button = QPushButton("Connect") + self.disconnect_button = QPushButton("Disconnect") + self.connect_button.setObjectName("ConnectButton") + self.disconnect_button.setObjectName("DisconnectButton") + self.disconnect_button.setEnabled(False) + self.theme_button = QPushButton("🌙") + btn_size = max(28, int(35 * self.scale_factor)) + self.theme_button.setFixedSize(btn_size, btn_size) + self.theme_button.setFont(QFont("Arial", max(10, int(14 * self.scale_factor)))) + self.theme_button.setStyleSheet("border: none; background-color: transparent; color: white;") + self.theme_button.clicked.connect(self.toggle_theme) + right_layout.addWidget(self.connect_button) + right_layout.addWidget(self.disconnect_button) + right_layout.addWidget(self.theme_button) + status_bar_layout.addLayout(left_layout, 1) + status_bar_layout.addWidget(company_logo, 1) + status_bar_layout.addLayout(right_layout, 1) + self.main_layout.addWidget(status_bar_widget) + self.connect_button.clicked.connect(self.connect_to_mqtt) + self.disconnect_button.clicked.connect(self.disconnect_from_mqtt) + + def apply_config_tab_styles(self): + font_size_group = max(10, int(12 * self.scale_factor)) + font_size_widgets = max(9, int(10 * self.scale_factor)) + text_color = "#f0f0f0" if self.is_dark_theme else "#000" + self.config_tab.setStyleSheet(f""" + QGroupBox {{ font-size: {font_size_group}pt; font-weight: bold; }} + QLabel, QLineEdit, QPushButton, QCheckBox {{ + font-size: {font_size_widgets}pt; + color: {text_color}; + }} + """) + + def setup_config_ui(self): + layout = QVBoxLayout(self.config_tab) + layout.setAlignment(Qt.AlignmentFlag.AlignTop) + layout.setSpacing(20) + layout.setContentsMargins(20, 20, 20, 20) + self.apply_config_tab_styles() + + mqtt_group = QGroupBox("MQTT Server Credentials") + form_layout = QFormLayout() + self.broker_input = QLineEdit("mqtt.vecmocon.com") + self.port_input = QLineEdit("1883") + self.username_input = QLineEdit("mqtt_username") + self.password_input = QLineEdit("mqtt_password") + self.password_input.setEchoMode(QLineEdit.EchoMode.Password) + form_layout.addRow("Broker Address:", self.broker_input) + form_layout.addRow("Port:", self.port_input) + form_layout.addRow("Username:", self.username_input) + form_layout.addRow("Password:", self.password_input) + mqtt_group.setLayout(form_layout) + + topic_group = QGroupBox("Topic Information") + form_layout_topic = QFormLayout() + self.client_id_input = QLineEdit("batterySmartStation") + self.version_input = QLineEdit("100") + self.device_id_input = QLineEdit("V16000862287077265957") + form_layout_topic.addRow("Client ID:", self.client_id_input) + form_layout_topic.addRow("Version:", self.version_input) + form_layout_topic.addRow("Device ID:", self.device_id_input) + + # --- NEW: Add display fields for the generated topics --- + line_separator = QFrame() + line_separator.setFrameShape(QFrame.Shape.HLine) + line_separator.setFrameShadow(QFrame.Shadow.Sunken) + form_layout_topic.addRow(line_separator) + + # form_layout_topic.addRow(QLabel("")) # Separator + form_layout_topic.addRow(QLabel("Generated Topis 📡")) + + self.periodic_topic_display = QLineEdit() + self.periodic_topic_display.setReadOnly(True) + self.periodic_topic_display.setObjectName("TopicDisplay") + + self.events_topic_display = QLineEdit() + self.events_topic_display.setReadOnly(True) + self.events_topic_display.setObjectName("TopicDisplay") + + self.rpcRequest_topic_display = QLineEdit() + self.rpcRequest_topic_display.setReadOnly(True) + self.rpcRequest_topic_display.setObjectName("TopicDisplay") + + form_layout_topic.addRow("Periodic Topic:", self.periodic_topic_display) + form_layout_topic.addRow("Events Topic:", self.events_topic_display) + form_layout_topic.addRow("RPC Request Topic:", self.rpcRequest_topic_display) + + topic_group.setLayout(form_layout_topic) + + # --- NEW: Connect input field changes to the update method --- + self.client_id_input.textChanged.connect(self._update_topic_display) + self.version_input.textChanged.connect(self._update_topic_display) + self.device_id_input.textChanged.connect(self._update_topic_display) + + logs_group = QGroupBox("Save Logs to CSV") + # ... (the rest of the method is the same) + logs_form_layout = QFormLayout() + self.save_logs_checkbox = QCheckBox("Enable Logging") + self.save_logs_checkbox.setChecked(True) + default_log_filename = f"Station_Mqtt_Dashboard_log_{datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.csv" + # self.log_filename_input = QLineEdit(default_log_filename) + log_dir_layout = QHBoxLayout() + script_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + default_log_dir = os.path.join(script_dir, "logs") + self.log_dir_input = QLineEdit(default_log_dir) + browse_btn = QPushButton("Browse") + browse_btn.clicked.connect(self.select_log_directory) + log_dir_layout.addWidget(self.log_dir_input) + log_dir_layout.addWidget(browse_btn) + logs_form_layout.addRow(self.save_logs_checkbox) + # logs_form_layout.addRow("Log Filename:", self.log_filename_input) + logs_form_layout.addRow("Output Directory:", log_dir_layout) + logs_group.setLayout(logs_form_layout) + + layout.addWidget(mqtt_group) + layout.addWidget(topic_group) + layout.addWidget(logs_group) + + # --- NEW: Call the update function once to set initial values --- + self._update_topic_display() + + def select_log_directory(self): + directory = QFileDialog.getExistingDirectory(self, "Select Log Directory") + if directory: + self.log_dir_input.setText(directory) + + def _update_topic_display(self): + """Constructs and displays the full MQTT topics based on user input.""" + client_id = self.client_id_input.text() + version = self.version_input.text() + device_id = self.device_id_input.text() + + # Construct the topic strings + periodic_topic = f"VEC/{client_id}/{version}/{device_id}/PERIODIC" + events_topic = f"VEC/{client_id}/{version}/{device_id}/EVENTS" + rpcRequest_topic = f"VEC/{client_id}/{version}/{device_id}/RPC/REQUEST" + + # Update the read-only display fields + self.periodic_topic_display.setText(periodic_topic) + self.events_topic_display.setText(events_topic) + self.rpcRequest_topic_display.setText(rpcRequest_topic) + + def setup_main_ui(self): + page_layout = QVBoxLayout(self.main_tab) + page_layout.setContentsMargins( + int(8 * self.scale_factor), int(8 * self.scale_factor), + int(8 * self.scale_factor), int(8 * self.scale_factor) + ) + + top_bar_layout = QHBoxLayout() + top_bar_layout.addWidget(QLabel("LAST RECV TS:")) + self.last_recv_ts_field = QLineEdit("No Data") + self.last_recv_ts_field.setReadOnly(True) + top_bar_layout.addWidget(self.last_recv_ts_field) + top_bar_layout.addSpacerItem(QSpacerItem(20, 20, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum)) + + top_bar_layout.addWidget(QLabel("Backup Supply:")) + self.backup_supply_indicator = QLabel("N/A") + self.backup_supply_indicator.setFixedSize(80, 25) + self.backup_supply_indicator.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.backup_supply_indicator.setStyleSheet( + "background-color: gray; color: white; border-radius: 5px; font-weight: bold;" + ) + top_bar_layout.addWidget(self.backup_supply_indicator) + + # backup_label = QLabel("Backup Supply:") + # backup_label.setFont(QFont("Arial", 10, QFont.Weight.Bold)) + # top_bar_layout.addWidget(backup_label) + + # self.backup_supply_indicator = QLabel("🔴 OFF") + # self.backup_supply_indicator.setStyleSheet("color: white; font-weight: bold;") + # self.backup_supply_indicator.setFont(QFont("Segoe UI Emoji", 8, QFont.Weight.Bold)) + # top_bar_layout.addWidget(self.backup_supply_indicator) + + refresh_btn = QPushButton("⟳ Refresh") + refresh_btn.setObjectName("RefreshButton") + refresh_btn.clicked.connect(self.reset_dashboard_ui) + top_bar_layout.addWidget(refresh_btn) + + reset_btn = QPushButton("Station Reset") + reset_btn.setObjectName("ResetButton") + reset_btn.clicked.connect(self.confirm_station_reset) + top_bar_layout.addWidget(reset_btn) + + main_content_layout = QHBoxLayout() + + self.chamber_widgets = [] + grid_widget = QWidget() + grid_layout = QGridLayout(grid_widget) + grid_layout.setSpacing(max(5, int(8 * self.scale_factor))) + for i in range(9): + chamber = ChamberWidget(f"CHAMBER - {i+1}", self.scale_factor) + chamber_num = i + 1 + chamber.open_door_requested.connect(partial(self.handle_open_door, chamber_num)) + chamber.chg_on_requested.connect(partial(self.handle_charger_control, chamber_num, True)) + chamber.chg_off_requested.connect(partial(self.handle_charger_control, chamber_num, False)) + self.chamber_widgets.append(chamber) + row, col = divmod(i, 3) + grid_layout.addWidget(chamber, row, col) + + diag_panel = QWidget() + diag_panel_layout = QVBoxLayout(diag_panel) + + alarms_group = QGroupBox("System Diagnostics") + alarms_group.setFont(QFont("Arial", max(9, int(11*self.scale_factor)), QFont.Weight.Bold)) + alarms_layout = QVBoxLayout(alarms_group) + alarms_layout.setSpacing(max(5, int(8 * self.scale_factor))) + sdc_layout = QHBoxLayout() + sdc_layout.addWidget(QLabel("SDC Value:")) + self.sdc_field = self._create_main_status_field() + sdc_layout.addWidget(self.sdc_field) + alarms_layout.addLayout(sdc_layout) + self.diag_labels = {} + for error_text in self.DIAGNOSTIC_ERRORS: + label = QLabel(error_text) + label.setProperty("alarm", "inactive") + label.setAlignment(Qt.AlignmentFlag.AlignCenter) + label.setFont(QFont("Arial", max(8, int(10 * self.scale_factor)))) + alarms_layout.addWidget(label) + self.diag_labels[error_text] = label + + swap_group = QGroupBox("Swap Process") + swap_group.setFont(QFont("Arial", max(9, int(11*self.scale_factor)), QFont.Weight.Bold)) + swap_layout = QVBoxLayout(swap_group) + swap_layout.setSpacing(max(4, int(6 * self.scale_factor))) + swap_layout.setContentsMargins( + int(8 * self.scale_factor), int(8 * self.scale_factor), + int(8 * self.scale_factor), int(8 * self.scale_factor) + ) + top_pad = QSpacerItem( + 0, + max(16, int(22 * self.scale_factor)), + QSizePolicy.Policy.Minimum, + QSizePolicy.Policy.Fixed + ) + swap_layout.addItem(top_pad) + + swap_display_layout = QHBoxLayout() + self.swap_display = QLineEdit() + self.swap_display.setReadOnly(True) + self.swap_display.setPlaceholderText("Click to build sequence...") + swap_display_layout.addWidget(self.swap_display) + swap_layout.addLayout(swap_display_layout) + + swap_grid = QGridLayout() + # swap_grid.setVerticalSpacing(max(0, int(4 * self.scale_factor))) + swap_grid.setSpacing(int(2 * self.scale_factor)) + swap_grid.setContentsMargins(0, 0, 0, 0) + swap_grid.setSizeConstraint(QLayout.SizeConstraint.SetFixedSize) + + self.swap_buttons = {} + btn_size = max(40, int(60 * self.scale_factor)) + + for i in range(1, 10): + btn = QPushButton(str(i)) + btn.setFont(QFont("Arial", max(12, int(14*self.scale_factor)))) + btn.setFixedSize(btn_size, btn_size) + btn.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) + btn.clicked.connect(self.on_swap_button_clicked) + self.swap_buttons[i] = btn + row, col = divmod(i-1, 3) + swap_grid.addWidget(btn, row, col, Qt.AlignmentFlag.AlignCenter) + + grid_container_layout = QHBoxLayout() + grid_container_layout.addStretch(1) # Add a stretchable "spring" on the left + grid_container_layout.addLayout(swap_grid) # Add the compact grid in the middle + grid_container_layout.addStretch(1) # Add a stretchable "spring" on the right + + # Add the container (with the springs) to the main vertical layout + swap_layout.addLayout(grid_container_layout) + + # swap_layout.addLayout(swap_grid, 0) + swap_layout.addStretch(1) + + button_row_layout = QHBoxLayout() + button_row_layout.setSpacing(max(4, int(6 * self.scale_factor))) + + self.start_swap_btn = QPushButton("Start Swap") + self.start_swap_btn.setObjectName("StartSwapButton") + self.start_swap_btn.clicked.connect(self.start_swap) + + self.abort_swap_btn = QPushButton("Abort Swap") + self.abort_swap_btn.setObjectName("AbortSwapButton") + self.abort_swap_btn.clicked.connect(self.abort_swap) + + for btn in (self.start_swap_btn, self.abort_swap_btn): + btn.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) + btn.setMinimumHeight(max(28, int(36 * self.scale_factor))) + + button_row_layout.addWidget(self.start_swap_btn) + button_row_layout.addWidget(self.abort_swap_btn) + + swap_layout.addLayout(button_row_layout) + + self.update_swap_buttons_state() + + log_group = QGroupBox("Instance Log") + log_group.setFont(QFont("Arial", max(9, int(11*self.scale_factor)), QFont.Weight.Bold)) + log_layout = QVBoxLayout(log_group) + + self.instance_log_area = QPlainTextEdit() + self.instance_log_area.setReadOnly(True) + self.instance_log_area.setObjectName("InstanceLog") + log_layout.addWidget(self.instance_log_area) + + audio_group = QGroupBox("Audio Command") + audio_group.setFont(QFont("Arial", max(9, int(11*self.scale_factor)), QFont.Weight.Bold)) + audio_layout = QHBoxLayout(audio_group) + self.audio_combo = QComboBox() + self.audio_combo.addItems(self.AUDIO_LANGUAGES.keys()) + send_audio_btn = QPushButton("➤") + send_audio_btn.setObjectName("SendAudioButton") + btn_size = max(28, int(35 * self.scale_factor)) + send_audio_btn.setFixedSize(btn_size, btn_size) + send_audio_btn.clicked.connect(self.send_audio_command) + audio_layout.addWidget(self.audio_combo) + audio_layout.addWidget(send_audio_btn) + + diag_panel_layout.addWidget(alarms_group, 2) + diag_panel_layout.addWidget(swap_group, 3) # Make sure you have swap_group defined + diag_panel_layout.addWidget(audio_group, 1) # Make sure you have audio_group defined + diag_panel_layout.addWidget(log_group, 4) + + main_content_layout.addWidget(grid_widget, 1) + main_content_layout.addWidget(diag_panel, 0) + page_layout.addLayout(top_bar_layout) + page_layout.addLayout(main_content_layout) + + def log_to_instance_view(self, message: str): + """Adds a formatted message to the instance log on the main tab.""" + if not self.instance_log_area: + return + + timestamp = datetime.datetime.now().strftime("%H:%M:%S") + formatted_message = f"[{timestamp}] {message}" + self.instance_log_area.appendPlainText(formatted_message) + + # Keep the log from growing forever (max 100 lines) + if self.instance_log_area.blockCount() > 100: + cursor = self.instance_log_area.textCursor() + cursor.movePosition(cursor.MoveOperation.Start) + cursor.select(cursor.SelectionType.BlockUnderCursor) + cursor.removeSelectedText() + + def setup_logs_ui(self): + layout = QHBoxLayout(self.logs_tab) + + # --- Setup the Request Logs area --- + request_group = QGroupBox("Request Logs (Dashboard -> MQTT Server)") + request_layout = QVBoxLayout(request_group) + self.request_log_area = QPlainTextEdit() + self.request_log_area.setReadOnly(True) + self.request_log_area.setObjectName("LogPanel") + request_layout.addWidget(self.request_log_area) + + # --- Setup the Event Logs area --- + event_group = QGroupBox("Event Logs (MQTT Server -> Dashboard)") + event_layout = QVBoxLayout(event_group) + self.event_log_area = QPlainTextEdit() + self.event_log_area.setReadOnly(True) + self.event_log_area.setObjectName("LogPanel") + event_layout.addWidget(self.event_log_area) + + layout.addWidget(request_group) + layout.addWidget(event_group) + + def _create_main_status_field(self): + field = QLineEdit() + field.setReadOnly(True) + return field + + def log_request(self, topic, payload_str, log_type="INFO"): + """Logs an event to the UI as a structured JSON object.""" + timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] + + # Add the new "log_type" to the entry for clarity + log_entry = { + "timestamp": timestamp, + "log_type": log_type, # <-- NEW + "topic": topic + } + + try: + log_entry["payload"] = json.loads(payload_str) + except json.JSONDecodeError: + log_entry["message"] = payload_str + + final_log_string = json.dumps(log_entry, indent=2) + self.request_log_area.appendPlainText(final_log_string) + self.request_log_area.appendPlainText("-" * 50 + "\n") + + def log_event(self, topic, json_payload): + """Logs a received event as a clean JSON object to the UI ONLY.""" + timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] + + log_entry = { + "timestamp": timestamp, + "topic": topic, + "payload": json.loads(json_payload) + } + final_log_string = json.dumps(log_entry, indent=2) + + self.event_log_area.appendPlainText(final_log_string) + self.event_log_area.appendPlainText("-" * 50 + "\n") + + # if self.save_logs_checkbox.isChecked(): + # self.log_data_signal.emit([timestamp, topic, json_payload.replace('\n', ' ')]) + + def confirm_station_reset(self): + reply = QMessageBox.question(self, 'Confirm Reset', + "Are you sure you want to reset the station?", + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, + QMessageBox.StandardButton.No) + if reply == QMessageBox.StandardButton.Yes: + print("Requesting Stationm Reset...") + request = rpcRequest( + ts=int(time.time()), + jobId=f"job_{int(time.time())}", + jobType=jobType_e.JOBTYPE_REBOOT + ) + self._send_rpc_request(request) + else: + self.log_request("INFO", "Station Reset command cancelled by user.") + + # --- THIS IS THE CRITICAL METHOD TO UPDATE --- + def on_message_received(self, topic, payload): + now = datetime.datetime.now() + self.timestamp_label.setText(f"Last Update: {now.strftime('%Y-%m-%d %H:%M:%S')}") + + try: + msg_type = topic.split('/')[-1] + + if msg_type == 'PERIODIC': + decoded_payload = periodicData() + decoded_payload.ParseFromString(payload) + data_dict = MessageToDict(decoded_payload, preserving_proto_field_name=True) + self._log_periodic_to_terminal(decoded_payload, data_dict) + self.update_main_dashboard(data_dict) + if self.save_logs_checkbox.isChecked(): + log_payload_str = json.dumps(data_dict) + self.log_data_signal.emit([now, topic, data_dict, payload]) + + elif msg_type == 'EVENTS': + # This part handles the UI log, as before + json_payload = self._decode_event_payload(payload) + self.log_event(topic, json_payload) + + # This new block handles the CSV logging correctly + if self.save_logs_checkbox.isChecked(): + event_data_dict = json.loads(json_payload) + # Emit the signal with all 4 required items + self.log_data_signal.emit([now, topic, event_data_dict, payload]) + + # This part updates the instance log, as before + try: + data = json.loads(json_payload) + event_type = data.get("eventType", "Unknown Event") + self.log_to_instance_view(f"Event Received: {event_type}") + except json.JSONDecodeError: + self.log_to_instance_view("Received unparseable event data") + + elif msg_type == 'REQUEST': + try: + # 1. Use the correct rpcRequest protobuf object for parsing + decoded_payload = rpcRequest() + decoded_payload.ParseFromString(payload) + + # 2. Convert the parsed message to a dictionary and then to a JSON string + data_dict = MessageToDict(decoded_payload, preserving_proto_field_name=True) + json_payload = json.dumps(data_dict, indent=2) + + # This new block handles the CSV logging correctly + if self.save_logs_checkbox.isChecked(): + request_data_dict = json.loads(json_payload) + # Emit the signal with all 4 required items + self.log_data_signal.emit([now, topic, request_data_dict, payload]) + + # 3. Log the INCOMING request to the correct panel + self.log_request(topic, json_payload, log_type="INCOMING_RPC") + + # 4. (Optional) Log to the instance view on the main tab + job_type = data_dict.get("jobType", "Unknown Job") + self.log_to_instance_view(f"RPC Request Received: {job_type}") + + except Exception as e: + # Handle potential decoding errors for this specific topic + print(f"Error decoding RPC Request from topic '{topic}': {e}") + error_msg = f'{{"error": "RPC DECODING FAILED: {e}", "raw_hex": "{payload.hex()}"}}' + self.log_request(topic, error_msg, log_type="DECODE_ERROR") + + else: + print(f"Received message on unhandled topic: {topic}") + + except Exception as e: + print(f"Error processing message from topic '{topic}': {e}") + # Log the failure to the UI for better debugging + self.log_event(topic, f'{{"error": "DECODING FAILED: {e}", "raw_hex": "{payload.hex()}"}}') + + # --- (The rest of your methods like `on_swap_button_clicked`, etc., remain here) --- + def on_swap_button_clicked(self): + sender = self.sender() + chamber_num = int(sender.text().split('\n')[0]) + self.swap_button_clicks[chamber_num] += 1 + click_count = self.swap_button_clicks[chamber_num] + if click_count == 1: + self.swap_sequence.append(chamber_num) + sender.setStyleSheet("background-color: #27ae60;") + elif click_count == 2: + self.swap_sequence.append(chamber_num) + sender.setText(f"{chamber_num}") + sender.setStyleSheet("background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 #27ae60, stop:0.5 #27ae60, stop:0.51 #2ecc71, stop:1 #2ecc71);") + elif click_count >= 3: + self.swap_sequence = [num for num in self.swap_sequence if num != chamber_num] + self.swap_button_clicks[chamber_num] = 0 + sender.setText(str(chamber_num)) + sender.setStyleSheet("") + self.update_swap_display() + self.update_swap_buttons_state() + + def update_swap_display(self): + self.swap_display.setText(str(self.swap_sequence) if self.swap_sequence else "") + + def update_swap_buttons_state(self): + is_sequence_present = bool(self.swap_sequence) + self.start_swap_btn.setEnabled(is_sequence_present) + + def start_swap(self): + if not self.swap_sequence: + QMessageBox.warning(self, "Empty Sequence", "Cannot start an empty swap sequence.") + return + print(f"Starting swap with sequence: {self.swap_sequence}") + request = rpcRequest( + ts=int(time.time()), + jobId=f"job_{int(time.time())}", + jobType=jobType_e.JOBTYPE_SWAP_START + ) + request.rpcData.slotsData.extend(self.swap_sequence) + self._send_rpc_request(request) + self.swap_sequence.clear() + self.update_swap_display() + + def abort_swap(self): + print("Requesting to abort swap...") + request = rpcRequest( + ts=int(time.time()), + jobId=f"job_{int(time.time())}", + jobType=jobType_e.JOBTYPE_TRANSACTION_ABORT + ) + self._send_rpc_request(request) + self.swap_sequence.clear() + self.update_swap_display() + self.swap_button_clicks = {i: 0 for i in range(1, 10)} + for i, btn in self.swap_buttons.items(): + btn.setText(str(i)) + btn.setStyleSheet("") + self.update_swap_buttons_state() + + def send_audio_command(self): + """ + Constructs and sends an RPC request to change the station's language. + """ + language_name = self.audio_combo.currentText() + language_code = self.AUDIO_LANGUAGES.get(language_name) + + if not language_code: + self.log_to_instance_view(f"Error: Could not find code for language '{language_name}'.") + return + + # Dynamically find the correct languageType enum value from the .proto file + # (e.g., "English" becomes "LANGUAGE_TYPE_ENGLISH") + enum_name = f"LANGUAGE_TYPE_{language_name.upper()}" + + try: + language_enum = languageType_e.Value(enum_name) + except ValueError: + self.log_to_instance_view(f"Error: Invalid language enum '{enum_name}' not found in .proto file.") + return + + # Create the rpcRequest object, similar to your abort_swap function + request = rpcRequest( + ts=int(time.time()), + jobId=f"lang_{int(time.time())}", + jobType=jobType_e.JOBTYPE_LANGUAGE_UPDATE, + languageType=language_enum # Add the specific language payload + ) + + # Use your existing helper method to send the request + self._send_rpc_request(request) + + # Log to the UI and show a confirmation pop-up + self.log_to_instance_view(f"Sent RPC to set language to {language_name} (Job ID: {request.jobId})") + QMessageBox.information(self, "RPC Sent", f"Request to change language to {language_name} has been sent.") + + + def _send_rpc_request(self, request_payload): + if not self.mqtt_client or not self.mqtt_client.client.is_connected(): + QMessageBox.warning(self, "Not Connected", "Cannot send command. MQTT client is not connected.") + return + device_id = self.device_id_input.text() + version = self.version_input.text() + topic = f"VEC/{self.client_id_input.text()}/{version}/{device_id}/RPC/REQUEST" + serialized_payload = request_payload.SerializeToString() + data_dict = MessageToDict(request_payload, preserving_proto_field_name=True) + json_payload = json.dumps(data_dict) + self.log_request(topic, json_payload, log_type="OUTGOING_RPC") + + job_type = data_dict.get("jobType", "Unknown Job") + self.log_to_instance_view(f"Command Sent: {job_type}") + + self.mqtt_client.publish_message(topic, serialized_payload) + + def handle_open_door(self, chamber_num): + print(f"Requesting to open door for chamber {chamber_num}...") + request = rpcRequest( + ts=int(time.time()), + jobId=f"job_{int(time.time())}", + jobType=jobType_e.JOBTYPE_GATE_OPEN_CLOSE + ) + request.slotInfo.slotId = chamber_num + request.slotInfo.state = 1 + self._send_rpc_request(request) + + def handle_charger_control(self, chamber_num, state): + action = "ON" if state else "OFF" + print(f"Requesting to turn charger {action} for chamber {chamber_num}...") + request = rpcRequest( + ts=int(time.time()), + jobId=f"job_{int(time.time())}", + jobType=jobType_e.JOBTYPE_CHARGER_ENABLE_DISABLE + ) + request.slotInfo.slotId = chamber_num + request.slotInfo.state = 1 if state else 0 + self._send_rpc_request(request) + + def reset_dashboard_ui(self): + self.log_request("INFO", "Dashboard UI cleared by user.") + self.last_recv_ts_field.setText("No Data") + self.sdc_field.setText("") + for chamber in self.chamber_widgets: + chamber.reset_to_default() + self.update_diagnostic_alarms(0) + self.swap_sequence.clear() + self.update_swap_display() + self.swap_button_clicks = {i: 0 for i in range(1, 10)} + for i, btn in self.swap_buttons.items(): + btn.setText(str(i)) + btn.setStyleSheet("") + self.update_swap_buttons_state() + + def connect_to_mqtt(self): + if self.mqtt_thread and self.mqtt_thread.isRunning(): + print("Cleaning up previous MQTT thread...") + if self.mqtt_client: + self.mqtt_client.disconnect_from_broker() + self.mqtt_client.cleanup() + self.mqtt_thread.quit() + self.mqtt_thread.wait() + if self.save_logs_checkbox.isChecked(): + self.start_csv_logger() + + broker = self.broker_input.text() + user = self.username_input.text() + password = self.password_input.text() + client_id = self.client_id_input.text() + version = self.version_input.text() + device_id = self.device_id_input.text() + + try: + port = int(self.port_input.text()) + except ValueError: + self.timestamp_label.setText("Error: Port must be a number.") + return + + # ========================================================== + # ===== ADD THIS BLOCK TO SAVE YOUR SETTINGS =============== + # ========================================================== + self.settings.setValue("broker_address", broker) + self.settings.setValue("port", str(port)) # Save port as a string + self.settings.setValue("username", user) + self.settings.setValue("password", password) + self.settings.setValue("client_id", client_id) + self.settings.setValue("version",version) + self.settings.setValue("device_id", device_id) + # Add any other settings you want to save + + self.settings.sync() # Force a write to disk immediately + print("✅ Configuration saved.") + # ========================================================== + + self.mqtt_thread = QThread() + self.mqtt_client = MqttClient(broker, port, user, password, client_id) + self.mqtt_client.moveToThread(self.mqtt_thread) + self.mqtt_client.stop_logging_signal.connect(self.csv_logger.stop_logging) + self.mqtt_client.connection_status_changed.connect(self.on_connection_status_changed) + self.mqtt_client.message_received.connect(self.on_message_received) + self.mqtt_thread.started.connect(self.mqtt_client.connect_to_broker) + self.mqtt_thread.start() + + def disconnect_from_mqtt(self): + if self.csv_logger: self.stop_csv_logger() + if self.mqtt_client: self.mqtt_client.disconnect_from_broker() + + def start_csv_logger(self): + base_log_dir = self.log_dir_input.text() + session_folder_name = f"session_{datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}" + + self.logger_thread = QThread() + # Pass BOTH the base directory and the session name to the logger + self.csv_logger = CsvLogger(base_log_dir, session_folder_name) + + self.csv_logger.moveToThread(self.logger_thread) + self.log_data_signal.connect(self.csv_logger.log_data) + self.logger_thread.started.connect(self.csv_logger.start_logging) + self.logger_thread.start() + + def stop_csv_logger(self): + if self.logger_thread and self.logger_thread.isRunning(): + self.csv_logger.stop_logging() + self.logger_thread.quit() + self.logger_thread.wait() + self.csv_logger = None + self.logger_thread = None + + def on_connection_status_changed(self, is_connected, message): + """Handles connection status updates from the MQTT client.""" + self.connect_button.setEnabled(not is_connected) + self.disconnect_button.setEnabled(is_connected) + self.set_config_inputs_enabled(not is_connected) + + # Set the text of the label to the message from the client + self.timestamp_label.setText(message) + + self.log_to_instance_view(message.strip("✅❌🔌🔴 ")) + + if is_connected: + client_id = self.client_id_input.text() + version = self.version_input.text() + device_id = self.device_id_input.text() + + periodic_topic = f"VEC/{client_id}/{version}/{device_id}/PERIODIC" + events_topic = f"VEC/{client_id}/{version}/{device_id}/EVENTS" + rpc_request_topic = f"VEC/{client_id}/{version}/{device_id}/RPC/REQUEST" + + # self.log_request(periodic_topic, "Subscribing to topic") + self.mqtt_client.subscribe_to_topic(periodic_topic) + + # self.log_request(events_topic, "Subscribing to topic") + self.mqtt_client.subscribe_to_topic(events_topic) + + # self.log_request(rpc_request_topic, "Subscribing to topic") + self.mqtt_client.subscribe_to_topic(rpc_request_topic) + + self.tabs.setCurrentWidget(self.main_tab) + + def update_main_dashboard(self, data): + # try: + # ts = datetime.datetime.fromtimestamp(data.get('ts', datetime.datetime.now().timestamp())).strftime('%Y-%m-%d %H:%M:%S') + # self.last_recv_ts_field.setText(ts) + # slot_payloads = data.get("slotLevelPayload", []) + # for i, slot_data in enumerate(slot_payloads): + # if i < len(self.chamber_widgets): + # self.chamber_widgets[i].update_data(slot_data) + # if (i+1) in self.swap_buttons: + # is_present = slot_data.get("batteryPresent") == 1 + # self.swap_buttons[i+1].setStyleSheet("background-color: #2ecc71;" if is_present else "") + # sdc_value = data.get("stationDiagnosticCode", 0) + # self.sdc_field.setText(str(sdc_value)) + + # backup_status = data.get("backupSupplyStatus", 0) # Default to 0 if not present + + # if backup_status == 1: + # self.backup_supply_indicator.setText("BackupON") + # self.backup_supply_indicator.setStyleSheet( + # "background-color: #28a745; color: white; border-radius: 5px; font-weight: bold;" # Green + # ) + # self.top_bar_frame.setStyleSheet("#topBarFrame { border: 1px solid #28a745; }") + # else: + # self.backup_supply_indicator.setText("Backup OFF") + # self.backup_supply_indicator.setStyleSheet( + # "background-color: #dc3545; color: white; border-radius: 5px; font-weight: bold;" # Red + # ) + # self.top_bar_frame.setStyleSheet("#topBarFrame { border: 1px solid #dc3545; }") + # self.update_diagnostic_alarms(sdc_value) + # except Exception as e: + # print(f"Error updating dashboard: {e}") + + try: + ts = datetime.datetime.fromtimestamp(data.get('ts', datetime.datetime.now().timestamp())).strftime('%Y-%m-%d %H:%M:%S') + self.last_recv_ts_field.setText(ts) + slot_payloads = data.get("slotLevelPayload", []) + for i, slot_data in enumerate(slot_payloads): + if i < len(self.chamber_widgets): + self.chamber_widgets[i].update_data(slot_data) + if (i+1) in self.swap_buttons: + is_present = slot_data.get("batteryPresent") == 1 + self.swap_buttons[i+1].setStyleSheet("background-color: #2ecc71;" if is_present else "") + sdc_value = data.get("stationDiagnosticCode", 0) + self.sdc_field.setText(str(sdc_value)) + self.update_diagnostic_alarms(sdc_value) + + except Exception as e: + print(f"Error updating dashboard: {e}") + + def _log_periodic_to_terminal(self, decoded_payload, data_dict): + """Formats and prints the periodic data to the terminal as a clean table.""" + try: + current_time = datetime.datetime.fromtimestamp(decoded_payload.ts).strftime('%Y-%m-%d %H:%M:%S') + device_id = data_dict.get("deviceId", "N/A") + + # --- Main Information --- + print("\n\033[1m" + "="*50 + " PERIODIC DATA " + "="*50 + "\033[0m") + print(f"\033[1m Timestamp:\033[0m {current_time} | \033[1mDevice ID:\033[0m {device_id}") + print(f"\033[1m Backup Supply:\033[0m {decoded_payload.backupSupplyStatus} | \033[1mStation SDC:\033[0m {decoded_payload.stationDiagnosticCode}") + print("-" * 120) + + # --- Table Header --- + header = "| {:^7} | {:^18} | {:^8} | {:^8} | {:^7} | {:^10} | {:^10} | {:^12} | {:^10} |" + print(header.format("Chamber", "Battery ID", "Present", "Charging", "SOC", "Voltage", "Current", "Temp (°C)", "Door")) + print("-" * 120) + + # --- Table Rows --- + row_format = "| {:^7} | {:<18} | {:^8} | {:^8} | {:>5}% | {:>8} V | {:>8} A | {:>10}°C | {:^10} |" + for i, chamber in enumerate(data_dict.get("slotLevelPayload", []), start=1): + print(row_format.format( + i, + chamber.get('batteryIdentification', 'N/A'), + "✅" if chamber.get("batteryPresent") == 1 else "❌", + "✅" if chamber.get("chargingStatus") == 1 else "❌", + chamber.get('soc', 'N/A'), + chamber.get('batVoltage', 'N/A'), + chamber.get('current', 'N/A'), + chamber.get('batteryTemp', 'N/A'), + "OPEN" if chamber.get("doorStatus") == 1 else "CLOSED" + )) + + print("=" * 120 + "\n") + + except Exception as e: + print(f"Error printing periodic log to terminal: {e}") + + def update_diagnostic_alarms(self, sdc_value): + for i, error_text in enumerate(self.DIAGNOSTIC_ERRORS): + is_alarm_active = (sdc_value >> i) & 1 + label = self.diag_labels[error_text] + if is_alarm_active: label.setProperty("alarm", "active") + else: label.setProperty("alarm", "inactive") + label.style().unpolish(label) + label.style().polish(label) + + def set_config_inputs_enabled(self, enabled): + for w in self.config_tab.findChildren(QWidget): + if isinstance(w, (QLineEdit, QPushButton, QCheckBox, QComboBox)): + w.setEnabled(enabled) + + @pyqtSlot() # This new slot handles the disconnected signal + def handle_disconnection(self): + print("Main window sees disconnection, stopping logger if active.") + if self.csv_logger and self.csv_logger.timer.isActive(): + self.csv_logger.stop_logging() + + # You might also want to update UI elements here + self.connect_button.setText("Connect") + self.connection_status_label.setText("Disconnected") + + def closeEvent(self, event: QCloseEvent): + """ + Handles the window's close event to ensure a clean shutdown. + """ + print("--- Close event triggered. Shutting down gracefully... ---") + + if self.mqtt_thread and self.mqtt_thread.isRunning(): + print(" > Stopping MQTT client...") + # Tell the client to disconnect (which will stop its loop) + if self.mqtt_client: + self.mqtt_client.disconnect_from_broker() + + print(" > Quitting and waiting for MQTT thread...") + self.mqtt_thread.quit() + if not self.mqtt_thread.wait(5000): + print(" > Warning: Thread did not terminate in time.") + self.mqtt_thread.terminate() + + # The handle_disconnection slot will have already stopped the logger + # if it was running. No need to call it again here. + + print("--- Shutdown complete. ---") + event.accept() \ No newline at end of file diff --git a/ui/styles.py b/ui/styles.py new file mode 100644 index 0000000..7265d5d --- /dev/null +++ b/ui/styles.py @@ -0,0 +1,218 @@ +# --- Dynamic Theme Stylesheets --- + +def get_light_theme_styles(scale=1.0): + + log_font_size = max(10, int(11 * scale)) + button_font_size = max(7, int(10 * scale)) + + return f""" + QMainWindow, QWidget {{ + background-color: #f0f0f0; + color: #000; + }} + #LogPanel {{ + font-family: "Courier New", Consolas, monospace; + font-size: {log_font_size}pt; + background-color: #212121; + color: #eceff1; + border: 1px solid #455a64; + }} + QGroupBox {{ + font-family: Arial; + border: 1px solid #4a4a4a; + border-radius: {int(8 * scale)}px; + margin-top: {int(6 * scale)}px; + }} + QGroupBox::title {{ + subcontrol-origin: margin; + subcontrol-position: top center; + padding: 0 {int(10 * scale)}px; + color: #000; + }} + QTabWidget::pane {{ border-top: 2px solid #c8c8c8; }} + QTabBar::tab {{ + background: #e1e1e1; border: 1px solid #c8c8c8; + padding: {int(6 * scale)}px {int(15 * scale)}px; + border-top-left-radius: {int(4 * scale)}px; border-top-right-radius: {int(4 * scale)}px; + }} + QTabBar::tab:selected {{ background: #f0f0f0; border-bottom-color: #f0f0f0; }} + QFormLayout::label {{ color: #000; padding-top: {int(3 * scale)}px; }} + QLineEdit, QPlainTextEdit, QComboBox {{ + background-color: #fff; border: 1px solid #c8c8c8; + border-radius: {int(4 * scale)}px; padding: {int(4 * scale)}px; + font-size: {max(7, int(9 * scale))}pt; + }} + QLineEdit:read-only {{ background-color: #e9e9e9; }} + QPushButton {{ + background-color: #e1e1e1; border: 1px solid #c8c8c8; + padding: {int(5 * scale)}px {int(10 * scale)}px; + border-radius: {int(4 * scale)}px; + }} + QPushButton:hover {{ background-color: #dcdcdc; }} + QPushButton:pressed {{ background-color: #c8c8c8; }} + #RefreshButton, #ResetButton {{ + padding: {int(6 * scale)}px {int(16 * scale)}px; + font-size: {button_font_size * 1.3}pt; + font-weight: bold; + border-radius: {int(4*scale)}px; + }} + #RefreshButton {{ + background-color: #2e7d32; /* A slightly darker green */ + }} + #ResetButton {{ + background-color: #c62828; /* A slightly darker red */ + }} + #ChamberOpenDoorButton, #ChamberChgOnButton, #ChamberChgOffButton {{ + padding: {int(8 * scale)}px; + font-size: {button_font_size}pt; + font-weight: bold; + border-radius: {int(4*scale)}px; + }} + + #ChamberOpenDoorButton {{ background-color: #E1E1E1; }} + #ChamberChgOnButton {{ background-color: #E1E1E1; }} + #ChamberChgOffButton {{ background-color: #E1E1E1; }} + + #ChamberOpenDoorButton:hover {{ background-color: #3498DB; }} + #ChamberChgOnButton:hover {{ background-color: #229954; }} + #ChamberChgOffButton:hover {{ background-color: #c0392b; }} + + QPushButton:disabled {{ background-color: #d3d3d3; color: #a0a0a0; }} + + #ConnectButton, #DisconnectButton {{ + padding: {int(6 * scale)}px {int(16 * scale)}px; + font-size: {button_font_size}pt; + font-weight: bold; + border-radius: {int(4 * scale)}px; + color: white; + }} + + #ConnectButton {{ background-color: #27ae60; }} /* Green */ + #DisconnectButton {{ background-color: #c0392b; }} /* Red */ + + #ConnectButton:hover {{ background-color: #52be80; }} + #DisconnectButton:hover {{ background-color: #cd6155; }} + + #ConnectButton:pressed {{ background-color: #52be80; }} + #DisconnectButton:pressed {{ background-color: #cd6155; }} + + #ConnectButton:disabled, #DisconnectButton:disabled {{ + background-color: #546e7a; + color: #90a4ae; + }} + + #RefreshButton, #StartSwapButton {{ background-color: #27ae60; color: white; border: none; }} + #RefreshButton:hover, #StartSwapButton:hover {{ background-color: #229954; }} + #ResetButton, #AbortSwapButton {{ background-color: #c0392b; color: white; border: none; }} + #ResetButton:hover, #AbortSwapButton:hover {{ background-color: #c0392b; }} + #SendAudioButton {{ background-color: #3498db; color: white; border: none; font-size: {max(10, int(14 * scale))}px; }} + #SendAudioButton:hover {{ background-color: #2980b9; }} + QLabel[status="present"] {{ background-color: #2ecc71; color: white; border-radius: {int(4*scale)}px; padding: {int(3*scale)}px; }} + QLabel[status="absent"] {{ background-color: #e74c3c; color: white; border-radius: {int(4*scale)}px; padding: {int(3*scale)}px; }} + QLabel[alarm="active"] {{ background-color: #e74c3c; color: white; font-weight: bold; border-radius: {int(4*scale)}px; padding: {int(2*scale)}px; }} + QLabel[alarm="inactive"] {{ background-color: transparent; color: black; }} + QGroupBox#ChamberWidget {{ border: 2px solid #3498db; }} + """ + +def get_dark_theme_styles(scale=1.0): + + log_font_size = max(10, int(11 * scale)) + button_font_size = max(7, int(10 * scale)) + + return f""" + QMainWindow, QWidget {{ background-color: #2b2b2b; color: #f0f0f0; }} + #LogPanel {{ + font-family: "Courier New", Consolas, monospace; + font-size: {log_font_size}pt; + background-color: #212121; + color: #eceff1; + border: 1px solid #455a64; + }} + QGroupBox {{ + font-family: Arial; border: 1px solid #4a4a4a; + border-radius: {int(8 * scale)}px; margin-top: {int(6 * scale)}px; + }} + QGroupBox::title {{ subcontrol-origin: margin; subcontrol-position: top center; padding: 0 {int(10 * scale)}px; color: #f0f0f0; }} + QTabWidget::pane {{ border-top: 2px solid #4a4a4a; }} + QTabBar::tab {{ + background: #3c3c3c; border: 1px solid #4a4a4a; color: #f0f0f0; + padding: {int(6 * scale)}px {int(15 * scale)}px; + border-top-left-radius: {int(4 * scale)}px; border-top-right-radius: {int(4 * scale)}px; + }} + QTabBar::tab:selected {{ background: #2b2b2b; border-bottom-color: #2b2b2b; }} + QFormLayout::label {{ color: #f0f0f0; padding-top: {int(3 * scale)}px; }} + QLineEdit, QPlainTextEdit, QComboBox {{ + background-color: #3c3c3c; border: 1px solid #4a4a4a; + border-radius: {int(4 * scale)}px; padding: {int(4 * scale)}px; color: #f0f0f0; + font-size: {max(7, int(9 * scale))}pt; + }} + QLineEdit:read-only {{ background-color: #333333; }} + QPushButton {{ + background-color: #555555; border: 1px solid #4a4a4a; + padding: {int(5 * scale)}px {int(10 * scale)}px; + border-radius: {int(4 * scale)}px; color: #f0f0f0; + }} + QPushButton:hover {{ background-color: #6a6a6a; }} + QPushButton:pressed {{ background-color: #4a4a4a; }} + QPushButton:disabled {{ background-color: #404040; color: #888888; }} + #RefreshButton, #ResetButton {{ + padding: {int(6 * scale)}px {int(16 * scale)}px; + font-size: {button_font_size * 1.3}pt; + font-weight: bold; + border-radius: {int(4*scale)}px; + }} + #RefreshButton {{ + background-color: #2e7d32; /* A slightly darker green */ + }} + #ResetButton {{ + background-color: #c62828; /* A slightly darker red */ + }} + #ChamberOpenDoorButton, #ChamberChgOnButton, #ChamberChgOffButton {{ + padding: {int(8 * scale)}px; + font-size: {button_font_size}pt; + font-weight: bold; + border-radius: {int(4*scale)}px; + }} + + #ChamberOpenDoorButton {{ background-color: #3C3C3C; }} + #ChamberChgOnButton {{ background-color: #3C3C3C; }} + #ChamberChgOffButton {{ background-color: #3C3C3C; }} + + #ChamberOpenDoorButton:hover {{ background-color: #607d8b; }} + #ChamberChgOnButton:hover {{ background-color: #52be80; }} + #ChamberChgOffButton:hover {{ background-color: #cd6155; }} + + #ConnectButton, #DisconnectButton {{ + padding: {int(6 * scale)}px {int(16 * scale)}px; + font-size: {button_font_size}pt; + font-weight: bold; + border-radius: {int(4*scale)}px; + color: white; + }} + + #ConnectButton {{ background-color: #27ae60; }} /* Green */ + #DisconnectButton {{ background-color: #c0392b; }} /* Red */ + + #ConnectButton:hover {{ background-color: #52be80; }} + #DisconnectButton:hover {{ background-color: #cd6155; }} + + #ConnectButton:pressed {{ background-color: #52be80; }} + #DisconnectButton:pressed {{ background-color: #cd6155; }} + + #ConnectButton:disabled, #DisconnectButton:disabled {{ + background-color: #546e7a; + color: #90a4ae; + }} + + #RefreshButton, #StartSwapButton {{ background-color: #27ae60; color: white; border: none; }} + #RefreshButton:hover, #StartSwapButton:hover {{ background-color: #52be80; }} + #ResetButton, #AbortSwapButton {{ background-color: #c0392b; color: white; border: none; }} + #ResetButton:hover, #AbortSwapButton:hover {{ background-color: #cd6155; }} + #SendAudioButton {{ background-color: #3498db; color: white; border: none; font-size: {max(10, int(14 * scale))}px; }} + #SendAudioButton:hover {{ background-color: #5dade2; }} + QLabel[status="present"] {{ background-color: #2ecc71; color: white; border-radius: {int(4*scale)}px; padding: {int(3*scale)}px; }} + QLabel[status="absent"] {{ background-color: #e74c3c; color: white; border-radius: {int(4*scale)}px; padding: {int(3*scale)}px; }} + QLabel[alarm="active"] {{ background-color: #e74c3c; color: white; font-weight: bold; border-radius: {int(4*scale)}px; padding: {int(2*scale)}px; }} + QLabel[alarm="inactive"] {{ background-color: transparent; color: #f0f0f0; }} + QGroupBox#ChamberWidget {{ border: 2px solid #3498db; }} + """ \ No newline at end of file diff --git a/ui/widgets.py b/ui/widgets.py new file mode 100644 index 0000000..0dd1236 --- /dev/null +++ b/ui/widgets.py @@ -0,0 +1,153 @@ +# --- REPLACE the entire content of ui/widgets.py with this --- + +from PyQt6.QtWidgets import ( + QGroupBox, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QFrame, QPushButton, QFormLayout +) +from PyQt6.QtCore import Qt, pyqtSignal # <-- IMPORT pyqtSignal +from PyQt6.QtGui import QFont + +class ChamberWidget(QGroupBox): + # --- ADD SIGNALS HERE --- + open_door_requested = pyqtSignal() + chg_on_requested = pyqtSignal() + chg_off_requested = pyqtSignal() + + def __init__(self, title="CHAMBER - X", scale=1.0): + super().__init__(title) + self.setObjectName("ChamberWidget") + self.setFont(QFont("Arial", max(8, int(9 * scale)), QFont.Weight.Bold)) + + main_layout = QVBoxLayout(self) + main_layout.setSpacing(max(2, int(4 * scale))) + + # This section creates the 'id_field' that was missing + id_layout = QHBoxLayout() + id_layout.addWidget(QLabel("BAT ID: ")) + self.id_field = self._create_data_field(scale) # This line ensures self.id_field exists + id_layout.addWidget(self.id_field) + main_layout.addLayout(id_layout) + + columns_layout = QHBoxLayout() + battery_form_layout = QFormLayout() + battery_form_layout.setVerticalSpacing(max(2, int(4 * scale))) + self.battery_status_label = self._create_status_label("ABSENT", scale) + self.battery_status_label.setProperty("status", "absent") + self.soc_field = self._create_data_field(scale) + self.voltage_field = self._create_data_field(scale) + self.temp_field = self._create_data_field(scale) + self.battery_fault_field = self._create_data_field(scale) + + battery_form_layout.addRow("Status:", self.battery_status_label) + battery_form_layout.addRow("SOC:", self.soc_field) + battery_form_layout.addRow("Voltage:", self.voltage_field) + battery_form_layout.addRow("Temp:", self.temp_field) + battery_form_layout.addRow("Fault:", self.battery_fault_field) + + separator_line = QFrame() + separator_line.setFrameShape(QFrame.Shape.VLine) + separator_line.setFrameShadow(QFrame.Shadow.Sunken) + + charger_form_layout = QFormLayout() + charger_form_layout.setVerticalSpacing(max(2, int(4 * scale))) + self.charger_status_label = self._create_status_label("OFF", scale) + self.charger_status_label.setProperty("status", "absent") + self.slot_temp_field = self._create_data_field(scale) + self.chg_temp_field = self._create_data_field(scale) + self.door_status_field = self._create_data_field(scale) + self.charger_fault_field = self._create_data_field(scale) + + charger_form_layout.addRow("Chg Status:", self.charger_status_label) + charger_form_layout.addRow("Chg Temp:", self.chg_temp_field) + charger_form_layout.addRow("Slot Temp:", self.slot_temp_field) + charger_form_layout.addRow("Door Status:", self.door_status_field) + charger_form_layout.addRow("Fault:", self.charger_fault_field) + + columns_layout.addLayout(battery_form_layout) + columns_layout.addWidget(separator_line) + columns_layout.addLayout(charger_form_layout) + main_layout.addLayout(columns_layout) + + main_layout.addStretch() + + button_layout = QHBoxLayout() + self.open_door_btn = QPushButton("OPEN DOOR") + self.chg_on_btn = QPushButton("CHG ON") + self.chg_off_btn = QPushButton("CHG OFF") + + self.open_door_btn.setObjectName("ChamberOpenDoorButton") + self.chg_on_btn.setObjectName("ChamberChgOnButton") + self.chg_off_btn.setObjectName("ChamberChgOffButton") + + self.open_door_btn.clicked.connect(self.open_door_requested.emit) + self.chg_on_btn.clicked.connect(self.chg_on_requested.emit) + self.chg_off_btn.clicked.connect(self.chg_off_requested.emit) + + button_layout.addWidget(self.open_door_btn) + button_layout.addWidget(self.chg_on_btn) + button_layout.addWidget(self.chg_off_btn) + main_layout.addLayout(button_layout) + + # ... (the rest of the class is unchanged) ... + def _create_status_label(self, text, scale): + label = QLabel(text) + label.setAlignment(Qt.AlignmentFlag.AlignCenter) + label.setFont(QFont("Arial", max(7, int(8 * scale)), QFont.Weight.Bold)) + return label + + def _create_data_field(self, scale): + field = QLineEdit("N/A") + field.setReadOnly(True) + field.setFont(QFont("Arial", max(7, int(8 * scale)))) + return field + + def update_data(self, data): + if data.get("batteryPresent") == 1: + self.battery_status_label.setText("PRESENT") + self.battery_status_label.setProperty("status", "present") + else: + self.battery_status_label.setText("ABSENT") + self.battery_status_label.setProperty("status", "absent") + + if data.get("chargerPresent") == 1: + self.charger_status_label.setText("CHARGER ON") + self.charger_status_label.setProperty("status", "present") + else: + self.charger_status_label.setText("CHARGER OFF") + self.charger_status_label.setProperty("status", "absent") + + for widget in [self.battery_status_label, self.charger_status_label]: + widget.style().unpolish(widget) + widget.style().polish(widget) + + self.id_field.setText(data.get("batteryIdentification", "N/A")) + self.soc_field.setText(f'{data.get("soc", 0)}%') + self.voltage_field.setText(f'{data.get("voltage", 0) / 1000.0:.2f} V') + self.temp_field.setText(f'{data.get("batteryMaxTemp", 0) / 10.0:.1f} °C') + self.battery_fault_field.setText(str(data.get("batteryFaultCode", 0))) + self.slot_temp_field.setText(f'{data.get("slotTemperature", 0) / 10.0:.1f} °C') + self.chg_temp_field.setText(f'{data.get("chargerTemp", 0) / 10.0:.1f} °C') + self.charger_fault_field.setText(str(data.get("chargerFaultCode", 0))) + door_status = "CLOSED" if data.get("doorStatus") == 1 else "OPEN" + self.door_status_field.setText(door_status) + + def reset_to_default(self): + """Resets all fields in this chamber widget to their default state.""" + self.battery_status_label.setText("ABSENT") + self.battery_status_label.setProperty("status", "absent") + self.charger_status_label.setText("CHARGER OFF") + self.charger_status_label.setProperty("status", "absent") + + # Re-apply the stylesheet for the status labels + for widget in [self.battery_status_label, self.charger_status_label]: + widget.style().unpolish(widget) + widget.style().polish(widget) + + self.id_field.setText("N/A") + self.soc_field.setText("N/A") + self.voltage_field.setText("N/A") + self.temp_field.setText("N/A") + self.battery_fault_field.setText("N/A") + self.slot_temp_field.setText("N/A") + self.chg_temp_field.setText("N/A") + self.door_status_field.setText("N/A") + self.charger_fault_field.setText("N/A") \ No newline at end of file diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..5af210c --- /dev/null +++ b/utils.py @@ -0,0 +1,13 @@ +import sys +import os + +def resource_path(relative_path): + """ Get absolute path to resource, works for dev and for PyInstaller """ + try: + # PyInstaller creates a temp folder and stores path in _MEIPASS + base_path = sys._MEIPASS + except Exception: + # If not running as a bundled exe, use the normal script path + base_path = os.path.abspath(".") + + return os.path.join(base_path, relative_path) \ No newline at end of file