; *************************************************************************** ; 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_GUI_HSPINNER_ASM #define AQH_AVR_GUI_HSPINNER_ASM ; *************************************************************************** ; *************************************************************************** ; *************************************************************************** ; defines .equ HSPINNER_OFFS_BEGIN = HLAYOUT_SIZE .equ HSPINNER_OFFS_CURVALUE_LO = HSPINNER_OFFS_BEGIN+0 .equ HSPINNER_OFFS_CURVALUE_HI = HSPINNER_OFFS_BEGIN+1 .equ HSPINNER_OFFS_MINVALUE_LO = HSPINNER_OFFS_BEGIN+2 .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_FLAGS = HSPINNER_OFFS_BEGIN+6 .equ HSPINNER_SIZE = HSPINNER_OFFS_BEGIN+7 ; selectors .equ HSPINNER_SEL_LEFT = 1 .equ HSPINNER_SEL_RIGHT = 2 ; values .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 .cseg ; --------------------------------------------------------------------------- ; @routine HSpinner_new @global ; ; @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) ; @clobbers any HSpinner_new: ldi r24, LOW(HSPINNER_SIZE) ldi r25, HIGH(HSPINNER_SIZE) push r20 push r21 bigcall Object_Alloc ; (!r16, !r17, !X) pop r21 pop r20 brcc HSpinner_new_ret rcall HSpinner_Init ; (any, !Y) sec HSpinner_new_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine HSpinner_Init @global ; ; @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 ; @param r21 total number of digits (including komma, if r20>0) ; @clobbers any, !Y HSpinner_Init: ; call base class push r20 push r21 ldi r20, HLAYOUT_MODE_EXPAND bigcall HLayout_Init pop r21 pop r20 brcc HSpinner_Init_ret ; set default signal map ldi r16, LOW(HSpinner_DefaultSignalmap*2) std Y+OBJECT_OFFS_SIGNALMAP_LO, r16 ldi r16, HIGH(HSpinner_DefaultSignalmap*2) std Y+OBJECT_OFFS_SIGNALMAP_HI, r16 rcall hSpinnerCreateChildren ; (any, !Y) HSpinner_Init_ret: ret ; @end ; --------------------------------------------------------------------------- ; @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 ; ; @param Y spinner object ; @param r20 number of postkomma digits ; @param r21 total number of digits (including komma, if r20>0) ; @clobbers any, !Y hSpinnerCreateChildren: push yl push yh mov xl, yl ; parent mov xh, yh ; create left button push r20 push r21 ldi r16, 0 ; OPTS 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 ; *************************************************************************** ; data in FLASH 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 #endif