219 lines
5.2 KiB
NASM
219 lines
5.2 KiB
NASM
; ***************************************************************************
|
|
; copyright : (C) 2024 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. *
|
|
; ***************************************************************************
|
|
|
|
|
|
; ***************************************************************************
|
|
; defs
|
|
|
|
.equ VALMGR_DSTLINK_OFFS_PEERADDR = 0 ; 1 byte (0=unused)
|
|
.equ VALMGR_DSTLINK_OFFS_TIMERSEND = 1 ; 1 byte
|
|
.equ VALMGR_DSTLINK_OFFS_MSGID = 2 ; 2 bytes
|
|
.equ VALMGR_DSTLINK_OFFS_RESULT = 4 ; 1 byte
|
|
.equ VALMGR_DSTLINK_SIZE = 5
|
|
|
|
|
|
|
|
; ***************************************************************************
|
|
; data
|
|
|
|
.dseg
|
|
|
|
valMgrDstDataBegin:
|
|
valMgrDstLinks: .byte VALMGR_DST_MAX_LINKS*VALMGR_DSTLINK_SIZE
|
|
valMgrDstNoSendErrors: .byte 1
|
|
valMgrDstDataEnd:
|
|
|
|
|
|
|
|
; ***************************************************************************
|
|
; code
|
|
|
|
.cseg
|
|
|
|
VALMGR_DST_BEGIN:
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine VALMGR_Dst_Init
|
|
|
|
VALMGR_Dst_Init:
|
|
; preset SRAM data area
|
|
ldi xh, HIGH(valMgrDstDataBegin)
|
|
ldi xl, LOW(valMgrDstDataBegin)
|
|
clr r16
|
|
ldi r17, (valMgrDstDataEnd-valMgrDstDataBegin)
|
|
rcall Utils_FillSram
|
|
sec
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine VALMGR_Dst_Fini
|
|
|
|
VALMGR_Dst_Fini:
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine VALMGR_Dst_SendResult @global
|
|
;
|
|
; @param r16 peer address
|
|
; @param r17 result
|
|
; @param r19:r18 message id
|
|
; @clobbers any
|
|
|
|
VALMGR_Dst_SendResult:
|
|
rcall valMgrDstFindFreeLink ; (r20, r21, y)
|
|
brcs VALMGR_Dst_SendResult_gotfreelink
|
|
ret
|
|
VALMGR_Dst_SendResult_gotfreelink:
|
|
std Y+VALMGR_DSTLINK_OFFS_PEERADDR, r16
|
|
std Y+VALMGR_DSTLINK_OFFS_MSGID, r18
|
|
std Y+VALMGR_DSTLINK_OFFS_MSGID+1, r19
|
|
std Y+VALMGR_DSTLINK_OFFS_RESULT, r17
|
|
ldi r16, VALMGR_DST_TIMEOUT_SENDRESULT
|
|
std Y+VALMGR_DSTLINK_OFFS_TIMERSEND, r16
|
|
rcall valMgrDstSendResult ; (any except Y)
|
|
sec
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine VALMGR_Dst_Every100ms @global
|
|
;
|
|
; @param Y pointer to VALMGR_VAR object
|
|
; @clobbers any
|
|
|
|
VALMGR_Dst_Every100ms:
|
|
ldd r16, Y+VALMGR_DSTLINK_OFFS_PEERADDR
|
|
tst r16
|
|
brne VALMGR_Dst_Every100ms_active
|
|
ret
|
|
VALMGR_Dst_Every100ms_active:
|
|
rjmp valMgrDstCheckSendTimer
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine valMgrDstFindFreeLink
|
|
;
|
|
; @return CFLAG set if free link found, cleared otherwise
|
|
; @return Y pointer to free entry
|
|
; @clobbers r20, r21, y
|
|
|
|
valMgrDstFindFreeLink:
|
|
ldi yl, LOW(valMgrDstLinks)
|
|
ldi yh, HIGH(valMgrDstLinks)
|
|
ldi r20, VALMGR_DST_MAX_LINKS
|
|
valMgrDstFindFreeLink_loop:
|
|
ld r21, Y
|
|
tst r21
|
|
brne valMgrDstFindFreeLink_next
|
|
sec
|
|
ret
|
|
valMgrDstFindFreeLink_next:
|
|
adiw yh:yl, VALMGR_DSTLINK_SIZE
|
|
dec r20
|
|
brne valMgrDstFindFreeLink_loop
|
|
clc
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine valMgrDstSendResult
|
|
;
|
|
; Try to send a value
|
|
;
|
|
; @return CFLAG set if message sent, cleared otherwise
|
|
; @param Y pointer to VALMGR_VAR object
|
|
; @clobbers any, -Y
|
|
|
|
valMgrDstSendResult:
|
|
ldi xl, LOW(com2SendBuffer)
|
|
ldi xh, HIGH(com2SendBuffer)
|
|
ldd r16, Y+VALMGR_DSTLINK_OFFS_PEERADDR
|
|
ldd r17, Y+VALMGR_DSTLINK_OFFS_RESULT
|
|
ldd r18, Y+VALMGR_DSTLINK_OFFS_MSGID
|
|
ldd r19, Y+VALMGR_DSTLINK_OFFS_MSGID+1
|
|
rcall CPRO_WriteResult
|
|
rcall COM2_SendPacket ; (any)
|
|
brcs valMgrDstSendResult_reset
|
|
ret
|
|
valMgrDstSendResult_reset:
|
|
rcall valMgrDstResetValue
|
|
sec
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine valMgrDstResetValue
|
|
;
|
|
; Reset value data (e.g. set timers, msgid and priority to 0)
|
|
;
|
|
; @return CFLAG set if message sent, cleared otherwise
|
|
; @param Y pointer to VALMGR_VAR object
|
|
; @clobbers r16
|
|
|
|
valMgrDstResetValue:
|
|
clr r16
|
|
std Y+VALMGR_DSTLINK_OFFS_PEERADDR, r16
|
|
std Y+VALMGR_DSTLINK_OFFS_TIMERSEND, r16
|
|
std Y+VALMGR_DSTLINK_OFFS_MSGID, r16
|
|
std Y+VALMGR_DSTLINK_OFFS_MSGID+1, r16
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine valMgrDstCheckSendTimer
|
|
;
|
|
; Set MSB in value id of all matching link entries
|
|
; @param R16 valueId to activate
|
|
; @clobbers any, -Y
|
|
|
|
valMgrDstCheckSendTimer:
|
|
ldd r16, Y+VALMGR_DSTLINK_OFFS_TIMERSEND
|
|
tst r16
|
|
brne valMgrDstCheckSendTimer_dec
|
|
ret
|
|
valMgrDstCheckSendTimer_dec:
|
|
dec r16
|
|
std Y+VALMGR_DSTLINK_OFFS_TIMERSEND, r16
|
|
breq valMgrDstCheckSendTimer_timeout
|
|
rjmp valMgrDstSendResult ; (any except Y)
|
|
valMgrDstCheckSendTimer_timeout:
|
|
lds r16, valMgrDstNoSendErrors
|
|
inc r16
|
|
breq valMgrDstCheckSendTimer_dontCountUp
|
|
sts valMgrSrcNoSendErrors, r16
|
|
valMgrDstCheckSendTimer_dontCountUp:
|
|
rjmp valMgrSrcResetValue
|
|
; @end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VALMGR_DST_END:
|
|
.equ MODULE_SIZE_VALMGR_DST = VALMGR_DST_END-VALMGR_DST_BEGIN
|