Compare commits

..

1 Commits

Author SHA1 Message Date
Jason Wen 783e3dad39 phase 1 2026-03-03 12:26:11 -05:00
4 changed files with 3928 additions and 1388 deletions
+15 -21
View File
@@ -32,7 +32,8 @@ def flash_panda(panda_serial: str) -> Panda:
raise raise
# skip flashing if the detected panda is not supported # skip flashing if the detected panda is not supported
if panda.get_type() not in Panda.SUPPORTED_DEVICES: supported_panda = check_panda_support(panda)
if not supported_panda:
cloudlog.warning(f"Panda {panda_serial} is not supported (hw_type: {panda.get_type()}), skipping flash...") cloudlog.warning(f"Panda {panda_serial} is not supported (hw_type: {panda.get_type()}), skipping flash...")
return panda return panda
@@ -68,19 +69,10 @@ def flash_panda(panda_serial: str) -> Panda:
return panda return panda
def check_panda_support(panda_serials: list[str]) -> bool: def check_panda_support(panda) -> bool:
unsupported = [] hw_type = panda.get_type()
for serial in panda_serials: if hw_type in Panda.SUPPORTED_DEVICES:
panda = Panda(serial) return True
hw_type = panda.get_type()
panda.close()
if hw_type in Panda.SUPPORTED_DEVICES:
return True
unsupported.append((serial, hw_type))
for serial, hw_type in unsupported:
cloudlog.warning(f"Panda {serial} is not supported (hw_type: {hw_type}), skipping...")
return False return False
@@ -134,17 +126,13 @@ def main() -> None:
cloudlog.info(f"{len(panda_serials)} panda(s) found, connecting - {panda_serials}") cloudlog.info(f"{len(panda_serials)} panda(s) found, connecting - {panda_serials}")
# custom flasher for xnor's Rivian Longitudinal Upgrade Kit
flash_rivian_long(panda_serials)
# skip flashing and health check if no supported panda is detected
if not check_panda_support(panda_serials):
continue
# Flash the first panda # Flash the first panda
panda_serial = panda_serials[0] panda_serial = panda_serials[0]
panda = flash_panda(panda_serial) panda = flash_panda(panda_serial)
# flash Rivian longitudinal upgrade panda
flash_rivian_long(panda)
# Ensure internal panda is present if expected # Ensure internal panda is present if expected
if HARDWARE.has_internal_panda() and not panda.is_internal(): if HARDWARE.has_internal_panda() and not panda.is_internal():
cloudlog.error("Internal panda is missing, trying again") cloudlog.error("Internal panda is missing, trying again")
@@ -155,6 +143,12 @@ def main() -> None:
# log panda fw version # log panda fw version
params.put("PandaSignatures", panda.get_signature()) params.put("PandaSignatures", panda.get_signature())
# skip health check if the detected panda is not supported
supported_panda = check_panda_support(panda)
if not supported_panda:
cloudlog.warning(f"Panda {panda.get_usb_serial()} is not supported (hw_type: {panda.get_type()}), skipping health check...")
continue
# check health for lost heartbeat # check health for lost heartbeat
health = panda.health() health = panda.health()
if health["heartbeat_lost"]: if health["heartbeat_lost"]:
@@ -74,7 +74,7 @@ def _flash_panda(panda: Panda) -> None:
panda.reconnect() panda.reconnect()
def flash_rivian_long(panda_serials: list[str]) -> None: def flash_rivian_long(panda: Panda) -> None:
if not os.path.isfile(FW_PATH): if not os.path.isfile(FW_PATH):
cloudlog.error(f"Rivian longitudinal upgrade firmware not found at {FW_PATH}") cloudlog.error(f"Rivian longitudinal upgrade firmware not found at {FW_PATH}")
return return
@@ -83,19 +83,13 @@ def flash_rivian_long(panda_serials: list[str]) -> None:
cloudlog.info("Not a Rivian, skipping longitudinal upgrade...") cloudlog.info("Not a Rivian, skipping longitudinal upgrade...")
return return
for serial in panda_serials: # only flash external black pandas (HW_TYPE_BLACK = 0x03)
panda = Panda(serial) if panda.get_type() == b'\x03' and not panda.is_internal():
# only flash external black pandas (HW_TYPE_BLACK = 0x03) try:
if panda.get_type() == b'\x03' and not panda.is_internal(): _flash_panda(panda)
try: except Exception:
_flash_panda(panda) cloudlog.exception(f"Failed to flash F4 panda {panda.get_usb_serial()}")
cloudlog.info(f"Successfully flashed xnor's Rivian Longitudinal Upgrade Kit: {serial}")
except Exception:
cloudlog.exception(f"Failed to flash xnor's Rivian Longitudinal Upgrade Kit: {serial}")
panda.close()
return
if __name__ == '__main__': if __name__ == '__main__':
flash_rivian_long(Panda.list()) flash_rivian_long(Panda())
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff