Add SUPV latchup report handling, clean up code #273
@ -10,9 +10,12 @@ list yields a list of all related PRs for each release.
|
|||||||
|
|
||||||
# [unreleased]
|
# [unreleased]
|
||||||
|
|
||||||
|
# [v6.0.0] 2024-01-31
|
||||||
|
|
||||||
## Changed
|
## Changed
|
||||||
|
|
||||||
- Bumped `tmccmd` to `v8.0.0rc1` to introduce new command tree handling.
|
- Bumped `tmccmd` to `v8.0.0rc1` to introduce new command tree handling.
|
||||||
|
- Added new PLOC SUPV commands to test sets, cleaned up PLOC SUPV commanding.
|
||||||
|
|
||||||
# [v5.13.0] 2024-01-30
|
# [v5.13.0] 2024-01-30
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
"""HK Handling for EIVE OBSW"""
|
"""HK Handling for EIVE OBSW"""
|
||||||
import dataclasses
|
import dataclasses
|
||||||
import logging
|
import logging
|
||||||
|
import base64 # noqa
|
||||||
import sqlite3
|
import sqlite3
|
||||||
from typing import List, cast
|
from typing import List, cast
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
@ -73,6 +74,7 @@ def handle_hk_packet(
|
|||||||
hk_data = tm_packet.tm_data[8:]
|
hk_data = tm_packet.tm_data[8:]
|
||||||
|
|
||||||
if named_obj_id in hk_filter.object_ids:
|
if named_obj_id in hk_filter.object_ids:
|
||||||
|
# print(f"PUS TM Base64: {base64.b64encode(raw_tm)}")
|
||||||
|
|||||||
handle_regular_hk_print(
|
handle_regular_hk_print(
|
||||||
printer=printer,
|
printer=printer,
|
||||||
packet_uuid=packet_uuid,
|
packet_uuid=packet_uuid,
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
@author J. Meier
|
@author J. Meier
|
||||||
@date 10.07.2021
|
@date 10.07.2021
|
||||||
"""
|
"""
|
||||||
|
from datetime import datetime
|
||||||
import enum
|
import enum
|
||||||
import logging
|
import logging
|
||||||
import struct
|
import struct
|
||||||
@ -129,19 +130,20 @@ class OpCode:
|
|||||||
ON = "on"
|
ON = "on"
|
||||||
NORMAL = "nml"
|
NORMAL = "nml"
|
||||||
HK_TO_OBC = "hk_to_obc"
|
HK_TO_OBC = "hk_to_obc"
|
||||||
REQUEST_HK_SET_FROM_DEV = "req_hk_from_dev"
|
REQUEST_GENERIC_HK_SET = "req_generic_hk"
|
||||||
REQUEST_HK_SET = "req_hk"
|
|
||||||
START_MPSOC = "start_mpsoc"
|
START_MPSOC = "start_mpsoc"
|
||||||
SHUTDOWN_MPSOC = "stop_mpsoc"
|
SHUTDOWN_MPSOC = "stop_mpsoc"
|
||||||
SEL_NVM = "sel_nvm"
|
SEL_NVM = "sel_nvm"
|
||||||
SET_TIME_REF = "set_time_ref"
|
SET_TIME_REF = "set_time_ref"
|
||||||
FACTORY_FLASH = "factory_flash"
|
FACTORY_FLASH = "factory_flash"
|
||||||
REQ_BOOT_STATUS_REPORT = "boot_report"
|
|
||||||
START_UPDATE = "start_update"
|
START_UPDATE = "start_update"
|
||||||
PERFORM_UPDATE = "update"
|
PERFORM_UPDATE = "update"
|
||||||
FACTORY_RESET = "factory_reset"
|
FACTORY_RESET = "factory_reset"
|
||||||
MEM_CHECK = "mem_check"
|
MEM_CHECK = "mem_check"
|
||||||
RESET_MPSOC = "reset_mpsoc"
|
RESET_MPSOC = "reset_mpsoc"
|
||||||
|
SET_GPIO = "set_gpio"
|
||||||
|
READ_GPIO = "read_gpio"
|
||||||
|
READ_STATUS_REPORT = "read_status_report"
|
||||||
|
|
||||||
|
|
||||||
class Info(str, enum.Enum):
|
class Info(str, enum.Enum):
|
||||||
@ -149,19 +151,20 @@ class Info(str, enum.Enum):
|
|||||||
ON = "Switch On"
|
ON = "Switch On"
|
||||||
NORMAL = "Switch Normal"
|
NORMAL = "Switch Normal"
|
||||||
HK_TO_OBC = "Request HK from PLOC SUPV"
|
HK_TO_OBC = "Request HK from PLOC SUPV"
|
||||||
|
REQUEST_GENERIC_HK_SET = "Request prompted HK set from PLOC Handler"
|
||||||
START_MPSOC = "Start MPSoC"
|
START_MPSOC = "Start MPSoC"
|
||||||
SHUTDOWN_MPSOC = "Shutdown MPSoC"
|
SHUTDOWN_MPSOC = "Shutdown MPSoC"
|
||||||
REQUEST_HK_SET_FROM_DEV = "Request HK set from the device to the PLOC Handler"
|
|
||||||
REQUEST_HK_SET = "Request HK set from PLOC Handler"
|
|
||||||
SET_TIME_REF = "Set time reference"
|
SET_TIME_REF = "Set time reference"
|
||||||
FACTORY_FLASH = "Factory Flash Mode"
|
FACTORY_FLASH = "Factory Flash Mode"
|
||||||
PERFORM_UPDATE = "Start or continue MPSoC SW update at starting bytes"
|
PERFORM_UPDATE = "Start or continue MPSoC SW update at starting bytes"
|
||||||
START_UPDATE = "Start new MPSoC SW update"
|
START_UPDATE = "Start new MPSoC SW update"
|
||||||
FACTORY_RESET = "Factory Reset of loggers"
|
FACTORY_RESET = "Factory Reset of loggers"
|
||||||
REQ_BOOT_STATUS_REPORT = "Request boot status report and HK"
|
|
||||||
MEM_CHECK = "Memory Check"
|
MEM_CHECK = "Memory Check"
|
||||||
SEL_NVM = "Select NVM"
|
SEL_NVM = "Select NVM"
|
||||||
RESET_MPSOC = "Reset MPSoC"
|
RESET_MPSOC = "Reset MPSoC"
|
||||||
|
SET_GPIO = "Set GPIO"
|
||||||
|
READ_GPIO = "Read GPIO"
|
||||||
|
READ_STATUS_REPORT = "Read HK status report"
|
||||||
|
|
||||||
|
|
||||||
def create_ploc_supv_node() -> CmdTreeNode:
|
def create_ploc_supv_node() -> CmdTreeNode:
|
||||||
@ -198,7 +201,7 @@ def pack_ploc_supv_commands(q: DefaultPusQueueHelper, cmd_str: str): # noqa C90
|
|||||||
q.add_log_cmd(f"{prefix}: {Info.HK_TO_OBC}")
|
q.add_log_cmd(f"{prefix}: {Info.HK_TO_OBC}")
|
||||||
command = obyt + struct.pack("!I", SupvActionId.REQUEST_HK_REPORT)
|
command = obyt + struct.pack("!I", SupvActionId.REQUEST_HK_REPORT)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
elif cmd_str == OpCode.START_MPSOC:
|
if cmd_str == OpCode.START_MPSOC:
|
||||||
q.add_log_cmd("PLOC Supervisor: Start MPSoC")
|
q.add_log_cmd("PLOC Supervisor: Start MPSoC")
|
||||||
command = obyt + struct.pack("!I", SupvActionId.START_MPSOC)
|
command = obyt + struct.pack("!I", SupvActionId.START_MPSOC)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
@ -206,15 +209,11 @@ def pack_ploc_supv_commands(q: DefaultPusQueueHelper, cmd_str: str): # noqa C90
|
|||||||
q.add_log_cmd("PLOC Supervisor: Shutdown MPSoC")
|
q.add_log_cmd("PLOC Supervisor: Shutdown MPSoC")
|
||||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.SHUTWOWN_MPSOC)
|
command = object_id.as_bytes + struct.pack("!I", SupvActionId.SHUTWOWN_MPSOC)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if cmd_str == OpCode.REQUEST_HK_SET:
|
if cmd_str == OpCode.READ_STATUS_REPORT:
|
||||||
q.add_log_cmd(f"{prefix}: {Info.REQUEST_HK_SET}")
|
q.add_log_cmd(f"{prefix}: {Info.READ_STATUS_REPORT}")
|
||||||
sid = make_sid(object_id.as_bytes, prompt_set_id())
|
|
||||||
cmd = generate_one_hk_command(sid)
|
|
||||||
q.add_pus_tc(cmd)
|
|
||||||
if cmd_str == OpCode.REQUEST_HK_SET_FROM_DEV:
|
|
||||||
q.add_log_cmd(f"{prefix}: {Info.REQUEST_HK_SET_FROM_DEV}")
|
|
||||||
set_id = prompt_set_id()
|
set_id = prompt_set_id()
|
||||||
action_cmd = None
|
action_cmd = None
|
||||||
|
# First read the set from the device.
|
||||||
if set_id == SetId.HK_REPORT:
|
if set_id == SetId.HK_REPORT:
|
||||||
action_cmd = create_action_cmd(PLOC_SUPV_ID, SupvActionId.REQUEST_HK_REPORT)
|
action_cmd = create_action_cmd(PLOC_SUPV_ID, SupvActionId.REQUEST_HK_REPORT)
|
||||||
if set_id == SetId.ADC_REPORT:
|
if set_id == SetId.ADC_REPORT:
|
||||||
@ -225,8 +224,24 @@ def pack_ploc_supv_commands(q: DefaultPusQueueHelper, cmd_str: str): # noqa C90
|
|||||||
action_cmd = create_action_cmd(
|
action_cmd = create_action_cmd(
|
||||||
PLOC_SUPV_ID, SupvActionId.REQUEST_LOGGING_COUNTERS
|
PLOC_SUPV_ID, SupvActionId.REQUEST_LOGGING_COUNTERS
|
||||||
)
|
)
|
||||||
assert action_cmd is not None
|
if set_id == SetId.LATCHUP_REPORT:
|
||||||
|
action_cmd = create_action_cmd(
|
||||||
|
PLOC_SUPV_ID, SupvActionId.GET_LATCHUP_STATUS_REPORT
|
||||||
|
)
|
||||||
|
if set_id == SetId.BOOT_STATUS_REPORT:
|
||||||
|
action_cmd = create_action_cmd(
|
||||||
|
PLOC_SUPV_ID, SupvActionId.GET_BOOT_STATUS_REPORT
|
||||||
|
)
|
||||||
|
if action_cmd is None:
|
||||||
|
_LOGGER.warning(f"invalid set ID {set_id!r} for PLOC SUPV")
|
||||||
|
return
|
||||||
|
# Now dump the HK set.
|
||||||
|
sid = make_sid(object_id.as_bytes, set_id)
|
||||||
|
req_hk = generate_one_hk_command(sid)
|
||||||
q.add_pus_tc(action_cmd)
|
q.add_pus_tc(action_cmd)
|
||||||
|
q.add_wait_seconds(2.0)
|
||||||
|
q.add_pus_tc(req_hk)
|
||||||
|
assert action_cmd is not None
|
||||||
elif cmd_str == OpCode.START_MPSOC:
|
elif cmd_str == OpCode.START_MPSOC:
|
||||||
q.add_log_cmd("PLOC Supervisor: Start MPSoC")
|
q.add_log_cmd("PLOC Supervisor: Start MPSoC")
|
||||||
command = obyt + struct.pack("!I", SupvActionId.START_MPSOC)
|
command = obyt + struct.pack("!I", SupvActionId.START_MPSOC)
|
||||||
@ -286,32 +301,6 @@ def pack_ploc_supv_commands(q: DefaultPusQueueHelper, cmd_str: str): # noqa C90
|
|||||||
+ struct.pack("!I", boot_timeout)
|
+ struct.pack("!I", boot_timeout)
|
||||||
)
|
)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if cmd_str == "12":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Disable HK")
|
|
||||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.DISABLE_HK)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if cmd_str in OpCode.REQ_BOOT_STATUS_REPORT:
|
|
||||||
q.add_log_cmd(f"{prefix}: {Info.REQ_BOOT_STATUS_REPORT}")
|
|
||||||
command = object_id.as_bytes + struct.pack(
|
|
||||||
"!I", SupvActionId.GET_BOOT_STATUS_REPORT
|
|
||||||
)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
q.add_wait_seconds(2.0)
|
|
||||||
sid = make_sid(object_id.as_bytes, SetId.BOOT_STATUS_REPORT)
|
|
||||||
req_hk = generate_one_hk_command(sid)
|
|
||||||
q.add_pus_tc(req_hk)
|
|
||||||
if cmd_str == "17":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Enable latchup alert")
|
|
||||||
command = pack_lachtup_alert_cmd(object_id.as_bytes, True)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if cmd_str == "18":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Disable latchup alert")
|
|
||||||
command = pack_lachtup_alert_cmd(object_id.as_bytes, False)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if cmd_str == "20":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Set alert limit")
|
|
||||||
command = pack_set_alert_limit_cmd(object_id.as_bytes)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if cmd_str == "23":
|
if cmd_str == "23":
|
||||||
q.add_log_cmd("PLOC Supervisor: Set ADC enabled channels")
|
q.add_log_cmd("PLOC Supervisor: Set ADC enabled channels")
|
||||||
command = pack_set_adc_enabled_channels_cmd(object_id.as_bytes)
|
command = pack_set_adc_enabled_channels_cmd(object_id.as_bytes)
|
||||||
@ -324,31 +313,11 @@ def pack_ploc_supv_commands(q: DefaultPusQueueHelper, cmd_str: str): # noqa C90
|
|||||||
q.add_log_cmd("PLOC Supervisor: Set ADC threshold")
|
q.add_log_cmd("PLOC Supervisor: Set ADC threshold")
|
||||||
command = pack_set_adc_threshold_cmd(object_id.as_bytes)
|
command = pack_set_adc_threshold_cmd(object_id.as_bytes)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if cmd_str == "26":
|
if cmd_str == OpCode.SET_GPIO:
|
||||||
q.add_log_cmd("PLOC Supervisor: Request latchup status report")
|
|
||||||
command = object_id.as_bytes + struct.pack(
|
|
||||||
"!I", SupvActionId.GET_LATCHUP_STATUS_REPORT
|
|
||||||
)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if cmd_str == "27":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Copy ADC data to MRAM")
|
|
||||||
command = object_id.as_bytes + struct.pack(
|
|
||||||
"!I", SupvActionId.COPY_ADC_DATA_TO_MRAM
|
|
||||||
)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if cmd_str == "30":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Run auto EM tests")
|
|
||||||
command = pack_auto_em_tests_cmd(object_id.as_bytes)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if cmd_str == "31":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Wipe MRAM")
|
|
||||||
command = pack_mram_wipe_cmd(object_id.as_bytes)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if cmd_str == "35":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Set GPIO command")
|
q.add_log_cmd("PLOC Supervisor: Set GPIO command")
|
||||||
command = pack_set_gpio_cmd(object_id.as_bytes)
|
command = pack_set_gpio_cmd(object_id.as_bytes)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if cmd_str == "36":
|
if cmd_str == OpCode.READ_GPIO:
|
||||||
q.add_log_cmd("PLOC Supervisor: Read GPIO command")
|
q.add_log_cmd("PLOC Supervisor: Read GPIO command")
|
||||||
command = pack_read_gpio_cmd(object_id.as_bytes)
|
command = pack_read_gpio_cmd(object_id.as_bytes)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
@ -384,40 +353,6 @@ def pack_ploc_supv_commands(q: DefaultPusQueueHelper, cmd_str: str): # noqa C90
|
|||||||
q.add_log_cmd(f"{prefix}: {Info.FACTORY_FLASH}")
|
q.add_log_cmd(f"{prefix}: {Info.FACTORY_FLASH}")
|
||||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.FACTORY_FLASH)
|
command = object_id.as_bytes + struct.pack("!I", SupvActionId.FACTORY_FLASH)
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
||||||
if cmd_str == "47":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Enable auto TM")
|
|
||||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.ENABLE_AUTO_TM)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if cmd_str == "48":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Disable auto TM")
|
|
||||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.DISABLE_AUTO_TM)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if cmd_str == "51":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Logging request event buffers")
|
|
||||||
command = pack_logging_buffer_request(object_id.as_bytes)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if cmd_str == "52":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Logging clear counters")
|
|
||||||
command = object_id.as_bytes + struct.pack(
|
|
||||||
"!I", SupvActionId.LOGGING_CLEAR_COUNTERS
|
|
||||||
)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if cmd_str == "53":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Logging set topic")
|
|
||||||
command = pack_logging_set_topic(object_id.as_bytes)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if cmd_str == "54":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Logging request counters")
|
|
||||||
command = object_id.as_bytes + struct.pack(
|
|
||||||
"!I", SupvActionId.REQUEST_LOGGING_COUNTERS
|
|
||||||
)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if cmd_str == "55":
|
|
||||||
q.add_log_cmd("PLOC Supervisor: Request ADC report")
|
|
||||||
command = object_id.as_bytes + struct.pack(
|
|
||||||
"!I", SupvActionId.REQUEST_ADC_REPORT
|
|
||||||
)
|
|
||||||
q.add_pus_tc(PusTelecommand(service=8, subservice=128, app_data=command))
|
|
||||||
if cmd_str == "56":
|
if cmd_str == "56":
|
||||||
q.add_log_cmd("PLOC Supervisor: Reset PL")
|
q.add_log_cmd("PLOC Supervisor: Reset PL")
|
||||||
command = object_id.as_bytes + struct.pack("!I", SupvActionId.RESET_PL)
|
command = object_id.as_bytes + struct.pack("!I", SupvActionId.RESET_PL)
|
||||||
@ -728,6 +663,8 @@ def handle_supv_hk_data(set_id: int, hk_data: bytes, pw: PrintWrapper):
|
|||||||
handle_adc_report(hk_data)
|
handle_adc_report(hk_data)
|
||||||
elif set_id == SetId.COUNTERS_REPORT:
|
elif set_id == SetId.COUNTERS_REPORT:
|
||||||
handle_counters_report(hk_data)
|
handle_counters_report(hk_data)
|
||||||
|
elif set_id == SetId.LATCHUP_REPORT:
|
||||||
|
handle_latchup_status_report(hk_data)
|
||||||
else:
|
else:
|
||||||
pw.dlog(f"PLOC SUPV: HK handling not implemented for set ID {set_id}")
|
pw.dlog(f"PLOC SUPV: HK handling not implemented for set ID {set_id}")
|
||||||
pw.dlog(f"Raw Data: 0x[{hk_data.hex(sep=',')}]")
|
pw.dlog(f"Raw Data: 0x[{hk_data.hex(sep=',')}]")
|
||||||
@ -869,3 +806,53 @@ def handle_counters_report(hk_data: bytes):
|
|||||||
print(f"MM task lost: {mm_task_lost}")
|
print(f"MM task lost: {mm_task_lost}")
|
||||||
print(f"HK task lost: {hk_task_lost}")
|
print(f"HK task lost: {hk_task_lost}")
|
||||||
print(f"DL task lost: {dl_task_lost}")
|
print(f"DL task lost: {dl_task_lost}")
|
||||||
|
|
||||||
|
|
||||||
|
def handle_latchup_status_report(hk_data: bytes):
|
||||||
|
# 1 byte ID, 7 times 2 bytes of counts, and 8 bytes of time and 1 byte sync status.
|
||||||
|
if len(hk_data) < 24:
|
||||||
|
raise ValueError("Latchup status report smaller than expected")
|
||||||
|
current_idx = 0
|
||||||
|
id = hk_data[current_idx]
|
||||||
|
current_idx += 1
|
||||||
|
counts_of_alerts = []
|
||||||
|
for _ in range(7):
|
||||||
|
counts_of_alerts.append(
|
||||||
|
struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0]
|
||||||
|
)
|
||||||
|
current_idx += 2
|
||||||
|
print(f"ID: {id}")
|
||||||
|
print(f"Counts of alerts: {counts_of_alerts}")
|
||||||
|
time_ms = struct.unpack("!H", hk_data[current_idx : current_idx + 2])[0]
|
||||||
|
current_idx += 2
|
||||||
|
time_seconds = hk_data[current_idx]
|
||||||
|
current_idx += 1
|
||||||
|
time_minutes = hk_data[current_idx]
|
||||||
|
current_idx += 1
|
||||||
|
time_hour = hk_data[current_idx]
|
||||||
|
current_idx += 1
|
||||||
|
time_day = hk_data[current_idx]
|
||||||
|
current_idx += 1
|
||||||
|
time_month = hk_data[current_idx]
|
||||||
|
current_idx += 1
|
||||||
|
# Is stored as years since 1900.
|
||||||
|
time_year = 1900 + hk_data[current_idx]
|
||||||
|
current_idx += 1
|
||||||
|
is_synced = hk_data[current_idx]
|
||||||
|
print(f"Time Sync Status: {is_synced}")
|
||||||
|
try:
|
||||||
|
dt = datetime(
|
||||||
|
year=time_year,
|
||||||
|
month=time_month,
|
||||||
|
day=time_day,
|
||||||
|
hour=time_hour,
|
||||||
|
minute=time_minutes,
|
||||||
|
second=time_seconds,
|
||||||
|
microsecond=time_ms * 1000,
|
||||||
|
)
|
||||||
|
print(f"Time Now: {dt}")
|
||||||
|
except ValueError:
|
||||||
|
print(
|
||||||
|
f"Time: {time_day}.{time_month}.{time_year}T"
|
||||||
|
f"{time_hour}:{time_minutes}:{time_seconds}.{time_ms}"
|
||||||
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user
I am stashing this every time I pull and now you come here and tell me to just leave it in there?!?
but..but it is super useful :(
actually I needed this often enough so I decided to leave it in there.. maybe we can this more cleanly with a CLI argument though...
you won this time ...