gui: started working on keypads.
This commit is contained in:
139
avr/modules/lcd2/gui/base/d_numinput.asm
Normal file
139
avr/modules/lcd2/gui/base/d_numinput.asm
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; 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_BASE_D_NUMINPUT_ASM
|
||||||
|
#define AQH_AVR_GUI_BASE_D_NUMINPUT_ASM
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; defines
|
||||||
|
|
||||||
|
.equ DLGNUMINPUT_OFFS_BEGIN = MAINWINDOW_SIZE
|
||||||
|
.equ DLGNUMINPUT_SIZE = DLGNUMINPUT_OFFS_BEGIN+0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; code
|
||||||
|
|
||||||
|
.cseg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine DlgNumInput_new @global
|
||||||
|
;
|
||||||
|
; @param Y pointer to GUIAPP
|
||||||
|
; @param r21:r20 ressource id for title
|
||||||
|
; @return CFLAG set of okay, cleared otherwise
|
||||||
|
; @return Y address of newly created object
|
||||||
|
|
||||||
|
DlgNumInput_new:
|
||||||
|
bigcall GuiApp_GetRootWindow
|
||||||
|
brcc DlgNumInput_new_ret
|
||||||
|
push r20
|
||||||
|
push r21
|
||||||
|
mov xl, r18 ; use root window as parent for main window
|
||||||
|
mov xh, r19
|
||||||
|
ldi r24, LOW(DLGNUMINPUT_SIZE)
|
||||||
|
ldi r25, HIGH(DLGNUMINPUT_SIZE)
|
||||||
|
bigcall Object_Alloc ; Y=space (!r16, !r17, !X)
|
||||||
|
pop r21
|
||||||
|
pop r20
|
||||||
|
brcc DlgNumInput_new_ret
|
||||||
|
rcall DlgNumInput_Init
|
||||||
|
DlgNumInput_new_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine DlgNumInput_Init @global
|
||||||
|
;
|
||||||
|
; @param Y pointer to newly allocated widget data
|
||||||
|
; @param X pointer to root window
|
||||||
|
; @param r21:r20 ressource id for title
|
||||||
|
; @return CFLAG set of okay, cleared otherwise
|
||||||
|
; @clobbers any, !Y
|
||||||
|
|
||||||
|
DlgNumInput_Init:
|
||||||
|
ldi r16, 0 ; OPTS
|
||||||
|
ldi r17, (WIDGET_PACK_FILLED<<WIDGET_PACK_HSELF0_BIT) | (WIDGET_PACK_FILLED<<WIDGET_PACK_VSELF0_BIT) ; PACK
|
||||||
|
bigcall MainWindow_new ; Y=main window
|
||||||
|
brcc DlgNumInput_Init_ret
|
||||||
|
|
||||||
|
bigcall MainWindow_GetContentWidget ; r19:r18=content window
|
||||||
|
brcc DlgNumInput_Init_ret
|
||||||
|
mov xl, r18 ; use content window as parent
|
||||||
|
mov xh, r19
|
||||||
|
|
||||||
|
; Y=MainWindow
|
||||||
|
push yl ; main window
|
||||||
|
push yh
|
||||||
|
push xl ; content window
|
||||||
|
push xh
|
||||||
|
rcall dlgNumInputCreateContent
|
||||||
|
pop xh ; content window
|
||||||
|
pop xl
|
||||||
|
; TODO: create button line (OK, ABORT)
|
||||||
|
bigcall C03App_CreateBackButton
|
||||||
|
pop yh ; main window
|
||||||
|
pop yl
|
||||||
|
DlgNumInput_Init_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine dlgNumInputCreateContent
|
||||||
|
;
|
||||||
|
; @param Y pointer to this main window
|
||||||
|
; @param X pointer to content window of this MainWindow (is a VLayout, becomes parent)
|
||||||
|
; @return CFLAG set of okay, cleared otherwise
|
||||||
|
|
||||||
|
dlgNumInputCreateContent:
|
||||||
|
; create input field
|
||||||
|
ldi r16, (1<<WIDGET_OPTS_BORDER_BIT)
|
||||||
|
ldi r17, (WIDGET_PACK_CENTER<<WIDGET_PACK_HSELF0_BIT) | \
|
||||||
|
(WIDGET_PACK_BEGIN <<WIDGET_PACK_VSELF0_BIT) | \
|
||||||
|
(WIDGET_PACK_END <<WIDGET_PACK_HCONTENT0_BIT) | \
|
||||||
|
(WIDGET_PACK_CENTER<<WIDGET_PACK_VCONTENT0_BIT) ; PACK
|
||||||
|
clr r20 ; number of postkomma digits
|
||||||
|
ldi r21, 10 ; max number of digits
|
||||||
|
push xl
|
||||||
|
push xh
|
||||||
|
bigcall ValueLabel_new
|
||||||
|
pop xh
|
||||||
|
pop xl
|
||||||
|
brcc dlgNumInputCreateContent_ret
|
||||||
|
|
||||||
|
; create numeric keypad
|
||||||
|
ldi r16, (1<<WIDGET_OPTS_BORDER_BIT)
|
||||||
|
ldi r17, (WIDGET_PACK_CENTER<<WIDGET_PACK_HSELF0_BIT) | (WIDGET_PACK_BEGIN<<WIDGET_PACK_VSELF0_BIT) | \
|
||||||
|
(WIDGET_PACK_CENTER <<WIDGET_PACK_HCONTENT0_BIT) | (WIDGET_PACK_CENTER<<WIDGET_PACK_VCONTENT0_BIT)
|
||||||
|
push xl
|
||||||
|
push xh
|
||||||
|
bigcall NumKeyPad_new
|
||||||
|
pop xh
|
||||||
|
pop xl
|
||||||
|
brcc dlgNumInputCreateContent_ret
|
||||||
|
|
||||||
|
sec
|
||||||
|
dlgNumInputCreateContent_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
551
avr/modules/lcd2/gui/base/keypad.asm
Normal file
551
avr/modules/lcd2/gui/base/keypad.asm
Normal file
@@ -0,0 +1,551 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; 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_KEYPAD_ASM
|
||||||
|
#define AQH_AVR_GUI2_KEYPAD_ASM
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; defines
|
||||||
|
|
||||||
|
.equ KEYPAD_OFFS_BEGIN = WIDGET_SIZE
|
||||||
|
.equ KEYPAD_OFFS_KEYWIDTH = KEYPAD_OFFS_BEGIN+0
|
||||||
|
.equ KEYPAD_OFFS_KEYHEIGHT = KEYPAD_OFFS_BEGIN+1
|
||||||
|
.equ KEYPAD_OFFS_KEYHDIST = KEYPAD_OFFS_BEGIN+2
|
||||||
|
.equ KEYPAD_OFFS_KEYVDIST = KEYPAD_OFFS_BEGIN+3
|
||||||
|
.equ KEYPAD_OFFS_TXTOFFS_X = KEYPAD_OFFS_BEGIN+4
|
||||||
|
.equ KEYPAD_OFFS_TXTOFFS_Y = KEYPAD_OFFS_BEGIN+5
|
||||||
|
.equ KEYPAD_OFFS_KEYSPERROW = KEYPAD_OFFS_BEGIN+6
|
||||||
|
.equ KEYPAD_OFFS_ROWS = KEYPAD_OFFS_BEGIN+7
|
||||||
|
.equ KEYPAD_OFFS_KEYS_LO = KEYPAD_OFFS_BEGIN+8
|
||||||
|
.equ KEYPAD_OFFS_KEYS_HI = KEYPAD_OFFS_BEGIN+9
|
||||||
|
.equ KEYPAD_OFFS_SELECTEDKEY = KEYPAD_OFFS_BEGIN+10
|
||||||
|
.equ KEYPAD_SIZE = KEYPAD_OFFS_BEGIN+11
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; code
|
||||||
|
|
||||||
|
.cseg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine KeyPad_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 keys per row
|
||||||
|
; @param r21 number of rows
|
||||||
|
; @param r23:r22 pointer to null-terminated string containing keys
|
||||||
|
; @clobbers any
|
||||||
|
|
||||||
|
KeyPad_new:
|
||||||
|
push r20
|
||||||
|
push r21
|
||||||
|
push r22
|
||||||
|
push r23
|
||||||
|
ldi r24, LOW(KEYPAD_SIZE)
|
||||||
|
ldi r25, HIGH(KEYPAD_SIZE)
|
||||||
|
bigcall Object_Alloc ; (!r16, !r17, !X)
|
||||||
|
pop r23
|
||||||
|
pop r22
|
||||||
|
pop r21
|
||||||
|
pop r20
|
||||||
|
brcc KeyPad_new_ret
|
||||||
|
rcall KeyPad_Init
|
||||||
|
sec
|
||||||
|
KeyPad_new_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine KeyPad_Init @global
|
||||||
|
;
|
||||||
|
; @param 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 keys per row
|
||||||
|
; @param r21 number of rows
|
||||||
|
; @param r23:r22 pointer to null-terminated string containing keys
|
||||||
|
; @clobbers any
|
||||||
|
|
||||||
|
KeyPad_Init:
|
||||||
|
push r20
|
||||||
|
push r21
|
||||||
|
push r22
|
||||||
|
push r23
|
||||||
|
; call base class
|
||||||
|
bigcall Widget_Init ; (r16, r17, X)
|
||||||
|
pop r23
|
||||||
|
pop r22
|
||||||
|
pop r21
|
||||||
|
pop r20
|
||||||
|
|
||||||
|
std Y+KEYPAD_OFFS_KEYSPERROW, r20
|
||||||
|
std Y+KEYPAD_OFFS_ROWS, r21
|
||||||
|
std Y+KEYPAD_OFFS_KEYS_LO, r22
|
||||||
|
std Y+KEYPAD_OFFS_KEYS_HI, r23
|
||||||
|
|
||||||
|
; set input and timer opts
|
||||||
|
ldd r16, Y+OBJECT_OFFS_OPTS
|
||||||
|
sbr r16, (1<<WIDGET_OPTS_INPUT_BIT) | (1<<OBJECT_OPTS_TIMER_BIT)
|
||||||
|
std Y+OBJECT_OFFS_OPTS, r16
|
||||||
|
|
||||||
|
; set default signal map
|
||||||
|
ldi r16, LOW(KeyPad_DefaultSignalmap*2)
|
||||||
|
std Y+OBJECT_OFFS_SIGNALMAP_LO, r16
|
||||||
|
ldi r16, HIGH(KeyPad_DefaultSignalmap*2)
|
||||||
|
std Y+OBJECT_OFFS_SIGNALMAP_HI, r16
|
||||||
|
|
||||||
|
; set default style
|
||||||
|
ldi r16, LOW(KeyPad_DefaultStyle*2)
|
||||||
|
std Y+WIDGET_OFFS_STYLE_LO, r16
|
||||||
|
ldi r16, HIGH(KeyPad_DefaultStyle*2)
|
||||||
|
std Y+WIDGET_OFFS_STYLE_HI, r16
|
||||||
|
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; signal handlers
|
||||||
|
|
||||||
|
|
||||||
|
KeyPad_OnLayout:
|
||||||
|
rcall keyPadLayoutX ; (r16, r18, r19)
|
||||||
|
rcall keyPadLayoutY ; (r16, r18, r19)
|
||||||
|
|
||||||
|
ldd r17, Y+OBJECT_OFFS_FLAGS
|
||||||
|
; only clear layout bit
|
||||||
|
cbr r17, (1<<WIDGET_FLAGS_LAYOUT_BIT)
|
||||||
|
std Y+OBJECT_OFFS_FLAGS, r17
|
||||||
|
sec
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
KeyPad_OnGetDefaultWidth:
|
||||||
|
rcall keyPadLayoutX ; (r16, r18, r19)
|
||||||
|
|
||||||
|
ldd r18, Y+KEYPAD_OFFS_KEYHDIST
|
||||||
|
ldd r19, Y+KEYPAD_OFFS_KEYSPERROW
|
||||||
|
bigcall Utils_Mulu8x8_16 ; R17:R16 = R18 * R19 (r19-r21)
|
||||||
|
mov r18, r16
|
||||||
|
mov r19, r17
|
||||||
|
|
||||||
|
rcall keyPadAdjustForBordersAndSpacings
|
||||||
|
sec
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
KeyPad_OnGetDefaultHeight:
|
||||||
|
rcall keyPadLayoutY ; (r16, r18, r19)
|
||||||
|
ldd r18, Y+KEYPAD_OFFS_KEYVDIST
|
||||||
|
ldd r19, Y+KEYPAD_OFFS_ROWS
|
||||||
|
bigcall Utils_Mulu8x8_16 ; R17:R16 = R18 * R19 (r19-r21)
|
||||||
|
mov r18, r16
|
||||||
|
mov r19, r17
|
||||||
|
|
||||||
|
rcall keyPadAdjustForBordersAndSpacings
|
||||||
|
sec
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine KeyPad_OnDraw @global
|
||||||
|
;
|
||||||
|
; @param Y address of widget
|
||||||
|
; @return CFLAG set if signal handled
|
||||||
|
; @clobbers any, !Y
|
||||||
|
|
||||||
|
KeyPad_OnDraw:
|
||||||
|
ldd r17, Y+OBJECT_OFFS_FLAGS
|
||||||
|
; check whether widget is visible
|
||||||
|
sbrs r17, WIDGET_FLAGS_VISIBLE_BIT
|
||||||
|
rjmp KeyPad_OnDraw_ret
|
||||||
|
; check whether widget is dirty
|
||||||
|
sbrs r17, WIDGET_FLAGS_DIRTY_BIT
|
||||||
|
rjmp KeyPad_OnDraw_ret
|
||||||
|
|
||||||
|
; clear widget background
|
||||||
|
bigcall Widget_Clear ; (any, !Y)
|
||||||
|
|
||||||
|
; draw keys
|
||||||
|
rcall keyPadDrawKeys ; (any, !Y)
|
||||||
|
|
||||||
|
ldd r17, Y+OBJECT_OFFS_OPTS
|
||||||
|
sbrs r17, WIDGET_OPTS_BORDER_BIT
|
||||||
|
rjmp KeyPad_OnDraw_done
|
||||||
|
bigcall Widget_DrawBorder
|
||||||
|
|
||||||
|
KeyPad_OnDraw_done:
|
||||||
|
; clear dirty bit
|
||||||
|
cbr r17, (1<<WIDGET_FLAGS_DIRTY_BIT)
|
||||||
|
std Y+OBJECT_OFFS_FLAGS, r17
|
||||||
|
|
||||||
|
KeyPad_OnDraw_ret:
|
||||||
|
sec
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
KeyPad_OnTimer:
|
||||||
|
KeyPad_OnTouchBegin:
|
||||||
|
KeyPad_OnTouchEnd:
|
||||||
|
sec
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine keyPadAdjustForBordersAndSpacings
|
||||||
|
;
|
||||||
|
; @param Y widget
|
||||||
|
; @param r19:r18 size so far (width or height)
|
||||||
|
; @return r19:r18 adjusted size
|
||||||
|
; @clobbers r16, r17, r20, r21
|
||||||
|
|
||||||
|
keyPadAdjustForBordersAndSpacings:
|
||||||
|
push zl
|
||||||
|
push zh
|
||||||
|
ldd zl, Y+WIDGET_OFFS_STYLE_LO
|
||||||
|
ldd zh, Y+WIDGET_OFFS_STYLE_HI
|
||||||
|
adiw zh:zl, WIDGET_STYLE_OFFS_SPACING
|
||||||
|
lpm r16, Z
|
||||||
|
pop zh
|
||||||
|
pop zl
|
||||||
|
clr r17
|
||||||
|
sub r18, r16 ; subtract one spacing
|
||||||
|
sbc r19, r17
|
||||||
|
bigcall Widget_AddOuterStyleBorders ; (r20, r21)
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine keyPadLayoutX
|
||||||
|
;
|
||||||
|
; @param Y widget
|
||||||
|
; @clobbers r16-r23, r25
|
||||||
|
|
||||||
|
keyPadLayoutX:
|
||||||
|
bigcall Widget_GetCharWidth ; r16=width (none)
|
||||||
|
clr r19
|
||||||
|
mov r18, r16
|
||||||
|
lsl r18 ; x2
|
||||||
|
rol r19
|
||||||
|
add r18, r16 ; x3
|
||||||
|
adc r19, r16
|
||||||
|
sub r19, r16
|
||||||
|
std Y+KEYPAD_OFFS_KEYWIDTH, r18
|
||||||
|
std Y+KEYPAD_OFFS_TXTOFFS_X, r16
|
||||||
|
|
||||||
|
push zl
|
||||||
|
push zh
|
||||||
|
ldd zl, Y+WIDGET_OFFS_STYLE_LO
|
||||||
|
ldd zh, Y+WIDGET_OFFS_STYLE_HI
|
||||||
|
adiw zh:zl, WIDGET_STYLE_OFFS_SPACING
|
||||||
|
lpm r16, Z
|
||||||
|
pop zh
|
||||||
|
pop zl
|
||||||
|
add r18, r16
|
||||||
|
std Y+KEYPAD_OFFS_KEYHDIST, r18
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine keyPadLayoutY
|
||||||
|
;
|
||||||
|
; @param Y widget
|
||||||
|
; @clobbers r16, r18, r19
|
||||||
|
|
||||||
|
keyPadLayoutY:
|
||||||
|
bigcall Widget_GetCharHeight ; r16=height (none)
|
||||||
|
clr r19
|
||||||
|
mov r18, r16
|
||||||
|
lsl r18 ; x2
|
||||||
|
rol r19
|
||||||
|
add r18, r16 ; x3
|
||||||
|
adc r19, r16
|
||||||
|
sub r19, r16
|
||||||
|
std Y+KEYPAD_OFFS_KEYHEIGHT, r18
|
||||||
|
std Y+KEYPAD_OFFS_TXTOFFS_Y, r16
|
||||||
|
|
||||||
|
push zl
|
||||||
|
push zh
|
||||||
|
ldd zl, Y+WIDGET_OFFS_STYLE_LO
|
||||||
|
ldd zh, Y+WIDGET_OFFS_STYLE_HI
|
||||||
|
adiw zh:zl, WIDGET_STYLE_OFFS_SPACING
|
||||||
|
lpm r16, Z
|
||||||
|
pop zh
|
||||||
|
pop zl
|
||||||
|
add r18, r16
|
||||||
|
std Y+KEYPAD_OFFS_KEYVDIST, r18
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
keyPadDrawKeys:
|
||||||
|
; get start pos
|
||||||
|
ldd zl, Y+WIDGET_OFFS_STYLE_LO
|
||||||
|
ldd zh, Y+WIDGET_OFFS_STYLE_HI
|
||||||
|
adiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
|
||||||
|
lpm r20, Z
|
||||||
|
clr r21
|
||||||
|
mov r4, r20 ; X
|
||||||
|
clr r5
|
||||||
|
mov r6, r20 ; Y
|
||||||
|
clr r7
|
||||||
|
|
||||||
|
; get key contents
|
||||||
|
ldd zl, Y+KEYPAD_OFFS_KEYS_LO
|
||||||
|
ldd zh, Y+KEYPAD_OFFS_KEYS_HI
|
||||||
|
mov r16, zl
|
||||||
|
or r16, zh
|
||||||
|
breq keyPadDrawKeys_ret
|
||||||
|
ldd r16, Y+KEYPAD_OFFS_ROWS
|
||||||
|
tst r16
|
||||||
|
breq keyPadDrawKeys_ret
|
||||||
|
ldd r16, Y+KEYPAD_OFFS_KEYSPERROW
|
||||||
|
tst r16
|
||||||
|
breq keyPadDrawKeys_ret
|
||||||
|
|
||||||
|
; draw keys
|
||||||
|
ldd r20, Y+KEYPAD_OFFS_ROWS ; row counter
|
||||||
|
clr r21 ; key idx
|
||||||
|
keyPadDrawKeys_loop1: ; loop for every row
|
||||||
|
push r20
|
||||||
|
ldd r20, Y+KEYPAD_OFFS_KEYSPERROW ; key counter per row
|
||||||
|
push r4 ; X
|
||||||
|
push r5
|
||||||
|
keyPadDrawKeys_loop2: ; loop for every key in a row
|
||||||
|
lpm r16, Z
|
||||||
|
tst r16
|
||||||
|
breq keyPadDrawKeys_loop2End ; end reached
|
||||||
|
cpi r16, 0xff
|
||||||
|
breq keyPadDrawKeys_loop2Next ; no key, ignore
|
||||||
|
push r4 ; X
|
||||||
|
push r5
|
||||||
|
push r6 ; Y
|
||||||
|
push r7
|
||||||
|
push r20 ; key counter per row
|
||||||
|
push r21 ; key idx
|
||||||
|
rcall keyPadDrawKey
|
||||||
|
pop r21
|
||||||
|
pop r20
|
||||||
|
pop r7
|
||||||
|
pop r6
|
||||||
|
pop r5
|
||||||
|
pop r4
|
||||||
|
keyPadDrawKeys_loop2Next:
|
||||||
|
ldd r16, Y+KEYPAD_OFFS_KEYHDIST ; increment X
|
||||||
|
add r4, r16
|
||||||
|
adc r5, r16
|
||||||
|
sub r5, r16
|
||||||
|
adiw zh:zl, 1
|
||||||
|
inc r21
|
||||||
|
dec r20
|
||||||
|
breq keyPadDrawKeys_loop2End
|
||||||
|
rjmp keyPadDrawKeys_loop2
|
||||||
|
keyPadDrawKeys_loop2End:
|
||||||
|
pop r5
|
||||||
|
pop r4
|
||||||
|
pop r20
|
||||||
|
dec r20
|
||||||
|
breq keyPadDrawKeys_loop1End
|
||||||
|
ldd r16, Y+KEYPAD_OFFS_KEYVDIST ; increment Y
|
||||||
|
add r6, r16
|
||||||
|
adc r7, r16
|
||||||
|
sub r7, r16
|
||||||
|
rjmp keyPadDrawKeys_loop1
|
||||||
|
keyPadDrawKeys_loop1End:
|
||||||
|
|
||||||
|
keyPadDrawKeys_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine keyPadDrawKey
|
||||||
|
;
|
||||||
|
; @param Y widget
|
||||||
|
; @param r5:r4 X
|
||||||
|
; @param r7:r6 Y
|
||||||
|
; @param r21 key idx
|
||||||
|
; @param Z pointer to current key byte
|
||||||
|
|
||||||
|
keyPadDrawKey:
|
||||||
|
; get colors
|
||||||
|
mov r16, r21
|
||||||
|
rcall keyPadGetColsForKey ; (r17)
|
||||||
|
push r4
|
||||||
|
push r5
|
||||||
|
push r6
|
||||||
|
push r7
|
||||||
|
push r21
|
||||||
|
push zl
|
||||||
|
push zh
|
||||||
|
ldd r8, Y+KEYPAD_OFFS_KEYWIDTH
|
||||||
|
clr r9
|
||||||
|
ldd r10, Y+KEYPAD_OFFS_KEYHEIGHT
|
||||||
|
clr r11
|
||||||
|
mov r2, r0
|
||||||
|
mov r3, r1
|
||||||
|
bigcall Widget_FillRect
|
||||||
|
pop zh
|
||||||
|
pop zl
|
||||||
|
pop r21
|
||||||
|
pop r7
|
||||||
|
pop r6
|
||||||
|
pop r5
|
||||||
|
pop r4
|
||||||
|
|
||||||
|
; get colors again
|
||||||
|
mov r16, r21
|
||||||
|
rcall keyPadGetColsForKey ; (r17)
|
||||||
|
|
||||||
|
push r4
|
||||||
|
push r5
|
||||||
|
push r6
|
||||||
|
push r7
|
||||||
|
push r21
|
||||||
|
push zl
|
||||||
|
push zh
|
||||||
|
ldd r8, Y+KEYPAD_OFFS_KEYWIDTH
|
||||||
|
clr r9
|
||||||
|
ldd r10, Y+KEYPAD_OFFS_KEYHEIGHT
|
||||||
|
clr r11
|
||||||
|
bigcall Widget_DrawRect
|
||||||
|
pop zh
|
||||||
|
pop zl
|
||||||
|
pop r21
|
||||||
|
pop r7
|
||||||
|
pop r6
|
||||||
|
pop r5
|
||||||
|
pop r4
|
||||||
|
|
||||||
|
; get colors again
|
||||||
|
mov r16, r21
|
||||||
|
rcall keyPadGetColsForKey ; (r17)
|
||||||
|
|
||||||
|
; adjust XPos
|
||||||
|
clr r17
|
||||||
|
ldd r16, Y+KEYPAD_OFFS_TXTOFFS_X
|
||||||
|
add r4, r16
|
||||||
|
adc r5, r17
|
||||||
|
; adjust YPos
|
||||||
|
ldd r16, Y+KEYPAD_OFFS_TXTOFFS_Y
|
||||||
|
add r6, r16
|
||||||
|
adc r7, r17
|
||||||
|
lpm r16, Z
|
||||||
|
push zl
|
||||||
|
push zh
|
||||||
|
bigcall Widget_DrawCharAt
|
||||||
|
pop zh
|
||||||
|
pop zl
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine keyPadGetColsForKey
|
||||||
|
;
|
||||||
|
; @param Y widget
|
||||||
|
; @param r16 key idx (starting at 0)
|
||||||
|
; @return r1:r0 background color
|
||||||
|
; @return r3:r2 foreground color
|
||||||
|
; @clobbers r17
|
||||||
|
|
||||||
|
keyPadGetColsForKey:
|
||||||
|
ldd r17, Y+KEYPAD_OFFS_SELECTEDKEY
|
||||||
|
cp r16, r17
|
||||||
|
breq keyPadGetColsForKey_activated
|
||||||
|
bigcall Widget_GetNormalColors ; (none)
|
||||||
|
rjmp keyPadGetColsForKey_ret
|
||||||
|
keyPadGetColsForKey_activated:
|
||||||
|
bigcall Widget_GetActivatedColors ; (none)
|
||||||
|
keyPadGetColsForKey_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; data in FLASH
|
||||||
|
|
||||||
|
|
||||||
|
KeyPad_DefaultStyle:
|
||||||
|
.dw DISPLAY_COLOR_BLACK ; frontCol_norm
|
||||||
|
.dw DISPLAY_COLOR_LIGHTGREY ; backCol_norm
|
||||||
|
.dw DISPLAY_COLOR_BLACK ; borderCol_norm
|
||||||
|
.dw DISPLAY_COLOR_WHITE ; shadowCol_norm
|
||||||
|
|
||||||
|
.dw DISPLAY_COLOR_WHITE ; frontCol_activated
|
||||||
|
.dw DISPLAY_COLOR_NAVY ; backCol_activated
|
||||||
|
.dw DISPLAY_COLOR_BLACK ; borderCol_activated
|
||||||
|
.dw DISPLAY_COLOR_WHITE ; shadowCol_activated
|
||||||
|
|
||||||
|
.db 4, 8 ; outerBorderSize, innerBorderSize
|
||||||
|
.dw ili9341Font12x16_1*2 ; font
|
||||||
|
.db 12, 16 ; charWidth, charHeight
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
KeyPad_DefaultSignalmap:
|
||||||
|
; header
|
||||||
|
.dw Widget_DefaultSignalmap*2 ; next table to use
|
||||||
|
; entries
|
||||||
|
.db 0, OBJECT_SIGNAL_TIMER, LOW(KeyPad_OnTimer), HIGH(KeyPad_OnTimer)
|
||||||
|
.db 0, WIDGET_SIGNAL_DRAW, LOW(KeyPad_OnDraw), HIGH(KeyPad_OnDraw)
|
||||||
|
.db 0, WIDGET_SIGNAL_TOUCH_BEGIN, LOW(KeyPad_OnTouchBegin), HIGH(KeyPad_OnTouchBegin)
|
||||||
|
.db 0, WIDGET_SIGNAL_TOUCH_END, LOW(KeyPad_OnTouchEnd), HIGH(KeyPad_OnTouchEnd)
|
||||||
|
.db 0, WIDGET_SIGNAL_LAYOUT, LOW(KeyPad_OnLayout), HIGH(KeyPad_OnLayout)
|
||||||
|
.db WIDGET_VALUE_DEFAULT_WIDTH, WIDGET_SIGNAL_GETVALUE, LOW(KeyPad_OnGetDefaultWidth), HIGH(KeyPad_OnGetDefaultWidth)
|
||||||
|
.db WIDGET_VALUE_DEFAULT_HEIGHT, WIDGET_SIGNAL_GETVALUE, LOW(KeyPad_OnGetDefaultHeight), HIGH(KeyPad_OnGetDefaultHeight)
|
||||||
|
|
||||||
|
.db 0, 0, 0, 0 ; end of table
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
57
avr/modules/lcd2/gui/base/keypad_num.asm
Normal file
57
avr/modules/lcd2/gui/base/keypad_num.asm
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; 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_KEYPAD_NUM_ASM
|
||||||
|
#define AQH_AVR_GUI2_KEYPAD_NUM_ASM
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; defines
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; code
|
||||||
|
|
||||||
|
.cseg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine NumKeyPad_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
|
||||||
|
; @clobbers any
|
||||||
|
|
||||||
|
NumKeyPad_new:
|
||||||
|
ldi r20, 5 ; keys per row
|
||||||
|
ldi r21, 2 ; rows
|
||||||
|
ldi r22, LOW(numKeyPadKeys*2) ; key defs
|
||||||
|
ldi r23, HIGH(numKeyPadKeys*2)
|
||||||
|
bigjmp KeyPad_new
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; data in FLASH
|
||||||
|
|
||||||
|
numKeyPadKeys:
|
||||||
|
.db '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 0, 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user