diff --git a/selfdrive/pandad/pandad.py b/selfdrive/pandad/pandad.py index a0bca3f239..3c01a2ec03 100755 --- a/selfdrive/pandad/pandad.py +++ b/selfdrive/pandad/pandad.py @@ -124,15 +124,15 @@ def main() -> None: no_internal_panda_count += 1 continue + # flash and filter out Rivian longitudinal before stock logic + panda_serials = flash_rivian_long(panda_serials) + cloudlog.info(f"{len(panda_serials)} panda(s) found, connecting - {panda_serials}") # Flash the first panda panda_serial = panda_serials[0] panda = flash_panda(panda_serial) - # flash Rivian longitudinal upgrade panda - flash_rivian_long(panda) - # Ensure internal panda is present if expected if HARDWARE.has_internal_panda() and not panda.is_internal(): cloudlog.error("Internal panda is missing, trying again") diff --git a/sunnypilot/selfdrive/pandad/rivian_long_flasher.py b/sunnypilot/selfdrive/pandad/rivian_long_flasher.py index 24191a73a2..31d0489550 100755 --- a/sunnypilot/selfdrive/pandad/rivian_long_flasher.py +++ b/sunnypilot/selfdrive/pandad/rivian_long_flasher.py @@ -74,22 +74,30 @@ def _flash_panda(panda: Panda) -> None: panda.reconnect() -def flash_rivian_long(panda: Panda) -> None: +def flash_rivian_long(panda_serials: list[str]) -> list[str]: if not os.path.isfile(FW_PATH): cloudlog.error(f"Rivian longitudinal upgrade firmware not found at {FW_PATH}") - return + return panda_serials if not _is_rivian(): cloudlog.info("Not a Rivian, skipping longitudinal upgrade...") - return + return panda_serials - # only flash external black pandas (HW_TYPE_BLACK = 0x03) - if panda.get_type() == b'\x03' and not panda.is_internal(): - try: - _flash_panda(panda) - except Exception: - cloudlog.exception(f"Failed to flash F4 panda {panda.get_usb_serial()}") + remaining_pandas = [] + for serial in panda_serials: + panda = Panda(serial) + # only flash external black pandas (HW_TYPE_BLACK = 0x03) + if panda.get_type() == b'\x03' and not panda.is_internal(): + try: + _flash_panda(panda) + except Exception: + cloudlog.exception(f"Failed to flash F4 panda {serial}") + else: + remaining_pandas.append(serial) + panda.close() + + return remaining_pandas if __name__ == '__main__': - flash_rivian_long(Panda()) + flash_rivian_long(Panda.list())