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: