diff --git a/avr/devices/n14/aqua_n14.xml b/avr/devices/n14/aqua_n14.xml
index 81abc7d..89eb432 100644
--- a/avr/devices/n14/aqua_n14.xml
+++ b/avr/devices/n14/aqua_n14.xml
@@ -10,13 +10,14 @@
+
-
+
diff --git a/avr/devices/n14/main/main.asm b/avr/devices/n14/main/main.asm
index fae03a2..6f5203b 100644
--- a/avr/devices/n14/main/main.asm
+++ b/avr/devices/n14/main/main.asm
@@ -88,6 +88,7 @@
.equ VALUE_ID_MAL_SOURCE2 = 0x87
.equ VALUE_ID_MAL_BSOURCE = 0x89
.equ VALUE_ID_MAL_BVALUE = 0x8a
+.equ VALUE_ID_LED_MODE = 0x8b
.equ VALUE_ID_LEDSIMPLE_TIMING = 0x88
diff --git a/avr/devices/n25/aqua_n25.xml b/avr/devices/n25/aqua_n25.xml
index 144bf35..09fbae2 100644
--- a/avr/devices/n25/aqua_n25.xml
+++ b/avr/devices/n25/aqua_n25.xml
@@ -5,20 +5,21 @@
25
-
+
-
-
-
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
diff --git a/avr/devices/n25/main/main.asm b/avr/devices/n25/main/main.asm
index 3735f1a..1d28bbb 100644
--- a/avr/devices/n25/main/main.asm
+++ b/avr/devices/n25/main/main.asm
@@ -90,6 +90,7 @@
.equ VALUE_ID_MAL_SOURCE2 = 0x87
.equ VALUE_ID_MAL_BSOURCE = 0x89
.equ VALUE_ID_MAL_BVALUE = 0x8a
+.equ VALUE_ID_LED_MODE = 0x8b
.equ VALUE_ID_LEDSIMPLE_TIMING = 0x88
diff --git a/avr/modules/sk6812/main.asm b/avr/modules/sk6812/main.asm
index 5fb9a9e..15acdd6 100644
--- a/avr/modules/sk6812/main.asm
+++ b/avr/modules/sk6812/main.asm
@@ -14,6 +14,11 @@
.equ SK6812_PATTERN_NUM = 3
+.equ SK6812_MODE_OFF = 0
+.equ SK6812_MODE_ON = 1
+.equ SK6812_MODE_AUTO = 2
+
+
; ***************************************************************************
; data
@@ -24,6 +29,7 @@ sk6812DataBegin:
sk6812NumLeds: .byte 1
sk6812Pattern: .byte 5*SK6812_PATTERN_NUM ; 1 byte num leds, 4 bytes colour (RGBW)
sk6812RGBW: .byte 4 ; current RGBW value
+ sk6812Mode: .byte 1
sk6812DataEnd:
@@ -47,6 +53,9 @@ SK6812_Init:
ldi r17, (sk6812DataEnd-sk6812DataBegin)
rcall Utils_FillSram
+ ldi r16, SK6812_MODE_AUTO
+ sts sk6812Mode, r16
+
sbi SK6812_DDR, SK6812_PINNUM ; set to output
cbi SK6812_PORT, SK6812_PINNUM ; set LOW
ldi r16, 150
@@ -119,20 +128,35 @@ sk6812SetAllColor_loop:
; @clobbers r18, r19, r20, r21, (r16, r17, r23, r24, r25)
SK6812_SetState:
- tst r18
+ lds r16, sk6812Mode
+ cpi r16, SK6812_MODE_AUTO
+ brne SK6812_SetState_end
+ rjmp sk6812SetState
+SK6812_SetState_end:
+ ret
+; @end
+
+
+
+; ---------------------------------------------------------------------------
+; @routine SK6812_SetMode @global
+;
+; @param r18 mode (SK6812_MODE_OFF, SK6812_MODE_ON, SK6812_MODE_AUTO)
+; @clobbers r18, (r16, r17, r19, r20, r21, r23, r24, r25)
+
+SK6812_SetMode:
+ sts sk6812Mode, r18
+ cpi r18, SK6812_MODE_OFF
breq SK6812_SetState_off
- lds r18, sk6812RGBW
- lds r19, sk6812RGBW+1
- lds r20, sk6812RGBW+2
- lds r22, sk6812RGBW+3
- rjmp SK6812_SetState_haveValue
+ cpi r18, SK6812_MODE_ON
+ breq SK6812_SetState_on
+ ret
SK6812_SetState_off:
clr r18
- clr r19
- clr r20
- clr r21
-SK6812_SetState_haveValue:
- rjmp sk6812SetAllColor ; (r16, r17, r23, r24, r25)
+ rjmp sk6812SetState ; (r16, r17, r18, r19, r20, r21, r23, r24, r25)
+SK6812_SetState_on:
+ ldi r18, 1
+ rjmp sk6812SetState ; (r16, r17, r18, r19, r20, r21, r23, r24, r25)
; @end
@@ -165,6 +189,33 @@ SK6812_SetRGBW:
; @end
+
+; ---------------------------------------------------------------------------
+; @routine sk6812SetState
+;
+; Set all LEDs to same colour according to state.
+;
+; @param r18 0: all LEDs off, otherwise all LEDs color stored in sk6812RGBW
+; @clobbers r18, r19, r20, r21, (r16, r17, r23, r24, r25)
+
+sk6812SetState:
+ tst r18
+ breq sk6812SetState_off
+ lds r18, sk6812RGBW
+ lds r19, sk6812RGBW+1
+ lds r20, sk6812RGBW+2
+ lds r21, sk6812RGBW+3
+ rjmp sk6812SetState_haveValue
+sk6812SetState_off:
+ clr r18
+ clr r19
+ clr r20
+ clr r21
+sk6812SetState_haveValue:
+ rjmp sk6812SetAllColor ; (r16, r17, r23, r24, r25)
+; @end
+
+
; ---------------------------------------------------------------------------
; @routine sk6812SendPattern
;
diff --git a/avr/modules/sk6812/recv.asm b/avr/modules/sk6812/recv.asm
index 7921edb..f77df90 100644
--- a/avr/modules/sk6812/recv.asm
+++ b/avr/modules/sk6812/recv.asm
@@ -30,6 +30,8 @@ SK6812_OnPacketReceived_set:
breq SK6812_OnPacketReceived_setNumLeds
cpi r17, VALUE_ID_LED_STATE
breq SK6812_OnPacketReceived_setState
+ cpi r17, VALUE_ID_LED_MODE
+ breq SK6812_OnPacketReceived_setMode
clc
ret
SK6812_OnPacketReceived_setRGBW:
@@ -50,7 +52,15 @@ SK6812_OnPacketReceived_setState:
pop r24
pop r17
rjmp SK6812_OnPacketReceived_sendAck
-
+SK6812_OnPacketReceived_setMode:
+ push r17
+ push r24
+ push r25
+ rcall SK6812_SetMode ; value is in R18 (r16, r17, r18, r19, r20, r21, r23, r24, r25)
+ pop r25
+ pop r24
+ pop r17
+ rjmp SK6812_OnPacketReceived_sendAck
SK6812_OnPacketReceived_setNumLeds:
sts sk6812NumLeds, r18
SK6812_OnPacketReceived_sendAck: