diff --git a/avr/devices/all/includes.asm b/avr/devices/all/includes.asm index e2e1dc7..1c522d1 100644 --- a/avr/devices/all/includes.asm +++ b/avr/devices/all/includes.asm @@ -247,6 +247,7 @@ #ifdef MODULES_ILI9341 .include "modules/lcd2/ili9341/defs.asm" +.include "modules/lcd2/ili9341/colors.asm" .include "modules/lcd2/ili9341/main.asm" .include "modules/lcd2/ili9341/io_spi.asm" .include "modules/lcd2/ili9341/graphops.asm" diff --git a/avr/devices/c02/main/main.asm b/avr/devices/c02/main/main.asm index 3668710..c7521d5 100644 --- a/avr/devices/c02/main/main.asm +++ b/avr/devices/c02/main/main.asm @@ -213,6 +213,14 @@ onEveryLoop: +test: +#ifdef MODULES_GUI + bigcall WinNetStats_Init +#endif + ret + + + ; *************************************************************************** @@ -223,6 +231,7 @@ onEveryLoop: ;.include "common/debug.asm" + .include "modules/lcd2/gui/titledwindow.asm" ;.include "modules/lcd2/font/font2.asm" ;.include "modules/lcd2/font/font3.asm" ;.include "modules/lcd2/font/font16x26.asm" @@ -234,6 +243,9 @@ onEveryLoop: ;.include "common/tree_t.asm" ;.include "common/divide.asm" + .include "modules/lcd2/gui/style.asm" + .include "win_netstats.asm" + ; --------------------------------------------------------------------------- ; defines for network interface @@ -245,93 +257,9 @@ onEveryLoop: -test: -#ifdef MODULES_GUI - ldi yl, LOW(mainWindow) - ldi yh, HIGH(mainWindow) - ldi zl, LOW(mainWindowInFlash*2); - ldi zh, HIGH(mainWindowInFlash*2); - ldi r17, WIN_SIZE -testCopyWinLoop: - lpm r16, Z+ - st Y+, r16 - dec r17 - brne testCopyWinLoop - - ldi yl, LOW(mainWindow) - ldi yh, HIGH(mainWindow) - bigcall Window_Clear -#if 1 - ldi zl, LOW(mainWindowTitle*2) - ldi zh, HIGH(mainWindowTitle*2) - ; print title at 10/2 - ldi r16, 10 - mov r4, r16 - clr r5 - ldi r16, 2 - mov r6, r16 - clr r7 - bigcall Window_DrawTextFlash -#else - ldi zl, LOW(ili9341Font6x8_1*2) - ldi zh, HIGH(ili9341Font6x8_1*2) - - ldi r16, LOW(0b0000000000000000) - mov r0, r16 - ldi r16, HIGH(0b0000000000000000) - mov r1, r16 - - ldi r16, LOW(0b1111111111111111) - mov r2, r16 - ldi r16, HIGH(0b1111111111111111) - mov r3, r16 - - ldi r16, 10 - mov r4, r16 - clr r5 - ldi r16, 20 - mov r6, r16 - clr r7 - - ldi r16, 'A' - bigcall Display_DrawChar - - add r4, r18 - adc r5, r19 - - ldi r16, 'B' - bigcall Display_DrawChar - -#endif - ret - - -testHandler: - ret - - -#ifdef MODULES_GUI -mainWindowInFlash: - .dw testHandler ; handler - .dw 0 ; X - .dw 0 ; Y - .dw DISPLAY_WIDTH - .dw DISPLAY_HEIGHT -; 0bRRRRRGGGGGGBBBBB - .dw 0b0000000000011111 ; blue -; .dw 0b1111100000000000 ; red - .dw 0b1111111111111111 ; white - .dw (ili9341Font6x8_1*2) - -mainWindowTitle: .db "AQHOME", 0, 0 -#endif - - .dseg -mainWindow: .byte WIN_SIZE - heapStart: diff --git a/avr/devices/c02/main/win_netstats.asm b/avr/devices/c02/main/win_netstats.asm new file mode 100644 index 0000000..4655a95 --- /dev/null +++ b/avr/devices/c02/main/win_netstats.asm @@ -0,0 +1,67 @@ +; *************************************************************************** +; 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_DEVICE_C02_WIN_NETSTATS_ASM +#define AQH_AVR_DEVICE_C02_WIN_NETSTATS_ASM + + +.cseg + + +WinNetStats_Init: + ; setup + ldi yl, LOW(winNetstats) + ldi yh, HIGH(winNetstats) + rcall TitleWindow_Init + + ldi zl, LOW(ili9341Font6x8_1*2) + ldi zh, HIGH(ili9341Font6x8_1*2) + bigcall TitleWindow_SetFont + + ldi r16, LOW(winNetstats_title*2) + std Y+TITLEDWINDOW_OFFS_TITLEPTR_LO, r16 + ldi r16, HIGH(winNetstats_title*2) + std Y+TITLEDWINDOW_OFFS_TITLEPTR_HI, r16 + + ; setup size and pos + clr r4 + clr r5 + clr r6 + clr r7 + ldi r16, LOW(DISPLAY_WIDTH) + mov r8, r16 + ldi r16, HIGH(DISPLAY_WIDTH) + mov r9, r16 + ldi r16, LOW(DISPLAY_HEIGHT) + mov r10, r16 + ldi r16, HIGH(DISPLAY_HEIGHT) + mov r11, r16 + bigcall TitleWindow_SetPosAndSize + + ; setup colors + bigcall TitleWindow_SetStyleColors + + bigcall TitleWindow_Draw + ret +; @end + + + +winNetstats_title: .db "Network Statistics", 0, 0 + + + +.dseg + +winNetstats: + .byte TITLEDWINDOW_SIZE + + + +#endif diff --git a/avr/modules/lcd2/gui/0BUILD b/avr/modules/lcd2/gui/0BUILD index 1d6fe97..841d560 100644 --- a/avr/modules/lcd2/gui/0BUILD +++ b/avr/modules/lcd2/gui/0BUILD @@ -5,6 +5,8 @@ defs.asm main.asm + style.asm + titledwindow.asm window.asm diff --git a/avr/modules/lcd2/gui/defs.asm b/avr/modules/lcd2/gui/defs.asm index 0ddc851..df1ab37 100644 --- a/avr/modules/lcd2/gui/defs.asm +++ b/avr/modules/lcd2/gui/defs.asm @@ -32,6 +32,12 @@ +.equ WIN_EVENT_DESTROY = 1 +.equ WIN_EVENT_SHOW = 2 +.equ WIN_EVENT_HIDE = 3 +.equ WIN_EVENT_DRAW = 4 +.equ WIN_EVENT_TIMER = 5 + #endif diff --git a/avr/modules/lcd2/gui/style.asm b/avr/modules/lcd2/gui/style.asm new file mode 100644 index 0000000..3d417bd --- /dev/null +++ b/avr/modules/lcd2/gui/style.asm @@ -0,0 +1,24 @@ +; *************************************************************************** +; 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_STYLE_ASM +#define AQH_AVR_GUI_STYLE_ASM + + +.equ STYLE_WIN_TITLE_BACKGROUND = DISPLAY_COLOR_NAVY +.equ STYLE_WIN_TITLE_FOREGROUND = DISPLAY_COLOR_WHITE +.equ STYLE_WIN_BACKGROUND = DISPLAY_COLOR_LIGHTGREY +.equ STYLE_WIN_FOREGROUND = DISPLAY_COLOR_BLACK + + +.equ STYLE_WIN_TITLE_HEIGHT = 20 + + +#endif + diff --git a/avr/modules/lcd2/gui/titledwindow.asm b/avr/modules/lcd2/gui/titledwindow.asm new file mode 100644 index 0000000..f6e6bc7 --- /dev/null +++ b/avr/modules/lcd2/gui/titledwindow.asm @@ -0,0 +1,214 @@ +; *************************************************************************** +; 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_TITLEDWINDOW_ASM +#define AQH_AVR_GUI_TITLEDWINDOW_ASM + + + +.equ TITLEDWINDOW_OFFS_SELF = 0 +.equ TITLEDWINDOW_OFFS_TITLEPTR_LO = WIN_SIZE +.equ TITLEDWINDOW_OFFS_TITLEPTR_HI = WIN_SIZE+1 +.equ TITLEDWINDOW_OFFS_TITLEWIN = TITLEDWINDOW_OFFS_TITLEPTR_HI+1 +.equ TITLEDWINDOW_OFFS_CONTENTWIN = TITLEDWINDOW_OFFS_TITLEWIN+WIN_SIZE +.equ TITLEDWINDOW_SIZE = TITLEDWINDOW_OFFS_CONTENTWIN+WIN_SIZE + + + +.cseg + + +; --------------------------------------------------------------------------- +; @routine TitleWindow_Init @global +; +; @param Y pointer to titledwindow data (size=TITLEDWINDOW_SIZE) + +TitleWindow_Init: + mov xl, yl + mov xh, yh + ldi r17, TITLEDWINDOW_SIZE + clr r16 + bigcall Utils_FillSram ; (R17, X) + + ldi r16, LOW(TitleWindow_Handler) + std Y+(TITLEDWINDOW_OFFS_SELF+WIN_OFFS_HANDLER_LO), r16 + ldi r16, HIGH(TitleWindow_Handler) + std Y+(TITLEDWINDOW_OFFS_SELF+WIN_OFFS_HANDLER_HI), r16 + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine TitleWindow_SetFont @global +; +; @param Y pointer to screen object in SDRAM +; @param Z pointer to font +; @clobbers any, !Y + +TitleWindow_SetFont: + std Y+WIN_OFFS_FONT_LO, zl + std Y+WIN_OFFS_FONT_HI, zh + + ; setup title window + adiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN + std Y+WIN_OFFS_FONT_LO, zl + std Y+WIN_OFFS_FONT_HI, zh + sbiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN + + ; setup content window + adiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN + std Y+WIN_OFFS_FONT_LO, zl + std Y+WIN_OFFS_FONT_HI, zh + sbiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN + + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine TitleWindow_SetPosAndSize @global +; +; @param Y pointer to screen object in SDRAM +; @param R5:R4 X (abs) +; @param R7:R6 Y (abs) +; @param R9:R8 W +; @param R11:R10 H +; @clobbers any, !Y + +TitleWindow_SetPosAndSize: + std Y+WIN_OFFS_X_LO, r4 + std Y+WIN_OFFS_X_HI, r5 + std Y+WIN_OFFS_Y_LO, r6 + std Y+WIN_OFFS_Y_HI, r7 + std Y+WIN_OFFS_WIDTH_LO, r8 + std Y+WIN_OFFS_WIDTH_HI, r9 + std Y+WIN_OFFS_HEIGHT_LO, r10 + std Y+WIN_OFFS_HEIGHT_HI, r11 + + ; setup title window + adiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN + std Y+WIN_OFFS_X_LO, r4 + std Y+WIN_OFFS_X_HI, r5 + std Y+WIN_OFFS_Y_LO, r6 + std Y+WIN_OFFS_Y_HI, r7 + std Y+WIN_OFFS_WIDTH_LO, r8 + std Y+WIN_OFFS_WIDTH_HI, r9 + ldi r16, LOW(STYLE_WIN_TITLE_HEIGHT) + ldi r17, HIGH(STYLE_WIN_TITLE_HEIGHT) + std Y+WIN_OFFS_HEIGHT_LO, r16 + std Y+WIN_OFFS_HEIGHT_HI, r17 + sbiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN + + ; setup content window + adiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN + std Y+WIN_OFFS_X_LO, r4 + std Y+WIN_OFFS_X_HI, r5 + ldi r16, LOW(STYLE_WIN_TITLE_HEIGHT) + ldi r17, HIGH(STYLE_WIN_TITLE_HEIGHT) + add r16, r6 + adc r16, r7 + std Y+WIN_OFFS_Y_LO, r16 + std Y+WIN_OFFS_Y_HI, r17 + std Y+WIN_OFFS_WIDTH_LO, r8 + std Y+WIN_OFFS_WIDTH_HI, r9 + mov r16, r10 + mov r17, r11 + subi r16, LOW(STYLE_WIN_TITLE_HEIGHT) + sbci r17, HIGH(STYLE_WIN_TITLE_HEIGHT) + std Y+WIN_OFFS_HEIGHT_LO, r16 + std Y+WIN_OFFS_HEIGHT_HI, r17 + sbiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN + + ret +; @end + + + +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 + + ; setup title window + adiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN + ldi r16, LOW(STYLE_WIN_TITLE_BACKGROUND) + ldi r17, HIGH(STYLE_WIN_TITLE_BACKGROUND) + std Y+WIN_OFFS_BG_COL_LO, r16 + std Y+WIN_OFFS_BG_COL_HI, r17 + ldi r16, LOW(STYLE_WIN_TITLE_FOREGROUND) + ldi r17, HIGH(STYLE_WIN_TITLE_FOREGROUND) + std Y+WIN_OFFS_FG_COL_LO, r16 + std Y+WIN_OFFS_FG_COL_HI, r17 + sbiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN + + ; setup content window + adiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN + 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 + sbiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN + + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine TitleWindow_Draw @global +; +; @param Y pointer to titledwindow data (size=TITLEDWINDOW_SIZE) + +TitleWindow_Draw: + ; draw title window + adiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN + rcall Window_Clear + sbiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN + + ; write header + ldd zl, Y+TITLEDWINDOW_OFFS_TITLEPTR_LO + ldd zh, Y+TITLEDWINDOW_OFFS_TITLEPTR_HI + adiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN + ldi r16, 5 + mov r4, r16 + clr r5 + ldi r16, 5 + mov r6, r16 + clr r7 + rcall Window_DrawTextFlash + sbiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN + + ; clear content window + adiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN + rcall Window_Clear + sbiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN + + ret +; @end + + + +TitleWindow_Handler: + ret + + + + +#endif diff --git a/avr/modules/lcd2/ili9341/colors.asm b/avr/modules/lcd2/ili9341/colors.asm index 5b2fc42..b0f6dfb 100644 --- a/avr/modules/lcd2/ili9341/colors.asm +++ b/avr/modules/lcd2/ili9341/colors.asm @@ -15,9 +15,30 @@ ; FEDCBA9876543210 ; 0bRRRRRGGGGGGBBBBB -#define DISPLAY_COLOR_FROM_RGB(r, g, b) ((r<<11) | (g<<5) | (b & 0x1f)) +;#define DISPLAY_COLOR_FROM_RGB(r, g, b) ((r<<11) | (g<<5) | (b & 0x1f)) +.equ DISPLAY_COLOR_BLACK = 0x0000 ; 0, 0, 0 +.equ DISPLAY_COLOR_NAVY = 0x000F ; 0, 0, 128 +.equ DISPLAY_COLOR_DARKGREEN = 0x03E0 ; 0, 128, 0 +.equ DISPLAY_COLOR_DARKCYAN = 0x03EF ; 0, 128, 128 +.equ DISPLAY_COLOR_MAROON = 0x7800 ; 128, 0, 0 +.equ DISPLAY_COLOR_PURPLE = 0x780F ; 128, 0, 128 +.equ DISPLAY_COLOR_OLIVE = 0x7BE0 ; 128, 128, 0 +.equ DISPLAY_COLOR_LIGHTGREY = 0xC618 ; 192, 192, 192 +.equ DISPLAY_COLOR_DARKGREY = 0x7BEF ; 128, 128, 128 +.equ DISPLAY_COLOR_BLUE = 0x001F ; 0, 0, 255 +.equ DISPLAY_COLOR_GREEN = 0x07E0 ; 0, 255, 0 +.equ DISPLAY_COLOR_CYAN = 0x07FF ; 0, 255, 255 +.equ DISPLAY_COLOR_RED = 0xF800 ; 255, 0, 0 +.equ DISPLAY_COLOR_MAGENTA = 0xF81F ; 255, 0, 255 +.equ DISPLAY_COLOR_YELLOW = 0xFFE0 ; 255, 255, 0 +.equ DISPLAY_COLOR_WHITE = 0xFFFF ; 255, 255, 255 +.equ DISPLAY_COLOR_ORANGE = 0xFD20 ; 255, 165, 0 +.equ DISPLAY_COLOR_GREENYELLOW = 0xAFE5 ; 173, 255, 47 +.equ DISPLAY_COLOR_PINK = 0xF81F + + #endif diff --git a/avr/modules/lcd2/ili9341/font12x20.asm b/avr/modules/lcd2/ili9341/font12x20.asm index f9e4ca2..eee3be1 100644 --- a/avr/modules/lcd2/ili9341/font12x20.asm +++ b/avr/modules/lcd2/ili9341/font12x20.asm @@ -47,7 +47,7 @@ ili9341Font12x20MonoHandlerFn: ili9341Font12x20MonoRenderChar: push zl push zh - rcall ili9341Font12x20GetCharPosInFont ; (r17, r24, r25, z) + rcall ili9341Font12x20GetCharPosInFont ; (r24, r25, z) ldi r25, 20 ; 20 bytes height ili9341Font12x20MonoRenderChar_loop1: ldi r24, 12 ; 16 bits @@ -68,10 +68,10 @@ ili9341Font12x20MonoRenderChar_writeForeground: mov r18, r2 mov r19, r3 ili9341Font12x20MonoRenderChar_sendToDisplay: - mov r16, r18 - rcall SPIHW_MasterTransfer ; (R16) mov r16, r19 rcall SPIHW_MasterTransfer ; (R16) + mov r16, r18 + rcall SPIHW_MasterTransfer ; (R16) ili9341Font12x20MonoRenderChar_loop2end: dec r24 brne ili9341Font12x20MonoRenderChar_loop2 @@ -92,7 +92,7 @@ ili9341Font12x20MonoRenderChar_loop2end: ; @param R16 character to write ; @param Z pointer to font ; @return Z pointer to begin of char data -; @clobbers r17, r24, r25, z +; @clobbers r24, r25, z ili9341Font12x20GetCharPosInFont: mov r24, r16