; ***************************************************************************
; copyright   : (C) 2025 by Martin Preuss
; email       : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome".                              *
; * Please see toplevel file COPYING of that project for license details.   *
; ***************************************************************************


; ***************************************************************************
; code


.cseg


; ---------------------------------------------------------------------------
; @routine ioWaitForGivenMsg
; Wait for incoming msg with given command
;
; @return CFLAG set if okay (packet received), cleared on error
; @return r16 code of received msg
; @param  r16 command to wait for
; @param  r20 number of tries (low number when waiting for FLASH_START, higher when waiting for FLASH_DATA)
; @clobbers: r16, r17, r20, X (r18, r19, r22)

ioWaitForGivenMsg:
ioWaitForGivenMsg_loop:
    push r16
      push r20
        rcall ioRawWaitForValidMsg   ; (r16, r17, r18, r19, r20, r21, r22, X)
      pop r20
    pop r17                          ; pop expected code to r17!
    brcc ioWaitForGivenMsg_loopEnd
    ldi xl, LOW(flashRecvBuffer)
    ldi xh, HIGH(flashRecvBuffer)
    adiw xh:xl, NETMSG_OFFS_CMD
    ld r16, X
    sbiw xh:xl, NETMSG_OFFS_CMD
    cp r16, r17
    breq ioWaitForGivenMsg_gotIt
    cpi r16, NETMSG_CMD_FLASH_END
    breq ioWaitForGivenMsg_gotIt
ioWaitForGivenMsg_loopEnd:
    mov r16, r17                     ; move expected code back to r16
    dec r20
  brne ioWaitForGivenMsg_loop
  clc
  ret
ioWaitForGivenMsg_gotIt:
  sec
ioWaitForGivenMsg_end:
  ret
; @end


