mirror of
https://github.com/joBr99/nspanel-lovelace-ui.git
synced 2026-02-18 10:57:01 +01:00
Changed entities layout for 5 only (add nextion2text)
This commit is contained in:
committed by
GitHub Actions
parent
72314db002
commit
125ebee23b
@@ -1,6 +1,6 @@
|
||||
diff -bur HMI/n2t-out/Program.s.txt HMI/US/portrait/n2t-out/Program.s.txt
|
||||
--- HMI/n2t-out/Program.s.txt 2022-04-10 15:53:53.428265648 +0000
|
||||
+++ HMI/US/portrait/n2t-out/Program.s.txt 2022-04-10 15:53:53.884273916 +0000
|
||||
--- HMI/n2t-out/Program.s.txt 2022-04-12 16:15:30.351143292 +0000
|
||||
+++ HMI/US/portrait/n2t-out/Program.s.txt 2022-04-12 16:15:30.734970090 +0000
|
||||
@@ -11,6 +11,6 @@
|
||||
// dim value
|
||||
int dimValue=40
|
||||
@@ -11,9 +11,9 @@ diff -bur HMI/n2t-out/Program.s.txt HMI/US/portrait/n2t-out/Program.s.txt
|
||||
+ //lcd_dev fffb 0002 0000 0020
|
||||
page pageStartup
|
||||
diff -bur HMI/n2t-out/cardEntities.txt HMI/US/portrait/n2t-out/cardEntities.txt
|
||||
--- HMI/n2t-out/cardEntities.txt 2022-04-10 15:53:53.432265720 +0000
|
||||
+++ HMI/US/portrait/n2t-out/cardEntities.txt 2022-04-10 15:53:53.884273916 +0000
|
||||
@@ -62,6 +62,26 @@
|
||||
--- HMI/n2t-out/cardEntities.txt 2022-04-12 16:15:30.351143292 +0000
|
||||
+++ HMI/US/portrait/n2t-out/cardEntities.txt 2022-04-12 16:15:30.734970090 +0000
|
||||
@@ -62,6 +62,16 @@
|
||||
vis bText4,0
|
||||
vis hSlider4,0
|
||||
vis nNum4,0
|
||||
@@ -27,20 +27,10 @@ diff -bur HMI/n2t-out/cardEntities.txt HMI/US/portrait/n2t-out/cardEntities.txt
|
||||
+ vis bText5,0
|
||||
+ vis hSlider5,0
|
||||
+ vis nNum5,0
|
||||
+ //ui e6
|
||||
+ vis btOnOff6,0
|
||||
+ vis bUp6,0
|
||||
+ vis bStop6,0
|
||||
+ vis bDown6,0
|
||||
+ vis tIcon6,0
|
||||
+ vis tEntity6,0
|
||||
+ vis bText6,0
|
||||
+ vis hSlider6,0
|
||||
+ vis nNum6,0
|
||||
|
||||
Variable (string) strCommand
|
||||
Attributes
|
||||
@@ -117,6 +137,30 @@
|
||||
@@ -117,6 +127,18 @@
|
||||
Text :
|
||||
Max. Text Size: 70
|
||||
|
||||
@@ -50,28 +40,16 @@ diff -bur HMI/n2t-out/cardEntities.txt HMI/US/portrait/n2t-out/cardEntities.txt
|
||||
+ Text :
|
||||
+ Max. Text Size: 70
|
||||
+
|
||||
+Variable (string) entn6
|
||||
+ Attributes
|
||||
+ Scope : local
|
||||
+ Text :
|
||||
+ Max. Text Size: 70
|
||||
+
|
||||
+Variable (string) type5
|
||||
+ Attributes
|
||||
+ Scope : local
|
||||
+ Text :
|
||||
+ Max. Text Size: 10
|
||||
+
|
||||
+Variable (string) type6
|
||||
+ Attributes
|
||||
+ Scope : local
|
||||
+ Text :
|
||||
+ Max. Text Size: 10
|
||||
+
|
||||
Number nNum1
|
||||
Attributes
|
||||
Scope : local
|
||||
@@ -153,6 +197,24 @@
|
||||
@@ -153,6 +175,15 @@
|
||||
Associated Keyboard : none
|
||||
Value : 0
|
||||
|
||||
@@ -83,20 +61,47 @@ diff -bur HMI/n2t-out/cardEntities.txt HMI/US/portrait/n2t-out/cardEntities.txt
|
||||
+ Send Component ID : disabled
|
||||
+ Associated Keyboard : none
|
||||
+ Value : 0
|
||||
+
|
||||
+Number nNum6
|
||||
+ Attributes
|
||||
+ Scope : local
|
||||
+ Dragging : 0
|
||||
+ Disable release event after dragging: 0
|
||||
+ Send Component ID : disabled
|
||||
+ Associated Keyboard : none
|
||||
+ Value : 0
|
||||
+
|
||||
Text tHeading
|
||||
Attributes
|
||||
Scope : local
|
||||
@@ -283,6 +345,46 @@
|
||||
@@ -171,7 +202,7 @@
|
||||
Send Component ID : disabled
|
||||
Associated Keyboard : none
|
||||
Text : tEntity1
|
||||
- Max. Text Size : 30
|
||||
+ Max. Text Size : 50
|
||||
|
||||
Text tEntity2
|
||||
Attributes
|
||||
@@ -181,7 +212,7 @@
|
||||
Send Component ID : disabled
|
||||
Associated Keyboard : none
|
||||
Text : tEntity2
|
||||
- Max. Text Size : 30
|
||||
+ Max. Text Size : 50
|
||||
|
||||
Text tEntity3
|
||||
Attributes
|
||||
@@ -191,7 +222,7 @@
|
||||
Send Component ID : disabled
|
||||
Associated Keyboard : none
|
||||
Text : tEntity3
|
||||
- Max. Text Size : 30
|
||||
+ Max. Text Size : 50
|
||||
|
||||
Text tEntity4
|
||||
Attributes
|
||||
@@ -201,7 +232,7 @@
|
||||
Send Component ID : disabled
|
||||
Associated Keyboard : none
|
||||
Text : tEntity4
|
||||
- Max. Text Size : 30
|
||||
+ Max. Text Size : 50
|
||||
|
||||
Text tIcon1
|
||||
Attributes
|
||||
@@ -283,6 +314,26 @@
|
||||
Text :
|
||||
Max. Text Size : 50
|
||||
|
||||
@@ -108,7 +113,7 @@ diff -bur HMI/n2t-out/cardEntities.txt HMI/US/portrait/n2t-out/cardEntities.txt
|
||||
+ Send Component ID : disabled
|
||||
+ Associated Keyboard : none
|
||||
+ Text : tEntity5
|
||||
+ Max. Text Size : 30
|
||||
+ Max. Text Size : 50
|
||||
+
|
||||
+Text tIcon5
|
||||
+ Attributes
|
||||
@@ -119,31 +124,11 @@ diff -bur HMI/n2t-out/cardEntities.txt HMI/US/portrait/n2t-out/cardEntities.txt
|
||||
+ Associated Keyboard : none
|
||||
+ Text : î°
|
||||
+ Max. Text Size : 5
|
||||
+
|
||||
+Text tEntity6
|
||||
+ Attributes
|
||||
+ Scope : local
|
||||
+ Dragging : 0
|
||||
+ Disable release event after dragging: 0
|
||||
+ Send Component ID : disabled
|
||||
+ Associated Keyboard : none
|
||||
+ Text : tEntity6
|
||||
+ Max. Text Size : 30
|
||||
+
|
||||
+Text tIcon6
|
||||
+ Attributes
|
||||
+ Scope : local
|
||||
+ Dragging : 0
|
||||
+ Disable release event after dragging: 0
|
||||
+ Send Component ID : disabled
|
||||
+ Associated Keyboard : none
|
||||
+ Text : î°
|
||||
+ Max. Text Size : 5
|
||||
+
|
||||
Picture p0
|
||||
Attributes
|
||||
Scope : local
|
||||
@@ -402,6 +504,62 @@
|
||||
@@ -402,6 +453,34 @@
|
||||
prints tSend.txt,0
|
||||
prints crcval,2
|
||||
|
||||
@@ -174,39 +159,11 @@ diff -bur HMI/n2t-out/cardEntities.txt HMI/US/portrait/n2t-out/cardEntities.txt
|
||||
+ prints sys0,2
|
||||
+ prints tSend.txt,0
|
||||
+ prints crcval,2
|
||||
+
|
||||
+Slider hSlider6
|
||||
+ Attributes
|
||||
+ Scope : local
|
||||
+ Dragging : 0
|
||||
+ Disable release event after dragging: 0
|
||||
+ Send Component ID : disabled
|
||||
+ Position : 50
|
||||
+ Upper range limit : 100
|
||||
+ Lower range limit : 0
|
||||
+
|
||||
+ Events
|
||||
+ Touch Release Event
|
||||
+ nNum6.val=hSlider6.val
|
||||
+ tSend.txt="event,buttonPress2,"+entn6.txt+",number-set,"
|
||||
+ covx nNum6.val,tTmp.txt,0,0
|
||||
+ tSend.txt+=tTmp.txt
|
||||
+ //send calc crc
|
||||
+ btlen tSend.txt,sys0
|
||||
+ crcrest 1,0xffff // reset CRC
|
||||
+ crcputh 55 bb
|
||||
+ crcputs sys0,1
|
||||
+ crcputs tSend.txt,0
|
||||
+ //send cmd
|
||||
+ printh 55 bb
|
||||
+ prints sys0,2
|
||||
+ prints tSend.txt,0
|
||||
+ prints crcval,2
|
||||
+
|
||||
Button bDown1
|
||||
Attributes
|
||||
Scope : local
|
||||
@@ -859,6 +1017,206 @@
|
||||
@@ -859,6 +938,106 @@
|
||||
prints tSend.txt,0
|
||||
prints crcval,2
|
||||
|
||||
@@ -309,111 +266,11 @@ diff -bur HMI/n2t-out/cardEntities.txt HMI/US/portrait/n2t-out/cardEntities.txt
|
||||
+ prints sys0,2
|
||||
+ prints tSend.txt,0
|
||||
+ prints crcval,2
|
||||
+
|
||||
+Button bStop6
|
||||
+ Attributes
|
||||
+ Scope : local
|
||||
+ Dragging : 0
|
||||
+ Disable release event after dragging: 0
|
||||
+ Send Component ID : disabled
|
||||
+ State : unpressed
|
||||
+ Text : î
|
||||
+ Max. Text Size : 10
|
||||
+
|
||||
+ Events
|
||||
+ Touch Press Event
|
||||
+ tSend.txt="event,buttonPress2,"+entn6.txt+",stop"
|
||||
+ //send calc crc
|
||||
+ btlen tSend.txt,sys0
|
||||
+ crcrest 1,0xffff // reset CRC
|
||||
+ crcputh 55 bb
|
||||
+ crcputs sys0,1
|
||||
+ crcputs tSend.txt,0
|
||||
+ //send cmd
|
||||
+ printh 55 bb
|
||||
+ prints sys0,2
|
||||
+ prints tSend.txt,0
|
||||
+ prints crcval,2
|
||||
+
|
||||
+Button bDown6
|
||||
+ Attributes
|
||||
+ Scope : local
|
||||
+ Dragging : 0
|
||||
+ Disable release event after dragging: 0
|
||||
+ Send Component ID : disabled
|
||||
+ State : unpressed
|
||||
+ Text : î
|
||||
+ Max. Text Size : 10
|
||||
+
|
||||
+ Events
|
||||
+ Touch Press Event
|
||||
+ tSend.txt="event,buttonPress2,"+entn6.txt+",down"
|
||||
+ //send calc crc
|
||||
+ btlen tSend.txt,sys0
|
||||
+ crcrest 1,0xffff // reset CRC
|
||||
+ crcputh 55 bb
|
||||
+ crcputs sys0,1
|
||||
+ crcputs tSend.txt,0
|
||||
+ //send cmd
|
||||
+ printh 55 bb
|
||||
+ prints sys0,2
|
||||
+ prints tSend.txt,0
|
||||
+ prints crcval,2
|
||||
+
|
||||
+Button bUp6
|
||||
+ Attributes
|
||||
+ Scope : local
|
||||
+ Dragging : 0
|
||||
+ Disable release event after dragging: 0
|
||||
+ Send Component ID : disabled
|
||||
+ State : unpressed
|
||||
+ Text : î
|
||||
+ Max. Text Size : 10
|
||||
+
|
||||
+ Events
|
||||
+ Touch Press Event
|
||||
+ tSend.txt="event,buttonPress2,"+entn6.txt+",up"
|
||||
+ //send calc crc
|
||||
+ btlen tSend.txt,sys0
|
||||
+ crcrest 1,0xffff // reset CRC
|
||||
+ crcputh 55 bb
|
||||
+ crcputs sys0,1
|
||||
+ crcputs tSend.txt,0
|
||||
+ //send cmd
|
||||
+ printh 55 bb
|
||||
+ prints sys0,2
|
||||
+ prints tSend.txt,0
|
||||
+ prints crcval,2
|
||||
+
|
||||
+Button bText6
|
||||
+ Attributes
|
||||
+ Scope : local
|
||||
+ Dragging : 0
|
||||
+ Disable release event after dragging: 0
|
||||
+ Send Component ID : disabled
|
||||
+ State : unpressed
|
||||
+ Text : newtxt
|
||||
+ Max. Text Size : 10
|
||||
+
|
||||
+ Events
|
||||
+ Touch Press Event
|
||||
+ tSend.txt="event,buttonPress2,"+entn6.txt+",button"
|
||||
+ //send calc crc
|
||||
+ btlen tSend.txt,sys0
|
||||
+ crcrest 1,0xffff // reset CRC
|
||||
+ crcputh 55 bb
|
||||
+ crcputs sys0,1
|
||||
+ crcputs tSend.txt,0
|
||||
+ //send cmd
|
||||
+ printh 55 bb
|
||||
+ prints sys0,2
|
||||
+ prints tSend.txt,0
|
||||
+ prints crcval,2
|
||||
+
|
||||
Dual-state Button btOnOff1
|
||||
Attributes
|
||||
Scope : local
|
||||
@@ -967,6 +1325,60 @@
|
||||
@@ -967,6 +1146,33 @@
|
||||
prints tSend.txt,0
|
||||
prints crcval,2
|
||||
|
||||
@@ -443,38 +300,11 @@ diff -bur HMI/n2t-out/cardEntities.txt HMI/US/portrait/n2t-out/cardEntities.txt
|
||||
+ prints sys0,2
|
||||
+ prints tSend.txt,0
|
||||
+ prints crcval,2
|
||||
+
|
||||
+Dual-state Button btOnOff6
|
||||
+ Attributes
|
||||
+ Scope : local
|
||||
+ Dragging : 0
|
||||
+ Disable release event after dragging: 0
|
||||
+ Send Component ID : disabled
|
||||
+ State : unpressed
|
||||
+ Text :
|
||||
+ Max. Text Size : 10
|
||||
+
|
||||
+ Events
|
||||
+ Touch Press Event
|
||||
+ tSend.txt="event,buttonPress2,"+entn6.txt+",OnOff,"
|
||||
+ covx btOnOff6.val,tTmp.txt,0,0
|
||||
+ tSend.txt+=tTmp.txt
|
||||
+ //send calc crc
|
||||
+ btlen tSend.txt,sys0
|
||||
+ crcrest 1,0xffff // reset CRC
|
||||
+ crcputh 55 bb
|
||||
+ crcputs sys0,1
|
||||
+ crcputs tSend.txt,0
|
||||
+ //send cmd
|
||||
+ printh 55 bb
|
||||
+ prints sys0,2
|
||||
+ prints tSend.txt,0
|
||||
+ prints crcval,2
|
||||
+
|
||||
Hotspot mSpecial
|
||||
Attributes
|
||||
Scope : local
|
||||
@@ -1072,6 +1484,50 @@
|
||||
@@ -1072,6 +1278,28 @@
|
||||
page popupLight
|
||||
}
|
||||
|
||||
@@ -499,33 +329,11 @@ diff -bur HMI/n2t-out/cardEntities.txt HMI/US/portrait/n2t-out/cardEntities.txt
|
||||
+ //popupLight.tEntity.txt=tEntity5.txt
|
||||
+ page popupLight
|
||||
+ }
|
||||
+
|
||||
+Hotspot m5
|
||||
+ Attributes
|
||||
+ Scope : local
|
||||
+ Dragging : 0
|
||||
+ Disable release event after dragging: 0
|
||||
+ Send Component ID : disabled
|
||||
+
|
||||
+ Events
|
||||
+ Touch Press Event
|
||||
+ pageIcons.tTmp1.txt=tEntity6.txt
|
||||
+ pageIcons.tTmp2.txt=entn6.txt
|
||||
+ if(type6.txt=="shutter")
|
||||
+ {
|
||||
+ //popupShutter.tHeading.txt=tEntity6.txt
|
||||
+ page popupShutter
|
||||
+ }
|
||||
+ if(type6.txt=="light")
|
||||
+ {
|
||||
+ //popupLight.tEntity.txt=tEntity6.txt
|
||||
+ page popupLight
|
||||
+ }
|
||||
+
|
||||
Timer tmSerial
|
||||
Attributes
|
||||
Scope : local
|
||||
@@ -1642,6 +2098,250 @@
|
||||
@@ -1642,6 +1870,128 @@
|
||||
covx tTmp.txt,sys0,0,0
|
||||
hSlider4.maxval=sys0
|
||||
}
|
||||
@@ -650,135 +458,13 @@ diff -bur HMI/n2t-out/cardEntities.txt HMI/US/portrait/n2t-out/cardEntities.txt
|
||||
+ spstr bText5.txt,tTmp.txt,"|",2
|
||||
+ covx tTmp.txt,sys0,0,0
|
||||
+ hSlider5.maxval=sys0
|
||||
+ }
|
||||
+ // get Type
|
||||
+ spstr strCommand.txt,type6.txt,"~",33
|
||||
+ // get internal name
|
||||
+ spstr strCommand.txt,entn6.txt,"~",34
|
||||
+ if(type6.txt=="delete"||type6.txt=="")
|
||||
+ {
|
||||
+ vis bUp6,0
|
||||
+ vis bStop6,0
|
||||
+ vis bDown6,0
|
||||
+ vis btOnOff6,0
|
||||
+ vis tEntity6,0
|
||||
+ vis tIcon6,0
|
||||
+ vis bText6,0
|
||||
+ vis hSlider6,0
|
||||
+ vis nNum6,0
|
||||
+ }else
|
||||
+ {
|
||||
+ // change icon
|
||||
+ spstr strCommand.txt,tIcon6.txt,"~",35
|
||||
+ vis tIcon6,1
|
||||
+ // change icon color
|
||||
+ spstr strCommand.txt,tTmp.txt,"~",36
|
||||
+ covx tTmp.txt,sys0,0,0
|
||||
+ tIcon6.pco=sys0
|
||||
+ // set name
|
||||
+ spstr strCommand.txt,tEntity6.txt,"~",37
|
||||
+ vis tEntity6,1
|
||||
+ }
|
||||
+ if(type6.txt=="shutter")
|
||||
+ {
|
||||
+ vis bUp6,1
|
||||
+ vis bStop6,1
|
||||
+ vis bDown6,1
|
||||
+ vis btOnOff6,0
|
||||
+ vis bText6,0
|
||||
+ vis hSlider6,0
|
||||
+ vis nNum6,0
|
||||
+ }
|
||||
+ if(type6.txt=="light")
|
||||
+ {
|
||||
+ vis bUp6,0
|
||||
+ vis bStop6,0
|
||||
+ vis bDown6,0
|
||||
+ vis btOnOff6,1
|
||||
+ vis bText6,0
|
||||
+ vis hSlider6,0
|
||||
+ vis nNum6,0
|
||||
+ // get Button State (optional Value)
|
||||
+ spstr strCommand.txt,tTmp.txt,"~",38
|
||||
+ covx tTmp.txt,sys0,0,0
|
||||
+ btOnOff6.val=sys0
|
||||
+ }
|
||||
+ if(type6.txt=="switch")
|
||||
+ {
|
||||
+ vis bUp6,0
|
||||
+ vis bStop6,0
|
||||
+ vis bDown6,0
|
||||
+ vis btOnOff6,1
|
||||
+ vis bText6,0
|
||||
+ vis hSlider6,0
|
||||
+ vis nNum6,0
|
||||
+ // get Button State (optional Value)
|
||||
+ spstr strCommand.txt,tTmp.txt,"~",38
|
||||
+ covx tTmp.txt,sys0,0,0
|
||||
+ btOnOff6.val=sys0
|
||||
+ }
|
||||
+ if(type6.txt=="text")
|
||||
+ {
|
||||
+ vis bUp6,0
|
||||
+ vis bStop6,0
|
||||
+ vis bDown6,0
|
||||
+ vis btOnOff6,0
|
||||
+ vis bText6,1
|
||||
+ tsw bText6,0
|
||||
+ vis hSlider6,0
|
||||
+ vis nNum6,0
|
||||
+ bText6.pco=65535
|
||||
+ bText6.pco2=65535
|
||||
+ // get Text (optional Value)
|
||||
+ spstr strCommand.txt,bText6.txt,"~",38
|
||||
+ }
|
||||
+ if(type6.txt=="button")
|
||||
+ {
|
||||
+ vis bUp6,0
|
||||
+ vis bStop6,0
|
||||
+ vis bDown6,0
|
||||
+ vis btOnOff6,0
|
||||
+ vis bText6,1
|
||||
+ tsw bText6,1
|
||||
+ vis hSlider6,0
|
||||
+ vis nNum6,0
|
||||
+ bText6.pco=1374
|
||||
+ bText6.pco2=1374
|
||||
+ // get Text (optional Value)
|
||||
+ spstr strCommand.txt,bText6.txt,"~",38
|
||||
+ }
|
||||
+ if(type6.txt=="number")
|
||||
+ {
|
||||
+ vis bUp6,0
|
||||
+ vis bStop6,0
|
||||
+ vis bDown6,0
|
||||
+ vis btOnOff6,0
|
||||
+ vis bText6,0
|
||||
+ tsw bText6,0
|
||||
+ vis hSlider6,1
|
||||
+ vis nNum6,1
|
||||
+ // get config (optional Value) (use bText as variable)
|
||||
+ spstr strCommand.txt,bText6.txt,"~",38
|
||||
+ //first value is current value
|
||||
+ spstr bText6.txt,tTmp.txt,"|",0
|
||||
+ covx tTmp.txt,sys0,0,0
|
||||
+ hSlider6.val=sys0
|
||||
+ nNum6.val=sys0
|
||||
+ //second value is min value
|
||||
+ spstr bText6.txt,tTmp.txt,"|",1
|
||||
+ covx tTmp.txt,sys0,0,0
|
||||
+ hSlider6.minval=sys0
|
||||
+ //third value is max value
|
||||
+ spstr bText6.txt,tTmp.txt,"|",2
|
||||
+ covx tTmp.txt,sys0,0,0
|
||||
+ hSlider6.maxval=sys0
|
||||
+ }
|
||||
}
|
||||
if(tInstruction.txt=="pageType")
|
||||
{
|
||||
diff -bur HMI/n2t-out/pageStartup.txt HMI/US/portrait/n2t-out/pageStartup.txt
|
||||
--- HMI/n2t-out/pageStartup.txt 2022-04-10 15:53:53.428265648 +0000
|
||||
+++ HMI/US/portrait/n2t-out/pageStartup.txt 2022-04-10 15:53:53.884273916 +0000
|
||||
--- HMI/n2t-out/pageStartup.txt 2022-04-12 16:15:30.351143292 +0000
|
||||
+++ HMI/US/portrait/n2t-out/pageStartup.txt 2022-04-12 16:15:30.734970090 +0000
|
||||
@@ -142,7 +142,7 @@
|
||||
Disable release event after dragging: 0
|
||||
Send Component ID : disabled
|
||||
@@ -798,8 +484,8 @@ diff -bur HMI/n2t-out/pageStartup.txt HMI/US/portrait/n2t-out/pageStartup.txt
|
||||
btlen tSend.txt,sys0
|
||||
crcrest 1,0xffff // reset CRC
|
||||
diff -bur HMI/n2t-out/screensaver.txt HMI/US/portrait/n2t-out/screensaver.txt
|
||||
--- HMI/n2t-out/screensaver.txt 2022-04-10 15:53:53.432265720 +0000
|
||||
+++ HMI/US/portrait/n2t-out/screensaver.txt 2022-04-10 15:53:53.884273916 +0000
|
||||
--- HMI/n2t-out/screensaver.txt 2022-04-12 16:15:30.351143292 +0000
|
||||
+++ HMI/US/portrait/n2t-out/screensaver.txt 2022-04-12 16:15:30.734970090 +0000
|
||||
@@ -48,6 +48,26 @@
|
||||
Scope: local
|
||||
Value: 0
|
||||
|
||||
Reference in New Issue
Block a user