Files
aqhomecontrol/avr/modules/lcd2/gui/button.asm
2025-11-22 14:10:06 +01:00

263 lines
5.8 KiB
NASM

; ***************************************************************************
; copyright : (C) 2025 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_BUTTON_ASM
#define AQH_AVR_GUI_BUTTON_ASM
.equ BUTTON_STATE_DOWN_BIT = 0
.equ BUTTON_STATE_ACTIVATED_BIT = 1
.cseg
; ---------------------------------------------------------------------------
; @routine Button_Draw_Up @global
;
; Draw button in state "UP".
;
; @param Y pointer to window in SDRAM
; @param Z pointer to button data in FLASH (byte address for LPM)
; @clobbers any, !Y
Button_Draw_Up:
clr r14
rjmp buttonDraw
; @end
; ---------------------------------------------------------------------------
; @routine Button_Draw_Down @global
;
; Draw button in state "DOWN".
;
; @param Y pointer to window in SDRAM
; @param Z pointer to button data in FLASH (byte address for LPM)
; @clobbers any, !Y
Button_Draw_Down:
ldi r16, 1
mov r14, r16
rjmp buttonDraw
; @end
; ---------------------------------------------------------------------------
; @routine Button_HandleTouch @global
;
; @param r18 flags
; @param r19 current state of button (bit 0: pressed, bit 1: activated)
; @param r5:r4 x
; @param r7:r6 Y
; @param Z pointer to button data in FLASH
; @return r19 new state of button (0=normal, 1=pressed)
Button_HandleTouch:
cbr r19, (1<<BUTTON_STATE_ACTIVATED_BIT) ; clear activated bit
; check for press change event
mov r17, r18
andi r17, (1<<DISPLAY_IFLAGS_CHGPRESS_BIT)
breq Button_HandleTouch_ret
; press changed
mov r17, r18
andi r17, (1<<DISPLAY_IFLAGS_PRESSED_BIT)
breq Button_HandleTouch_up
; touch came down
push zl
push zh
push r19
bigcall Window_IsPointInRect
pop r19
pop zh
pop zl
brcc Button_HandleTouch_ret
tst r19
brne Button_HandleTouch_ret ; already down, jmp
sbr r19, (1<<BUTTON_STATE_DOWN_BIT) ; button now down
push zl
push zh
push r19
rcall Button_Draw_Down
pop r19
pop zh
pop zl
rjmp Button_HandleTouch_ret
Button_HandleTouch_up:
; touch came up
tst r19
breq Button_HandleTouch_ret ; already up, jmp
cbr r19, (1<<BUTTON_STATE_DOWN_BIT)
push zl
push zh
push r19
rcall Button_Draw_Up
pop r19
pop zh
pop zl
push zl
push zh
push r19
bigcall Window_IsPointInRect
pop r19
pop zh
pop zl
brcc Button_HandleTouch_ret
; touch ended over button
sbr r19, (1<<BUTTON_STATE_ACTIVATED_BIT) ; set activated bit
Button_HandleTouch_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine buttonDraw
;
; @param Y pointer to window in SDRAM
; @param Z pointer to button data in FLASH (byte address for LPM)
; @param r14 0 if normal, 1 if pressed state
; @clobbers any, !Y
buttonDraw:
lpm r4, Z+ ; X
lpm r5, Z+
lpm r6, Z+ ; Y
lpm r7, Z+
lpm r8, Z+ ; W
lpm r9, Z+
lpm r10, Z+ ; H
lpm r11, Z+
lpm r12, Z+ ; text
lpm r13, Z+
rcall buttonClearBackground
rcall buttonDrawBorder
rcall buttonDrawText
ret
; @end
; ---------------------------------------------------------------------------
; @routine buttonClearBackground
;
; @param Y pointer to window in SDRAM
; @param r5:r4 X
; @param r7:r6 Y
; @param r9:r8 W
; @param r11:r10 H
; @param r14 0 if normal, 1 if pressed state
; @clobbers any, !Y, !Z
buttonClearBackground:
tst r14
brne buttonClearBackground_bgDown
ldi r16, LOW(STYLE_BUTTON_COL_BG_NORM)
mov r2, r16
ldi r16, HIGH(STYLE_BUTTON_COL_BG_NORM)
mov r3, r16
rjmp buttonClearBackground_bgFill
buttonClearBackground_bgDown:
ldi r16, LOW(STYLE_BUTTON_COL_BG_PRESSED)
mov r2, r16
ldi r16, HIGH(STYLE_BUTTON_COL_BG_PRESSED)
mov r3, r16
buttonClearBackground_bgFill:
bigcall Display_FillRect
ret
; @end
; ---------------------------------------------------------------------------
; @routine buttonDrawBorder
;
; @param Y pointer to window in SDRAM
; @param r5:r4 X
; @param r7:r6 Y
; @param r9:r8 W
; @param r11:r10 H
; @param r14 0 if normal, 1 if pressed state
; @clobbers any, !Y, !Z
buttonDrawBorder:
ldi r16, LOW(STYLE_BUTTON_COL_BORDER)
mov r2, r16
ldi r16, HIGH(STYLE_BUTTON_COL_BORDER)
mov r3, r16
bigcall Display_DrawRect
ret
; @end
; ---------------------------------------------------------------------------
; @routine buttonDrawText
;
; @param Y pointer to window in SDRAM
; @param r5:r4 X
; @param r7:r6 Y
; @param r9:r8 W
; @param r11:r10 H
; @param r13:r12 Text in FLASH
; @param r14 0 if normal, 1 if pressed state
; @clobbers any, !Y, !Z
buttonDrawText:
ldi r16, 2
clr r17
add r4, r16 ; x+=2
adc r5, r17
add r6, r16 ; y+=2
adc r7, r17
; set text colors
tst r14
brne buttonDrawText_down
; set background color
ldi r16, LOW(STYLE_BUTTON_COL_BG_NORM)
mov r0, r16
ldi r16, HIGH(STYLE_BUTTON_COL_BG_NORM)
mov r1, r16
; set foreground color
ldi r16, LOW(STYLE_BUTTON_COL_FG_NORM)
mov r2, r16
ldi r16, HIGH(STYLE_BUTTON_COL_FG_NORM)
mov r3, r16
rjmp buttonDrawText_draw
buttonDrawText_down:
; set background color
ldi r16, LOW(STYLE_BUTTON_COL_BG_PRESSED)
mov r0, r16
ldi r16, HIGH(STYLE_BUTTON_COL_BG_PRESSED)
mov r1, r16
; set foreground color
ldi r16, LOW(STYLE_BUTTON_COL_FG_PRESSED)
mov r2, r16
ldi r16, HIGH(STYLE_BUTTON_COL_FG_PRESSED)
mov r3, r16
buttonDrawText_draw:
mov zl, r12
mov zh, r13
bigcall Window_DrawColorTextFlash
ret
; @end
#endif