From 93b71099c427c6641d8e0b3ab7ddcfe5c9d61901 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Thu, 2 Feb 2023 00:39:29 +0100 Subject: [PATCH] COM: Added routine COM_EnqueueValue. This sends a message with a sensor value. --- avr/com.asm | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/avr/com.asm b/avr/com.asm index 0ef2fd9..fa442d0 100644 --- a/avr/com.asm +++ b/avr/com.asm @@ -42,6 +42,7 @@ .equ COM_CMD_COMRECVSTATS = 3 .equ COM_CMD_I2CBUSMEMBER = 4 .equ COM_CMD_DEBUG = 5 +.equ COM_CMD_VALUE = 6 .equ COM_ERR_NOTFORME = 1 .equ COM_ERR_CHECKSUM = 2 @@ -455,6 +456,81 @@ COM_EnqueueDebug_error: +; --------------------------------------------------------------------------- +; Enqueue a VALUE packet. +; +; IN: +; - R16: destination address +; - R17: value id +; - R19:R18: value +; - R21:R20: denom (e.g. 100, meaning value must be divided by 100) +; - R22: value type +; OUT: +; - CFLAG: set if okay, clear otherwise +; MODIFIED REGS: + +COM_EnqueueValue: + push r16 + push r17 + push r21 + rcall COM_AllocBufferAndGetXY ; (r16, r17, r21) + pop r21 + pop r17 + pop r16 + brcc COM_EnqueueValue_error + clr r1 ; r1: XOR byte + ; write header (dest address, msg length) + st X+, r16 ; destination address + eor r1, r16 + ldi r16, 12 ; 12 bytes payload + st X+, r16 ; msglen + eor r1, r16 + ; write payload + ldi r16, COM_CMD_VALUE ; 0: msg type + st X+, r16 + eor r1, r16 + lds r16, comAddress ; 1: source address + st X+, r16 + eor r1, r16 + lds r16, timerModuleCounterSecs ; 2-5: current seconds counter + st X+, r16 + eor r1, r16 + lds r16, timerModuleCounterSecs+1 + st X+, r16 + eor r1, r16 + lds r16, timerModuleCounterSecs+2 + st X+, r16 + eor r1, r16 + lds r16, timerModuleCounterSecs+3 + st X+, r16 + eor r1, r16 + st X+, r17 ; 6: value id + eor r1, r17 + st X+, r22 ; 7: value type + eor r1, r22 + st X+, r18 ; 8: low value + eor r1, r18 + st X+, r19 ; 9: high value + eor r1, r19 + st X+, r20 ; 10: low denom + eor r1, r20 + st X+, r21 ; 11: high denom + eor r1, r21 + ; store XOR byte + mov r16, r1 + st X+, r16 + ; mark buffer as enqueued with PRIO "normal" (slightly limited number of retries) + ldi r20, COM_BUFFER_PRIO_NORMAL + rcall COM_EnqueuePacket ; (R15, R16) + brcc COM_EnqueueValue_error + sec + ret +COM_EnqueueValue_error: + clc + ret + + +