avr: removed old lcd2/gui, replaced by lcd2/gui2.

This commit is contained in:
Martin Preuss
2026-04-14 23:53:30 +02:00
parent 7fb21a2f06
commit 0df5c68fb3
34 changed files with 51 additions and 4835 deletions

View File

@@ -63,13 +63,10 @@
;#define MODULES_LCD ;#define MODULES_LCD
;#define LCD_MINIMAL_FONT ;#define LCD_MINIMAL_FONT
;#define MODULES_SI7021 ;#define MODULES_SI7021
;#define MODULES_SGP30
;#define MODULES_SGP40
;#define MODULES_STATS ;#define MODULES_STATS
;#define MODULES_OWI_MASTER ;#define MODULES_OWI_MASTER
;#define MODULES_DS18B20
;#define MODULES_MOTION ;#define MODULES_MOTION
;#define MODULES_CCS811 ;#define MODULES_BRIGHTNESS
#define APPS_NETWORK #define APPS_NETWORK
;#define APPS_MOTION ;#define APPS_MOTION
@@ -526,29 +523,24 @@ Debug_Style:
.include "style.asm" .include "style.asm"
GUI2_MODULE_BEGIN: GUI_MODULE_BEGIN:
.include "modules/lcd2/gui2/base/object.asm" .include "modules/lcd2/gui/base/object.asm"
.include "modules/lcd2/gui2/base/widget.asm" .include "modules/lcd2/gui/base/widget.asm"
;.include "modules/lcd2/gui2/base/layout.asm" .include "modules/lcd2/gui/base/guiapp.asm"
;.include "modules/lcd2/gui2/base/hlayout.asm" .include "modules/lcd2/gui/base/rootwindow.asm"
;.include "modules/lcd2/gui2/base/vlayout.asm" .include "modules/lcd2/gui/base/label.asm"
;.include "modules/lcd2/gui2/base/mlayout.asm" .include "modules/lcd2/gui/base/button.asm"
;.include "modules/lcd2/gui2/base/mlayout_column.asm" .include "modules/lcd2/gui/base/imageview.asm"
.include "modules/lcd2/gui2/base/guiapp.asm" .include "modules/lcd2/gui/base/valuelabel.asm"
.include "modules/lcd2/gui2/base/rootwindow.asm" .include "modules/lcd2/gui/base/layout.asm"
.include "modules/lcd2/gui2/base/label.asm" .include "modules/lcd2/gui/base/hlayout.asm"
.include "modules/lcd2/gui2/base/button.asm" .include "modules/lcd2/gui/base/vlayout.asm"
.include "modules/lcd2/gui2/base/imageview.asm" .include "modules/lcd2/gui/base/mclayout.asm"
.include "modules/lcd2/gui2/base/valuelabel.asm" .include "modules/lcd2/gui/base/mainwindow.asm"
.include "modules/lcd2/gui2/base/layout.asm" .include "modules/lcd2/gui/aqhome/sensorwatch.asm"
.include "modules/lcd2/gui2/base/hlayout.asm" .include "modules/lcd2/gui/screensavers/simple.asm"
.include "modules/lcd2/gui2/base/vlayout.asm" GUI_MODULE_END:
.include "modules/lcd2/gui2/base/mclayout.asm" .equ MODULE_SIZE_GUI = GUI_MODULE_END-GUI_MODULE_BEGIN
.include "modules/lcd2/gui2/base/mainwindow.asm"
.include "modules/lcd2/gui2/aqhome/sensorwatch.asm"
.include "modules/lcd2/gui2/screensavers/simple.asm"
GUI2_MODULE_END:
.equ MODULE_SIZE_GUI2 = GUI2_MODULE_END-GUI2_MODULE_BEGIN
.include "a_c03.asm" .include "a_c03.asm"
.include "w_menu.asm" .include "w_menu.asm"

View File

@@ -2,10 +2,16 @@
<gwbuild> <gwbuild>
<subdirs>
aqhome
base
screensavers
</subdirs>
<extradist> <extradist>
sensorwatch.asm README.md
</extradist> </extradist>
</gwbuild> </gwbuild>

View File

@@ -1,207 +0,0 @@
object:
- next 2 2
- parent 2 4
- child 2 6
- opts 2 8
- flags 1 9
- selector 1 10
- target 2 12
- signalMap 2 14
widget:
- X 1 15
- Y 1 16
- W 1 17
- H 1 18
- style 2 (ptr) 20
- frontCol 2 2
- backCol 2 4
- borderCol 2 6
- borderWidth 1 7
- font 2 9
- charWidth 1 10
- charHeight 1 11
page: light
- up to 8 light bulbs, each for one device
- lightPage:
- SDRAM: ptr to lightData
- address of target device (1 byte)
- currentMode (1 byte)
- currentColor (4 bytes)
- sensor watch:
- SDRAM vars:
- change limits
- SENSORWATCH_SD_OFFS_UPPERLIMIT_WARN_LO
- SENSORWATCH_SD_OFFS_LOWERLIMIT_WARN_LO
- SENSORWATCH_SD_OFFS_UPPERLIMIT_CRIT_LO
- SENSORWATCH_SD_OFFS_LOWERLIMIT_CRIT_LO
- add private flags (HAVE_VALUE, USE_UPPERWARNLIMIT, USE_LOWERWARNLIMIT, USE_UPPERCRITLIMIT, USE_LOWERCRITLIMIT)
- widgets:
Mode: [Auto] [On] [Off]
Color: [Preset1] [Preset2] [Preset3]
Red: [123]
Green: [123]
Blue: [123]
White: [123]
page: numInput (g_win_numinput)
- SDRAM:
- prevPage
- flags
- minNum
- maxNum
- currPos
- editBuffer[7]
- widgets:
textField:
- SDRAM:
- ptrText
- slots:
- setText(newText)
- draw(): draw text and a cursor behind it
[123 ]
------------
[7] [8] [9]
[4] [5] [6]
[1] [2] [3]
[,] [0] [<]
------------
[Okay] [Abort]
- new pages:
- main window
- buttons for climate, netstats, light, doors
- about window (version, logo etc)
- lights
- mode: on, off, auto
- color: R, G, B, W
- calibrate screen
- digitEdit
- arrow_up, below digit, below arrow_down
- label:
- use ressource id instead of pointer to text!
- print hex numbers (bytes, words, dwords)
- room value:
- bits 0-2: cardinal number (0-7, as in "Buero 1")
- bits 7-3: room type number (32)
- Flur
- Wohnzimmer
- Schlafzimmer
- Kueche
- Buero
- Kinderzimmer
- Abstellraum
- Bad
- new classes:
- choice
- "< TEXT >" (choose by clicking buttons left/right)
- roomLabel (uses room value to print a string)
- flashingLabel
- use timer to blink/flash label, e.g. when values change
- widgets:
- value (flashingLabel)
- imageViewer (use code from testWin)
- generate bigger images (96x96 px)
- light
- window_open
- window_closed
|--------------------------------------|
| CO2-Value Temp Humidity |
| |--------| |--------| |--------| |
| | Cloud | | Temp | | Hum | |
| | | | | | | |
| |--------| |--------| |--------| |
| |
| |-----------| |---| |
| | 1 7 : 4 5 | | S | |
| |-----------| |---| |
| |
|--------------------------------------|
|--------------------------------------|
| CO2-Value Temp Humidity |
| |--------| |--------| |--------| |
| | Cloud | | Temp | | Hum | |
| | | | | | | |
| |--------| |--------| |--------| |
| |
| |---| |---| |---| |---| |---| |
| | < | | N | | L | | ? | | > | |
| |---| |---| |---| |---| |---| |
| |
|--------------------------------------|
Object:
- next
- parent
- firstChild
- options (2 bytes)
- signal handling
- targetAddr (like in FOX)
- selector
- handlerMap:
- selector/signal (00: end), handlerAddr
Widgets:
- x (2 bytes)
- y (2 bytes)
- width (2 bytes)
- height (2 bytes)
- font (2 bytes)
- frontColor (2 bytes)
- backColor (2 bytes)
Labels:
- text
Signals:
- CREATE
- DESTROY
- SHOW
- HIDE
- DRAW
- TIMER
- TOUCH
[- KEY]
- USER = 16
OBJ:
- SDRAM pointer hierher verschieben
- speichere dort:
- FLAGS_LO, FLAGS_HI (2 bytes)
- NEXT, PARENT, CHILD (6 bytes)
- OBJ_AddNeighbour()
- OBJ_AddChild()
- OBJ_Unlink()

View File

@@ -0,0 +1,11 @@
<?xml?>
<gwbuild>
<extradist>
sensorwatch.asm
</extradist>
</gwbuild>

View File

@@ -10,9 +10,11 @@
label.asm label.asm
layout.asm layout.asm
mainwindow.asm mainwindow.asm
mclayout.asm
object.asm object.asm
rootwindow.asm rootwindow.asm
valuelabel.asm valuelabel.asm
vlayout.asm
widget.asm widget.asm
</extradist> </extradist>

View File

@@ -1,339 +0,0 @@
; ***************************************************************************
; 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_EEPROMDUMP_ASM
#define AQH_AVR_GUI2_EEPROMDUMP_ASM
; ***************************************************************************
; defines
.equ EEPROMDUMP_FONT = ili9341Font6x8_1
.equ EEPROMDUMP_FONT_WIDTH = 6
.equ EEPROMDUMP_FONT_HEIGHT = 8
.equ EEPROMDUMP_BYTESPERLINE = 8
.equ EEPROMDUMP_LINESPERPAGE = 18
; SDRAM data for EepromDump
.equ EEPROMDUMP_SD_OFFS_BEGIN = WIDGET_SD_SIZE
.equ EEPROMDUMP_SD_OFFS_STARTADDR_LO = EEPROMDUMP_SD_OFFS_BEGIN+0
.equ EEPROMDUMP_SD_OFFS_STARTADDR_HI = EEPROMDUMP_SD_OFFS_BEGIN+1
.equ EEPROMDUMP_SD_SIZE = EEPROMDUMP_SD_OFFS_BEGIN+2
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine SensorWatch_OnCreate @global
;
; @param Z byte address of widget object (for LPM!)
; @param XL node addr
; @param XH value id
; @return CFLAG set if signal handled
; @clobbers any, !Z
EepromDump_OnCreate:
bigcall OBJ_IsObject ; (none)
brcc EepromDump_OnCreate_ret
; preset SDRAM
bigcall Widget_GetSdramPtr ; (none)
clr r16
ldi r17, EEPROMDUMP_SD_SIZE
push yl
push yh
EepromDump_OnCreate_loop:
st Y+, r16
dec r17
brne EepromDump_OnCreate_loop
pop yh
pop yl
bigcall Widget_OnCreate
EepromDump_OnCreate_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine EepromDump_OnUp @global
;
; @param Z byte address of object (for LPM!)
EepromDump_OnUp:
bigcall Widget_GetSdramPtr ; (none)
ldd xl, Y+EEPROMDUMP_SD_OFFS_STARTADDR_LO
ldd xh, Y+EEPROMDUMP_SD_OFFS_STARTADDR_HI
ldi r16, LOW(EEPROMDUMP_BYTESPERLINE*EEPROMDUMP_LINESPERPAGE)
ldi r17, HIGH(EEPROMDUMP_BYTESPERLINE*EEPROMDUMP_LINESPERPAGE)
sub xl, r16
sbc xh, r17
brcc EepromDump_OnUp_set
clr xl
clr xh
EepromDump_OnUp_set:
std Y+EEPROMDUMP_SD_OFFS_STARTADDR_LO, xl
std Y+EEPROMDUMP_SD_OFFS_STARTADDR_HI, xh
ldd r17, Y+WIDGET_SD_OFFS_FLAGS
ori r17, (1<<WIDGET_FLAGS_DIRTY_BIT)
std Y+WIDGET_SD_OFFS_FLAGS, r17
sec
ret
; @end
EepromDump_OnDown:
bigcall Widget_GetSdramPtr ; (none)
ldd xl, Y+EEPROMDUMP_SD_OFFS_STARTADDR_LO
ldd xh, Y+EEPROMDUMP_SD_OFFS_STARTADDR_HI
ldi r16, LOW(EEPROMDUMP_BYTESPERLINE*EEPROMDUMP_LINESPERPAGE)
ldi r17, HIGH(EEPROMDUMP_BYTESPERLINE*EEPROMDUMP_LINESPERPAGE)
add xl, r16
adc xh, r17
brcs EepromDump_OnDown_tooHigh
ldi r16, LOW(EEPROMEND)
ldi r17, HIGH(EEPROMEND)
cp xl, r16
cpc xh, r17
brcs EepromDump_OnDown_set
EepromDump_OnDown_tooHigh:
ldi xl, LOW(EEPROMEND-EEPROMDUMP_BYTESPERLINE)
ldi xh, HIGH(EEPROMEND-EEPROMDUMP_BYTESPERLINE)
EepromDump_OnDown_set:
std Y+EEPROMDUMP_SD_OFFS_STARTADDR_LO, xl
std Y+EEPROMDUMP_SD_OFFS_STARTADDR_HI, xh
ldd r17, Y+WIDGET_SD_OFFS_FLAGS
ori r17, (1<<WIDGET_FLAGS_DIRTY_BIT)
std Y+WIDGET_SD_OFFS_FLAGS, r17
sec
ret
; @end
EepromDump_OnResetTlv:
bigcall Widget_GetSdramPtr ; (none)
ldi xl, LOW(EEPROM_OFFS_TLV)
ldi xh, HIGH(EEPROM_OFFS_TLV)
EepromDump_OnResetTlv_loop:
bigcall Eeprom_CheckAddr
brcc EepromDump_OnResetTlv_loopEnd
ldi r16, 0xff
bigcall Eeprom_WriteByte
adiw xh:xl, 1
rjmp EepromDump_OnResetTlv_loop
EepromDump_OnResetTlv_loopEnd:
ldd r17, Y+WIDGET_SD_OFFS_FLAGS
ori r17, (1<<WIDGET_FLAGS_DIRTY_BIT)
std Y+WIDGET_SD_OFFS_FLAGS, r17
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine EepromDump_OnDraw @global
;
; @param Z byte address of object (for LPM!)
; @param xl param1
; @param xh param2
; @clobbers any, !Z
EepromDump_OnDraw:
bigcall Widget_GetSdramPtr ; (none)
ldd r16, Y+WIDGET_SD_OFFS_FLAGS
andi r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
breq EepromDump_OnDraw_ret
rcall Widget_Clear
bigcall Widget_GetSdramPtr ; (none)
ldd xl, Y+EEPROMDUMP_SD_OFFS_STARTADDR_LO
ldd xh, Y+EEPROMDUMP_SD_OFFS_STARTADDR_HI
ldi r16, 2
mov r4, r16
clr r5
mov r6, r16
clr r7
rcall eepromDumpDrawBlock
bigcall Widget_GetSdramPtr ; (none)
ldd r16, Y+WIDGET_SD_OFFS_FLAGS
cbr r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
std Y+WIDGET_SD_OFFS_FLAGS, r16
EepromDump_OnDraw_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine eepromDumpDrawBlock
;
; @param Z byte address of widget object (for LPM!)
; @param R5:R4 X relative to widget
; @param R7:R6 Y relative to widget
; @param X current start address
; @param R18 number of bytes to print as hex bytes
eepromDumpDrawBlock:
ldi r18, EEPROMDUMP_LINESPERPAGE
eepromDumpDrawBlock_loop:
push r18
push r4
push r5
rcall eepromDumpDrawLine
pop r5
pop r4
ldi r16, LOW(EEPROMDUMP_FONT_HEIGHT)
ldi r17, HIGH(EEPROMDUMP_FONT_HEIGHT)
add r6, r16
adc r7, r17
pop r18
dec r18
brne eepromDumpDrawBlock_loop
ret
; @end
; ---------------------------------------------------------------------------
; @routine eepromDumpDrawLine
;
; @param Z byte address of widget object (for LPM!)
; @param R5:R4 X relative to widget
; @param R7:R6 Y relative to widget
; @param X current start address
; @param R18 number of bytes to print as hex bytes
; @return X pointer to next byte to write
; @clobbers any, !Z, !R6, !R7
eepromDumpDrawLine:
push xl
push xh
mov r20, xl
mov r21, xh
bigcall HexWordToAscii ; X=ptr to addr (R16, R17)
rcall eepromDumpDrawText
ldi r16, LOW(EEPROMDUMP_FONT_WIDTH*4)
ldi r17, HIGH(EEPROMDUMP_FONT_WIDTH*4)
add r4, r16
adc r5, r17
ldi r16, ':'
rcall eepromDumpDrawChar
ldi r16, ' '
rcall eepromDumpDrawChar
pop xh
pop xl
ldi r18, EEPROMDUMP_BYTESPERLINE
eepromDumpDrawLine_loop:
bigcall Eeprom_ReadByte ; R16=byte read
brcc eepromDumpDrawLine_ret
adiw xh:xl, 1
push r18
push xl
push xh
bigcall HexByteToAscii ; X=ptr to addr (R16, R17)
rcall eepromDumpDrawText
ldi r16, LOW(EEPROMDUMP_FONT_WIDTH*2)
ldi r17, HIGH(EEPROMDUMP_FONT_WIDTH*2)
add r4, r16
adc r5, r17
ldi r16, ' '
rcall eepromDumpDrawChar
pop xh
pop xl
pop r18
dec r18
brne eepromDumpDrawLine_loop
eepromDumpDrawLine_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine eepromDumpDrawLine
;
; @param Z byte address of widget object (for LPM!)
; @param R5:R4 X relative to widget
; @param R7:R6 Y relative to widget
; @param X address of text to write
; @clobbers any, !Z, !(r4-r7)
eepromDumpDrawText:
push r4
push r5
push r6
push r7
bigcall Widget_DrawTextSDRAM ; (any, !Z)
pop r7
pop r6
pop r5
pop r4
ret
; @end
; ---------------------------------------------------------------------------
; @routine eepromDumpDrawChar
;
; @param Z byte address of widget object (for LPM!)
; @param R5:R4 X relative to widget
; @param R7:R6 Y relative to widget
; @param R16 byte to write
; @clobbers any, !Z, !(r4-r7)
eepromDumpDrawChar:
push r4
push r5
push r6
push r7
bigcall Widget_DrawCharAt ; (any, !Z)
pop r7
pop r6
pop r5
pop r4
ldi r16, LOW(EEPROMDUMP_FONT_WIDTH)
ldi r17, HIGH(EEPROMDUMP_FONT_WIDTH)
add r4, r16
adc r5, r17
ret
; @end
#endif

View File

@@ -1,18 +0,0 @@
<?xml?>
<gwbuild>
<extradist>
button.asm
guiapp.asm
imageview.asm
label.asm
object.asm
rootwidget.asm
valuelabel.asm
widget.asm
</extradist>
</gwbuild>

View File

@@ -1,95 +0,0 @@
; ***************************************************************************
; 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_BUTTON_ASM
#define AQH_AVR_GUI2_BUTTON_ASM
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine Button_OnTouch @global
;
; @param Z byte address of widget object (for LPM!)
; @param X pointer to TOUCH event (see @ref WIDGET_DATA_TOUCH_OFFS_X_LO)
; @return CFLAG set if signal handled
; @clobbers any, !Z
Button_OnTouch:
rcall Widget_GetSdramPtr ; Y:=SDRAM data for widget
; read touch signal data from X
ld r18, X+ ; WIDGET_DATA_TOUCH_OFFS_X_LO
ld r19, X+ ; WIDGET_DATA_TOUCH_OFFS_X_HI
ld r20, X+ ; WIDGET_DATA_TOUCH_OFFS_Y_LO
ld r21, X+ ; WIDGET_DATA_TOUCH_OFFS_Z_HI
ld r22, X ; WIDGET_DATA_TOUCH_OFFS_STATE
sbiw xh:xl, 4
sbrs r22, DISPLAY_IFLAGS_PRESSED_BIT
rjmp Button_OnTouch_up
; down (active touch)
ldd r16, Y+WIDGET_SD_OFFS_FLAGS
sbrc r16, WIDGET_FLAGS_PRESSED_BIT
rjmp Button_OnTouch_ret ; already pressed, jmp
; newly pressed
rcall widgetLoadCoordsForFullWidget ; get X, Y, W, H (none)
rcall Widget_MakeAbsPos ; (R16, R17)
rcall Widget_IsPointInRect ; (R16, R17)
brcc Button_OnTouch_ret ; touch not inside this widget, jmp
; touch down inside this widget, handle
bigcall Widget_GrabTouchEvents ; (r16, r17, r18, r19, X)
brcc Button_OnTouch_ret
ldi r16, (1<<WIDGET_FLAGS_PRESSED_BIT) | (1<<WIDGET_FLAGS_DIRTY_BIT)
push yl
push yh
bigcall Widget_AddFlagsDown ; (R17, R18, R19, R22, R23, Y)
pop yh
pop yl
rjmp Button_OnTouch_ret
Button_OnTouch_up:
ldd r16, Y+WIDGET_SD_OFFS_FLAGS
sbrs r16, WIDGET_FLAGS_PRESSED_BIT
rjmp Button_OnTouch_ret
; was pressed, not any more
bigcall Widget_UngrabTouchEvents ; (r16, r17, r18, r19, X)
push yl
push yh
ldi r16, (1<<WIDGET_FLAGS_PRESSED_BIT)
bigcall Widget_SubFlagsDown ; (R17, R18, R19, R22, R23, Y)
ldi r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
bigcall Widget_AddFlagsDown ; (R17, R18, R19, R22, R23, Y)
ldi r16, WIDGET_SIGNAL_CLICKED ; emit "CLICKED" signal
bigcall OBJ_EmitSignal
pop yh
pop yl
Button_OnTouch_ret:
sec
ret
; @end
Button_DefaultSignalmap:
.db 0, WIDGET_SIGNAL_TOUCH, LOW(Button_OnTouch), HIGH(Button_OnTouch)
.db 0, WIDGET_SIGNAL_DRAW, LOW(ImageView_OnDraw), HIGH(ImageView_OnDraw)
.db 0, IMGVIEW_SIGNAL_SETBGCOL, LOW(ImageView_OnSetBgCol), HIGH(ImageView_OnSetBgCol)
.db 0, OBJECT_SIGNAL_CREATE, LOW(ImageView_OnCreate), HIGH(ImageView_OnCreate)
.db 0, 0, 0, 0 ; end of table
#endif

View File

@@ -1,593 +0,0 @@
; ***************************************************************************
; 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_GUIAPP_ASM
#define AQH_AVR_GUI2_GUIAPP_ASM
; ***************************************************************************
; defines
; GuiApp in flash
.equ GUIAPP_OFFS_GUIAPP = OBJECT_SIZE
.equ GUIAPP_OFFS_SDRAM_LO = GUIAPP_OFFS_GUIAPP+0
.equ GUIAPP_OFFS_SDRAM_HI = GUIAPP_OFFS_GUIAPP+1
.equ GUIAPP_OFFS_ROOTWIDGET_LO = GUIAPP_OFFS_GUIAPP+2
.equ GUIAPP_OFFS_ROOTWIDGET_HI = GUIAPP_OFFS_GUIAPP+3
.equ GUIAPP_OFFS_SCREENSAVER_LO = GUIAPP_OFFS_GUIAPP+4
.equ GUIAPP_OFFS_SCREENSAVER_HI = GUIAPP_OFFS_GUIAPP+5
.equ GUIAPP_SIZE = GUIAPP_OFFS_GUIAPP+6
; signals
.equ GUIAPP_SIGNAL_RAISE = OBJECT_SIGNAL_NEXTFREE+0 ; app->cntrl: X=WIDGET to raise
.equ GUIAPP_SIGNAL_SHOW = OBJECT_SIGNAL_NEXTFREE+1 ; cntrl->app
.equ GUIAPP_SIGNAL_HIDE = OBJECT_SIGNAL_NEXTFREE+2 ; cntrl->app
.equ GUIAPP_SIGNAL_DEBUG = OBJECT_SIGNAL_NEXTFREE+3
.equ GUIAPP_SIGNAL_NEXTFREE = OBJECT_SIGNAL_NEXTFREE+4
; SDRAM data for guiapp
.equ GUIAPP_SD_OFFS_FLAGS = 0
.equ GUIAPP_SD_OFFS_DRAWTIMER = 1
.equ GUIAPP_SD_OFFS_CURRENTWIDGET_LO = 2
.equ GUIAPP_SD_OFFS_CURRENTWIDGET_HI = 3
.equ GUIAPP_SD_OFFS_TOUCHWIDGET_LO = 4
.equ GUIAPP_SD_OFFS_TOUCHWIDGET_HI = 5
.equ GUIAPP_SD_SIZE = 6
.equ GUIAPP_DRAWTIMER = 2
; ***************************************************************************
; data
.dseg
guiapp_touch_event:
.byte WIDGET_DATA_TOUCH_SIZE
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine GuiApp_Init
;
; @param Z byte address of guiapp object (for LPM!)
GuiApp_Init:
ldi r16, OBJECT_SIGNAL_CREATE
clr r17
bigcall OBJ_HandleSignal
rcall GuiApp_ShowFirstView
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_Every100ms @global
;
; @param Z byte address of guiapp object (for LPM!)
GuiApp_Every100ms:
ldi r16, OBJECT_SIGNAL_TIMER
clr r17
bigcall OBJ_HandleSignal
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_MsgReceived @global
;
; @param Z byte address of guiapp object (for LPM!)
GuiApp_MsgReceived:
ldi r16, OBJECT_SIGNAL_RECVMSG
clr r17
bigcall OBJ_HandleSignal
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_OnTimer
;
; @param Z byte address of guiapp object (for LPM!)
GuiApp_OnTimer:
; check for touch event
rcall guiAppCheckTouch
; send timer signal to all accepting widgets
push zl
push zh
adiw zh:zl, GUIAPP_OFFS_ROOTWIDGET_LO
lpm r16, Z+
lpm zh, Z
mov zl, r16
or r17, zh
breq GuiApp_OnTimer_l1
bigcall Widget_Tree_SendTimerSignal
GuiApp_OnTimer_l1:
pop zh
pop zl
; possibly draw widgets
rcall GuiApp_GetSdramPtr
ldd r16, Y+GUIAPP_SD_OFFS_DRAWTIMER
tst r16
breq GuiApp_OnTimer_ret
dec r16
brne GuiApp_OnTimer_writeDrawTimer
push yl
push yh
rcall guiAppDrawWidgets
pop yh
pop yl
ldi r16, GUIAPP_DRAWTIMER
GuiApp_OnTimer_writeDrawTimer:
std Y+GUIAPP_SD_OFFS_DRAWTIMER, r16
GuiApp_OnTimer_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_OnTouch
;
; @param Z byte address of guiapp object (for LPM!)
; @param X pointer to touch event in SDRAM
GuiApp_OnTouch:
push zl
push zh
rcall GuiApp_GetSdramPtr
ldd r18, Y+GUIAPP_SD_OFFS_TOUCHWIDGET_LO
ldd r19, Y+GUIAPP_SD_OFFS_TOUCHWIDGET_HI
mov r16, r18
or r16, r19
breq GuiApp_OnTouch_sendToAll
mov zl, r18
mov zh, r19
ldi r16, WIDGET_SIGNAL_TOUCH
clr r17
bigcall OBJ_HandleSignal
rjmp GuiApp_OnTouch_done
GuiApp_OnTouch_sendToAll:
rcall GuiApp_GetRootWidgetToZ
brcc GuiApp_OnTouch_done
; send touch signal
bigcall Widget_Tree_SendTouchSignal
GuiApp_OnTouch_done:
pop zh
pop zl
; send keepAlive to screensaver (if not active!)
rcall guiAppSendKeepAliveIfScreenSaverInactive
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine guiAppSendKeepAliveIfScreenSaverInactive
;
; @param Z byte address of guiapp object (for LPM!)
; @clobbers any
guiAppSendKeepAliveIfScreenSaverInactive:
push zl
push zh
rcall GuiApp_GetSdramPtr
adiw zh:zl, GUIAPP_OFFS_SCREENSAVER_LO
lpm r20, Z+
lpm r21, Z
sbiw zh:zl, GUIAPP_OFFS_SCREENSAVER_LO+1
ldd r16, Y+GUIAPP_SD_OFFS_CURRENTWIDGET_LO
cp r16, r20
brne guiAppSendKeepAliveIfScreenSaverInactive_send
ldd r16, Y+GUIAPP_SD_OFFS_CURRENTWIDGET_HI
cp r16, r21
breq guiAppSendKeepAliveIfScreenSaverInactive_end
guiAppSendKeepAliveIfScreenSaverInactive_send:
mov zl, r20
mov zh, r21
bigcall ScreenSaver_KeepAlive
guiAppSendKeepAliveIfScreenSaverInactive_end:
pop zh
pop zl
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_OnMsgReceived @global
;
; @param Z byte address of guiapp object (for LPM!)
; @param X pointer to message received in SDRAM
GuiApp_OnMsgReceived:
push zl
push zh
rcall GuiApp_GetRootWidgetToZ
brcc GuiApp_OnMsgReceived_done
bigcall Widget_Tree_SendMsgRecvSignal
GuiApp_OnMsgReceived_done:
pop zh
pop zl
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_OnCreate @global
;
; @param Z byte address of object (for LPM!)
; @return CFLAG set if signal handled
; @clobbers any, !Z
GuiApp_OnCreate:
; init sdram data
rcall GuiApp_GetSdramPtr
ldi r17, GUIAPP_SD_SIZE
clr r16
push yl
push yh
GuiApp_OnCreate_loop:
st Y+, r16
dec r17
brne GuiApp_OnCreate_loop
pop yh
pop yl
clr r16
std Y+GUIAPP_SD_OFFS_FLAGS, r16
ldi r16, GUIAPP_DRAWTIMER
std Y+GUIAPP_SD_OFFS_DRAWTIMER, r16
rcall guiAppInitWidgets
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_GetSdramPtr @global
;
; @param Z byte address of object (for LPM!)
; @return Y pointer to SDRAM data for widget
; @clobbers none
GuiApp_GetSdramPtr:
adiw zh:zl, GUIAPP_OFFS_SDRAM_LO
lpm yl, Z+
lpm yh, Z
sbiw zh:zl, GUIAPP_OFFS_SDRAM_LO+1
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_GetRootWidgetToZ @global
;
; @param Z byte address of object (for LPM!)
; @return CFLAG set if there is a root widget, cleared otherwise
; @return Z byte address pointer to root widget (for LPM!), if CFLAG set, garbage otherwise
; @clobbers none
GuiApp_GetRootWidgetToZ:
rcall OBJ_IsObject
brcc GuiApp_GetRootWidgetToZ_ret
adiw zh:zl, GUIAPP_OFFS_ROOTWIDGET_LO
lpm r16, Z+
lpm zh, Z
mov zl, r16
rcall OBJ_IsObject
GuiApp_GetRootWidgetToZ_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_ShowFirstView @global
;
; @param Z byte address of guiapp object (for LPM!)
GuiApp_ShowFirstView:
push zl
push zh
rcall GuiApp_GetRootWidgetToZ
brcc GuiApp_ShowFirstView_error
bigcall OBJ_GetFirstChild
brcc GuiApp_ShowFirstView_error
mov xl, r18
mov xh, r19
pop zh
pop zl
rcall GuiApp_ShowView
rjmp GuiApp_ShowFirstView_ret
GuiApp_ShowFirstView_error:
pop zh
pop zl
GuiApp_ShowFirstView_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_ShowView @global
;
; @param Z byte address of object (for LPM!)
; @param X byte address of object to show (for LPM!)
; @return CFLAG set if signal handled
; @clobbers any, !Z
GuiApp_ShowView:
rcall GuiApp_GetSdramPtr ; Y=SDRAM
ldd r18, Y+GUIAPP_SD_OFFS_CURRENTWIDGET_LO
ldd r19, Y+GUIAPP_SD_OFFS_CURRENTWIDGET_HI
eor r18, xl ; 0 if same
eor r19, xh ; 0 if same
or r18, r19 ; 0 if r19:r18==X
breq GuiApp_ShowView_ret ; same, no change
push yl
push yh
rcall guiAppHideCurrent ; (any, !X, !Z)
pop yh
pop yl
; store new view
std Y+GUIAPP_SD_OFFS_CURRENTWIDGET_LO, xl
std Y+GUIAPP_SD_OFFS_CURRENTWIDGET_HI, xh
; show new (if any)
rcall guiAppShowCurrent
GuiApp_ShowView_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_GetCurrentView @global
;
; @param Z byte address of object (for LPM!)
; @return X byte address of current view object (for LPM!)
; @clobbers Y
GuiApp_GetCurrentView:
rcall GuiApp_GetSdramPtr ; Y=SDRAM
ldd xl, Y+GUIAPP_SD_OFFS_CURRENTWIDGET_LO
ldd xh, Y+GUIAPP_SD_OFFS_CURRENTWIDGET_HI
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_GrabTouchEvents
;
; @param Z byte address of gui app object (for LPM!)
; @param X byte address of widget grabbing touch events
; @return CFLAG set if grabbed, cleared otherwise
; @clobbers R16, R17, Y
GuiApp_GrabTouchEvents:
rcall OBJ_IsObject ; (none)
brcc GuiApp_GrabTouchEvents_ret
rcall GuiApp_GetSdramPtr ; (none)
ldd r16, Y+GUIAPP_SD_OFFS_TOUCHWIDGET_LO
ldd r17, Y+GUIAPP_SD_OFFS_TOUCHWIDGET_HI
or r16, r17
clc
brne GuiApp_GrabTouchEvents_ret ; only grab if not already grabbed!
std Y+GUIAPP_SD_OFFS_TOUCHWIDGET_LO, xl
std Y+GUIAPP_SD_OFFS_TOUCHWIDGET_HI, xh
sec
GuiApp_GrabTouchEvents_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_UngrabTouchEvents
;
; @param Z byte address of gui app object (for LPM!)
; @param X byte address of widget ungrabbing touch events
; @return CFLAG set if ungrabbed, cleared otherwise
; @clobbers R16, R17
GuiApp_UngrabTouchEvents:
rcall OBJ_IsObject ; (none)
brcc GuiApp_UngrabTouchEvents_ret
rcall GuiApp_GetSdramPtr ; (none)
ldd r16, Y+GUIAPP_SD_OFFS_TOUCHWIDGET_LO
ldd r17, Y+GUIAPP_SD_OFFS_TOUCHWIDGET_HI
eor r16, xl
eor r17, xh
or r16, r17
clc
brne GuiApp_UngrabTouchEvents_ret ; only ungrab same widget!
clr r16
std Y+GUIAPP_SD_OFFS_TOUCHWIDGET_LO, r16
std Y+GUIAPP_SD_OFFS_TOUCHWIDGET_HI, r16
sec
GuiApp_UngrabTouchEvents_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine guiAppHideCurrent
;
; @param Z byte address of gui app object (for LPM!)
; @clobbers any, !X, !Z
guiAppHideCurrent:
push zl
push zh
rcall GuiApp_GetSdramPtr ; Y=SDRAM
ldd zl, Y+GUIAPP_SD_OFFS_CURRENTWIDGET_LO
ldd zh, Y+GUIAPP_SD_OFFS_CURRENTWIDGET_HI
mov r16, zl
or r16, zh
breq guiAppHideCurrent_done
ldi r16, WIDGET_SIGNAL_HIDE
clr r17
bigcall OBJ_HandleSignal ; (any, !X, !Y. !Z)
ldi r16, (1<<WIDGET_FLAGS_ACTIVE_BIT)
bigcall Widget_SubFlagsDown ; (R17, R18, R19, R22, R23)
guiAppHideCurrent_done:
pop zh
pop zl
ret
; @end
; ---------------------------------------------------------------------------
; @routine guiAppShowCurrent
;
; @param Z byte address of gui app object (for LPM!)
; @clobbers any, !X, !Z
guiAppShowCurrent:
push zl
push zh
rcall GuiApp_GetSdramPtr ; Y=SDRAM
ldd zl, Y+GUIAPP_SD_OFFS_CURRENTWIDGET_LO
ldd zh, Y+GUIAPP_SD_OFFS_CURRENTWIDGET_HI
mov r16, zl
or r16, zh
breq guiAppShowCurrent_done
ldi r16, (1<<WIDGET_FLAGS_ACTIVE_BIT) | (1<<WIDGET_FLAGS_DIRTY_BIT)
bigcall Widget_AddFlagsDown
ldi r16, WIDGET_SIGNAL_SHOW
clr r17
bigcall OBJ_HandleSignal ; (any, !X, !Y. !Z)
guiAppShowCurrent_done:
pop zh
pop zl
rcall guiAppDrawWidgets ; (any, !Z)
ret
; @end
; ---------------------------------------------------------------------------
; @routine guiAppInitWidgets
;
; @param Z byte address of guiapp object (for LPM!)
guiAppInitWidgets:
; init widgets
push zl
push zh
rcall GuiApp_GetRootWidgetToZ
brcc guiAppInitWidgets_done
ldi r16, OBJECT_SIGNAL_CREATE
clr r17
bigcall OBJ_TreeAllHandleSignal
ldi r16, (1<<WIDGET_FLAGS_ACTIVE_BIT) | (1<<WIDGET_FLAGS_DIRTY_BIT) ; root window is always active
rcall Widget_AddFlags
guiAppInitWidgets_done:
pop zh
pop zl
ret
; @end
; ---------------------------------------------------------------------------
; @routine guiAppDrawWidgets
;
; @param Z byte address of guiapp object (for LPM!)
guiAppDrawWidgets:
push zl
push zh
rcall GuiApp_GetRootWidgetToZ
brcc guiAppDrawWidgets_done
bigcall Widget_Tree_SendDrawSignal
guiAppDrawWidgets_done:
pop zh
pop zl
guiAppDrawWidgets_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine guiAppCheckTouch
;
; @param Z byte address of guiapp object (for LPM!)
guiAppCheckTouch:
bigcall Display_InputGetState ; r16=flags, r5:r4=x, r7:r6=y
mov r17, r16
andi r17, (1<<DISPLAY_IFLAGS_CHGCOORD_BIT) | (1<<DISPLAY_IFLAGS_CHGPRESS_BIT)
breq guiAppCheckTouch_ret
ldi xl, LOW(guiapp_touch_event)
ldi xh, HIGH(guiapp_touch_event)
st X+, r4 ; X
st X+, r5
st X+, r6 ; Y
st X+, r7
st X, r16 ; flags
sbiw xh:xl, 4 ; (4 times incremented)
; send touch signal
ldi r16, WIDGET_SIGNAL_TOUCH
clr r17
bigcall OBJ_HandleSignal
guiAppCheckTouch_ret:
ret
; @end
guiAbortIfNotObject:
bigcall OBJ_IsObject
brcs guiAbortIfNotObject_ret
rcall DEBUG2
guiAbortIfNotObject_ret:
ret
; @end
#endif

View File

@@ -1,187 +0,0 @@
; ***************************************************************************
; 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_IMAGEVIEW_ASM
#define AQH_AVR_GUI2_IMAGEVIEW_ASM
; ***************************************************************************
; defines
; IMGVIEW in flash
.equ IMGVIEW_OFFS_IMGVIEW = WIDGET_SIZE
.equ IMGVIEW_OFFS_RESSOURCEID_LO = IMGVIEW_OFFS_IMGVIEW+0
.equ IMGVIEW_OFFS_RESSOURCEID_HI = IMGVIEW_OFFS_IMGVIEW+1
.equ IMGVIEW_SIZE = IMGVIEW_OFFS_IMGVIEW+2
; SDRAM data for IMGVIEW
.equ IMGVIEW_SD_OFFS_IMGVIEW = WIDGET_SD_SIZE
.equ IMGVIEW_SD_OFFS_BGCOL_LO = IMGVIEW_SD_OFFS_IMGVIEW+0
.equ IMGVIEW_SD_OFFS_BGCOL_HI = IMGVIEW_SD_OFFS_IMGVIEW+1
.equ IMGVIEW_SD_SIZE = IMGVIEW_SD_OFFS_IMGVIEW+2
; signals
.equ IMGVIEW_SIGNAL_SETBGCOL = WIDGET_SIGNAL_NEXTFREE+0
.equ IMGVIEW_SIGNAL_NEXTFREE = WIDGET_SIGNAL_NEXTFREE+1
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine ImageView_OnCreate @global
;
; @param Z byte address of widget object (for LPM!)
; @return CFLAG set if signal handled
; @clobbers any, !Z
ImageView_OnCreate:
bigcall Widget_OnCreate
bigcall Widget_GetSdramPtr ; (none)
adiw zh:zl, WIDGET_OFFS_BACKCOL_LO
lpm r16, Z+
lpm r17, Z
sbiw zh:zl, WIDGET_OFFS_BACKCOL_LO+1
std Y+IMGVIEW_SD_OFFS_BGCOL_LO, r16
std Y+IMGVIEW_SD_OFFS_BGCOL_HI, r17
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine ImageView_OnSetBgCol @global
;
; @param Z byte address of widget object (for LPM!)
; @param X new value for background color
; @return CFLAG set if signal handled
; @clobbers r17
ImageView_OnSetBgCol:
bigcall OBJ_IsObject ; (none)
brcc ImageView_OnSetBgCol_ret
push zl
push zh
rcall Widget_GetSdramPtr ; (none)
std Y+IMGVIEW_SD_OFFS_BGCOL_LO, xl
std Y+IMGVIEW_SD_OFFS_BGCOL_HI, xh
ldd r17, Y+WIDGET_SD_OFFS_FLAGS
ori r17, (1<<WIDGET_FLAGS_DIRTY_BIT)
std Y+WIDGET_SD_OFFS_FLAGS, r17
pop zh
pop zl
ImageView_OnSetBgCol_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine Widget_OnDraw @global
;
; @param Z byte address of widget object (for LPM!)
; @return CFLAG set if signal handled
; @clobbers any, !Z
ImageView_OnDraw:
bigcall Widget_GetSdramPtr ; (none)
ldd r16, Y+WIDGET_SD_OFFS_FLAGS
andi r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
breq ImageView_OnDraw_ret
; rcall Widget_Clear
adiw zh:zl, WIDGET_OFFS_OPTS_LO
lpm r14, Z
sbiw zh:zl, WIDGET_OFFS_OPTS_LO
push zl
push zh
; get ressource id
adiw zh:zl, IMGVIEW_OFFS_RESSOURCEID_LO
lpm r16, Z+
lpm r17, Z
sbiw zh:zl, IMGVIEW_OFFS_RESSOURCEID_LO+1
; get ressource
ldi zl, LOW(RESSOURCE_ADDR*2)
ldi zh, HIGH(RESSOURCE_ADDR*2)
bigcall RES_GetRessource
mov r12, zl
mov r13, zh
pop zh
pop zl
brcc ImageView_OnDraw_done
; get background color
ldd r16, Y+WIDGET_SD_OFFS_FLAGS
andi r16, (1<<WIDGET_FLAGS_PRESSED_BIT)
breq ImageView_OnDraw_useStoredBgCol
ldi r16, LOW(STYLE_BUTTON_COL_BG_PRESSED)
mov r0, r16
ldi r16, HIGH(STYLE_BUTTON_COL_BG_PRESSED)
mov r1, r16
rjmp ImageView_OnDraw_getPos
ImageView_OnDraw_useStoredBgCol:
ldd r0, Y+IMGVIEW_SD_OFFS_BGCOL_LO
ldd r1, Y+IMGVIEW_SD_OFFS_BGCOL_HI
ImageView_OnDraw_getPos:
; draw at 0/0
clr r4 ; X
clr r5
clr r6 ; Y
clr r7
sbrs r14, WIDGET_OPTSLO_BORDER_BIT
rjmp ImageView_OnDraw_draw
ldi r16, 2
clr r17
add r4, r16
adc r5, r17
add r6, r16
adc r7, r17
ImageView_OnDraw_draw:
bigcall Widget_DrawImage
sbrs r14, WIDGET_OPTSLO_BORDER_BIT
rjmp ImageView_OnDraw_done
bigcall Widget_DrawBorder
ImageView_OnDraw_done:
bigcall Widget_GetSdramPtr ; (none)
ldd r16, Y+WIDGET_SD_OFFS_FLAGS
cbr r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
std Y+WIDGET_SD_OFFS_FLAGS, r16
ImageView_OnDraw_ret:
sec
ret
; @end
ImageView_DefaultSignalmap:
.db 0, WIDGET_SIGNAL_DRAW, LOW(ImageView_OnDraw), HIGH(ImageView_OnDraw)
.db 0, IMGVIEW_SIGNAL_SETBGCOL, LOW(ImageView_OnSetBgCol), HIGH(ImageView_OnSetBgCol)
.db 0, OBJECT_SIGNAL_CREATE, LOW(ImageView_OnCreate), HIGH(ImageView_OnCreate)
.db 0, 0, 0, 0 ; end of table
#endif

View File

@@ -1,118 +0,0 @@
; ***************************************************************************
; 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_LABEL_ASM
#define AQH_AVR_GUI2_LABEL_ASM
; ***************************************************************************
; defines
; Label in flash
.equ LABEL_OFFS_LABEL = WIDGET_SIZE
.equ LABEL_OFFS_TEXT_LO = LABEL_OFFS_LABEL+0
.equ LABEL_OFFS_TEXT_HI = LABEL_OFFS_LABEL+1
.equ LABEL_SIZE = LABEL_OFFS_LABEL+2
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine Label_OnDraw @global
;
; @param Z byte address of object (for LPM!)
; @param xl param1
; @param xh param2
; @clobbers any, !Z
Label_OnDraw:
bigcall Widget_GetSdramPtr ; (none)
ldd r16, Y+WIDGET_SD_OFFS_FLAGS
andi r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
breq Label_OnDraw_ret
adiw zh:zl, WIDGET_OFFS_OPTS_LO ; get OPTS low
lpm r14, Z
sbiw zh:zl, WIDGET_OFFS_OPTS_LO
rcall Widget_Clear
rcall labelWriteText
mov r16, r14
andi r16, (1<<WIDGET_OPTSLO_BORDER_BIT)
breq Label_OnDraw_done
ldi r16, LOW(STYLE_BUTTON_COL_BORDER)
mov r2, r16
ldi r16, HIGH(STYLE_BUTTON_COL_BORDER)
mov r3, r16
bigcall Widget_DrawBorder
Label_OnDraw_done:
bigcall Widget_GetSdramPtr ; (none)
ldd r16, Y+WIDGET_SD_OFFS_FLAGS
cbr r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
std Y+WIDGET_SD_OFFS_FLAGS, r16
Label_OnDraw_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine labelWriteText
;
; @param Z byte address of object (for LPM!)
; @param R14 opts low
; @clobbers any, !Z
labelWriteText:
push zl
push zh
adiw zh:zl, LABEL_OFFS_TEXT_LO
lpm r16, Z+
lpm zh, Z
mov zl, r16
or r16, zh
breq labelWriteText_noText
ldi r18, STYLE_WIN_FONT_WIDTH
rcall Widget_CalcStringWidthFLASH ; r13:r12=string width
pop zh
pop zl
rcall Widget_AlignPosXY ; (r8, r9, r10, r11, r12, r13, r14, r15, r16, r17, r18, r19)
adiw zh:zl, LABEL_OFFS_TEXT_LO
lpm r12, Z+
lpm r13, Z
sbiw zh:zl, LABEL_OFFS_TEXT_LO+1
bigcall Widget_DrawTextFlash
ret
labelWriteText_noText:
pop zh
pop zl
ret
; @end
Label_DefaultSignalmap:
.db 0, OBJECT_SIGNAL_CREATE, LOW(Widget_OnCreate), HIGH(Widget_OnCreate)
.db 0, WIDGET_SIGNAL_DRAW, LOW(Label_OnDraw), HIGH(Label_OnDraw)
.db 0, 0, 0, 0 ; end of table
#endif

View File

@@ -1,530 +0,0 @@
; ***************************************************************************
; 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_OBJECT_ASM
#define AQH_AVR_GUI2_OBJECT_ASM
; ***************************************************************************
; defines
; Object in flash
.equ OBJECT_OFFS_MAGIC_LO = 0
.equ OBJECT_OFFS_MAGIC_HI = 1
.equ OBJECT_OFFS_NEXT_LO = 2 ; byte address (for LPM!)
.equ OBJECT_OFFS_NEXT_HI = 3
.equ OBJECT_OFFS_PARENT_LO = 4 ; byte address (for LPM!)
.equ OBJECT_OFFS_PARENT_HI = 5
.equ OBJECT_OFFS_CHILD_LO = 6 ; byte address (for LPM!)
.equ OBJECT_OFFS_CHILD_HI = 7
.equ OBJECT_OFFS_TARGET_LO = 8 ; byte address (for LPM!)
.equ OBJECT_OFFS_TARGET_HI = 9
.equ OBJECT_OFFS_SELECTOR = 10
.equ OBJECT_OFFS_UNUSED = 11
.equ OBJECT_OFFS_SIGNALMAP_LO = 12 ; byte address (for LPM!)
.equ OBJECT_OFFS_SIGNALMAP_HI = 13
.equ OBJECT_SIZE = 14
; SignalMap entries
.equ OBJECT_SIGNALMAP_OFFS_SELECTOR = 0
.equ OBJECT_SIGNALMAP_OFFS_SIGNAL = 1 ; end if 0
.equ OBJECT_SIGNALMAP_OFFS_HANDLER_LO = 2
.equ OBJECT_SIGNALMAP_OFFS_HANDLER_HI = 3
; signals
.equ OBJECT_SIGNAL_NONE = 0
.equ OBJECT_SIGNAL_CREATE = 1
.equ OBJECT_SIGNAL_DESTROY = 2
.equ OBJECT_SIGNAL_TIMER = 3
.equ OBJECT_SIGNAL_RECVMSG = 4 ; X=msg
.equ OBJECT_SIGNAL_NEXTFREE = 5
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine OBJ_IsObject @global
;
; @param Z byte address of object (for LPM!)
; @return CFLAG set if is widget, cleared otherwise
; @clobbers none
OBJ_IsObject:
push r22
push r23
mov r22, zl
or r22, zh
clc
breq OBJ_IsObject_ret
lpm r22, Z+
lpm r23, Z
sbiw zh:zl, 1
cpi r22, 0x55
clc
brne OBJ_IsObject_ret
cpi r23, 0xaa
clc
brne OBJ_IsObject_ret
sec
OBJ_IsObject_ret:
pop r23
pop r22
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_GetParent @global
;
; @param Z byte address of object (for LPM!)
; @return CFLAG set, if found, cleared otherwise
; @return r19:r18 resulting object (byte address for LPM!), NULL otherwise
; @clobbers none
OBJ_GetParent:
rcall OBJ_IsObject
brcc OBJ_GetParent_ret
adiw zh:zl, OBJECT_OFFS_PARENT_LO
lpm r18, Z+
lpm r19, Z
sbiw zh:zl, OBJECT_OFFS_PARENT_LO+1
tst r18
brne OBJ_GetParent_secRet
tst r19
clc
breq OBJ_GetParent_ret
OBJ_GetParent_secRet:
sec
OBJ_GetParent_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_GetFirstChild @global
;
; @param Z byte address of object (for LPM!)
; @return CFLAG set, if found, cleared otherwise
; @return r19:r18 resulting object (byte address for LPM!), NULL otherwise
; @clobbers none
OBJ_GetFirstChild:
rcall OBJ_IsObject
brcc OBJ_GetFirstChild_ret
adiw zh:zl, OBJECT_OFFS_CHILD_LO
lpm r18, Z+
lpm r19, Z
sbiw zh:zl, OBJECT_OFFS_CHILD_LO+1
tst r18
brne OBJ_GetFirstChild_secRet
tst r19
clc
breq OBJ_GetFirstChild_ret
OBJ_GetFirstChild_secRet:
sec
OBJ_GetFirstChild_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_GetNext @global
;
; @param Z byte address of object (for LPM!)
; @return CFLAG set, if found, cleared otherwise
; @return r19:r18 resulting object (byte address for LPM!), NULL otherwise
; @clobbers none
OBJ_GetNext:
rcall OBJ_IsObject
brcc OBJ_GetNext_ret
adiw zh:zl, OBJECT_OFFS_NEXT_LO
lpm r18, Z+
lpm r19, Z
sbiw zh:zl, OBJECT_OFFS_NEXT_LO+1
tst r18
brne OBJ_GetNext_secRet
tst r19
clc
breq OBJ_GetNext_ret
OBJ_GetNext_secRet:
sec
OBJ_GetNext_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_GetBelow @global
;
; @param Z byte address of object (for LPM!)
; @return CFLAG set, if found, cleared otherwise
; @return r19:r18 resulting object (byte address for LPM!), NULL otherwise
; @clobbers r16
OBJ_GetBelow:
push zl
push zh
rcall OBJ_IsObject
brcc OBJ_GetBelow_ret
OBJ_GetBelow_get:
rcall OBJ_GetFirstChild
brcs OBJ_GetBelow_ret ; jmp if found
rcall OBJ_GetNext
brcs OBJ_GetBelow_ret ; jmp if found
OBJ_GetBelow_loop:
rcall OBJ_GetParent
brcc OBJ_GetBelow_ret ; jmp if no parent
; use parent
mov zl, r18
mov zh, r19
; don't check for first child here, we came from there!
rcall OBJ_GetNext
brcs OBJ_GetBelow_ret
rjmp OBJ_GetBelow_loop
OBJ_GetBelow_ret:
pop zh
pop zl
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_GetBelowParent @global
;
; @param Z byte address of object (for LPM!)
; @param r21:20 stay below this object
; @return CFLAG set, if found, cleared otherwise
; @return r19:r18 resulting object (byte address for LPM!), NULL otherwise
; @clobbers r16
OBJ_GetBelowParent:
push zl
push zh
rcall OBJ_IsObject
brcc OBJ_GetBelowParent_ret
OBJ_GetBelowParent_get:
rcall OBJ_GetFirstChild
brcs OBJ_GetBelowParent_ret ; jmp if found
rcall OBJ_GetNext
brcs OBJ_GetBelowParent_ret ; jmp if found
OBJ_GetBelowParent_loop:
rcall OBJ_GetParent
brcc OBJ_GetBelowParent_ret ; jmp if no parent
mov zl, r18
mov zh, r19
rcall objZIsNotR21R20
brcc OBJ_GetBelowParent_ret ; Z is avoidable parent
; don't check for first child here, we came from there!
rcall OBJ_GetNext
brcs OBJ_GetBelowParent_ret
rjmp OBJ_GetBelowParent_loop
OBJ_GetBelowParent_ret:
pop zh
pop zl
ret
; @end
objZIsNotR21R20:
cp zl, r20
brne objZIsNotR21R20_secRet
cp zh, r21
brne objZIsNotR21R20_secRet
clc
rjmp objZIsNotR21R20_ret
objZIsNotR21R20_secRet:
sec
objZIsNotR21R20_ret:
ret
; ---------------------------------------------------------------------------
; @routine OBJ_GetBelowSkipChildren @global
;
; Same as @ref OBJ_GetBelow but skips children of given object.
;
; @param Z byte address of object (for LPM!)
; @return CFLAG set, if found, cleared otherwise
; @return r19:r18 resulting object (byte address for LPM!), NULL otherwise
; @clobbers r16
OBJ_GetBelowSkipChildren:
push zl
push zh
tst zh
brne OBJ_GetBelowSkipChildren_get
tst zl
clc
breq OBJ_GetBelowSkipChildren_ret
OBJ_GetBelowSkipChildren_get:
rcall OBJ_GetNext
brcs OBJ_GetBelowSkipChildren_ret ; jmp if found
OBJ_GetBelowSkipChildren_loop:
rcall OBJ_GetParent
brcc OBJ_GetBelowSkipChildren_ret ; jmp if no parent
; use parent
mov zl, r18
mov zh, r19
; don't check for first child here, we came from there!
rcall OBJ_GetNext
brcs OBJ_GetBelowSkipChildren_ret
rjmp OBJ_GetBelowSkipChildren_loop
OBJ_GetBelowSkipChildren_ret:
pop zh
pop zl
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_EmitSignal @global
;
; @param Z byte address of object (for LPM!)
; @param R16 signal number
; @param xl param1
; @param xh param2
; @clobbers any, !X, !Y, !Z
OBJ_EmitSignal:
rcall OBJ_IsObject ; (none)
brcc OBJ_EmitSignal_ret
push zl
push zh
adiw zh:zl, OBJECT_OFFS_SELECTOR
lpm r17, Z
sbiw zh:zl, OBJECT_OFFS_SELECTOR
adiw zh:zl, OBJECT_OFFS_TARGET_LO
lpm r23, Z+
lpm zh, Z
mov zl, r23
rcall OBJ_HandleSignal ; (any, !X, !Y, !Z)
pop zh
pop zl
OBJ_EmitSignal_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_TreeHandleSignal @global
;
; @param Z byte address of object (for LPM!)
; @param R16 signal number
; @param R17 selector
; @param xl param1
; @param xh param2
; @return CFLAG set if handled, cleared otherwise
; @clobbers any, !R16, !R17, !X, !Z
OBJ_TreeHandleSignal:
rcall OBJ_IsObject ; (none)
brcc OBJ_TreeHandleSignal_ret
push zl
push zh
mov r18, zl
or r18, zh
clc
breq OBJ_TreeHandleSignal_done
rcall OBJ_HandleSignalSaveInRegs
brcs OBJ_TreeHandleSignal_done
rcall OBJ_GetFirstChild
OBJ_TreeHandleSignal_loop:
brcc OBJ_TreeHandleSignal_done
mov zl, r18
mov zh, r19
rcall OBJ_TreeHandleSignal ; recursion
brcs OBJ_TreeHandleSignal_done
rcall OBJ_GetNext
rjmp OBJ_TreeHandleSignal_loop
OBJ_TreeHandleSignal_done:
pop zh
pop zl
OBJ_TreeHandleSignal_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_TreeAllHandleSignal @global
;
; @param Z byte address of object (for LPM!)
; @param R16 signal number
; @param R17 selector
; @param xl param1
; @param xh param2
; @clobbers any, !R16, !R17, !X, !Z
OBJ_TreeAllHandleSignal:
rcall OBJ_IsObject ; (none)
brcc OBJ_TreeAllHandleSignal_ret
push zl
push zh
OBJ_TreeAllHandleSignal_loop:
rcall OBJ_HandleSignalSaveInRegs ; (any, !R16, !R17, !X, !Z)
push r16
rcall OBJ_GetBelow ; (R16)
pop r16
brcc OBJ_TreeAllHandleSignal_done
mov zl, r18
mov zh, r19
rjmp OBJ_TreeAllHandleSignal_loop
OBJ_TreeAllHandleSignal_done:
pop zh
pop zl
OBJ_TreeAllHandleSignal_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_HandleSignalSaveInRegs
;
; @param Z byte address of object (for LPM!)
; @param R16 signal number
; @param R17 selector
; @param xl param1
; @param xh param2
; @return CFLAG set if handled, cleared otherwise
; @clobbers any, !R16, !R17, !X, !Z
OBJ_HandleSignalSaveInRegs:
push r16
push r17
rcall OBJ_HandleSignal ; (any, !X, !Y, !Z)
pop r17
pop r16
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_HandleSignal
;
; @param Z byte address of object (for LPM!)
; @param R16 signal number
; @param R17 selector
; @param xl param1
; @param xh param2
; @return CFLAG set if handled, cleared otherwise
; @clobbers any, !X, !Y, !Z
OBJ_HandleSignal:
rcall OBJ_IsObject ; (none)
brcc OBJ_HandleSignal_ret
push zl
push zh
rcall objGetHandlerFromSignalMap ; CF set: R19:R18=handler (r22, r23)
brcc OBJ_HandleSignal_done
push xl
push xh
push yl
push yh
rcall OBJ_HandleSignal_jmpR19R18
pop yh
pop yl
pop xh
pop xl
OBJ_HandleSignal_done:
pop zh
pop zl
OBJ_HandleSignal_ret:
ret
OBJ_HandleSignal_jmpR19R18:
; jmp to r19:r18 via stack
push r18
push r19
ret
; @end
; ---------------------------------------------------------------------------
; @routine objGetHandlerFromSignalMap
;
; @param Z byte address of object (for LPM!)
; @param R16 signal number
; @param R17 selector
; @param xl param1
; @param xh param2
; @return CFLAG set if found, cleared otherwise
; @return R19:R18 handler found
; @clobbers r22, r23
objGetHandlerFromSignalMap:
push zl
push zh
; z:=signal map
adiw zh:zl, OBJECT_OFFS_SIGNALMAP_LO
lpm r23, Z+
lpm zh, Z
mov zl, r23
or r23, zh
clc
breq objGetHandlerFromSignalMap_done ; no signal map
objGetHandlerFromSignalMap_loop:
lpm r22, Z+ ; selector
lpm r23, Z+ ; signal (0=end of table)
lpm r18, Z+ ; handler LOW
lpm r19, Z+ ; handler HIGH
tst r23 ; end of table?
clc
breq objGetHandlerFromSignalMap_done ; yes, jmp
cp r16, r23 ; signal match?
brne objGetHandlerFromSignalMap_next ; no, next
tst r22
breq objGetHandlerFromSignalMap_checkHandler ; accept any selector if it is 0 in table
cp r17, r22 ; selector match?
brne objGetHandlerFromSignalMap_next ; no, next
objGetHandlerFromSignalMap_checkHandler:
mov r23, r18 ; handler==NULL?
or r23, r19
clc
breq objGetHandlerFromSignalMap_done ; yes, done
sec ; found handler, return in r19:r18
rjmp objGetHandlerFromSignalMap_done
objGetHandlerFromSignalMap_next:
rjmp objGetHandlerFromSignalMap_loop
objGetHandlerFromSignalMap_done:
pop zh
pop zl
ret
; @end
#endif

View File

@@ -1,56 +0,0 @@
; ***************************************************************************
; 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_ROOTWIDGET_ASM
#define AQH_AVR_GUI2_ROOTWIDGET_ASM
; ***************************************************************************
; defines
; RootWidget in flash
.equ ROOTWIDGET_OFFS_BEGIN = WIDGET_SIZE
.equ ROOTWIDGET_OFFS_APP_LO = ROOTWIDGET_OFFS_BEGIN+0
.equ ROOTWIDGET_OFFS_APP_HI = ROOTWIDGET_OFFS_BEGIN+1
.equ ROOTWIDGET_SIZE = ROOTWIDGET_OFFS_BEGIN+2
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine RootWidget_GetApp @global
;
; @param Z byte address of object (for LPM!)
; @return R19:R18 byte address pointer to GuiApp
; @clobbers none
RootWidget_GetApp:
bigcall OBJ_IsObject ; (none)
brcc RootWidget_GetApp_ret
adiw zh:zl, ROOTWIDGET_OFFS_APP_LO
lpm r18, Z+
lpm r19, Z
sbiw zh:zl, ROOTWIDGET_OFFS_APP_LO+1
sec
RootWidget_GetApp_ret:
ret
; @end
#endif

View File

@@ -1,471 +0,0 @@
; ***************************************************************************
; 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_SCREENSAVER_ASM
#define AQH_AVR_GUI2_SCREENSAVER_ASM
; ***************************************************************************
; defines
.equ SCREENSAVER_TIMER100ms = 6000 ; 10mins
;.equ SCREENSAVER_TIMER100ms = 300 ; 30 secs
; SDRAM data
.equ SCREENSAVER_SD_OFFS_BEGIN = WIDGET_SD_SIZE
.equ SCREENSAVER_SD_OFFS_TIMER_LO = SCREENSAVER_SD_OFFS_BEGIN+0
.equ SCREENSAVER_SD_OFFS_TIMER_HI = SCREENSAVER_SD_OFFS_BEGIN+1
.equ SCREENSAVER_SD_OFFS_PREV_VIEW_LO = SCREENSAVER_SD_OFFS_BEGIN+2
.equ SCREENSAVER_SD_OFFS_PREV_VIEW_HI = SCREENSAVER_SD_OFFS_BEGIN+3
.equ SCREENSAVER_SD_OFFS_NODEADDR1 = SCREENSAVER_SD_OFFS_BEGIN+4
.equ SCREENSAVER_SD_OFFS_VALUEID1 = SCREENSAVER_SD_OFFS_BEGIN+5
.equ SCREENSAVER_SD_OFFS_NODEADDR2 = SCREENSAVER_SD_OFFS_BEGIN+6
.equ SCREENSAVER_SD_OFFS_VALUEID2 = SCREENSAVER_SD_OFFS_BEGIN+7
.equ SCREENSAVER_SD_SIZE = SCREENSAVER_SD_OFFS_BEGIN+8
; EEPROM data
.equ SCREENSAVER_EE_OFFS_NODEADDR1 = 0
.equ SCREENSAVER_EE_OFFS_VALUEID1 = 1
.equ SCREENSAVER_EE_OFFS_NODEADDR2 = 2
.equ SCREENSAVER_EE_OFFS_VALUEID2 = 3
.equ SCREENSAVER_EE_SIZE = 4
; signals
.equ SCREENSAVER_SIGNAL_SETSOURCE1 = WIDGET_SIGNAL_NEXTFREE+0
.equ SCREENSAVER_SIGNAL_SETSOURCE2 = WIDGET_SIGNAL_NEXTFREE+1
.equ SCREENSAVER_SIGNAL_NEXTFREE = WIDGET_SIGNAL_NEXTFREE+2
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine ScreenSaver_KeepAlive @global
;
; @param Z byte address of widget object (for LPM!)
; @clobbers any, !Y, !Z
ScreenSaver_KeepAlive:
push yl
push yh
bigcall Widget_GetSdramPtr ; Y:=SDRAM data for widget (none)
ldd r24, Y+SCREENSAVER_SD_OFFS_TIMER_LO
ldd r25, Y+SCREENSAVER_SD_OFFS_TIMER_HI
mov r16, r24
or r16, r25
brne ScreenSaver_KeepAlive_restartCounter
; counter is 0, screen saver active, leave
rcall ScreenSaver_Leave ; (any, !Z)
ScreenSaver_KeepAlive_restartCounter:
ldi r16, LOW(SCREENSAVER_TIMER100ms)
std Y+SCREENSAVER_SD_OFFS_TIMER_LO, r16
ldi r16, HIGH(SCREENSAVER_TIMER100ms)
std Y+SCREENSAVER_SD_OFFS_TIMER_HI, r16
ScreenSaver_KeepAlive_ret:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine ScreenSaver_Enter @global
;
; @param Z byte address of widget object (for LPM!)
; @clobbers any, !Z
ScreenSaver_Enter:
bigcall Widget_GetApp ; r19;r18=app
push zl
push zh
mov zl, r18
mov zh, r19
bigcall GuiApp_GetCurrentView ; X=current view (Y)
pop zh
pop zl
bigcall Widget_GetSdramPtr ; Y:=SDRAM data for widget (none)
cp xl, zl
brne ScreenSaver_Enter_store
cp xh, zh
breq ScreenSaver_Enter_ret
ScreenSaver_Enter_store:
std Y+SCREENSAVER_SD_OFFS_PREV_VIEW_LO, xl
std Y+SCREENSAVER_SD_OFFS_PREV_VIEW_HI, xh
clr r16
std Y+SCREENSAVER_SD_OFFS_TIMER_LO, r16
std Y+SCREENSAVER_SD_OFFS_TIMER_HI, r16
push zl
push zh
mov xl, zl
mov xh, zh
mov zl, r18
mov zh, r19
bigcall GuiApp_ShowView ; select view: screensaver
pop zh
pop zl
clr r16
bigcall Display_SetBacklight
ScreenSaver_Enter_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine ScreenSaver_Leave @global
;
; @param Z byte address of widget object (for LPM!)
; @clobbers any, !Z
ScreenSaver_Leave:
bigcall Widget_GetSdramPtr ; Y:=SDRAM data for widget (none)
ldd xl, Y+SCREENSAVER_SD_OFFS_PREV_VIEW_LO
ldd xh, Y+SCREENSAVER_SD_OFFS_PREV_VIEW_HI
; restart screen saver timer
ldi r16, LOW(SCREENSAVER_TIMER100ms)
std Y+SCREENSAVER_SD_OFFS_TIMER_LO, r16
ldi r16, HIGH(SCREENSAVER_TIMER100ms)
std Y+SCREENSAVER_SD_OFFS_TIMER_HI, r16
; show previous view
bigcall Widget_GetApp ; r19;r18=app
push zl
push zh
mov zl, r18
mov zh, r19
bigcall GuiApp_ShowView
pop zh
pop zl
ldi r16, 0xff
bigcall Display_SetBacklight
ret
; @end
; ---------------------------------------------------------------------------
; @routine ScreenSaver_OnTimer @global
;
; @param Z byte address of widget object (for LPM!)
; @clobbers any, !Z
ScreenSaver_OnTimer:
bigcall Widget_GetSdramPtr ; Y:=SDRAM data for widget (none)
ldd r24, Y+SCREENSAVER_SD_OFFS_TIMER_LO
ldd r25, Y+SCREENSAVER_SD_OFFS_TIMER_HI
mov r16, r24
or r16, r25
breq ScreenSaver_OnTimer_ret
sbiw r25:r24, 1
std Y+SCREENSAVER_SD_OFFS_TIMER_LO, r24
std Y+SCREENSAVER_SD_OFFS_TIMER_HI, r25
brne ScreenSaver_OnTimer_ret
rcall ScreenSaver_Enter ; (any, !Z)
ScreenSaver_OnTimer_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine ScreenSaver_OnCreate @global
;
; @param Z byte address of widget object (for LPM!)
; @return CFLAG set if signal handled
; @clobbers any, !Z
ScreenSaver_OnCreate:
bigcall OBJ_IsObject ; (none)
brcc ScreenSaver_OnCreate_ret
; preset SDRAM
bigcall Widget_GetSdramPtr ; (none)
clr r16
ldi r17, SCREENSAVER_SD_SIZE
push yl
push yh
ScreenSaver_OnCreate_loop:
st Y+, r16
dec r17
brne ScreenSaver_OnCreate_loop
pop yh
pop yl
push yl
push yh
bigcall Widget_OnCreate
pop yh
pop yl
ldi r16, LOW(SCREENSAVER_TIMER100ms)
std Y+SCREENSAVER_SD_OFFS_TIMER_LO, r16
ldi r16, HIGH(SCREENSAVER_TIMER100ms)
std Y+SCREENSAVER_SD_OFFS_TIMER_HI, r16
ldi r16, 0xff
bigcall Display_SetBacklight
rcall screenSaverReadFromEeprom
ScreenSaver_OnCreate_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine ScreenSaver_OnTouch @global
;
; @param Z byte address of widget object (for LPM!)
; @param X pointer to TOUCH event (see @ref WIDGET_DATA_TOUCH_OFFS_X_LO)
; @return CFLAG set if signal handled
; @clobbers any, !Z
ScreenSaver_OnTouch:
bigcall Widget_GetSdramPtr ; Y:=SDRAM data for widget
; read touch signal data from X
adiw xh:xl, WIDGET_DATA_TOUCH_OFFS_STATE
ld r22, X ; WIDGET_DATA_TOUCH_OFFS_STATE
sbiw xh:xl, WIDGET_DATA_TOUCH_OFFS_STATE
sbrs r22, DISPLAY_IFLAGS_PRESSED_BIT
rjmp ScreenSaver_OnTouch_up
; down (active touch), switch display on
ldi r16, 0xff
bigcall Display_SetBacklight
rjmp ScreenSaver_OnTouch_ret
ScreenSaver_OnTouch_up:
rcall ScreenSaver_Leave
ScreenSaver_OnTouch_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine ScreenSaver_OnMsgReceived @global
;
; @param Z byte address of widget object (for LPM!)
; @param XL node addr
; @param XH value id
; @return CFLAG set if signal handled
; @clobbers any, !Z
ScreenSaver_OnMsgReceived:
push zl
push zh
mov yl, zl
mov yh, zh
ldi zl, LOW(ScreenSaver_MsgTable*2)
ldi zh, HIGH(ScreenSaver_MsgTable*2)
bigcall Main_HandleValueMsg ; (any)
pop zh
pop zl
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine screenSaverHandleSetSource1
;
; @param Y byte address of widget object (for LPM!)
; @param R17 value id
; @param R19:R18 value
; @param R21:R20 denom (e.g. 100, meaning value must be divided by 100)
; @param R22 source address
; @param R23 command
; @param R25:R24 message id
; @return CFLAG set if ACK/NACK requested
; @return R23 command value for ACK/NACK message
; @clobbers R16, R17, R18, R20, R21, X, Y, Z
screenSaverHandleSetSource1:
mov zl, yl
mov zh, yh
bigcall Widget_GetSdramPtr ; Y:=SDRAM data for widget
std Y+SCREENSAVER_SD_OFFS_NODEADDR1, r18
std Y+SCREENSAVER_SD_OFFS_VALUEID1, r19
rcall screenSaverWriteToEeprom ; (R16, R17, R18, R20, R21, X, Y)
ldi r23, NETMSG_CMD_VALUE_SET_ACK
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine screenSaverHandleSetSource2
;
; @param Y byte address of widget object (for LPM!)
; @param R17 value id
; @param R19:R18 value
; @param R21:R20 denom (e.g. 100, meaning value must be divided by 100)
; @param R22 source address
; @param R23 command
; @param R25:R24 message id
; @return CFLAG set if ACK/NACK requested
; @return R23 command value for ACK/NACK message
; @clobbers R16, R17, R18, R20, R21, X, Y, Z
screenSaverHandleSetSource2:
mov zl, yl
mov zh, yh
bigcall Widget_GetSdramPtr ; Y:=SDRAM data for widget
std Y+SCREENSAVER_SD_OFFS_NODEADDR1, r18
std Y+SCREENSAVER_SD_OFFS_VALUEID1, r19
rcall screenSaverWriteToEeprom ; (R16, R17, R18, R20, R21, X, Y)
ldi r23, NETMSG_CMD_VALUE_SET_ACK
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine screenSaverHandleReport
;
; @param Y byte address of widget object (for LPM!)
; @param R17 value id
; @param R19:R18 value
; @param R21:R20 denom (e.g. 100, meaning value must be divided by 100)
; @param R22 source address
; @param R23 command
; @param R25:R24 message id
; @return CFLAG cleared (no ACK/NACK requested)
; @clobbers any
screenSaverHandleReport:
mov zl, yl
mov zh, yh
bigcall Widget_GetSdramPtr ; Y:=SDRAM data for widget
mov r16, r18 ; check for non-zero value
or r16, r19
breq screenSaverHandleReport_end
ldd r16, Y+SCREENSAVER_SD_OFFS_NODEADDR1
cp r16, r22
brne screenSaverHandleReport_l1
ldd r16, Y+SCREENSAVER_SD_OFFS_VALUEID1
cp r16, r17
breq screenSaverHandleReport_matches
screenSaverHandleReport_l1:
ldd r16, Y+SCREENSAVER_SD_OFFS_NODEADDR2
cp r16, r22
brne screenSaverHandleReport_end
ldd r16, Y+SCREENSAVER_SD_OFFS_VALUEID2
cp r16, r17
brne screenSaverHandleReport_end
screenSaverHandleReport_matches:
rcall ScreenSaver_KeepAlive
screenSaverHandleReport_end:
clc ; no ACK needed
ret
; @end
; ---------------------------------------------------------------------------
; @routine screenSaverWriteToEeprom
;
; @param Z byte address of widget object (for LPM!)
; @return CFLAG set if data found and read, cleared on error
; @clobbers R16, R17, R18, R20, R21, X, Y
screenSaverWriteToEeprom:
ldi r16, EEID_SCREENSAVER
bigcall EepromTlv_FindFirst ; (R18)
brcs screenSaverWriteToEeprom_write
ldi r16, EEID_SCREENSAVER
ldi r17, SCREENSAVER_EE_SIZE
bigcall EepromTlv_AddTlv ; X=pointer to EEPROM data (R16, R18, R20, R21)
brcc screenSaverWriteToEeprom_ret
screenSaverWriteToEeprom_write:
bigcall Widget_GetSdramPtr ; (none)
adiw yh:yl, SCREENSAVER_SD_OFFS_NODEADDR1
ldi r18, SCREENSAVER_EE_SIZE
screenSaverWriteToEeprom_loop:
ld r16, Y+
bigcall Eeprom_WriteByteIfChanged ; (R17)
brcc screenSaverWriteToEeprom_ret
adiw xh:xl, 1
dec r18
brne screenSaverWriteToEeprom_loop
sec
screenSaverWriteToEeprom_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine screenSaverReadFromEeprom
;
; @param Z byte address of widget object (for LPM!)
; @return CFLAG set if data found and read, cleared on error
; @clobbers R16, R18, X, Y
screenSaverReadFromEeprom:
ldi r16, EEID_SCREENSAVER
bigcall EepromTlv_FindFirst ; (R18)
brcc screenSaverReadFromEeprom_ret
bigcall Widget_GetSdramPtr ; (none)
adiw yh:yl, SCREENSAVER_SD_OFFS_NODEADDR1
ldi r18, SCREENSAVER_EE_SIZE
screenSaverReadFromEeprom_loop:
bigcall Eeprom_ReadByte ; R16=byte (none)
brcc screenSaverReadFromEeprom_ret
st Y+, r16
adiw xh:xl, 1
dec r18
brne screenSaverReadFromEeprom_loop
sec
screenSaverReadFromEeprom_ret:
ret
; @end
ScreenSaver_MsgTable:
.dw NETMSG_CMD_VALUE_SET | (VALUE_ID_SCREENSAVER_SETSOURCE1<<8), screenSaverHandleSetSource1
.dw NETMSG_CMD_VALUE_SET | (VALUE_ID_SCREENSAVER_SETSOURCE2<<8), screenSaverHandleSetSource2
.dw NETMSG_CMD_VALUE_REPORT, screenSaverHandleReport
.dw 0, 0
ScreenSaver_DefaultSignalmap:
.db 0, OBJECT_SIGNAL_TIMER, LOW(ScreenSaver_OnTimer), HIGH(ScreenSaver_OnTimer)
.db 0, WIDGET_SIGNAL_TOUCH, LOW(ScreenSaver_OnTouch), HIGH(ScreenSaver_OnTouch)
.db 0, OBJECT_SIGNAL_RECVMSG, LOW(ScreenSaver_OnMsgReceived), HIGH(ScreenSaver_OnMsgReceived)
.db 0, WIDGET_SIGNAL_DRAW, LOW(Widget_OnDraw), HIGH(Widget_OnDraw)
.db 0, OBJECT_SIGNAL_CREATE, LOW(ScreenSaver_OnCreate), HIGH(ScreenSaver_OnCreate)
.db 0, 0, 0, 0 ; end of table
#endif

View File

@@ -1,177 +0,0 @@
; ***************************************************************************
; 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_VALUELABEL_ASM
#define AQH_AVR_GUI2_VALUELABEL_ASM
; ***************************************************************************
; defines
; IMGVIEW in flash
.equ VLABEL_OFFS_VLABEL = WIDGET_SIZE
.equ VLABEL_OFFS_POSTKOMMADIGITS = VLABEL_OFFS_VLABEL+0
.equ VLABEL_OFFS_RESERVED = VLABEL_OFFS_VLABEL+1
.equ VLABEL_SIZE = VLABEL_OFFS_VLABEL+2
; SDRAM data for IMGVIEW
.equ VLABEL_SD_OFFS_VLABEL = WIDGET_SD_SIZE
.equ VLABEL_SD_OFFS_VALUE_LO = VLABEL_SD_OFFS_VLABEL+0
.equ VLABEL_SD_OFFS_VALUE_HI = VLABEL_SD_OFFS_VLABEL+1
.equ VLABEL_SD_SIZE = VLABEL_SD_OFFS_VLABEL+2
; signals
.equ VLABEL_SIGNAL_SETVALUE = WIDGET_SIGNAL_NEXTFREE+0
.equ VLABEL_SIGNAL_NEXTFREE = WIDGET_SIGNAL_NEXTFREE+1
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine ImageView_OnCreate @global
;
; @param Z byte address of widget object (for LPM!)
; @return CFLAG set if signal handled
; @clobbers any, !Z
ValueLabel_OnCreate:
bigcall Widget_OnCreate
bigcall Widget_GetSdramPtr ; (none)
clr r16
std Y+VLABEL_SD_OFFS_VALUE_LO, r16
std Y+VLABEL_SD_OFFS_VALUE_HI, r16
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine ValueLabel_OnSetValue @global
;
; @param Z byte address of widget object (for LPM!)
; @param X new value for background color
; @return CFLAG set if signal handled
; @clobbers r17
ValueLabel_OnSetValue:
bigcall OBJ_IsObject ; (none)
brcc ValueLabel_OnSetValue_ret
push zl
push zh
rcall Widget_GetSdramPtr ; (none)
std Y+VLABEL_SD_OFFS_VALUE_LO, xl
std Y+VLABEL_SD_OFFS_VALUE_HI, xh
ldd r17, Y+WIDGET_SD_OFFS_FLAGS
ori r17, (1<<WIDGET_FLAGS_DIRTY_BIT)
std Y+WIDGET_SD_OFFS_FLAGS, r17
pop zh
pop zl
ValueLabel_OnSetValue_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine ValueLabel_OnDraw @global
;
; @param Z byte address of widget object (for LPM!)
; @return CFLAG set if signal handled
; @clobbers any, !Z
ValueLabel_OnDraw:
bigcall Widget_GetSdramPtr ; (none)
ldd r16, Y+WIDGET_SD_OFFS_FLAGS
andi r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
breq ValueLabel_OnDraw_ret
bigcall Widget_Clear
adiw zh:zl, WIDGET_OFFS_OPTS_LO ; get OPTS low
lpm r14, Z
sbiw zh:zl, WIDGET_OFFS_OPTS_LO
push r14
rcall valueLabelWriteValue
pop r14
sbrs r14, WIDGET_OPTSLO_BORDER_BIT
rjmp ValueLabel_OnDraw_done
ldi r16, LOW(STYLE_BUTTON_COL_BORDER)
mov r2, r16
ldi r16, HIGH(STYLE_BUTTON_COL_BORDER)
mov r3, r16
bigcall Widget_DrawBorder
ValueLabel_OnDraw_done:
bigcall Widget_GetSdramPtr ; (none)
ldd r16, Y+WIDGET_SD_OFFS_FLAGS
cbr r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
std Y+WIDGET_SD_OFFS_FLAGS, r16
ValueLabel_OnDraw_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine valueLabelWriteValue
;
; @param Z byte address of object (for LPM!)
; @param R14 opts low
; @clobbers any, !Z
valueLabelWriteValue:
push zl
push zh
bigcall Widget_GetSdramPtr ; (none)
; convert value to string
ldd r20, Y+VLABEL_SD_OFFS_VALUE_LO
ldd r21, Y+VLABEL_SD_OFFS_VALUE_HI
adiw zh:zl, VLABEL_OFFS_POSTKOMMADIGITS
lpm r24, Z
sbiw zh:zl, VLABEL_OFFS_POSTKOMMADIGITS
rcall IntToAscii ; X=pointer to text
; align according to string size
ldi r18, STYLE_WIN_FONT_WIDTH
rcall Widget_CalcStringWidthSDRAM ; r13:r12=string width
rcall Widget_AlignPosXY ; (r8, r9, r10, r11, r12, r13, r14, r15, r16, r17, r18, r19)
bigcall Widget_DrawTextSDRAM
pop zh
pop zl
ret
; @end
ValueLabel_DefaultSignalmap:
.db 0, OBJECT_SIGNAL_CREATE, LOW(ValueLabel_OnCreate), HIGH(ValueLabel_OnCreate)
.db 0, WIDGET_SIGNAL_DRAW, LOW(ValueLabel_OnDraw), HIGH(ValueLabel_OnDraw)
.db 0, VLABEL_SIGNAL_SETVALUE, LOW(ValueLabel_OnSetValue), HIGH(ValueLabel_OnSetValue)
.db 0, 0, 0, 0 ; end of table
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,11 @@
<?xml?>
<gwbuild>
<extradist>
simple.asm
</extradist>
</gwbuild>

View File

@@ -1,608 +0,0 @@
; ***************************************************************************
; 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_SENSORWATCH_ASM
#define AQH_AVR_GUI2_SENSORWATCH_ASM
; ***************************************************************************
; SensorWatch
;
; This widget has three subwidgets:
; - Title (Label)
; - Image (ImageView)
; - Value (Label)
;
; It watches received messages and reacts on those matching the stored
; combination of NodeAddr and ValueId by colouring the image according to
; the value received and also shows the value beloe the image.
;
; Please note that this widget needs to have the option bit
; "WIDGET_OPTSLO_MSGRECV_BIT" set in order to receive MsgReceived signals.
;
; ***************************************************************************
; ***************************************************************************
; defines
; SensorWatch in flash
.equ SENSORWATCH_OFFS_BEGIN = WIDGET_SIZE
.equ SENSORWATCH_OFFS_BASEVALUEID = SENSORWATCH_OFFS_BEGIN+0
.equ SENSORWATCH_OFFS_EEPROMID = SENSORWATCH_OFFS_BEGIN+1
.equ SENSORWATCH_SIZE = SENSORWATCH_OFFS_BEGIN+2
; SDRAM data for SensorWatch
.equ SENSORWATCH_SD_OFFS_SENSORWATCH = WIDGET_SD_SIZE
.equ SENSORWATCH_SD_OFFS_NODEADDR = SENSORWATCH_SD_OFFS_SENSORWATCH+0
.equ SENSORWATCH_SD_OFFS_VALUEID = SENSORWATCH_SD_OFFS_SENSORWATCH+1
.equ SENSORWATCH_SD_OFFS_UPPER_LIMIT_WARN_LO = SENSORWATCH_SD_OFFS_SENSORWATCH+2
.equ SENSORWATCH_SD_OFFS_UPPER_LIMIT_WARN_HI = SENSORWATCH_SD_OFFS_SENSORWATCH+3
.equ SENSORWATCH_SD_OFFS_LOWER_LIMIT_WARN_LO = SENSORWATCH_SD_OFFS_SENSORWATCH+4
.equ SENSORWATCH_SD_OFFS_LOWER_LIMIT_WARN_HI = SENSORWATCH_SD_OFFS_SENSORWATCH+5
.equ SENSORWATCH_SD_OFFS_UPPER_LIMIT_CRIT_LO = SENSORWATCH_SD_OFFS_SENSORWATCH+6
.equ SENSORWATCH_SD_OFFS_UPPER_LIMIT_CRIT_HI = SENSORWATCH_SD_OFFS_SENSORWATCH+7
.equ SENSORWATCH_SD_OFFS_LOWER_LIMIT_CRIT_LO = SENSORWATCH_SD_OFFS_SENSORWATCH+8
.equ SENSORWATCH_SD_OFFS_LOWER_LIMIT_CRIT_HI = SENSORWATCH_SD_OFFS_SENSORWATCH+9
.equ SENSORWATCH_SD_OFFS_VALUE_LO = SENSORWATCH_SD_OFFS_SENSORWATCH+10
.equ SENSORWATCH_SD_OFFS_VALUE_HI = SENSORWATCH_SD_OFFS_SENSORWATCH+11
.equ SENSORWATCH_SD_SIZE = SENSORWATCH_SD_OFFS_SENSORWATCH+12
; EEPROM data for SensorWatch
.equ SENSORWATCH_EE_OFFS_NODEADDR = 0
.equ SENSORWATCH_EE_OFFS_VALUEID = 1
.equ SENSORWATCH_EE_OFFS_UPPER_LIMIT_WARN_LO = 2
.equ SENSORWATCH_EE_OFFS_UPPER_LIMIT_WARN_HI = 3
.equ SENSORWATCH_EE_OFFS_LOWER_LIMIT_WARN_LO = 4
.equ SENSORWATCH_EE_OFFS_LOWER_LIMIT_WARN_HI = 5
.equ SENSORWATCH_EE_OFFS_UPPER_LIMIT_CRIT_LO = 6
.equ SENSORWATCH_EE_OFFS_UPPER_LIMIT_CRIT_HI = 7
.equ SENSORWATCH_EE_OFFS_LOWER_LIMIT_CRIT_LO = 8
.equ SENSORWATCH_EE_OFFS_LOWER_LIMIT_CRIT_HI = 9
.equ SENSORWATCH_EE_SIZE = 10
; signals
.equ SENSORWATCH_SIGNAL_SETSOURCE = WIDGET_SIGNAL_NEXTFREE+0
.equ SENSORWATCH_SIGNAL_SETUPPERLIMWARN = WIDGET_SIGNAL_NEXTFREE+1
.equ SENSORWATCH_SIGNAL_SETLOWERLIMWARN = WIDGET_SIGNAL_NEXTFREE+2
.equ SENSORWATCH_SIGNAL_SETUPPERLIMCRIT = WIDGET_SIGNAL_NEXTFREE+3
.equ SENSORWATCH_SIGNAL_SETLOWERLIMCRIT = WIDGET_SIGNAL_NEXTFREE+4
.equ SENSORWATCH_SIGNAL_NEXTFREE = WIDGET_SIGNAL_NEXTFREE+5
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine SensorWatch_OnCreate @global
;
; @param Z byte address of widget object (for LPM!)
; @return CFLAG set if signal handled
; @clobbers any, !Z
SensorWatch_OnCreate:
bigcall OBJ_IsObject ; (none)
brcc SensorWatch_OnCreate_ret
; preset SDRAM
bigcall Widget_GetSdramPtr ; (none)
clr r16
ldi r17, SENSORWATCH_SD_SIZE
push yl
push yh
SensorWatch_OnCreate_loop:
st Y+, r16
dec r17
brne SensorWatch_OnCreate_loop
pop yh
pop yl
bigcall Widget_OnCreate
rcall sensorWatchReadFromEeprom ; (R16, R18, X, Y)
SensorWatch_OnCreate_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine SensorWatch_OnSetSource @global
;
; @param Z byte address of widget object (for LPM!)
; @param XL node addr
; @param XH value id
; @return CFLAG set if signal handled
; @clobbers any, !Z
SensorWatch_OnSetSource:
bigcall OBJ_IsObject ; (none)
brcc SensorWatch_OnSetSource_ret
push zl
push zh
bigcall Widget_GetSdramPtr ; (none)
std Y+SENSORWATCH_SD_OFFS_NODEADDR, xl
std Y+SENSORWATCH_SD_OFFS_VALUEID, xh
pop zh
pop zl
SensorWatch_OnSetSource_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine SensorWatch_OnSetLowerLimitWarn @global
;
; @param Z byte address of widget object (for LPM!)
; @param X value
; @return CFLAG set if signal handled
; @clobbers any, !Z
SensorWatch_OnSetLowerLimitWarn:
bigcall OBJ_IsObject ; (none)
brcc SensorWatch_OnSetLowerLimitWarn_ret
bigcall Widget_GetSdramPtr ; (none)
std Y+SENSORWATCH_SD_OFFS_LOWER_LIMIT_WARN_LO, xl
std Y+SENSORWATCH_SD_OFFS_LOWER_LIMIT_WARN_HI, xh
rcall sensorWatchSetColor
SensorWatch_OnSetLowerLimitWarn_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine SensorWatch_OnSetUpperLimitWarn @global
;
; @param Z byte address of widget object (for LPM!)
; @param X value
; @return CFLAG set if signal handled
; @clobbers any, !Z
SensorWatch_OnSetUpperLimitWarn:
bigcall OBJ_IsObject ; (none)
brcc SensorWatch_OnSetUpperLimitWarn_ret
bigcall Widget_GetSdramPtr ; (none)
std Y+SENSORWATCH_SD_OFFS_UPPER_LIMIT_WARN_LO, xl
std Y+SENSORWATCH_SD_OFFS_UPPER_LIMIT_WARN_HI, xh
rcall sensorWatchSetColor
SensorWatch_OnSetUpperLimitWarn_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine SensorWatch_OnSetLimitCrit @global
;
; @param Z byte address of widget object (for LPM!)
; @param X value
; @return CFLAG set if signal handled
; @clobbers any, !Z
SensorWatch_OnSetLowerLimitCrit:
bigcall OBJ_IsObject ; (none)
brcc SensorWatch_OnSetLowerLimitCrit_ret
rcall Widget_GetSdramPtr ; (none)
std Y+SENSORWATCH_SD_OFFS_LOWER_LIMIT_CRIT_LO, xl
std Y+SENSORWATCH_SD_OFFS_LOWER_LIMIT_CRIT_HI, xh
rcall sensorWatchSetColor
SensorWatch_OnSetLowerLimitCrit_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine SensorWatch_OnSetUpperLimitCrit @global
;
; @param Z byte address of widget object (for LPM!)
; @param X value
; @return CFLAG set if signal handled
; @clobbers any, !Z
SensorWatch_OnSetUpperLimitCrit:
bigcall OBJ_IsObject ; (none)
brcc SensorWatch_OnSetUpperLimitCrit_ret
rcall Widget_GetSdramPtr ; (none)
std Y+SENSORWATCH_SD_OFFS_UPPER_LIMIT_CRIT_LO, xl
std Y+SENSORWATCH_SD_OFFS_UPPER_LIMIT_CRIT_HI, xh
rcall sensorWatchSetColor
SensorWatch_OnSetUpperLimitCrit_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine SensorWatch_OnMsgReceived @global
;
; @param Z byte address of widget object (for LPM!)
; @param XL node addr
; @param XH value id
; @return CFLAG set if signal handled
; @clobbers any, !Z
SensorWatch_OnMsgReceived:
adiw xh:xl, 2 ; command
ld r16, X
sbiw xh:xl, 2
cpi r16, NETMSG_CMD_VALUE_REPORT
breq SensorWatch_OnMsgReceived_report
cpi r16, NETMSG_CMD_VALUE_SET
breq SensorWatch_OnMsgReceived_set
rjmp SensorWatch_OnMsgReceived_ret
SensorWatch_OnMsgReceived_report:
bigcall Widget_GetSdramPtr ; (none)
bigcall NETMSG_ValueRead ; R17=valueId, R22=nodeAddr R19:R18=value (none)
; check node addr
ldd r16, Y+SENSORWATCH_SD_OFFS_NODEADDR
cp r16, r22
brne SensorWatch_OnMsgReceived_ret
; check value id
ldd r16, Y+SENSORWATCH_SD_OFFS_VALUEID
cp r16, r17
brne SensorWatch_OnMsgReceived_ret
; store value
std Y+SENSORWATCH_SD_OFFS_VALUE_LO, r18
std Y+SENSORWATCH_SD_OFFS_VALUE_HI, r19
; setup background color
rcall sensorWatchSetColor ; (any, !Y, !Z)
rcall sensorWatchSetValueLabel ; (any, !Y, !Z)
rjmp SensorWatch_OnMsgReceived_ret
SensorWatch_OnMsgReceived_set:
bigcall Widget_GetSdramPtr ; (none)
bigcall NETMSG_ValueRead ; R17=valueId, R22=nodeAddr R19:R18=value (none)
adiw zh:zl, SENSORWATCH_OFFS_BASEVALUEID
lpm r16, Z
sbiw zh:zl, SENSORWATCH_OFFS_BASEVALUEID
sub r17, r16
brcs SensorWatch_OnMsgReceived_ret ; not my value
cpi r17, 3
brcc SensorWatch_OnMsgReceived_ret ; not my value
cpi r17, 0
breq SensorWatch_OnMsgReceived_setSource
cpi r17, 1
breq SensorWatch_OnMsgReceived_setLimWarn
cpi r17, 2
breq SensorWatch_OnMsgReceived_setLimCrit
rjmp SensorWatch_OnMsgReceived_ret
SensorWatch_OnMsgReceived_setSource:
std Y+SENSORWATCH_SD_OFFS_NODEADDR, r18
std Y+SENSORWATCH_SD_OFFS_VALUEID, r19
rjmp SensorWatch_OnMsgReceived_sendACK
SensorWatch_OnMsgReceived_setLimWarn:
std Y+SENSORWATCH_SD_OFFS_LOWER_LIMIT_WARN_LO, r18
std Y+SENSORWATCH_SD_OFFS_LOWER_LIMIT_WARN_HI, r19
std Y+SENSORWATCH_SD_OFFS_UPPER_LIMIT_WARN_LO, r20
std Y+SENSORWATCH_SD_OFFS_UPPER_LIMIT_WARN_HI, r21
rjmp SensorWatch_OnMsgReceived_sendACK
SensorWatch_OnMsgReceived_setLimCrit:
std Y+SENSORWATCH_SD_OFFS_LOWER_LIMIT_CRIT_LO, r18
std Y+SENSORWATCH_SD_OFFS_LOWER_LIMIT_CRIT_HI, r19
std Y+SENSORWATCH_SD_OFFS_UPPER_LIMIT_CRIT_LO, r20
std Y+SENSORWATCH_SD_OFFS_UPPER_LIMIT_CRIT_HI, r21
SensorWatch_OnMsgReceived_sendACK:
add r17, r16 ; restore valueId
push xl
push xh
push yl
push yh
ldi r23, NETMSG_CMD_VALUE_SET_ACK
bigcall Main_SendValueResponse ; (clobbers all except Z)
pop yh
pop yl
rcall sensorWatchSetColor ; (any, !Y, !Z)
rcall sensorWatchWriteToEeprom ; (R16, R17, R18, R20, R21, X, Y)
pop xh
pop xl
SensorWatch_OnMsgReceived_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine SensorWatch_GetImageView @global
;
; @param Z byte address of widget object (for LPM!)
; @return CFLAG set if widget found, cleared otherwise
; @return R19:R18 byte address pointer to image view (for LPM!)
; @clobbers none
SensorWatch_GetImageView:
bigcall OBJ_IsObject ; (none)
brcc SensorWatch_GetImageView_ret
push zl
push zh
bigcall OBJ_GetFirstChild ; (none)
brcc SensorWatch_GetImageView_done
mov zl, r18
mov zh, r19
bigcall OBJ_GetNext ; 2nd child
SensorWatch_GetImageView_done:
pop zh
pop zl
SensorWatch_GetImageView_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine SensorWatch_GetValueLabel @global
;
; @param Z byte address of widget object (for LPM!)
; @return CFLAG set if widget found, cleared otherwise
; @return R19:R18 byte address pointer to image view (for LPM!)
; @clobbers none
SensorWatch_GetValueLabel:
bigcall OBJ_IsObject ; (none)
brcc SensorWatch_GetValueLabel_ret
push zl
push zh
bigcall OBJ_GetFirstChild ; (none)
brcc SensorWatch_GetValueLabel_done
mov zl, r18
mov zh, r19
bigcall OBJ_GetNext ; 2nd child
brcc SensorWatch_GetValueLabel_done
mov zl, r18
mov zh, r19
bigcall OBJ_GetNext ; 3nd child
SensorWatch_GetValueLabel_done:
pop zh
pop zl
SensorWatch_GetValueLabel_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine sensorWatchSetColor
;
; @param Z byte address of widget object (for LPM!)
; @param Y pointer to SDRAM data
; @clobbers any, !Y, !Z
sensorWatchSetColor:
push yl
push yh
; default color is green
ldi xl, LOW(DISPLAY_COLOR_DARKGREEN)
ldi xh, HIGH(DISPLAY_COLOR_DARKGREEN)
ldd r20, Y+SENSORWATCH_SD_OFFS_VALUE_LO
ldd r21, Y+SENSORWATCH_SD_OFFS_VALUE_HI
mov r16, r20
or r16, r21
breq sensorWatchSetColor_ret ; do nothing
; check against critical limits
adiw yh:yl, SENSORWATCH_SD_OFFS_UPPER_LIMIT_CRIT_LO
rcall sensorWatchCheckAgainstLimit ; (r16, r17, r22, r23)
brcs sensorWatchSetColor_setRed
sbiw yh:yl, SENSORWATCH_SD_OFFS_UPPER_LIMIT_CRIT_LO
; check against warning limits
adiw yh:yl, SENSORWATCH_SD_OFFS_UPPER_LIMIT_WARN_LO
rcall sensorWatchCheckAgainstLimit ; (r16, r17, r22, r23)
brcs sensorWatchSetColor_setYellow
sbiw yh:yl, SENSORWATCH_SD_OFFS_UPPER_LIMIT_WARN_LO
; set green background
rjmp sensorWatchSetColor_setColor
sensorWatchSetColor_setRed:
ldi xl, LOW(DISPLAY_COLOR_RED)
ldi xh, HIGH(DISPLAY_COLOR_RED)
rjmp sensorWatchSetColor_setColor
sensorWatchSetColor_setYellow:
ldi xl, LOW(DISPLAY_COLOR_YELLOW)
ldi xh, HIGH(DISPLAY_COLOR_YELLOW)
sensorWatchSetColor_setColor:
rcall SensorWatch_GetImageView ; (none)
brcc sensorWatchSetColor_ret
push zl
push zh
mov zl, r18
mov zh, r19
ldi r16, IMGVIEW_SIGNAL_SETBGCOL
clr r17
bigcall OBJ_HandleSignal ; (any, !X, !Y, !Z)
pop zh
pop zl
sensorWatchSetColor_ret:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine sensorWatchCheckAgainstLimit
;
; @param R21:R20 value to check against limit
; @param Y points to upper limit (lo/hi), followed by lower limit (lo/hi)
; @return CFLAG set if limit triggered, cleared if between upper and lower limit
; @clobbers r16, r17, r22, r23
sensorWatchCheckAgainstLimit:
; check against upper limit (if any)
ldd r22, Y+0
ldd r23, Y+1
mov r16, r22
or r16, r23 ; zero?
clc
breq sensorWatchCheckAgainstLimit_ret ; yes, jmp
cp r20, r22
cpc r21, r23
brcc sensorWatchCheckAgainstLimit_secRet
; check against lower limit (if any)
ldd r22, Y+2
ldd r23, Y+3
mov r16, r22
or r16, r23 ; zero?
clc
breq sensorWatchCheckAgainstLimit_ret ; yes, jmp
cp r22, r20
cpc r23, r21
brcc sensorWatchCheckAgainstLimit_secRet
clc
rjmp sensorWatchCheckAgainstLimit_ret
sensorWatchCheckAgainstLimit_secRet:
sec
sensorWatchCheckAgainstLimit_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine sensorWatchSetValueLabel
;
; @param Z byte address of widget object (for LPM!)
; @param Y pointer to SDRAM data
; @clobbers any, !Y, !Z
sensorWatchSetValueLabel:
rcall SensorWatch_GetValueLabel ; (none)
brcc sensorWatchSetValueLabel_ret
push zl
push zh
mov zl, r18
mov zh, r19
ldd xl, Y+SENSORWATCH_SD_OFFS_VALUE_LO
ldd xh, Y+SENSORWATCH_SD_OFFS_VALUE_HI
ldi r16, VLABEL_SIGNAL_SETVALUE
clr r17
bigcall OBJ_HandleSignal ; (any, !X, !Y, !Z)
pop zh
pop zl
sensorWatchSetValueLabel_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine sensorWatchWriteToEeprom
;
; @param Z byte address of widget object (for LPM!)
; @return CFLAG set if data found and read, cleared on error
; @clobbers R16, R17, R18, R20, R21, X, Y
sensorWatchWriteToEeprom:
adiw zh:zl, SENSORWATCH_OFFS_EEPROMID
lpm r16, Z
sbiw zh:zl, SENSORWATCH_OFFS_EEPROMID
tst r16
clc
breq sensorWatchWriteToEeprom_ret
push r16
bigcall EepromTlv_FindFirst ; (R18)
pop r16
brcs sensorWatchWriteToEeprom_write
ldi r17, SENSORWATCH_EE_SIZE
bigcall EepromTlv_AddTlv ; X=pointer to EEPROM data (R16, R18, R20, R21)
brcc sensorWatchWriteToEeprom_ret
sensorWatchWriteToEeprom_write:
bigcall Widget_GetSdramPtr ; (none)
adiw yh:yl, SENSORWATCH_SD_OFFS_NODEADDR
ldi r18, SENSORWATCH_EE_SIZE
sensorWatchWriteToEeprom_loop:
ld r16, Y+
bigcall Eeprom_WriteByteIfChanged ; (R17)
brcc sensorWatchWriteToEeprom_ret
adiw xh:xl, 1
dec r18
brne sensorWatchWriteToEeprom_loop
sec
sensorWatchWriteToEeprom_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine sensorWatchReadFromEeprom
;
; @param Z byte address of widget object (for LPM!)
; @return CFLAG set if data found and read, cleared on error
; @clobbers R16, R18, X, Y
sensorWatchReadFromEeprom:
adiw zh:zl, SENSORWATCH_OFFS_EEPROMID
lpm r16, Z
sbiw zh:zl, SENSORWATCH_OFFS_EEPROMID
bigcall EepromTlv_FindFirst ; (R18)
brcc sensorWatchReadFromEeprom_ret
bigcall Widget_GetSdramPtr ; (none)
adiw yh:yl, SENSORWATCH_SD_OFFS_NODEADDR
ldi r18, SENSORWATCH_EE_SIZE
sensorWatchReadFromEeprom_loop:
bigcall Eeprom_ReadByte ; R16=byte (none)
brcc sensorWatchReadFromEeprom_ret
st Y+, r16
adiw xh:xl, 1
dec r18
brne sensorWatchReadFromEeprom_loop
sec
sensorWatchReadFromEeprom_ret:
ret
; @end
SensorWatch_DefaultSignalmap:
.db 0, OBJECT_SIGNAL_CREATE, LOW(SensorWatch_OnCreate), HIGH(SensorWatch_OnCreate)
.db 0, WIDGET_SIGNAL_DRAW, LOW(Widget_OnDraw), HIGH(Widget_OnDraw)
.db 0, OBJECT_SIGNAL_RECVMSG, LOW(SensorWatch_OnMsgReceived), HIGH(SensorWatch_OnMsgReceived)
.db 0, SENSORWATCH_SIGNAL_SETSOURCE, LOW(SensorWatch_OnSetSource), HIGH(SensorWatch_OnSetSource)
.db 0, SENSORWATCH_SIGNAL_SETUPPERLIMWARN, LOW(SensorWatch_OnSetUpperLimitWarn), HIGH(SensorWatch_OnSetUpperLimitWarn)
.db 0, SENSORWATCH_SIGNAL_SETLOWERLIMWARN, LOW(SensorWatch_OnSetLowerLimitWarn), HIGH(SensorWatch_OnSetLowerLimitWarn)
.db 0, SENSORWATCH_SIGNAL_SETUPPERLIMCRIT, LOW(SensorWatch_OnSetUpperLimitCrit), HIGH(SensorWatch_OnSetUpperLimitCrit)
.db 0, SENSORWATCH_SIGNAL_SETLOWERLIMCRIT, LOW(SensorWatch_OnSetLowerLimitCrit), HIGH(SensorWatch_OnSetLowerLimitCrit)
.db 0, 0, 0, 0 ; end of table
#endif