avr: started working on xpt2046 module.

This commit is contained in:
Martin Preuss
2025-11-10 14:49:23 +01:00
parent e82c1cbe5c
commit 29f74c0eae
15 changed files with 1020 additions and 82 deletions

View File

@@ -254,6 +254,10 @@
.include "modules/lcd2/ili9341/text.asm" .include "modules/lcd2/ili9341/text.asm"
#endif #endif
#ifdef MODULES_XPT2046
.include "modules/lcd2/xpt2046/main.asm"
#endif
#ifdef MODULES_FONT #ifdef MODULES_FONT
.include "modules/lcd2/font/defs.asm" .include "modules/lcd2/font/defs.asm"
.include "modules/lcd2/font/main.asm" .include "modules/lcd2/font/main.asm"

View File

@@ -183,6 +183,10 @@ onSystemTimerTick:
bigcall GUI_Every100ms bigcall GUI_Every100ms
#endif #endif
#ifdef MODULES_XPT2046
bigcall XPT2046_Every100ms
#endif
#ifdef APPS_NETWORK #ifdef APPS_NETWORK
ldi yl, LOW(netInterfaceData) ldi yl, LOW(netInterfaceData)

View File

@@ -193,6 +193,10 @@ initModules:
bigcall ILI9341_Init bigcall ILI9341_Init
#endif #endif
#ifdef MODULES_XPT2046
bigcall XPT2046_Init
#endif
#ifdef MODULES_GUI #ifdef MODULES_GUI
bigcall GUI_Init bigcall GUI_Init
#endif #endif

View File

@@ -151,6 +151,13 @@
; ---------------------------------------------------------------------------
; XPT2046 module
.equ XPT2046_DEVICENUM = 1
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; ComOnUart module ; ComOnUart module

View File

@@ -56,6 +56,7 @@
#define MODULES_COM2W #define MODULES_COM2W
#define MODULES_SPI_HW #define MODULES_SPI_HW
#define MODULES_ILI9341 #define MODULES_ILI9341
#define MODULES_XPT2046
#define MODULES_FONT #define MODULES_FONT
#define MODULES_GUI #define MODULES_GUI
;#define MODULES_TWI_MASTER ;#define MODULES_TWI_MASTER
@@ -169,6 +170,8 @@ irqNotSet:
; @routine onSystemStart ; @routine onSystemStart
onSystemStart: onSystemStart:
clr r16
sts statsUpdateTimer, r16
bigcall test bigcall test
ret ret
; @end ; @end
@@ -193,15 +196,26 @@ onMessageReceived:
; Called every 100ms. Add your routine calls here. No arguments, no results. ; Called every 100ms. Add your routine calls here. No arguments, no results.
onEvery100ms: onEvery100ms:
onEverySecond: onEveryMinute:
onEveryHour: onEveryHour:
onEveryDay: onEveryDay:
ret ret
; @end ; @end
onEveryMinute: onEverySecond:
#ifdef MODULES_GUI
lds r16, statsUpdateTimer
inc r16
cpi r16, 5
brcc onEverySecond_updateStats
sts statsUpdateTimer, r16
ret
onEverySecond_updateStats:
bigcall WinNetStats_Update bigcall WinNetStats_Update
clr r16
sts statsUpdateTimer, r16
#endif
ret ret
@@ -220,7 +234,7 @@ onEveryLoop:
test: test:
#ifdef MODULES_GUI #ifdef MODULES_GUI
bigcall WinNetStats_Init bigcall WinNetStats_Init
bigcall WinNetStats_Draw bigcall WinNetStats_Show
#endif #endif
ret ret
@@ -236,7 +250,7 @@ test:
;.include "common/debug.asm" ;.include "common/debug.asm"
.include "modules/lcd2/gui/titlewindow.asm" .include "modules/lcd2/gui/titlewindow2.asm"
;.include "modules/lcd2/font/font2.asm" ;.include "modules/lcd2/font/font2.asm"
;.include "modules/lcd2/font/font3.asm" ;.include "modules/lcd2/font/font3.asm"
;.include "modules/lcd2/font/font16x26.asm" ;.include "modules/lcd2/font/font16x26.asm"
@@ -265,6 +279,8 @@ test:
.dseg .dseg
statsUpdateTimer: .byte 1
heapStart: heapStart:

View File

@@ -15,19 +15,19 @@
WinNetStats_Init: WinNetStats_Init:
clr r16
sts winNetstatsUpdateNum, r16
sts winNetstatsUpdateNum+1, r16
; setup ; setup
ldi yl, LOW(winNetstats) ldi yl, LOW(winNetstats)
ldi yh, HIGH(winNetstats) ldi yh, HIGH(winNetstats)
bigcall TitleWindow_Init bigcall TitleWindow_Init
ldi zl, LOW(ili9341Font12x20_1*2) ldi zl, LOW(STYLE_WIN_FONT*2)
ldi zh, HIGH(ili9341Font12x20_1*2) ldi zh, HIGH(STYLE_WIN_FONT*2)
bigcall TitleWindow_SetFont std Y+WIN_OFFS_FONT_LO, zl
std Y+WIN_OFFS_FONT_HI, zh
ldi r16, LOW(winNetstats_title*2)
std Y+TITLEWINDOW_OFFS_TITLEPTR_LO, r16
ldi r16, HIGH(winNetstats_title*2)
std Y+TITLEWINDOW_OFFS_TITLEPTR_HI, r16
bigcall TitleWindow_SetFullSize bigcall TitleWindow_SetFullSize
bigcall TitleWindow_SetStyleColors bigcall TitleWindow_SetStyleColors
@@ -37,64 +37,108 @@ WinNetStats_Init:
WinNetStats_Draw:
ldi yl, LOW(winNetstats)
ldi yh, HIGH(winNetstats)
bigcall TitleWindow_Draw
rcall WinNetStats_Update
ret
; @param @0 Y ; @param @0 Y
; @param @1 label addr ; @param @1 label addr
; @param @2 data address
.macro WINNETSTATS_PRINTDATA .macro WINNETSTATS_PRINTLABEL
; packets in ; packets in
ldi zl, LOW(@1 * 2) ldi zl, LOW(@1 * 2)
ldi zh, HIGH(@1 * 2) ldi zh, HIGH(@1 * 2)
ldi r16, 2 ; X ldi r16, 2 ; X
mov r4, r16 mov r4, r16
clr r5 clr r5
ldi r16, LOW(@0) ; Y ldi r16, LOW(STYLE_WIN_TITLE_HEIGHT+@0) ; Y
mov r6, r16 mov r6, r16
ldi r16, HIGH(@0) ldi r16, HIGH(STYLE_WIN_TITLE_HEIGHT+@0)
mov r7, r16 mov r7, r16
bigcall Window_DrawTextFlash bigcall Window_DrawTextFlash
.endmacro
; @param @0 Y
; @param @1 data address
.macro WINNETSTATS_PRINTDATA
ldi r16, 160 ; X ldi r16, 160 ; X
mov r4, r16 mov r4, r16
clr r5 clr r5
ldi r16, LOW(@0) ; Y ldi r16, LOW(STYLE_WIN_TITLE_HEIGHT+@0) ; Y
mov r6, r16 mov r6, r16
ldi r16, HIGH(@0) ldi r16, HIGH(@0)
mov r7, r16 mov r7, r16
lds r16, @2 ; data lds r16, @1 ; data
lds r17, @2+1 lds r17, @1+1
bigcall Window_WriteHexWordAt bigcall Window_WriteHexWordAt
.endmacro .endmacro
WinNetStats_Show:
; draw title window basics (with title)
ldi yl, LOW(winNetstats)
ldi yh, HIGH(winNetstats)
ldi zl, LOW(winNetstats_title*2)
ldi zh, HIGH(winNetstats_title*2)
bigcall TitleWindow_DrawTitle
bigcall TitleWindow_ClearContentArea
; packets in
WINNETSTATS_PRINTLABEL 2, winNetstats_lPacketsIn
; packets out
WINNETSTATS_PRINTLABEL 24, winNetstats_lPacketsOut
; eContent
WINNETSTATS_PRINTLABEL 46, winNetstats_lContentErr
; eIO
WINNETSTATS_PRINTLABEL 68, winNetstats_lIoErr
; eMsgSize
WINNETSTATS_PRINTLABEL 90, winNetstats_lMsgSizeErr
; X
WINNETSTATS_PRINTLABEL 112, winNetstats_lX
; Y
WINNETSTATS_PRINTLABEL 134, winNetstats_lY
; Z
WINNETSTATS_PRINTLABEL 156, winNetstats_lZ
; update num
WINNETSTATS_PRINTLABEL 178, winNetstats_lUpdate
rcall WinNetStats_Update
ret
; @end
WinNetStats_Update: WinNetStats_Update:
lds r16, winNetstatsUpdateNum
inc r16
sts winNetstatsUpdateNum, r16
ldi yl, LOW(winNetstats) ldi yl, LOW(winNetstats)
ldi yh, HIGH(winNetstats) ldi yh, HIGH(winNetstats)
adiw yh:yl, TITLEWINDOW_OFFS_CONTENTWIN
bigcall Window_Clear
; packets in ; packets in
WINNETSTATS_PRINTDATA 2, winNetstats_lPacketsIn, netInterfaceData+NET_IFACE_OFFS_PACKETSIN_LOW WINNETSTATS_PRINTDATA 2, netInterfaceData+NET_IFACE_OFFS_PACKETSIN_LOW
; packets out ; packets out
WINNETSTATS_PRINTDATA 24, winNetstats_lPacketsOut, netInterfaceData+NET_IFACE_OFFS_PACKETSOUT_LOW WINNETSTATS_PRINTDATA 24, netInterfaceData+NET_IFACE_OFFS_PACKETSOUT_LOW
; eContent ; eContent
WINNETSTATS_PRINTDATA 46, winNetstats_lContentErr, netInterfaceData+NET_IFACE_OFFS_ERR_CONTENT_LOW WINNETSTATS_PRINTDATA 46, netInterfaceData+NET_IFACE_OFFS_ERR_CONTENT_LOW
; eIO ; eIO
WINNETSTATS_PRINTDATA 68, winNetstats_lIoErr, netInterfaceData+NET_IFACE_OFFS_ERR_IO_LOW WINNETSTATS_PRINTDATA 68, netInterfaceData+NET_IFACE_OFFS_ERR_IO_LOW
; eMsgSize ; eMsgSize
WINNETSTATS_PRINTDATA 90, winNetstats_lMsgSizeErr, netInterfaceData+NET_IFACE_OFFS_ERR_MSGSIZE_LOW WINNETSTATS_PRINTDATA 90, netInterfaceData+NET_IFACE_OFFS_ERR_MSGSIZE_LOW
; X
WINNETSTATS_PRINTDATA 112, xpt2046CurrentX
; Y
WINNETSTATS_PRINTDATA 134, xpt2046CurrentY
; Z
WINNETSTATS_PRINTDATA 156, xpt2046CurrentZ
; update num
WINNETSTATS_PRINTDATA 178, winNetstatsUpdateNum
sbiw yh:yl, TITLEWINDOW_OFFS_CONTENTWIN
ret ret
; @end ; @end
@@ -107,13 +151,20 @@ winNetstats_lPacketsOut: .db "Pkgs Out:", 0
winNetstats_lContentErr: .db "eContent:", 0 winNetstats_lContentErr: .db "eContent:", 0
winNetstats_lIoErr: .db "eIO :", 0 winNetstats_lIoErr: .db "eIO :", 0
winNetstats_lMsgSizeErr: .db "eMsgSize:", 0 winNetstats_lMsgSizeErr: .db "eMsgSize:", 0
winNetstats_lX: .db "X :", 0
winNetstats_lY: .db "Y :", 0
winNetstats_lZ: .db "Z :", 0
winNetstats_lUpdate: .db "Update :", 0
.dseg
winNetstats:
.byte WIN_SIZE
.dseg .dseg
winNetstats: winNetstatsUpdateNum: .byte 2
.byte TITLEWINDOW_SIZE
#endif #endif

View File

@@ -51,8 +51,6 @@
.equ NET_MSGNUMINBUF_SIZE = 8 ; max buffer nums in ringbuffer (global incoming) .equ NET_MSGNUMINBUF_SIZE = 8 ; max buffer nums in ringbuffer (global incoming)
.equ NET_IFACE_OUTMSGBUF_SIZE = 8 ; max buffer nums in ringbuffer (per interface outbound) .equ NET_IFACE_OUTMSGBUF_SIZE = 8 ; max buffer nums in ringbuffer (per interface outbound)
.equ PROGRAM_SENSOR_INTERVAL_SECS = 60
.equ PROGRAM_STATS_INTERVAL_MINS = 10

View File

@@ -4,6 +4,7 @@
<extradist> <extradist>
defs.asm defs.asm
dialog.asm
main.asm main.asm
style.asm style.asm
titlewindow.asm titlewindow.asm

View File

@@ -12,23 +12,21 @@
.equ WIN_OFFS_HANDLER_LO = 0 ; word address! .equ WIN_OFFS_X_LO = 0
.equ WIN_OFFS_HANDLER_HI = 1 .equ WIN_OFFS_X_HI = 1
.equ WIN_OFFS_X_LO = 2 .equ WIN_OFFS_Y_LO = 2
.equ WIN_OFFS_X_HI = 3 .equ WIN_OFFS_Y_HI = 3
.equ WIN_OFFS_Y_LO = 4 .equ WIN_OFFS_WIDTH_LO = 4
.equ WIN_OFFS_Y_HI = 5 .equ WIN_OFFS_WIDTH_HI = 5
.equ WIN_OFFS_WIDTH_LO = 6 .equ WIN_OFFS_HEIGHT_LO = 6
.equ WIN_OFFS_WIDTH_HI = 7 .equ WIN_OFFS_HEIGHT_HI = 7
.equ WIN_OFFS_HEIGHT_LO = 8 .equ WIN_OFFS_BG_COL_LO = 8
.equ WIN_OFFS_HEIGHT_HI = 9 .equ WIN_OFFS_BG_COL_HI = 9
.equ WIN_OFFS_BG_COL_LO = 10 .equ WIN_OFFS_FG_COL_LO = 10
.equ WIN_OFFS_BG_COL_HI = 11 .equ WIN_OFFS_FG_COL_HI = 11
.equ WIN_OFFS_FG_COL_LO = 12 .equ WIN_OFFS_FONT_LO = 12 ;byte address!
.equ WIN_OFFS_FG_COL_HI = 13 .equ WIN_OFFS_FONT_HI = 13
.equ WIN_OFFS_FONT_LO = 14 ;byte address! .equ WIN_SIZE = 14
.equ WIN_OFFS_FONT_HI = 15
.equ WIN_SIZE = 16

View File

@@ -0,0 +1,278 @@
; ***************************************************************************
; 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 AQHOME_AVR_MODS_GUI_DIALOG_ASM
#define AQHOME_AVR_MODS_GUI_DIALOG_ASM
; ***************************************************************************
; defines
.equ DIALOG_MAX_ACTIVE = 8
.equ DIALOG_OFFS_HANDLER_LO = 0
.equ DIALOG_OFFS_HANDLER_HI = 1
.equ DIALOG_OFFS_OPTIONS = 2
.equ DIALOG_OFFS_COUNTER = 3
.equ DIALOG_SIZE = 4
.equ DIALOG_OPT_ACTIVE_BIT = 7
.equ DIALOG_FN_INIT = 0
.equ DIALOG_FN_FINI = 1
.equ DIALOG_FN_SHOW = 2
.equ DIALOG_FN_HIDE = 3
.equ DIALOG_FN_DRAW = 4
.equ DIALOG_FN_TOUCH = 5
.equ DIALOG_FN_TIMER = 6
; ***************************************************************************
; data
.dseg
dialogCurrent: .byte 2
dialogStack: .byte DIALOG_MAX_ACTIVE*2
dialogStackPos: .byte 1
dialogWindow: .byte WIN_SIZE
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine GraphApp_Init @global
;
DialogMgr_Init:
clr r16
sts dialogStackPos, r16
sts dialogCurrent, r16
sts dialogCurrent+1, r16
ldi yl, LOW(dialogWindow)
ldi yh, HIGH(dialogWindow)
bigcall TitleWindow_Init
ldi zl, LOW(ili9341Font12x20_1*2)
ldi zh, HIGH(ili9341Font12x20_1*2)
std Y+WIN_OFFS_FONT_LO, zl
std Y+WIN_OFFS_FONT_HI, zh
bigcall TitleWindow_SetFullSize
bigcall TitleWindow_SetStyleColors
bigcall Window_Clear
ret
; @end
; ---------------------------------------------------------------------------
; @routine DialogMgr_Every100ms @global
;
; Send timer event to every app in the stack (started with last added app).
DialogMgr_Every100ms:
ldi xl, LOW(dialogStack)
ldi xh, HIGH(dialogStack)
lds r16, dialogStackPos
mov r17, r16
add r16, r16
add xl, r16
adc xh, r16
sub xh, r16
DialogMgr_Every100ms_loop:
tst r17
breq DialogMgr_Every100ms_ret
ld yh, -X
ld yl, -X
push xl
push xh
push r17
ldi r23, DIALOG_FN_TIMER
rcall DialogMgr_CallCurrentHandler
pop r17
pop xh
pop xl
dec r17
rjmp DialogMgr_Every100ms_loop
DialogMgr_Every100ms_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine DialogMgr_CallHandler @global
;
; @param Y pointer to app data
; @param R23 number of function to call
; @clobbers R16, R17, R22, X (any)
DialogMgr_CallHandler:
ldi xl, LOW(dialogWindow)
ldi xh, HIGH(dialogWindow)
ldd r16, Y+DIALOG_OFFS_HANDLER_LO
ldd r17, Y+DIALOG_OFFS_HANDLER_HI
mov r22, r16
and r22, r17
breq DialogMgr_CallHandler_ret
push r16
push r17
DialogMgr_CallHandler_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine DialogMgr_CallCurrentHandler @global
;
; @param X pointer to window
; @param R23 number of function to call
; @clobbers R22 (any)
DialogMgr_CallCurrentHandler:
lds yl, dialogCurrent
lds yh, dialogCurrent+1
rjmp DialogMgr_CallHandler
; @end
; ---------------------------------------------------------------------------
; @routine DialogMgr_PushDialog @global
;
; @param Y pointer to app data
;
DialogMgr_PushDialog:
lds r16, dialogStackPos
cpi r16, DIALOG_MAX_ACTIVE
brcc DialogMgr_PushDialog_ret
tst r16
brne DialogMgr_PushDialog_push
; deactivate previous app
push yl
push yh
lds yl, dialogCurrent
lds yh, dialogCurrent+1
ldi r23, DIALOG_FN_HIDE
rcall DialogMgr_CallHandler
ldd r17, Y+DIALOG_OFFS_OPTIONS
cbr r17, (1<<DIALOG_OPT_ACTIVE_BIT)
std Y+DIALOG_OFFS_OPTIONS, r17
pop yh
pop yl
DialogMgr_PushDialog_push:
lds r16, dialogStackPos
add r17, r17 ; *2
push xl
push xh
ldi xl, LOW(dialogStack)
ldi xh, HIGH(dialogStack)
add xl, r17
adc xh, r17
sub xh, r17
st X+, yl
st X, yh
pop xh
pop xl
inc r16
sts dialogStackPos, r16
; activate new app
ldd r17, Y+DIALOG_OFFS_OPTIONS
ori r17, (1<<DIALOG_OPT_ACTIVE_BIT)
std Y+DIALOG_OFFS_OPTIONS, r17
ldi r23, DIALOG_FN_SHOW
rcall DialogMgr_CallHandler
sec
DialogMgr_PushDialog_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine DialogMgr_PopDialog @global
;
; @return CFLAG set if app popped from stack, cleared otherwise
; @return Y app popped from stack (if CFLAG set)
DialogMgr_PopDialog:
lds r16, dialogStackPos
tst r16
clc
brne DialogMgr_PopDialog_ret
; deactivate previous app
push yl
push yh
lds yl, dialogCurrent
lds yh, dialogCurrent+1
ldi r23, DIALOG_FN_HIDE
rcall DialogMgr_CallHandler
ldd r17, Y+DIALOG_OFFS_OPTIONS
cbr r17, (1<<DIALOG_OPT_ACTIVE_BIT)
std Y+DIALOG_OFFS_OPTIONS, r17
pop yh
pop yl
lds r16, dialogStackPos
dec r16
sts dialogStackPos, r16
brne DialogMgr_PopDialog_pop
clr r16
sts dialogCurrent, r16
sts dialogCurrent+1, r16
sec
rjmp DialogMgr_PopDialog_ret
DialogMgr_PopDialog_pop:
push xl
push xh
ldi xl, LOW(dialogStack)
ldi xh, HIGH(dialogStack)
add xl, r16
adc xh, r16
sub xh, r16
ld yl, X+
ld yh, X
sts dialogCurrent, yl
sts dialogCurrent+1, yh
pop xh
pop xl
; activate new active app
ldd r17, Y+DIALOG_OFFS_OPTIONS
ori r17, (1<<DIALOG_OPT_ACTIVE_BIT)
std Y+DIALOG_OFFS_OPTIONS, r17
ldi r23, DIALOG_FN_SHOW
rcall DialogMgr_CallHandler
sec
DialogMgr_PopDialog_ret:
ret
; @end
#endif ; AQHOME_AVR_MODS_GUI_DIALOG_ASM

View File

@@ -15,7 +15,7 @@
.equ STYLE_WIN_TITLE_FOREGROUND = DISPLAY_COLOR_WHITE .equ STYLE_WIN_TITLE_FOREGROUND = DISPLAY_COLOR_WHITE
.equ STYLE_WIN_BACKGROUND = DISPLAY_COLOR_LIGHTGREY .equ STYLE_WIN_BACKGROUND = DISPLAY_COLOR_LIGHTGREY
.equ STYLE_WIN_FOREGROUND = DISPLAY_COLOR_BLACK .equ STYLE_WIN_FOREGROUND = DISPLAY_COLOR_BLACK
.equ STYLE_WIN_FONT = ili9341Font12x20_1
.equ STYLE_WIN_TITLE_HEIGHT = 24 .equ STYLE_WIN_TITLE_HEIGHT = 24

View File

@@ -30,16 +30,7 @@
; @param Y pointer to titledwindow data (size=TITLEWINDOW_SIZE) ; @param Y pointer to titledwindow data (size=TITLEWINDOW_SIZE)
TitleWindow_Init: TitleWindow_Init:
mov xl, yl rcall Window_Init
mov xh, yh
ldi r17, TITLEWINDOW_SIZE
clr r16
bigcall Utils_FillSram ; (R17, X)
ldi r16, LOW(TitleWindow_Handler)
std Y+(TITLEWINDOW_OFFS_SELF+WIN_OFFS_HANDLER_LO), r16
ldi r16, HIGH(TitleWindow_Handler)
std Y+(TITLEWINDOW_OFFS_SELF+WIN_OFFS_HANDLER_HI), r16
ret ret
; @end ; @end
@@ -236,10 +227,5 @@ TitleWindow_Draw:
TitleWindow_Handler:
ret
#endif #endif

View File

@@ -0,0 +1,156 @@
; ***************************************************************************
; 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_TITLEWINDOW2_ASM
#define AQH_AVR_GUI_TITLEWINDOW2_ASM
.cseg
; ---------------------------------------------------------------------------
; @routine TitleWindow_Init @global
;
; @param Y pointer to titledwindow data (size=TITLEWINDOW_SIZE)
TitleWindow_Init:
bigcall Window_Init
ret
; @end
; ---------------------------------------------------------------------------
; @routine TitleWindow_SetFullSize @global
;
; @param Y pointer to screen object in SDRAM
; @clobbers any, !Y
TitleWindow_SetFullSize:
clr r16
std Y+WIN_OFFS_X_LO, r16
std Y+WIN_OFFS_X_HI, r16
std Y+WIN_OFFS_Y_LO, r16
std Y+WIN_OFFS_Y_HI, r16
ldi r16, LOW(DISPLAY_WIDTH)
std Y+WIN_OFFS_WIDTH_LO, r16
ldi r16, HIGH(DISPLAY_WIDTH)
std Y+WIN_OFFS_WIDTH_HI, r16
ldi r16, LOW(DISPLAY_HEIGHT)
std Y+WIN_OFFS_HEIGHT_LO, r16
ldi r16, HIGH(DISPLAY_HEIGHT)
std Y+WIN_OFFS_HEIGHT_HI, r16
ret
; @enb
; ---------------------------------------------------------------------------
; @routine TitleWindow_SetStyleColors @global
;
; @param Y pointer to screen object in SDRAM
; @clobbers any, !Y
TitleWindow_SetStyleColors:
ldi r16, LOW(STYLE_WIN_BACKGROUND)
ldi r17, HIGH(STYLE_WIN_BACKGROUND)
std Y+WIN_OFFS_BG_COL_LO, r16
std Y+WIN_OFFS_BG_COL_HI, r17
ldi r16, LOW(STYLE_WIN_FOREGROUND)
ldi r17, HIGH(STYLE_WIN_FOREGROUND)
std Y+WIN_OFFS_FG_COL_LO, r16
std Y+WIN_OFFS_FG_COL_HI, r17
ret
; @end
; ---------------------------------------------------------------------------
; @routine TitleWindow_DrawTitle @global
;
; @param Y pointer to screen object in SDRAM
; @param Z pointer to title
; @clobbers any, !Y
TitleWindow_DrawTitle:
; fill background of title area
clr r4
clr r5
clr r6
clr r7
ldd r8, Y+WIN_OFFS_WIDTH_LO
ldd r9, Y+WIN_OFFS_WIDTH_HI
ldi r16, LOW(STYLE_WIN_TITLE_HEIGHT)
ldi r17, HIGH(STYLE_WIN_TITLE_HEIGHT)
mov r10, r16
mov r11, r17
ldi r16, LOW(STYLE_WIN_TITLE_BACKGROUND)
mov r2, r16
ldi r16, HIGH(STYLE_WIN_TITLE_BACKGROUND)
mov r3, r16
rcall Window_FillRect
; draw title
ldi r16, 5 ; X
mov r4, r16
clr r5
ldi r16, 2 ; Y
mov r6, r16
clr r7
ldi r16, LOW(STYLE_WIN_TITLE_BACKGROUND)
mov r0, r16
ldi r16, HIGH(STYLE_WIN_TITLE_BACKGROUND)
mov r1, r16
ldi r16, LOW(STYLE_WIN_TITLE_FOREGROUND)
mov r2, r16
ldi r16, HIGH(STYLE_WIN_TITLE_FOREGROUND)
mov r3, r16
bigcall Window_DrawColorTextFlash
ret
; @end
; ---------------------------------------------------------------------------
; @routine TitleWindow_ClearContentArea @global
;
; @param Y pointer to screen object in SDRAM
; @clobbers any, !Y
TitleWindow_ClearContentArea:
clr r4
clr r5
ldi r16, LOW(STYLE_WIN_TITLE_HEIGHT)
mov r6, r16
ldi r16, HIGH(STYLE_WIN_TITLE_HEIGHT)
mov r7, r16
ldd r8, Y+WIN_OFFS_WIDTH_LO
ldd r9, Y+WIN_OFFS_WIDTH_HI
ldi r16, LOW(STYLE_WIN_TITLE_HEIGHT)
ldi r17, HIGH(STYLE_WIN_TITLE_HEIGHT)
ldd r10, Y+WIN_OFFS_HEIGHT_LO
ldd r11, Y+WIN_OFFS_HEIGHT_HI
sub r10, r16
sbc r11, r17
ldi r16, LOW(STYLE_WIN_BACKGROUND)
ldd r2, Y+WIN_OFFS_BG_COL_LO
ldd r3, Y+WIN_OFFS_BG_COL_HI
rcall Window_FillRect
ret
; @end
#endif

View File

@@ -11,6 +11,24 @@
#define AQH_AVR_GUI_WINDOW_ASM #define AQH_AVR_GUI_WINDOW_ASM
; ---------------------------------------------------------------------------
; @routine Window_Init @global
;
; @param Y pointer to screen object in SDRAM
; @clobbers R16, R17, X
Window_Init:
mov xl, yl
mov xh, yh
ldi r17, WIN_SIZE
clr r16
bigcall Utils_FillSram ; (R17, X)
ret
; @end
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine Window_Clear @global ; @routine Window_Clear @global
; ;
@@ -34,6 +52,32 @@ Window_Clear:
; ---------------------------------------------------------------------------
; @routine Window_FillRect @global
;
; @param Y pointer to screen object in SDRAM
; @param r3:r2 color
; @param r5:r4 X0
; @param r7:r6 Y0
; @param r9:r8 X1/W
; @param r11:r10 Y1/H
; @clobbers any, !Y
Window_FillRect:
ldd r16, Y+WIN_OFFS_X_LO ; make absolute coords
ldd r17, Y+WIN_OFFS_X_HI
add r4, r16
adc r5, r17
ldd r16, Y+WIN_OFFS_Y_LO
ldd r17, Y+WIN_OFFS_Y_HI
add r6, r16
adc r7, r17
bigcall Display_FillRect ; directly call graphics function
ret
; @end
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine Window_DrawTextFlash @global ; @routine Window_DrawTextFlash @global
; ;
@@ -41,25 +85,43 @@ Window_Clear:
; @param R5:R4 X (dest) ; @param R5:R4 X (dest)
; @param R7:R6 Y (dest) ; @param R7:R6 Y (dest)
; @return R5:R4 X pos behind string ; @return R5:R4 X pos behind string
; @clobbers any, !Y, !R6, !R7 ; @clobbers any, !Y, !R6, !R7
Window_DrawTextFlash: Window_DrawTextFlash:
rcall winCalcAbsPosAndBorders ; (R18, R19)
ldd r0, Y+WIN_OFFS_BG_COL_LO ldd r0, Y+WIN_OFFS_BG_COL_LO
ldd r1, Y+WIN_OFFS_BG_COL_HI ldd r1, Y+WIN_OFFS_BG_COL_HI
ldd r2, Y+WIN_OFFS_FG_COL_LO ldd r2, Y+WIN_OFFS_FG_COL_LO
ldd r3, Y+WIN_OFFS_FG_COL_HI ldd r3, Y+WIN_OFFS_FG_COL_HI
Window_DrawTextFlash_loop: rjmp Window_DrawColorTextFlash
; @end
; ---------------------------------------------------------------------------
; @routine Window_DrawColorTextFlash @global
;
; @param Y pointer to screen object in SDRAM
; @param R1:R0 background color
; @param R3:R2 foreground color
; @param R5:R4 X (dest)
; @param R7:R6 Y (dest)
; @return R5:R4 X pos behind string
; @clobbers any, !Y, !R6, !R7
Window_DrawColorTextFlash:
rcall winCalcAbsPosAndBorders ; (R18, R19)
Window_DrawColorTextFlash_loop:
lpm r16, Z lpm r16, Z
tst r16 tst r16
breq Window_DrawTextFlash_loopEnd breq Window_DrawColorTextFlash_loopEnd
rcall winDrawChar rcall winDrawChar
brcc Window_DrawTextFlash_loopEnd brcc Window_DrawColorTextFlash_loopEnd
adiw zh:zl, 1 ; next char adiw zh:zl, 1 ; next char
rjmp Window_DrawTextFlash_loop rjmp Window_DrawColorTextFlash_loop
Window_DrawTextFlash_loopEnd: Window_DrawColorTextFlash_loopEnd:
ret ret
; @end ; @end

View File

@@ -7,5 +7,378 @@
; * Please see toplevel file COPYING of that project for license details. * ; * Please see toplevel file COPYING of that project for license details. *
; *************************************************************************** ; ***************************************************************************
#ifndef AQH_AVR_XPT2046_MAIN_ASM
#define AQH_AVR_XPT2046_MAIN_ASM
; ***************************************************************************
; defines
.equ XPT2046_SPIMODE = (1<<SPIHW_MODE_SPEED0_BIT) | \
(1<<SPIHW_MODE_SPEED1_BIT) | \
(0<<SPIHW_MODE_DOUBLESPEED_BIT) | \
(0<<SPIHW_MODE_DATAORDER_BIT) | \
(0<<SPIHW_MODE_CPOL_BIT) | \
(0<<SPIHW_MODE_CPHA_BIT)
.equ XPT2046_CMD_READ_X = 0xd1
.equ XPT2046_CMD_READ_Y = 0x91
.equ XPT2046_CMD_READ_Z1 = 0xb1
.equ XPT2046_CMD_READ_Z2 = 0xc1
.equ XPT2046_AVERAGE = 2
.equ XPT2046_Z_THRESHOLD = 500
.equ XPT2046_TIMER_VALUE = 3 ; every 300ms
.equ XPT2046_FLAGS_PRESSED_BIT = 7
.equ XPT2046_FLAGS_CHGCOORD_BIT = 6
.equ XPT2046_FLAGS_CHGPRESS_BIT = 5
; ***************************************************************************
; data
.dseg
xpt2046ValueBuffer: .byte (XPT2046_AVERAGE*2)
xpt2046CurrentX: .byte 2
xpt2046CurrentY: .byte 2
xpt2046CurrentZ: .byte 2
xpt2046Flags: .byte 1
xpt2046Timer: .byte 1
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine XPT2046_Init @global
XPT2046_Init:
clr r16
sts xpt2046CurrentX, r16
sts xpt2046CurrentX+1, r16
sts xpt2046CurrentY, r16
sts xpt2046CurrentY+1, r16
sts xpt2046CurrentZ, r16
sts xpt2046CurrentZ+1, r16
sts xpt2046Flags, r16
sts xpt2046Timer, r16
ret
; @end
; ---------------------------------------------------------------------------
; @routine XPT2046_Every100ms @global
XPT2046_Every100ms:
lds r16, xpt2046Timer
inc r16
cpi r16, XPT2046_TIMER_VALUE
brcs XPT2046_Every100ms_store
rcall xpt2046UpdateValues
clr r16
XPT2046_Every100ms_store:
sts xpt2046Timer, r16
ret
; @end
; ---------------------------------------------------------------------------
; @routine XPT2046_GetFlagsResetChg @global
;
; Return flags, clear stored flags XPT2046_FLAGS_CHGCOORD_BIT and
; XPT2046_FLAGS_CHGPRESS_BIT.
;
; @return r16 flags
; @clobbers r17
XPT2046_GetFlagsResetChg:
lds r16, xpt2046Flags
mov r17, r16
cbr r17, (1<<XPT2046_FLAGS_CHGCOORD_BIT) | (1<<XPT2046_FLAGS_CHGPRESS_BIT)
sts xpt2046Flags, r17
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046UpdateValues
xpt2046UpdateValues:
push r15
in r15, SREG
cli
lds r23, xpt2046Flags
rcall xpt2046BeginSpi ; (R16, R17)
#if 0
ldi r16, XPT2046_CMD_READ_X
rcall xpt2046SendCommandRecv12Bit ; (R16)
sts xpt2046CurrentX, r18
sts xpt2046CurrentX+1, r19
lds r24, xpt2046CurrentY
lds r25, xpt2046CurrentY+1
adiw r25:r24, 1
sts xpt2046CurrentY, r24
sts xpt2046CurrentY+1, r25
#else
rcall xpt2046UpdateX
rcall xpt2046UpdateY
rcall xpt2046UpdateZ
#endif
sts xpt2046Flags, r23
rcall xpt2046EndSpi ; (R16, R17)
out SREG, r15
pop r15
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046UpdateX
;
; @param r23 current xpt2046Flag (modified by routine)
; @clobbers (r16, r18, r19, r20, r21)
xpt2046UpdateX:
; dummy read
ldi r16, XPT2046_CMD_READ_X
rcall xpt2046SendCommandRecv12Bit ; (R16)
ldi r16, XPT2046_CMD_READ_X
rcall xpt2046ReadAvgValues ; (r16, r18, r19, r20, r21)
rcall xpt2046AverageValues ; (r16, r17, r21)
lds r16, xpt2046CurrentX
lds r17, xpt2046CurrentX+1
sts xpt2046CurrentX, r18
sts xpt2046CurrentX+1, r19
sub r16, r18
sbc r17, r19
breq xpt2046UpdateX_ret
ori r23, (1<<XPT2046_FLAGS_CHGCOORD_BIT)
xpt2046UpdateX_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046UpdateY
;
; @param r23 current xpt2046Flag (modified by routine)
; @clobbers (r16, r18, r19, r20, r21)
xpt2046UpdateY:
; read Y
ldi r16, XPT2046_CMD_READ_Y
rcall xpt2046ReadAvgValues ; (r16, r18, r19, r20, r21)
rcall xpt2046AverageValues ; (r16, r17, r21)
lds r16, xpt2046CurrentY
lds r17, xpt2046CurrentY+1
sts xpt2046CurrentY, r18
sts xpt2046CurrentY+1, r19
sub r16, r18
sbc r17, r19
breq xpt2046UpdateY_ret
ori r23, (1<<XPT2046_FLAGS_CHGCOORD_BIT)
xpt2046UpdateY_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046UpdateZ
;
; @param r23 current xpt2046Flag (modified by routine)
; @clobbers (r16, r18, r19, r20, r21)
xpt2046UpdateZ:
ldi r16, XPT2046_CMD_READ_Z1
rcall xpt2046SendCommandRecv12Bit ; (R16)
ldi r24, LOW(4095)
ldi r25, HIGH(4095)
add r24, r18
adc r25, r19
ldi r16, XPT2046_CMD_READ_Z2
rcall xpt2046SendCommandRecv12Bit ; (R16)
sub r24, r18
sbc r25, r19
sts xpt2046CurrentZ, r24
sts xpt2046CurrentZ+1, r25
ldi r16, LOW(XPT2046_Z_THRESHOLD)
ldi r17, HIGH(XPT2046_Z_THRESHOLD)
sub r24, r16
sbc r25, r17
mov r16, r23
brcs xpt2046UpdateZ_overThreshold
cbr r23, (1<<XPT2046_FLAGS_PRESSED_BIT) ; Z below threshold, not pressed
rjmp xpt2046UpdateZ_checkPressChg
xpt2046UpdateZ_overThreshold:
ori r23, (1<<XPT2046_FLAGS_PRESSED_BIT)
xpt2046UpdateZ_checkPressChg:
eor r16, r23
andi r16, (1<<XPT2046_FLAGS_PRESSED_BIT)
breq xpt2046UpdateZ_ret
ori r23, (1<<XPT2046_FLAGS_CHGPRESS_BIT)
xpt2046UpdateZ_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046AverageValues
;
; @return r19:r18 averaged value
; @clobbers r16, r17, r21
xpt2046AverageValues:
ldi xl, LOW(xpt2046ValueBuffer)
ldi xh, HIGH(xpt2046ValueBuffer)
ldi r21, XPT2046_AVERAGE
clr r18
clr r19
xpt2046AverageValues_loop:
ld r16, X+
ld r17, X+
add r18, r16
adc r19, r17
dec r21
brne xpt2046AverageValues_loop
.if (XPT2046_AVERAGE == 2)
lsr r19
ror r18
.elif (XPT2046_AVERAGE == 4)
lsr r19
ror r18
lsr r19
ror r18
.else
.error "XPT2046_AVERAGE is not 4"
.endif
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046ReadAvgValues
;
; @param r16 command
; @clobbers r16, r18, r19, r20, r21
xpt2046ReadAvgValues:
ldi xl, LOW(xpt2046ValueBuffer)
ldi xh, HIGH(xpt2046ValueBuffer)
mov r20, r16
ldi r21, XPT2046_AVERAGE
xpt2046ReadAvgValues_loop:
mov r16, r20
rcall xpt2046SendCommandRecv12Bit ; (R16)
st X+, r18
st X+, r19
dec r21
brne xpt2046ReadAvgValues_loop
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046BeginSpi
;
; @clobbers r16, r17
xpt2046BeginSpi:
ldi r16, XPT2046_SPIMODE
ldi r17, XPT2046_DEVICENUM
rjmp SPIHW_MasterStart ; (R17)
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046EndSpi
;
; @clobbers r16
xpt2046EndSpi:
rjmp SPIHW_MasterStop ; (R16)
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046SendCommandRecv12Bit
;
; @param r16 command
; @return r19:18 data
; @clobbers r16
xpt2046SendCommandRecv12Bit:
rcall xpt2046SendCommandRecv16Bit
lsr r19 ; >>1
ror r18
lsr r19 ; >>2
ror r18
lsr r19 ; >>3
ror r18
lsr r19 ; >>4
ror r18
ret
; @end
; ---------------------------------------------------------------------------
; @routine xpt2046SendCommandRecv16Bit
;
; @param r16 command
; @return r19:18 data
; @clobbers r16
xpt2046SendCommandRecv16Bit:
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
rcall SPIHW_MasterTransfer ; (R16)
clr r16
rcall SPIHW_MasterTransfer ; (R16)
mov r19, r16
clr r16
rcall SPIHW_MasterTransfer ; (R16)
mov r18, r16
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
ret
; @end
#endif ; AQH_AVR_XPT2046_MAIN_ASM