Files
aqhomecontrol/avr/modules/valuemgr/dst.asm
Martin Preuss dfad168875 avr: started working on value manager
will probably not use this since this takes many bytes in flash.
2024-10-31 18:50:08 +01:00

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