From 8b25922b88d2409cd9b2a5cb273a89539b5a558f Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Thu, 30 Apr 2026 00:10:07 +0200 Subject: [PATCH] gui: more work on spinner. --- avr/modules/lcd2/gui/base/hspinner.asm | 321 +++++++++++++++++++++++-- 1 file changed, 297 insertions(+), 24 deletions(-) diff --git a/avr/modules/lcd2/gui/base/hspinner.asm b/avr/modules/lcd2/gui/base/hspinner.asm index 52e3f8a..c9e4b9f 100644 --- a/avr/modules/lcd2/gui/base/hspinner.asm +++ b/avr/modules/lcd2/gui/base/hspinner.asm @@ -27,23 +27,27 @@ .equ HSPINNER_OFFS_MINVALUE_HI = HSPINNER_OFFS_BEGIN+3 .equ HSPINNER_OFFS_MAXVALUE_LO = HSPINNER_OFFS_BEGIN+4 .equ HSPINNER_OFFS_MAXVALUE_HI = HSPINNER_OFFS_BEGIN+5 -.equ HSPINNER_OFFS_DIGITS = HSPINNER_OFFS_BEGIN+6 -.equ HSPINNER_OFFS_FLAGS = HSPINNER_OFFS_BEGIN+7 -.equ HSPINNER_SIZE = HSPINNER_OFFS_BEGIN+8 +.equ HSPINNER_OFFS_FLAGS = HSPINNER_OFFS_BEGIN+6 +.equ HSPINNER_SIZE = HSPINNER_OFFS_BEGIN+7 -; signals -.equ HSPINNER_SIGNAL_LEFT = WIDGET_SIGNAL_NEXTFREE+0 -.equ HSPINNER_SIGNAL_RIGHT = WIDGET_SIGNAL_NEXTFREE+1 -.equ HSPINNER_SIGNAL_NEXTFREE = WIDGET_SIGNAL_NEXTFREE+2 +; selectors +.equ HSPINNER_SEL_LEFT = 1 +.equ HSPINNER_SEL_RIGHT = 2 ; values -.equ HSPINNER_VALUE_MINVALUE = WIDGET_VALUE_NEXTFREE+0 -.equ HSPINNER_VALUE_MAXVALUE = WIDGET_VALUE_NEXTFREE+1 -.equ HSPINNER_VALUE_NEXTFREE = WIDGET_VALUE_NEXTFREE+2 +.equ HSPINNER_VALUE_VALUE = WIDGET_VALUE_NEXTFREE+0 +.equ HSPINNER_VALUE_MINVALUE = WIDGET_VALUE_NEXTFREE+1 +.equ HSPINNER_VALUE_MAXVALUE = WIDGET_VALUE_NEXTFREE+2 +.equ HSPINNER_VALUE_NEXTFREE = WIDGET_VALUE_NEXTFREE+3 +; child widgets +.equ HSPINNER_CHILDIDX_LEFT = 0 +.equ HSPINNER_CHILDIDX_VALUE = 1 +.equ HSPINNER_CHILDIDX_EIGHT = 2 + ; *************************************************************************** ; code @@ -57,11 +61,11 @@ ; ; @return CFLAG set of okay, cleared otherwise ; @return Y address of newly created object -; @param X parent widget -; @param r16 value for OBJECT_OFFS_OPTS -; @param r17 value for WIDGET_OFFS_PACK -; @param r20 number of postkomma digits -; @param r21 total number of digits (including komma, if r20>0) +; @param X parent widget +; @param r16 value for OBJECT_OFFS_OPTS +; @param r17 value for WIDGET_OFFS_PACK +; @param r20 number of postkomma digits +; @param r21 total number of digits (including komma, if r20>0) ; @clobbers any HSpinner_new: @@ -84,8 +88,8 @@ HSpinner_new_ret: ; --------------------------------------------------------------------------- ; @routine HSpinner_Init @global ; -; @param Y address of widget -; @param X parent widget (if any) +; @param Y address of widget +; @param X parent widget (if any) ; @param r16 value for OBJECT_OFFS_OPTS ; @param r17 value for WIDGET_OFFS_PACK ; @param r20 number of postkomma digits @@ -102,9 +106,6 @@ HSpinner_Init: pop r20 brcc HSpinner_Init_ret - ; set values - std Y+HSPINNER_OFFS_DIGITS, r20 - ; set default signal map ldi r16, LOW(HSpinner_DefaultSignalmap*2) std Y+OBJECT_OFFS_SIGNALMAP_LO, r16 @@ -118,6 +119,63 @@ HSpinner_Init_ret: +; --------------------------------------------------------------------------- +; @routine HSpinner_SetValue @global +; +; @param Y spinner object +; @param X new value +; @clobbers any, !Y + +HSpinner_SetValue: + ldi r17, HSPINNER_VALUE_VALUE + bigjmp Widget_SetValue +; @end + + + +; --------------------------------------------------------------------------- +; @routine HSpinner_GetValue @global +; +; @param Y spinner object +; @return CFLAG set if value retrieved, cleared on error +; @return R19:r18 new value +; @clobbers any, !Y + +HSpinner_GetValue: + ldi r17, HSPINNER_VALUE_VALUE + bigjmp Widget_GetValue +; @end + + + +; --------------------------------------------------------------------------- +; @routine HSpinner_SetMinValue @global +; +; @param Y spinner object +; @param X new value +; @clobbers any, !Y + +HSpinner_SetMinValue: + ldi r17, HSPINNER_VALUE_MINVALUE + bigjmp Widget_SetValue +; @end + + + +; --------------------------------------------------------------------------- +; @routine HSpinner_SetMaxValue @global +; +; @param Y spinner object +; @param X new value +; @clobbers any, !Y + +HSpinner_SetMaxValue: + ldi r17, HSPINNER_VALUE_MAXVALUE + bigjmp Widget_SetValue +; @end + + + ; --------------------------------------------------------------------------- ; @routine hSpinnerCreateChildren ; @@ -139,7 +197,8 @@ hSpinnerCreateChildren: ldi r17, (WIDGET_PACK_BEGIN< minimum? + cpc r19, xh + brcc HSpinner_OnCmdLeft_ret ; no, jmp + sbiw xh:xl, 1 + + rcall hSpinnerSetValue +HSpinner_OnCmdLeft_ret: + sec + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine HSpinner_OnCmdRight @global +; +; @param Y widget + +HSpinner_OnCmdRight: + ldd xl, Y+HSPINNER_OFFS_CURVALUE_LO + ldd xh, Y+HSPINNER_OFFS_CURVALUE_HI + ldd r18, Y+HSPINNER_OFFS_MAXVALUE_LO + ldd r19, Y+HSPINNER_OFFS_MAXVALUE_HI + + cp xl, r18 ; max value > current value? + cpc xh, r19 + brcc HSpinner_OnCmdRight_ret ; no, jmp + adiw xh:xl, 1 + + rcall hSpinnerSetValue +HSpinner_OnCmdRight_ret: + sec + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine HSpinner_OnSetValue @global +; +; @param Y widget +; @param X new value + +HSpinner_OnSetValue: + std Y+HSPINNER_OFFS_CURVALUE_LO, xl + std Y+HSPINNER_OFFS_CURVALUE_HI, xh + rcall hSpinnerValidate + sec + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine HSpinner_OnGetValue @global +; +; @param Y widget +; @return r19:r18 value + +HSpinner_OnGetValue: + ldd r18, Y+HSPINNER_OFFS_CURVALUE_LO + ldd r19, Y+HSPINNER_OFFS_CURVALUE_HI + sec + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine HSpinner_OnSetMinValue @global +; +; @param Y widget +; @param X new value + +HSpinner_OnSetMinValue: + std Y+HSPINNER_OFFS_MINVALUE_LO, xl + std Y+HSPINNER_OFFS_MINVALUE_HI, xh + rcall hSpinnerValidate + brcc HSpinner_OnSetMinValue_done + rcall hSpinnerEmitCmdSignal +HSpinner_OnSetMinValue_done: + sec + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine HSpinner_OnSetMaxValue @global +; +; @param Y widget +; @param X new value + +HSpinner_OnSetMaxValue: + std Y+HSPINNER_OFFS_MAXVALUE_LO, xl + std Y+HSPINNER_OFFS_MAXVALUE_HI, xh + rcall hSpinnerValidate + brcc HSpinner_OnSetMaxValue_done + rcall hSpinnerEmitCmdSignal +HSpinner_OnSetMaxValue_done: + sec + ret +; @end + @@ -196,6 +462,13 @@ HSpinner_DefaultSignalmap: ; header .dw HLayout_DefaultSignalmap*2 ; next table to use ; entries + + .db HSPINNER_SEL_LEFT, WIDGET_SIGNAL_COMMAND, LOW(HSpinner_OnCmdLeft), HIGH(HSpinner_OnCmdLeft) + .db HSPINNER_SEL_RIGHT, WIDGET_SIGNAL_COMMAND, LOW(HSpinner_OnCmdRight), HIGH(HSpinner_OnCmdRight) + .db HSPINNER_VALUE_VALUE, WIDGET_SIGNAL_SETVALUE, LOW(HSpinner_OnSetValue), HIGH(HSpinner_OnSetValue) + .db HSPINNER_VALUE_VALUE, WIDGET_SIGNAL_GETVALUE, LOW(HSpinner_OnGetValue), HIGH(HSpinner_OnGetValue) + .db HSPINNER_VALUE_MINVALUE, WIDGET_SIGNAL_SETVALUE, LOW(HSpinner_OnSetMinValue), HIGH(HSpinner_OnSetMinValue) + .db HSPINNER_VALUE_MAXVALUE, WIDGET_SIGNAL_SETVALUE, LOW(HSpinner_OnSetMaxValue), HIGH(HSpinner_OnSetMaxValue) .db 0, 0, 0, 0 ; end of table