avr: added text aligning in labels.

This commit is contained in:
Martin Preuss
2026-01-18 20:02:25 +01:00
parent fb308ba9fc
commit a11c5ac536
5 changed files with 270 additions and 87 deletions

View File

@@ -201,7 +201,7 @@ winSensorWatch1:
.dw 0 ; selector (ony lower 8 bits used) .dw 0 ; selector (ony lower 8 bits used)
.dw winSensorWatch1_signalmap*2 ; signal map .dw winSensorWatch1_signalmap*2 ; signal map
; WIDGET ; WIDGET
.db (1<<WIDGETS_OPTSLO_MSGRECV_BIT), 0 ; opts lo, hi .db (1<<WIDGET_OPTSLO_MSGRECV_BIT), 0 ; opts lo, hi
.dw 4 ; X .dw 4 ; X
.dw 4 ; Y .dw 4 ; Y
.dw 100 ; W (image=96, 2 px borders) .dw 100 ; W (image=96, 2 px borders)
@@ -232,17 +232,17 @@ winSensorWatch1Title:
.dw 0 ; selector (ony lower 8 bits used) .dw 0 ; selector (ony lower 8 bits used)
.dw winSensorWatch1Title_signalmap*2 ; signal map .dw winSensorWatch1Title_signalmap*2 ; signal map
; WIDGET ; WIDGET
.db 0, 0 ; opts lo, hi .db 0, (1<<WIDGET_OPTSHI_HALIGNCENTER_BIT) ; opts lo, hi
.dw 2 ; X .dw 2 ; X
.dw 1 ; Y .dw 1 ; Y
.dw 96 ; W .dw 96 ; W
.dw STYLE_WIN_FONT_HEIGHT+2 ; H .dw STYLE_WIN_FONT_HEIGHT+2 ; H
.dw STYLE_WIN_FOREGROUND ; front color .dw STYLE_WIN_FOREGROUND ; front color
.dw STYLE_WIN_BACKGROUND ; back color .dw STYLE_WIN_BACKGROUND ; back color
.dw STYLE_WIN_FONT*2 ; font .dw STYLE_WIN_FONT*2 ; font
.dw winSensorWatch1Title_ramdata ; ptr to SDRAM .dw winSensorWatch1Title_ramdata ; ptr to SDRAM
; LABEL ; LABEL
.dw winSensorWatch1Title_text*2 ; text .dw winSensorWatch1Title_text*2 ; text
winSensorWatch1Title_text: winSensorWatch1Title_text:
.db "CO2", 0 .db "CO2", 0
@@ -285,25 +285,25 @@ winSensorWatch1Image_signalmap:
winSensorWatch1Value: winSensorWatch1Value:
; OBJECT ; OBJECT
.db 0x55, 0xaa ; magic .db 0x55, 0xaa ; magic
.dw 0 ; next .dw 0 ; next
.dw winSensorWatch1*2 ; parent .dw winSensorWatch1*2 ; parent
.dw 0 ; first child .dw 0 ; first child
.dw 0 ; target .dw 0 ; target
.dw 0 ; selector (ony lower 8 bits used) .dw 0 ; selector (ony lower 8 bits used)
.dw winSensorWatch1Value_signalmap*2 ; signal map .dw winSensorWatch1Value_signalmap*2 ; signal map
; WIDGET ; WIDGET
.db 0, 0 ; opts lo, hi .db 0, (1<<WIDGET_OPTSHI_HALIGNCENTER_BIT) ; opts lo, hi
.dw 2 ; X .dw 2 ; X
.dw STYLE_WIN_FONT_HEIGHT+2+96+2 ; Y .dw STYLE_WIN_FONT_HEIGHT+2+96+2 ; Y
.dw 96 ; W .dw 96 ; W
.dw STYLE_WIN_FONT_HEIGHT+2 ; H .dw STYLE_WIN_FONT_HEIGHT+4 ; H
.dw STYLE_WIN_FOREGROUND ; front color .dw STYLE_WIN_FOREGROUND ; front color
.dw STYLE_WIN_BACKGROUND ; back color .dw STYLE_WIN_BACKGROUND ; back color
.dw STYLE_WIN_FONT*2 ; font .dw STYLE_WIN_FONT*2 ; font
.dw winSensorWatch1Value_ramdata ; ptr to SDRAM .dw winSensorWatch1Value_ramdata ; ptr to SDRAM
; VALUELABEL ; VALUELABEL
.db 0, 0 ; num of post-komma digits .db 0, 0 ; num of post-komma digits
winSensorWatch1Value_signalmap: winSensorWatch1Value_signalmap:

View File

@@ -50,7 +50,7 @@ Label_OnDraw:
rcall labelWriteText rcall labelWriteText
mov r16, r14 mov r16, r14
andi r16, (1<<WIDGETS_OPTSLO_BORDER_BIT) andi r16, (1<<WIDGET_OPTSLO_BORDER_BIT)
breq Label_OnDraw_done breq Label_OnDraw_done
ldi r16, LOW(STYLE_BUTTON_COL_BORDER) ldi r16, LOW(STYLE_BUTTON_COL_BORDER)
mov r2, r16 mov r2, r16
@@ -79,26 +79,30 @@ Label_OnDraw_ret:
; @clobbers any, !Z ; @clobbers any, !Z
labelWriteText: labelWriteText:
clr r4 push zl
clr r5 push zh
clr r6 adiw zh:zl, LABEL_OFFS_TEXT_LO
clr r7 lpm r16, Z+
mov r16, r14 lpm zh, Z
andi r16, (1<<WIDGETS_OPTSLO_BORDER_BIT) mov zl, r16
breq labelWriteText_draw or r16, zh
ldi r16, 2 breq labelWriteText_noText
clr r17
add r4, r16 ; x+=2 ldi r18, STYLE_WIN_FONT_WIDTH
adc r5, r17 rcall Widget_CalcStringWidthFLASH ; r13:r12=string width
add r6, r16 ; y+=2 pop zh
adc r7, r17 pop zl
labelWriteText_draw: rcall Widget_AlignPosXY ; (r8, r9, r10, r11, r12, r13, r14, r15, r16, r17, r18, r19)
adiw zh:zl, LABEL_OFFS_TEXT_LO adiw zh:zl, LABEL_OFFS_TEXT_LO
lpm r12, Z+ lpm r12, Z+
lpm r13, Z lpm r13, Z
sbiw zh:zl, LABEL_OFFS_TEXT_LO+1 sbiw zh:zl, LABEL_OFFS_TEXT_LO+1
bigcall Widget_DrawTextFlash bigcall Widget_DrawTextFlash
ret ret
labelWriteText_noText:
pop zh
pop zl
ret
; @end ; @end

View File

@@ -24,7 +24,7 @@
; the value received and also shows the value beloe the image. ; the value received and also shows the value beloe the image.
; ;
; Please note that this widget needs to have the option bit ; Please note that this widget needs to have the option bit
; "WIDGETS_OPTSLO_MSGRECV_BIT" set in order to receive MsgReceived signals. ; "WIDGET_OPTSLO_MSGRECV_BIT" set in order to receive MsgReceived signals.
; ;
; *************************************************************************** ; ***************************************************************************

View File

@@ -15,17 +15,17 @@
; defines ; defines
; IMGVIEW in flash ; IMGVIEW in flash
.equ VLABEL_OFFS_VLABEL = WIDGET_SIZE .equ VLABEL_OFFS_VLABEL = WIDGET_SIZE
.equ VLABEL_OFFS_POSTKOMMADIGITS = VLABEL_OFFS_VLABEL+0 .equ VLABEL_OFFS_POSTKOMMADIGITS = VLABEL_OFFS_VLABEL+0
.equ VLABEL_OFFS_RESERVED = VLABEL_OFFS_VLABEL+1 .equ VLABEL_OFFS_RESERVED = VLABEL_OFFS_VLABEL+1
.equ VLABEL_SIZE = VLABEL_OFFS_VLABEL+2 .equ VLABEL_SIZE = VLABEL_OFFS_VLABEL+2
; SDRAM data for IMGVIEW ; SDRAM data for IMGVIEW
.equ VLABEL_SD_OFFS_VLABEL = WIDGET_SD_SIZE .equ VLABEL_SD_OFFS_VLABEL = WIDGET_SD_SIZE
.equ VLABEL_SD_OFFS_VALUE_LO = VLABEL_SD_OFFS_VLABEL+0 .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_OFFS_VALUE_HI = VLABEL_SD_OFFS_VLABEL+1
.equ VLABEL_SD_SIZE = VLABEL_SD_OFFS_VLABEL+2 .equ VLABEL_SD_SIZE = VLABEL_SD_OFFS_VLABEL+2
; signals ; signals
@@ -102,16 +102,18 @@ ValueLabel_OnDraw:
andi r16, (1<<WIDGET_FLAGS_DIRTY_BIT) andi r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
breq ValueLabel_OnDraw_ret breq ValueLabel_OnDraw_ret
bigcall Widget_Clear
adiw zh:zl, WIDGET_OFFS_OPTS_LO ; get OPTS low adiw zh:zl, WIDGET_OFFS_OPTS_LO ; get OPTS low
lpm r14, Z lpm r14, Z
sbiw zh:zl, WIDGET_OFFS_OPTS_LO sbiw zh:zl, WIDGET_OFFS_OPTS_LO
bigcall Widget_Clear push r14
rcall valueLabelWriteValue rcall valueLabelWriteValue
pop r14
mov r16, r14 sbrs r14, WIDGET_OPTSLO_BORDER_BIT
andi r16, (1<<WIDGETS_OPTSLO_BORDER_BIT) rjmp ValueLabel_OnDraw_done
breq ValueLabel_OnDraw_done
ldi r16, LOW(STYLE_BUTTON_COL_BORDER) ldi r16, LOW(STYLE_BUTTON_COL_BORDER)
mov r2, r16 mov r2, r16
ldi r16, HIGH(STYLE_BUTTON_COL_BORDER) ldi r16, HIGH(STYLE_BUTTON_COL_BORDER)
@@ -142,26 +144,17 @@ valueLabelWriteValue:
push zl push zl
push zh push zh
bigcall Widget_GetSdramPtr ; (none) bigcall Widget_GetSdramPtr ; (none)
; convert value to string
ldd r20, Y+VLABEL_SD_OFFS_VALUE_LO ldd r20, Y+VLABEL_SD_OFFS_VALUE_LO
ldd r21, Y+VLABEL_SD_OFFS_VALUE_HI ldd r21, Y+VLABEL_SD_OFFS_VALUE_HI
adiw zh:zl, VLABEL_OFFS_POSTKOMMADIGITS adiw zh:zl, VLABEL_OFFS_POSTKOMMADIGITS
lpm r24, Z lpm r24, Z
sbiw zh:zl, VLABEL_OFFS_POSTKOMMADIGITS sbiw zh:zl, VLABEL_OFFS_POSTKOMMADIGITS
rcall IntToAscii ; X=pointer to text rcall IntToAscii ; X=pointer to text
clr r4 ; X ; align according to string size
clr r5 ldi r18, STYLE_WIN_FONT_WIDTH
clr r6 ; Y rcall Widget_CalcStringWidthSDRAM ; r13:r12=string width
clr r7 rcall Widget_AlignPosXY ; (r8, r9, r10, r11, r12, r13, r14, r15, r16, r17, r18, r19)
mov r16, r14
andi r16, (1<<WIDGETS_OPTSLO_BORDER_BIT)
breq valueLabelWriteValue_draw
ldi r16, 2
clr r17
add r4, r16 ; x+=2
adc r5, r17
add r6, r16 ; y+=2
adc r7, r17
valueLabelWriteValue_draw:
bigcall Widget_DrawTextSDRAM bigcall Widget_DrawTextSDRAM
pop zh pop zh
pop zl pop zl
@@ -172,6 +165,5 @@ valueLabelWriteValue_draw:
#endif #endif

View File

@@ -41,10 +41,15 @@
.equ WIDGET_SD_SIZE = 1 .equ WIDGET_SD_SIZE = 1
; widget opts_lo ; widget opts_lo
.equ WIDGETS_OPTSLO_BORDER_BIT = 7 .equ WIDGET_OPTSLO_BORDER_BIT = 7
.equ WIDGETS_OPTSLO_INPUT_BIT = 6 ; TOUCH, KEY .equ WIDGET_OPTSLO_INPUT_BIT = 6 ; TOUCH, KEY
.equ WIDGETS_OPTSLO_TIMER_BIT = 5 .equ WIDGET_OPTSLO_TIMER_BIT = 5
.equ WIDGETS_OPTSLO_MSGRECV_BIT = 4 .equ WIDGET_OPTSLO_MSGRECV_BIT = 4
.equ WIDGET_OPTSHI_HALIGNRIGHT_BIT = 7
.equ WIDGET_OPTSHI_HALIGNCENTER_BIT = 6
.equ WIDGET_OPTSHI_VALIGNBOTTOM_BIT = 5
.equ WIDGET_OPTSHI_VALIGNCENTER_BIT = 4
; widget flags ; widget flags
.equ WIDGET_FLAGS_ACTIVE_BIT = 7 .equ WIDGET_FLAGS_ACTIVE_BIT = 7
@@ -69,6 +74,12 @@
.equ WIDGET_SIGNAL_NEXTFREE = OBJECT_SIGNAL_NEXTFREE+5 .equ WIDGET_SIGNAL_NEXTFREE = OBJECT_SIGNAL_NEXTFREE+5
; args to Widget_AlignPos
.equ WIDGET_1DALIGN_END_BIT = 0
.equ WIDGET_1DALIGN_CENTER_BIT = 1
.equ WIDGET_1DALIGN_BORDER_BIT = 2
; *************************************************************************** ; ***************************************************************************
; code ; code
@@ -121,7 +132,7 @@ Widget_OnTouch:
adiw zh:zl, WIDGET_OFFS_OPTS_LO adiw zh:zl, WIDGET_OFFS_OPTS_LO
lpm r16, Z lpm r16, Z
sbiw zh:zl, WIDGET_OFFS_OPTS_LO sbiw zh:zl, WIDGET_OFFS_OPTS_LO
andi r16, (1<<WIDGETS_OPTSLO_INPUT_BIT) andi r16, (1<<WIDGET_OPTSLO_INPUT_BIT)
clc clc
breq Widget_OnTouch_ret breq Widget_OnTouch_ret
@@ -145,7 +156,7 @@ Widget_OnTouch:
; check for position inside this widget ; check for position inside this widget
rcall Widget_LoadDisplayRegs ; (R0-R11) rcall Widget_LoadDisplayRegs ; (R0-R11)
rcall Widget_MakeAbsPos ; (R16, R17) rcall Widget_MakeAbsPos ; (R16, R17) TODO!!!
rcall Widget_IsPointInRect ; (R16, R17) rcall Widget_IsPointInRect ; (R16, R17)
sbci r16, 0 ; r16=ff if touched inside, 0 otherwise sbci r16, 0 ; r16=ff if touched inside, 0 otherwise
@@ -460,16 +471,20 @@ Widget_SubFlags_ret:
; @param Z byte address of widget object (for LPM!) ; @param Z byte address of widget object (for LPM!)
Widget_Clear: Widget_Clear:
rcall OBJ_IsObject
brcc Widget_Clear_ret
rcall Widget_LoadDisplayRegs rcall Widget_LoadDisplayRegs
rcall Widget_MakeAbsPos ; (R16, R17) rcall Widget_MakeAbsPos ; (R16, R17)
rcall Widget_GetSdramPtr ; (none) rcall Widget_GetSdramPtr ; (none)
adiw zh:zl, WIDGET_OFFS_OPTS_LO ; get OPTS low ; adiw zh:zl, WIDGET_OFFS_OPTS_LO ; get OPTS low
lpm r14, Z ; lpm r14, Z
sbiw zh:zl, WIDGET_OFFS_OPTS_LO ; sbiw zh:zl, WIDGET_OFFS_OPTS_LO
rcall Widget_SelectColors ; (R16) rcall Widget_SelectColors ; (R16)
mov r2, r0 ; use background mov r2, r0 ; use background
mov r3, r1 mov r3, r1
bigcall Display_FillRect bigcall Display_FillRect
Widget_Clear_ret:
ret ret
; @end ; @end
@@ -864,8 +879,8 @@ Widget_Tree_SendTouchSignal:
ldi r16, WIDGET_SIGNAL_TOUCH ldi r16, WIDGET_SIGNAL_TOUCH
clr r17 clr r17
; only check active widgets ; only check active widgets
ldi r20, (1<<WIDGETS_OPTSLO_INPUT_BIT) ldi r20, (1<<WIDGET_OPTSLO_INPUT_BIT)
ldi r21, (1<<WIDGETS_OPTSLO_INPUT_BIT) ldi r21, (1<<WIDGET_OPTSLO_INPUT_BIT)
rcall Widget_TreeMatchOptsAndSendSignal rcall Widget_TreeMatchOptsAndSendSignal
ret ret
; @end ; @end
@@ -881,8 +896,8 @@ Widget_Tree_SendTimerSignal:
ldi r16, OBJECT_SIGNAL_TIMER ldi r16, OBJECT_SIGNAL_TIMER
clr r17 clr r17
; only check active widgets ; only check active widgets
ldi r20, (1<<WIDGETS_OPTSLO_TIMER_BIT) ldi r20, (1<<WIDGET_OPTSLO_TIMER_BIT)
ldi r21, (1<<WIDGETS_OPTSLO_TIMER_BIT) ldi r21, (1<<WIDGET_OPTSLO_TIMER_BIT)
rcall Widget_TreeMatchOptsAndSendSignal rcall Widget_TreeMatchOptsAndSendSignal
ret ret
; @end ; @end
@@ -899,8 +914,8 @@ Widget_Tree_SendMsgRecvSignal:
ldi r16, OBJECT_SIGNAL_RECVMSG ldi r16, OBJECT_SIGNAL_RECVMSG
clr r17 clr r17
; only check active widgets ; only check active widgets
ldi r20, (1<<WIDGETS_OPTSLO_MSGRECV_BIT) ldi r20, (1<<WIDGET_OPTSLO_MSGRECV_BIT)
ldi r21, (1<<WIDGETS_OPTSLO_MSGRECV_BIT) ldi r21, (1<<WIDGET_OPTSLO_MSGRECV_BIT)
rcall Widget_TreeMatchOptsAndSendSignal rcall Widget_TreeMatchOptsAndSendSignal
ret ret
; @end ; @end
@@ -1079,4 +1094,176 @@ Widget_TreeMatchFlagsAndSendSignalToActive_done:
; ---------------------------------------------------------------------------
; @routine Widget_AlignPos1D
;
; one-dimensional routine.
;
; @param R19:R18 size of target
; @param R13:R12 size of object to align
; @param
; @param R17 opts (bit 0: align end, bit 1: align center, bit 2: account for border)
; @return R23:R22 pos
; @clobbers r16, r18, r19
Widget_AlignPos1D:
clr r22
clr r23
sbrc r17, WIDGET_1DALIGN_BORDER_BIT
rcall Widget_AlignPos1D_subBordersFromSize
sbrc r17, WIDGET_1DALIGN_END_BIT
rcall Widget_AlignPos1D_alignEnd
sbrc r17, WIDGET_1DALIGN_CENTER_BIT
rcall Widget_AlignPos1D_alignCenter
sbrc r17, WIDGET_1DALIGN_BORDER_BIT
rcall Widget_AlignPos1D_addBordersToPos
Widget_AlignPos1D_ret:
ret
Widget_AlignPos1D_alignEnd:
mov r22, r18
mov r23, r19
sub r22, r12
sbc r23, r13
brcc Widget_AlignPos1D_ret
clr r22
clr r23
ret
Widget_AlignPos1D_alignCenter:
rcall Widget_AlignPos1D_alignEnd
lsr r23
ror r22
ret
Widget_AlignPos1D_subBordersFromSize:
subi r18, 4
sbci r19, 0
ret
Widget_AlignPos1D_addBordersToPos:
ldi r16, 2
add r22, r16
adc r23, r16
sub r23, r16
ret
; @end
; ---------------------------------------------------------------------------
; @routine Widget_AlignPosXY
;
; @param Z byte address of widget object (for LPM!)
; @param R13:R12 width of object to align
; @return R5:R4 X
; @return R7:R6 Y
; @clobbers r8, r9, r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, r20, r21, r22, r23, r24, r25
Widget_AlignPosXY:
adiw zh:zl, WIDGET_OFFS_WIDTH_LO
lpm r8, Z+ ; WIDTH_LO
lpm r9, Z+
lpm r10, Z+ ; HEIGHT_LO
lpm r11, Z
sbiw zh:zl, WIDGET_OFFS_WIDTH_LO+3
adiw zh:zl, WIDGET_OFFS_OPTS_LO
lpm r24, Z+
lpm r25, Z
sbiw zh:zl, WIDGET_OFFS_OPTS_LO+1
; align horizontally
clr r17
sbrc r24, WIDGET_OPTSLO_BORDER_BIT
ori r17, (1<<WIDGET_1DALIGN_BORDER_BIT)
sbrc r25, WIDGET_OPTSHI_HALIGNRIGHT_BIT
ori r17, (1<<WIDGET_1DALIGN_END_BIT)
sbrc r25, WIDGET_OPTSHI_HALIGNCENTER_BIT
ori r17, (1<<WIDGET_1DALIGN_CENTER_BIT)
mov r18, r8 ; widget width
mov r19, r9
rcall Widget_AlignPos1D ; (r16, r18, r19)
mov r4, r22
mov r5, r23
; align vertically
clr r17
sbrc r24, WIDGET_OPTSLO_BORDER_BIT
ori r17, (1<<WIDGET_1DALIGN_BORDER_BIT)
sbrc r25, WIDGET_OPTSHI_VALIGNBOTTOM_BIT
ori r17, (1<<WIDGET_1DALIGN_END_BIT)
sbrc r25, WIDGET_OPTSHI_VALIGNCENTER_BIT
ori r17, (1<<WIDGET_1DALIGN_CENTER_BIT)
ldi r16, STYLE_WIN_FONT_HEIGHT ; use font height
mov r12, r16
clr r13
mov r18, r10 ; widget height
mov r19, r11
rcall Widget_AlignPos1D ; (r16, r18, r19)
mov r6, r22
mov r7, r23
ret
; @end
; ---------------------------------------------------------------------------
; @routine Widget_CalcStringWidthSDRAM
;
; @param X pointer to text in SDRAM
; @param R18 char width in px
; @return r13:r12 width of string
; @clobbers r16
Widget_CalcStringWidthSDRAM:
clr r12
clr r13
push xl
push xh
Widget_CalcStringWidthSDRAM_loop:
ld r16, X+
tst r16
breq Widget_CalcStringWidthSDRAM_done
add r12, r18
adc r13, r18
sub r13, r18
rjmp Widget_CalcStringWidthSDRAM_loop
Widget_CalcStringWidthSDRAM_done:
pop xh
pop xl
ret
; @end
; ---------------------------------------------------------------------------
; @routine Widget_CalcStringWidthFLASH
;
; @param Z pointer to text in FLASH
; @param R18 char width in px
; @return r13:r12 width of string
; @clobbers r16
Widget_CalcStringWidthFLASH:
clr r12
clr r13
push zl
push zh
Widget_CalcStringWidthFLASH_loop:
lpm r16, Z+
tst r16
breq Widget_CalcStringWidthFLASH_done
add r12, r18
adc r13, r18
sub r13, r18
rjmp Widget_CalcStringWidthFLASH_loop
Widget_CalcStringWidthFLASH_done:
pop zh
pop zl
ret
; @end
#endif #endif