; *************************************************************************** ; 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