From cbc3eab1643f7633cda070374246219462a17eb3 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Mon, 29 Jun 2026 22:15:15 +0200 Subject: [PATCH] multiFan: handle SETVALUE messages. --- avr/devices/all/modules_include.asm | 4 ++ avr/devices/all/modules_msg.asm | 6 ++ avr/modules/multifan/main.asm | 80 +++++++++++++++++++++++++++ avr/modules/multifan/recv.asm | 86 +++++++++++++++++++++++++++++ 4 files changed, 176 insertions(+) create mode 100644 avr/modules/multifan/recv.asm diff --git a/avr/devices/all/modules_include.asm b/avr/devices/all/modules_include.asm index 1e28f9e3..6c4a7616 100644 --- a/avr/devices/all/modules_include.asm +++ b/avr/devices/all/modules_include.asm @@ -310,6 +310,10 @@ MODULE_END_COM2W: #ifdef MODULES_MULTIFAN .include "modules/multifan/main.asm" + #ifdef MODULES_NETWORK + .include "modules/multifan/recv.asm" + .include "devices/all/handlevaluemsg.asm" + #endif #endif diff --git a/avr/devices/all/modules_msg.asm b/avr/devices/all/modules_msg.asm index 79d206fb..5acafcc8 100644 --- a/avr/devices/all/modules_msg.asm +++ b/avr/devices/all/modules_msg.asm @@ -41,6 +41,12 @@ modulesOnPacketReceived: #endif #endif +#ifdef MODULES_MULTIFAN + #ifdef MODULES_NETWORK + bigcall MultiFan_OnPacketReceived + #endif +#endif + ; add more here diff --git a/avr/modules/multifan/main.asm b/avr/modules/multifan/main.asm index e8cb62cc..2544d255 100644 --- a/avr/modules/multifan/main.asm +++ b/avr/modules/multifan/main.asm @@ -151,6 +151,86 @@ MultiFan_CheckPort: +MultiFan_SetFan1Duty: + ldi yl, LOW(multiFanObjects) + ldi yh, HIGH(multiFanObjects) + std Y+MULTIFAN_FAN_OFFS_DUTYCYCLE, r16 + + rcall multiFanCalcTimerValue ; r17:r16=timer value + ; set OC register + outr TC1H, r17 + outr OCR1A, r16 + ret +; @end + + + +.if MULTIFAN_FANS > 1 +MultiFan_SetFan2Duty: + ldi yl, LOW(multiFanObjects+MULTIFAN_FAN_SIZE) + ldi yh, HIGH(multiFanObjects+MULTIFAN_FAN_SIZE) + std Y+MULTIFAN_FAN_OFFS_DUTYCYCLE, r16 + + rcall multiFanCalcTimerValue ; r17:r16=timer value + ; set OC register + outr TC1H, r17 + outr OCR1B, r16 + ret +; @end +.endif + + + +.if MULTIFAN_FANS > 2 +MultiFan_SetFan3Duty: + ldi yl, LOW(multiFanObjects+(MULTIFAN_FAN_SIZE*2)) + ldi yh, HIGH(multiFanObjects+(MULTIFAN_FAN_SIZE*2)) + std Y+MULTIFAN_FAN_OFFS_DUTYCYCLE, r16 + + rcall multiFanCalcTimerValue ; r17:r16=timer value + ; set OC register + outr TC1H, r17 + outr OCR1D, r16 + ret +; @end +.endif + + +; --------------------------------------------------------------------------- +; @routine multiFanCalcTimerValue +; +; @param r16 duty value (0-99) +; @return r17:r16 timer value +; @clobbers r16, r17, r18, r19, r20, r21, r25 + +multiFanCalcTimerValue: + ; x40 + clr r17 + mov r18, r16 + mov r19, r17 + lsl r16 ; x2 + rol r17 + lsl r16 ; x4 + rol r17 + add r16, r18 ; x5 + adc r17, r19 + lsl r16 ; x10 + rol r17 + lsl r16 ; x20 + rol r17 + lsl r16 ; x40 + rol r17 + ; /100 + mov r20, r16 + mov r21, r17 + ldi r22, 100 + clr r23 + bigjmp Utils_Divu16_16_16 ; r17:r16=result +; @end + + + + ; --------------------------------------------------------------------------- ; @routine multiFanIncCounter ; diff --git a/avr/modules/multifan/recv.asm b/avr/modules/multifan/recv.asm new file mode 100644 index 00000000..ea20e732 --- /dev/null +++ b/avr/modules/multifan/recv.asm @@ -0,0 +1,86 @@ +; *************************************************************************** +; 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_MODULES_MULTIFAN_RECV_ASM +#define AQH_AVR_MODULES_MULTIFAN_RECV_ASM + + +; --------------------------------------------------------------------------- +; @routine MultiFan_OnPacketReceived @global +; +; @clobbers any, !X + +MultiFan_OnPacketReceived: + ldi zl, LOW(multiFanMsgTable*2) + ldi zh, HIGH(multiFanMsgTable*2) + rjmp Main_HandleValueMsg +; @end + + + +multiFanSetValueFan1Duty: ; value is in R18-R21 (R16, R17, X) + mov r16, r18 + rcall MultiFan_SetFan1Duty + rjmp multiFanSetValueACK +; @end + + + +.if MULTIFAN_FANS > 1 +multiFanSetValueFan2Duty: ; value is in R18-R21 (R16, R17, X) + mov r16, r18 + rcall MultiFan_SetFan2Duty + rjmp multiFanSetValueACK +; @end +.endif + + + +.if MULTIFAN_FANS > 2 +multiFanSetValueFan3Duty: ; value is in R18-R21 (R16, R17, X) + mov r16, r18 + rcall MultiFan_SetFan3Duty + rjmp multiFanSetValueACK +; @end +.endif + + + + +multiFanSetValueACK: + ldi r23, NETMSG_CMD_VALUE_SET_ACK + sec + ret +; @end + + + +multiFanSetValueNACK: + ldi r23, NETMSG_CMD_VALUE_SET_NACK + sec + ret +; @end + + + + +multiFanMsgTable: + .db NETMSG_CMD_VALUE_SET, VALUE_ID_FAN1_DUTY, LOW(multiFanSetValueFan1Duty), HIGH(multiFanSetValueFan1Duty) +.if MULTIFAN_FANS > 1 + .db NETMSG_CMD_VALUE_SET, VALUE_ID_FAN2_DUTY, LOW(multiFanSetValueFan2Duty), HIGH(multiFanSetValueFan2Duty) +.endif +.if MULTIFAN_FANS > 2 + .db NETMSG_CMD_VALUE_SET, VALUE_ID_FAN3_DUTY, LOW(multiFanSetValueFan3Duty), HIGH(multiFanSetValueFan3Duty) +.endif + .db 0, 0, 0, 0 + + + +#endif +