53 lines
2.1 KiB
Python
53 lines
2.1 KiB
Python
# tool/core/cmd/fw_status.py
|
|
import struct
|
|
from core.utils import console, console_err
|
|
from core.protocol import COMMANDS, ERRORS
|
|
|
|
class fw_status:
|
|
def __init__(self, bus):
|
|
self.bus = bus
|
|
|
|
|
|
def get(self):
|
|
import struct
|
|
self.bus.send_request(COMMANDS['get_firmware_status'])
|
|
|
|
data = self.bus.receive_response(length=10)
|
|
if not data or data.get('type') == 'error':
|
|
return None
|
|
|
|
header = data['data']
|
|
status = header[0]
|
|
app_version_raw = struct.unpack('<I', header[1:5])[0]
|
|
ker_version_raw = struct.unpack('<I', header[5:9])[0]
|
|
str_len = header[9]
|
|
|
|
fw_string_bytes = self.bus.connection.read(str_len)
|
|
fw_string = fw_string_bytes.decode('utf-8')
|
|
|
|
result = {
|
|
'status': status,
|
|
'fw_version_raw': hex(app_version_raw),
|
|
'kernel_version_raw': hex(ker_version_raw),
|
|
'fw_major': (app_version_raw >> 24) & 0xFF,
|
|
'fw_minor': (app_version_raw >> 16) & 0xFF,
|
|
'fw_patch': (app_version_raw >> 8)& 0xFF,
|
|
'kernel_major': (ker_version_raw >> 16) & 0xFF,
|
|
'kernel_minor': (ker_version_raw >> 8) & 0xFF,
|
|
'kernel_patch': ker_version_raw & 0xFF,
|
|
'fw_string': fw_string,
|
|
'kernel_string': f"{(ker_version_raw >> 16) & 0xFF}.{(ker_version_raw >> 8) & 0xFF}.{ker_version_raw & 0xFF}"
|
|
}
|
|
return result
|
|
|
|
def print(self, result):
|
|
if not result:
|
|
return
|
|
|
|
status = "UNKNOWN"
|
|
if result['status'] == 0x00: status = "CONFIRMED"
|
|
elif result['status'] == 0x01: status = "PENDING"
|
|
elif result['status'] == 0x02: status = "TESTING"
|
|
console.print(f"[info]Firmware Status[/info] des Controllers ist [info]{status}[/info]:")
|
|
console.print(f" • Firmware: [info]{result['fw_string']}[/info] ({result['fw_major']}.{result['fw_minor']}.{result['fw_patch']})")
|
|
console.print(f" • Kernel: [info]{result['kernel_string']}[/info] ({result['kernel_major']}.{result['kernel_minor']}.{result['kernel_patch']})") |