; *************************************************************************** ; 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_GUI2_SENSORWATCH_ASM #define AQH_AVR_GUI2_SENSORWATCH_ASM ; *************************************************************************** ; SensorWatch ; ; This widget has three subwidgets: ; - Title (Label) ; - Image (ImageView) ; - Value (Label) ; ; It watches received messages and reacts on those matching the stored ; combination of NodeAddr and ValueId by colouring the image according to ; the value received and also shows the value beloe the image. ; ; Please note that this widget needs to have the option bit ; "WIDGET_OPTSLO_MSGRECV_BIT" set in order to receive MsgReceived signals. ; ; *************************************************************************** ; *************************************************************************** ; defines ; SensorWatch in flash .equ SENSORWATCH_OFFS_SENSORWATCH = WIDGET_SIZE .equ SENSORWATCH_SIZE = SENSORWATCH_OFFS_SENSORWATCH+0 ; SDRAM data for SensorWatch .equ SENSORWATCH_SD_OFFS_SENSORWATCH = WIDGET_SD_SIZE .equ SENSORWATCH_SD_OFFS_NODEADDR = SENSORWATCH_SD_OFFS_SENSORWATCH+0 .equ SENSORWATCH_SD_OFFS_VALUEID = SENSORWATCH_SD_OFFS_SENSORWATCH+1 .equ SENSORWATCH_SD_OFFS_LIMIT_WARN_LO = SENSORWATCH_SD_OFFS_SENSORWATCH+2 .equ SENSORWATCH_SD_OFFS_LIMIT_WARN_HI = SENSORWATCH_SD_OFFS_SENSORWATCH+3 .equ SENSORWATCH_SD_OFFS_LIMIT_CRIT_LO = SENSORWATCH_SD_OFFS_SENSORWATCH+4 .equ SENSORWATCH_SD_OFFS_LIMIT_CRIT_HI = SENSORWATCH_SD_OFFS_SENSORWATCH+5 .equ SENSORWATCH_SD_OFFS_VALUE_LO = SENSORWATCH_SD_OFFS_SENSORWATCH+6 .equ SENSORWATCH_SD_OFFS_VALUE_HI = SENSORWATCH_SD_OFFS_SENSORWATCH+7 .equ SENSORWATCH_SD_SIZE = SENSORWATCH_SD_OFFS_SENSORWATCH+8 ; signals .equ SENSORWATCH_SIGNAL_SETSOURCE = WIDGET_SIGNAL_NEXTFREE+0 .equ SENSORWATCH_SIGNAL_SETLIMWARN = WIDGET_SIGNAL_NEXTFREE+1 .equ SENSORWATCH_SIGNAL_SETLIMCRIT = WIDGET_SIGNAL_NEXTFREE+2 .equ SENSORWATCH_SIGNAL_NEXTFREE = WIDGET_SIGNAL_NEXTFREE+3 ; *************************************************************************** ; code .cseg ; --------------------------------------------------------------------------- ; @routine SensorWatch_OnCreate @global ; ; @param Z byte address of widget object (for LPM!) ; @param XL node addr ; @param XH value id ; @return CFLAG set if signal handled ; @clobbers any, !Z SensorWatch_OnCreate: bigcall OBJ_IsObject ; (none) brcc SensorWatch_OnCreate_ret ; preset SDRAM bigcall Widget_GetSdramPtr ; (none) clr r16 ldi r17, SENSORWATCH_SD_SIZE push yl push yh SensorWatch_OnCreate_loop: st Y+, r16 dec r17 brne SensorWatch_OnCreate_loop pop yh pop yl bigcall Widget_OnCreate SensorWatch_OnCreate_ret: sec ret ; @end ; --------------------------------------------------------------------------- ; @routine SensorWatch_OnSetSource @global ; ; @param Z byte address of widget object (for LPM!) ; @param XL node addr ; @param XH value id ; @return CFLAG set if signal handled ; @clobbers any, !Z SensorWatch_OnSetSource: bigcall OBJ_IsObject ; (none) brcc SensorWatch_OnSetSource_ret push zl push zh bigcall Widget_GetSdramPtr ; (none) std Y+SENSORWATCH_SD_OFFS_NODEADDR, xl std Y+SENSORWATCH_SD_OFFS_VALUEID, xh pop zh pop zl SensorWatch_OnSetSource_ret: sec ret ; @end ; --------------------------------------------------------------------------- ; @routine SensorWatch_OnSetLimitWarn @global ; ; @param Z byte address of widget object (for LPM!) ; @param X value ; @return CFLAG set if signal handled ; @clobbers any, !Z SensorWatch_OnSetLimitWarn: bigcall OBJ_IsObject ; (none) brcc SensorWatch_OnSetLimitWarn_ret bigcall Widget_GetSdramPtr ; (none) std Y+SENSORWATCH_SD_OFFS_LIMIT_WARN_LO, xl std Y+SENSORWATCH_SD_OFFS_LIMIT_WARN_HI, xh rcall sensorWatchSetColor SensorWatch_OnSetLimitWarn_ret: sec ret ; @end ; --------------------------------------------------------------------------- ; @routine SensorWatch_OnSetLimitCrit @global ; ; @param Z byte address of widget object (for LPM!) ; @param X value ; @return CFLAG set if signal handled ; @clobbers any, !Z SensorWatch_OnSetLimitCrit: bigcall OBJ_IsObject ; (none) brcc SensorWatch_OnSetLimitCrit_ret rcall Widget_GetSdramPtr ; (none) std Y+SENSORWATCH_SD_OFFS_LIMIT_CRIT_LO, xl std Y+SENSORWATCH_SD_OFFS_LIMIT_CRIT_HI, xh rcall sensorWatchSetColor SensorWatch_OnSetLimitCrit_ret: sec ret ; @end ; --------------------------------------------------------------------------- ; @routine SensorWatch_OnMsgReceived @global ; ; @param Z byte address of widget object (for LPM!) ; @param XL node addr ; @param XH value id ; @return CFLAG set if signal handled ; @clobbers any, !Z SensorWatch_OnMsgReceived: adiw xh:xl, 2 ; command ld r16, X sbiw xh:xl, 2 cpi r16, NETMSG_CMD_VALUE_REPORT breq SensorWatch_OnMsgReceived_report rjmp SensorWatch_OnMsgReceived_ret SensorWatch_OnMsgReceived_report: bigcall Widget_GetSdramPtr ; (none) bigcall NETMSG_ValueRead ; R17=valueId, R22=nodeAddr R19:R18=value (none) ; check node addr ldd r16, Y+SENSORWATCH_SD_OFFS_NODEADDR cp r16, r22 brne SensorWatch_OnMsgReceived_ret ; check value id ldd r16, Y+SENSORWATCH_SD_OFFS_VALUEID cp r16, r17 brne SensorWatch_OnMsgReceived_ret ; store value std Y+SENSORWATCH_SD_OFFS_VALUE_LO, r18 std Y+SENSORWATCH_SD_OFFS_VALUE_HI, r19 ; setup background color rcall sensorWatchSetColor ; (any, !Y, !Z) rcall sensorWatchSetValueLabel ; (any, !Y, !Z) SensorWatch_OnMsgReceived_ret: sec ret ; @end ; --------------------------------------------------------------------------- ; @routine SensorWatch_GetImageView @global ; ; @param Z byte address of widget object (for LPM!) ; @return CFLAG set if widget found, cleared otherwise ; @return R19:R18 byte address pointer to image view (for LPM!) ; @clobbers none SensorWatch_GetImageView: bigcall OBJ_IsObject ; (none) brcc SensorWatch_GetImageView_ret push zl push zh bigcall OBJ_GetFirstChild ; (none) brcc SensorWatch_GetImageView_done mov zl, r18 mov zh, r19 bigcall OBJ_GetNext ; 2nd child SensorWatch_GetImageView_done: pop zh pop zl SensorWatch_GetImageView_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine SensorWatch_GetValueLabel @global ; ; @param Z byte address of widget object (for LPM!) ; @return CFLAG set if widget found, cleared otherwise ; @return R19:R18 byte address pointer to image view (for LPM!) ; @clobbers none SensorWatch_GetValueLabel: bigcall OBJ_IsObject ; (none) brcc SensorWatch_GetValueLabel_ret push zl push zh bigcall OBJ_GetFirstChild ; (none) brcc SensorWatch_GetValueLabel_done mov zl, r18 mov zh, r19 bigcall OBJ_GetNext ; 2nd child brcc SensorWatch_GetValueLabel_done mov zl, r18 mov zh, r19 bigcall OBJ_GetNext ; 3nd child SensorWatch_GetValueLabel_done: pop zh pop zl SensorWatch_GetValueLabel_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine sensorWatchSetColor ; ; @param Z byte address of widget object (for LPM!) ; @param Y pointer to SDRAM data ; @clobbers any, !Y, !Z sensorWatchSetColor: ; default color is green ldi xl, LOW(DISPLAY_COLOR_DARKGREEN) ldi xh, HIGH(DISPLAY_COLOR_DARKGREEN) ldd r20, Y+SENSORWATCH_SD_OFFS_VALUE_LO ldd r21, Y+SENSORWATCH_SD_OFFS_VALUE_HI mov r16, r20 or r16, r21 breq sensorWatchSetColor_ret ; do nothing ; check against critical limit ldd r22, Y+SENSORWATCH_SD_OFFS_LIMIT_CRIT_LO ldd r23, Y+SENSORWATCH_SD_OFFS_LIMIT_CRIT_HI mov r16, r22 or r16, r23 breq sensorWatchSetColor_checkWarn cp r20, r22 cpc r21, r23 brcc sensorWatchSetColor_setRed sensorWatchSetColor_checkWarn: ; check against warning limit ldd r22, Y+SENSORWATCH_SD_OFFS_LIMIT_WARN_LO ldd r23, Y+SENSORWATCH_SD_OFFS_LIMIT_WARN_HI mov r16, r22 or r16, r23 breq sensorWatchSetColor_ret ; do nothing cp r20, r22 cpc r21, r23 brcc sensorWatchSetColor_setYellow ; set green background rjmp sensorWatchSetColor_setColor sensorWatchSetColor_setRed: ldi xl, LOW(DISPLAY_COLOR_RED) ldi xh, HIGH(DISPLAY_COLOR_RED) rjmp sensorWatchSetColor_setColor sensorWatchSetColor_setYellow: ldi xl, LOW(DISPLAY_COLOR_YELLOW) ldi xh, HIGH(DISPLAY_COLOR_YELLOW) sensorWatchSetColor_setColor: rcall SensorWatch_GetImageView ; (none) brcc sensorWatchSetColor_ret push zl push zh mov zl, r18 mov zh, r19 ldi r16, IMGVIEW_SIGNAL_SETBGCOL clr r17 bigcall OBJ_HandleSignal ; (any, !X, !Y, !Z) pop zh pop zl sensorWatchSetColor_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine sensorWatchSetValueLabel ; ; @param Z byte address of widget object (for LPM!) ; @param Y pointer to SDRAM data ; @clobbers any, !Y, !Z sensorWatchSetValueLabel: rcall SensorWatch_GetValueLabel ; (none) brcc sensorWatchSetValueLabel_ret push zl push zh mov zl, r18 mov zh, r19 ldd xl, Y+SENSORWATCH_SD_OFFS_VALUE_LO ldd xh, Y+SENSORWATCH_SD_OFFS_VALUE_HI ldi r16, VLABEL_SIGNAL_SETVALUE clr r17 bigcall OBJ_HandleSignal ; (any, !X, !Y, !Z) pop zh pop zl sensorWatchSetValueLabel_ret: ret ; @end #endif