diff --git a/avr/devices/all/includes.asm b/avr/devices/all/includes.asm index 1c522d1..e981879 100644 --- a/avr/devices/all/includes.asm +++ b/avr/devices/all/includes.asm @@ -254,6 +254,10 @@ .include "modules/lcd2/ili9341/text.asm" #endif +#ifdef MODULES_XPT2046 +.include "modules/lcd2/xpt2046/main.asm" +#endif + #ifdef MODULES_FONT .include "modules/lcd2/font/defs.asm" .include "modules/lcd2/font/main.asm" diff --git a/avr/devices/all/main.asm b/avr/devices/all/main.asm index 09b0a9d..930678f 100644 --- a/avr/devices/all/main.asm +++ b/avr/devices/all/main.asm @@ -183,6 +183,10 @@ onSystemTimerTick: bigcall GUI_Every100ms #endif +#ifdef MODULES_XPT2046 + bigcall XPT2046_Every100ms +#endif + #ifdef APPS_NETWORK ldi yl, LOW(netInterfaceData) diff --git a/avr/devices/all/modules.asm b/avr/devices/all/modules.asm index be92db5..ae613d2 100644 --- a/avr/devices/all/modules.asm +++ b/avr/devices/all/modules.asm @@ -193,6 +193,10 @@ initModules: bigcall ILI9341_Init #endif +#ifdef MODULES_XPT2046 + bigcall XPT2046_Init +#endif + #ifdef MODULES_GUI bigcall GUI_Init #endif diff --git a/avr/devices/c02/defs.asm b/avr/devices/c02/defs.asm index 4095865..a73734c 100644 --- a/avr/devices/c02/defs.asm +++ b/avr/devices/c02/defs.asm @@ -151,6 +151,13 @@ +; --------------------------------------------------------------------------- +; XPT2046 module + +.equ XPT2046_DEVICENUM = 1 + + + ; --------------------------------------------------------------------------- ; ComOnUart module diff --git a/avr/devices/c02/main/main.asm b/avr/devices/c02/main/main.asm index 9369ea2..619d9bf 100644 --- a/avr/devices/c02/main/main.asm +++ b/avr/devices/c02/main/main.asm @@ -56,6 +56,7 @@ #define MODULES_COM2W #define MODULES_SPI_HW #define MODULES_ILI9341 +#define MODULES_XPT2046 #define MODULES_FONT #define MODULES_GUI ;#define MODULES_TWI_MASTER @@ -169,6 +170,8 @@ irqNotSet: ; @routine onSystemStart onSystemStart: + clr r16 + sts statsUpdateTimer, r16 bigcall test ret ; @end @@ -193,15 +196,26 @@ onMessageReceived: ; Called every 100ms. Add your routine calls here. No arguments, no results. onEvery100ms: -onEverySecond: +onEveryMinute: onEveryHour: onEveryDay: ret ; @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 + clr r16 + sts statsUpdateTimer, r16 +#endif ret @@ -220,7 +234,7 @@ onEveryLoop: test: #ifdef MODULES_GUI bigcall WinNetStats_Init - bigcall WinNetStats_Draw + bigcall WinNetStats_Show #endif ret @@ -236,7 +250,7 @@ test: ;.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/font3.asm" ;.include "modules/lcd2/font/font16x26.asm" @@ -265,6 +279,8 @@ test: .dseg +statsUpdateTimer: .byte 1 + heapStart: diff --git a/avr/devices/c02/main/win_netstats.asm b/avr/devices/c02/main/win_netstats.asm index 0919255..8a09fce 100644 --- a/avr/devices/c02/main/win_netstats.asm +++ b/avr/devices/c02/main/win_netstats.asm @@ -15,20 +15,20 @@ WinNetStats_Init: + clr r16 + sts winNetstatsUpdateNum, r16 + sts winNetstatsUpdateNum+1, r16 + ; setup ldi yl, LOW(winNetstats) ldi yh, HIGH(winNetstats) bigcall TitleWindow_Init - ldi zl, LOW(ili9341Font12x20_1*2) - ldi zh, HIGH(ili9341Font12x20_1*2) - bigcall TitleWindow_SetFont + ldi zl, LOW(STYLE_WIN_FONT*2) + ldi zh, HIGH(STYLE_WIN_FONT*2) + 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_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 @1 label addr -; @param @2 data address -.macro WINNETSTATS_PRINTDATA +.macro WINNETSTATS_PRINTLABEL ; packets in ldi zl, LOW(@1 * 2) ldi zh, HIGH(@1 * 2) ldi r16, 2 ; X mov r4, r16 clr r5 - ldi r16, LOW(@0) ; Y + ldi r16, LOW(STYLE_WIN_TITLE_HEIGHT+@0) ; Y mov r6, r16 - ldi r16, HIGH(@0) + ldi r16, HIGH(STYLE_WIN_TITLE_HEIGHT+@0) mov r7, r16 bigcall Window_DrawTextFlash - +.endmacro + + + +; @param @0 Y +; @param @1 data address + +.macro WINNETSTATS_PRINTDATA ldi r16, 160 ; X mov r4, r16 clr r5 - ldi r16, LOW(@0) ; Y + ldi r16, LOW(STYLE_WIN_TITLE_HEIGHT+@0) ; Y mov r6, r16 ldi r16, HIGH(@0) mov r7, r16 - lds r16, @2 ; data - lds r17, @2+1 + lds r16, @1 ; data + lds r17, @1+1 bigcall Window_WriteHexWordAt .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: + lds r16, winNetstatsUpdateNum + inc r16 + sts winNetstatsUpdateNum, r16 + ldi yl, LOW(winNetstats) ldi yh, HIGH(winNetstats) - adiw yh:yl, TITLEWINDOW_OFFS_CONTENTWIN - bigcall Window_Clear - ; packets in - WINNETSTATS_PRINTDATA 2, winNetstats_lPacketsIn, netInterfaceData+NET_IFACE_OFFS_PACKETSIN_LOW + WINNETSTATS_PRINTDATA 2, netInterfaceData+NET_IFACE_OFFS_PACKETSIN_LOW ; packets out - WINNETSTATS_PRINTDATA 24, winNetstats_lPacketsOut, netInterfaceData+NET_IFACE_OFFS_PACKETSOUT_LOW + WINNETSTATS_PRINTDATA 24, netInterfaceData+NET_IFACE_OFFS_PACKETSOUT_LOW ; eContent - WINNETSTATS_PRINTDATA 46, winNetstats_lContentErr, netInterfaceData+NET_IFACE_OFFS_ERR_CONTENT_LOW + WINNETSTATS_PRINTDATA 46, netInterfaceData+NET_IFACE_OFFS_ERR_CONTENT_LOW ; eIO - WINNETSTATS_PRINTDATA 68, winNetstats_lIoErr, netInterfaceData+NET_IFACE_OFFS_ERR_IO_LOW + WINNETSTATS_PRINTDATA 68, netInterfaceData+NET_IFACE_OFFS_ERR_IO_LOW ; 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 ; @end @@ -107,13 +151,20 @@ winNetstats_lPacketsOut: .db "Pkgs Out:", 0 winNetstats_lContentErr: .db "eContent:", 0 winNetstats_lIoErr: .db "eIO :", 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 -winNetstats: - .byte TITLEWINDOW_SIZE - +winNetstatsUpdateNum: .byte 2 #endif diff --git a/avr/devices/n27/main/main.asm b/avr/devices/n27/main/main.asm index dbaecad..ae824e5 100644 --- a/avr/devices/n27/main/main.asm +++ b/avr/devices/n27/main/main.asm @@ -51,8 +51,6 @@ .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 PROGRAM_SENSOR_INTERVAL_SECS = 60 -.equ PROGRAM_STATS_INTERVAL_MINS = 10 diff --git a/avr/modules/lcd2/gui/0BUILD b/avr/modules/lcd2/gui/0BUILD index 198b276..7ad68a8 100644 --- a/avr/modules/lcd2/gui/0BUILD +++ b/avr/modules/lcd2/gui/0BUILD @@ -4,6 +4,7 @@ defs.asm + dialog.asm main.asm style.asm titlewindow.asm diff --git a/avr/modules/lcd2/gui/defs.asm b/avr/modules/lcd2/gui/defs.asm index df1ab37..bb3347f 100644 --- a/avr/modules/lcd2/gui/defs.asm +++ b/avr/modules/lcd2/gui/defs.asm @@ -12,23 +12,21 @@ -.equ WIN_OFFS_HANDLER_LO = 0 ; word address! -.equ WIN_OFFS_HANDLER_HI = 1 -.equ WIN_OFFS_X_LO = 2 -.equ WIN_OFFS_X_HI = 3 -.equ WIN_OFFS_Y_LO = 4 -.equ WIN_OFFS_Y_HI = 5 -.equ WIN_OFFS_WIDTH_LO = 6 -.equ WIN_OFFS_WIDTH_HI = 7 -.equ WIN_OFFS_HEIGHT_LO = 8 -.equ WIN_OFFS_HEIGHT_HI = 9 -.equ WIN_OFFS_BG_COL_LO = 10 -.equ WIN_OFFS_BG_COL_HI = 11 -.equ WIN_OFFS_FG_COL_LO = 12 -.equ WIN_OFFS_FG_COL_HI = 13 -.equ WIN_OFFS_FONT_LO = 14 ;byte address! -.equ WIN_OFFS_FONT_HI = 15 -.equ WIN_SIZE = 16 +.equ WIN_OFFS_X_LO = 0 +.equ WIN_OFFS_X_HI = 1 +.equ WIN_OFFS_Y_LO = 2 +.equ WIN_OFFS_Y_HI = 3 +.equ WIN_OFFS_WIDTH_LO = 4 +.equ WIN_OFFS_WIDTH_HI = 5 +.equ WIN_OFFS_HEIGHT_LO = 6 +.equ WIN_OFFS_HEIGHT_HI = 7 +.equ WIN_OFFS_BG_COL_LO = 8 +.equ WIN_OFFS_BG_COL_HI = 9 +.equ WIN_OFFS_FG_COL_LO = 10 +.equ WIN_OFFS_FG_COL_HI = 11 +.equ WIN_OFFS_FONT_LO = 12 ;byte address! +.equ WIN_OFFS_FONT_HI = 13 +.equ WIN_SIZE = 14 diff --git a/avr/modules/lcd2/gui/dialog.asm b/avr/modules/lcd2/gui/dialog.asm new file mode 100644 index 0000000..ba4001c --- /dev/null +++ b/avr/modules/lcd2/gui/dialog.asm @@ -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<>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 +