Files
aqhomecontrol/avr/modules/network/msg/time-w.asm
2026-03-15 20:24:48 +01:00

123 lines
3.2 KiB
NASM

; ***************************************************************************
; copyright : (C) 2026 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. *
; ***************************************************************************
#ifndef AQH_AVR_NETMSG_TIME_W_ASM
#define AQH_AVR_NETMSG_TIME_W_ASM
; ---------------------------------------------------------------------------
; @routine netMsgTimeWrite @global
; Write a packet (including the checksum byte).
;
; @return nothing
; @param R16 destination address
; @param R23 msg code
; @param R25:R24 message id
; @param X buffer to write to
; @param Y pointer to network interface
; @param Z pointer to RTC DS3231 format of time
netMsgTimeWrite:
st X+, r16 ; dest address
ldi r16, NETMSG_TIME_SIZE-2 ; msg code+src address+12 payload bytes
st X+, r16 ; msg len
; begin of msg data
st X+, r23 ; msg code
ldd r16, Y+NET_IFACE_OFFS_ADDRESS
st X+, r16 ; src address
adiw xh:xl, 4 ; skip uid (4 bytes)
st X+, r24 ; msg id (low)
st X+, r25 ; msg id (high)
adiw zh:zl, 7 ; point to one byte behind year
; write year
ld r16, -Z ; 6
rcall fromBcd ; (r17, r18)
ldi r18, LOW(2000)
ldi r19, HIGH(2000)
clr r17
add r16, r18
adc r17, r19
st X+, r16
st X+, r17
; write month
ld r16, -Z ; 5
andi r16, 0x7f ; mask out century (ignore)
rcall fromBcd ; (r17, r18)
st X+, r16
; write day of month
ld r16, -Z ; 4
rcall fromBcd ; (r17, r18)
st X+, r16
; write day of week
ld r16, -Z ; 3
rcall fromBcd ; (r17, r18)
st X+, r16
; write hours
ld r16, -Z ; 2
andi r16, 0x3f ; mask out 12/24 bit (we use the clock in 24h mode)
rcall fromBcd ; (r17, r18)
st X+, r16
; write minutes
ld r16, -Z ; 1
rcall fromBcd ; (r17, r18)
st X+, r16
; write seconds
ld r16, -Z ; 0
rcall fromBcd ; (r17, r18)
st X+, r16
sbiw xh:xl, NETMSG_TIME_SIZE ; go back to start
adiw xh:xl, NETMSG_TIME_OFFS_UID ; go back to UID
rcall NETMSG_Common_AddUidToBuffer ; (R16, R18, R19, R20, R21)
sbiw xh:xl, (NETMSG_TIME_OFFS_UID+4) ; go back to beginning of message
; finish msg
rcall NETMSG_CalcAndAddChecksumByte ; (R16, R17, R18, R19, R20, X)
sbiw xh:xl, (NETMSG_TIME_SIZE+1) ; go back to beginning of message
ret
; @end
; ---------------------------------------------------------------------------
; @routine fromBcd
;
; Write a packet (including the checksum byte).
;
; @param r16 BCD value
; @return r16 bin value
; @clobbers r17, r18
fromBcd:
mov r17, r16
; high nibble
swap r17 ; /16
andi r17, 0x0f
mov r18, r17 ; x10
lsl r17 ; x2
lsl r17 ; x4
add r17, r18 ; x5
lsl r17 ; x10
; right digit
andi r16, 0xf
add r16, r17
ret
; @end
#endif