|  | @ -316,22 +316,23 @@ QueueHandle_t rfidCardQueue; | 
		
	
		
			
				|  |  | RingbufHandle_t explorerFileUploadRingBuffer; |  |  | RingbufHandle_t explorerFileUploadRingBuffer; | 
		
	
		
			
				|  |  | QueueHandle_t explorerFileUploadStatusQueue; |  |  | QueueHandle_t explorerFileUploadStatusQueue; | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | #if (NEXT_BUTTON > 0 && NEXT_BUTTON<50)
 |  |  |  | 
		
	
		
			
				|  |  |  |  |  | // Only enable those buttons that use GPIOs <= 39
 | 
		
	
		
			
				|  |  |  |  |  | #if (NEXT_BUTTON >= 0 && NEXT_BUTTON <= 39)
 | 
		
	
		
			
				|  |  |     #define BUTTON_0_ENABLE
 |  |  |     #define BUTTON_0_ENABLE
 | 
		
	
		
			
				|  |  | #endif
 |  |  | #endif
 | 
		
	
		
			
				|  |  | #if (PREVIOUS_BUTTON > 0 && PREVIOUS_BUTTON<50)
 |  |  |  | 
		
	
		
			
				|  |  |  |  |  | #if (PREVIOUS_BUTTON >= 0 && PREVIOUS_BUTTON <= 39)
 | 
		
	
		
			
				|  |  |     #define BUTTON_1_ENABLE
 |  |  |     #define BUTTON_1_ENABLE
 | 
		
	
		
			
				|  |  | #endif
 |  |  | #endif
 | 
		
	
		
			
				|  |  | #if (PAUSEPLAY_BUTTON > 0 && PAUSEPLAY_BUTTON<50)
 |  |  |  | 
		
	
		
			
				|  |  |  |  |  | #if (PAUSEPLAY_BUTTON >= 0 && PAUSEPLAY_BUTTON <= 39)
 | 
		
	
		
			
				|  |  |     #define BUTTON_2_ENABLE
 |  |  |     #define BUTTON_2_ENABLE
 | 
		
	
		
			
				|  |  | #endif
 |  |  | #endif
 | 
		
	
		
			
				|  |  | #ifdef USEROTARY_ENABLE
 |  |  | #ifdef USEROTARY_ENABLE
 | 
		
	
		
			
				|  |  |     #define BUTTON_3_ENABLE
 |  |  |     #define BUTTON_3_ENABLE
 | 
		
	
		
			
				|  |  | #endif
 |  |  | #endif
 | 
		
	
		
			
				|  |  | #if (BUTTON_4 > 0 && BUTTON_4<50)
 |  |  |  | 
		
	
		
			
				|  |  |  |  |  | #if (BUTTON_4 >= 0 && BUTTON_4 <= 39)
 | 
		
	
		
			
				|  |  |     #define BUTTON_4_ENABLE
 |  |  |     #define BUTTON_4_ENABLE
 | 
		
	
		
			
				|  |  | #endif
 |  |  | #endif
 | 
		
	
		
			
				|  |  | #if (BUTTON_5 > 0 && BUTTON_5<50)
 |  |  |  | 
		
	
		
			
				|  |  |  |  |  | #if (BUTTON_5 >= 0 && BUTTON_5 <= 39)
 | 
		
	
		
			
				|  |  |     #define BUTTON_5_ENABLE
 |  |  |     #define BUTTON_5_ENABLE
 | 
		
	
		
			
				|  |  | #endif
 |  |  | #endif
 | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
	
		
			
				|  | @ -2566,7 +2567,7 @@ void doRfidCardModifications(const uint32_t mod) { | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | void doCmdAction(const uint32_t mod) { |  |  | void doCmdAction(const uint32_t mod) { | 
		
	
		
			
				|  |  |     switch (mod) { |  |  |     switch (mod) { | 
		
	
		
			
				|  |  |         case LOCK_BUTTONS_MOD:      // Locks/unlocks all buttons
 |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         case LOCK_BUTTONS_MOD: {     // Locks/unlocks all buttons
 | 
		
	
		
			
				|  |  |             lockControls = !lockControls; |  |  |             lockControls = !lockControls; | 
		
	
		
			
				|  |  |             if (lockControls) { |  |  |             if (lockControls) { | 
		
	
		
			
				|  |  |                 loggerNl(serialDebug, (char *) FPSTR(modificatorAllButtonsLocked), LOGLEVEL_NOTICE); |  |  |                 loggerNl(serialDebug, (char *) FPSTR(modificatorAllButtonsLocked), LOGLEVEL_NOTICE); | 
		
	
	
		
			
				|  | @ -2582,8 +2583,9 @@ void doCmdAction(const uint32_t mod) { | 
		
	
		
			
				|  |  |                     publishMqtt((char *) FPSTR(topicLockControlsState), "OFF", false); |  |  |                     publishMqtt((char *) FPSTR(topicLockControlsState), "OFF", false); | 
		
	
		
			
				|  |  |                 #endif
 |  |  |                 #endif
 | 
		
	
		
			
				|  |  |             } |  |  |             } | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |         case SLEEP_TIMER_MOD_15:    // Enables/disables sleep after 15 minutes
 |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         case SLEEP_TIMER_MOD_15: {   // Enables/disables sleep after 15 minutes
 | 
		
	
		
			
				|  |  |             if (sleepTimerStartTimestamp && sleepTimer == 15) { |  |  |             if (sleepTimerStartTimestamp && sleepTimer == 15) { | 
		
	
		
			
				|  |  |                 sleepTimerStartTimestamp = 0; |  |  |                 sleepTimerStartTimestamp = 0; | 
		
	
		
			
				|  |  |                 #ifdef NEOPIXEL_ENABLE
 |  |  |                 #ifdef NEOPIXEL_ENABLE
 | 
		
	
	
		
			
				|  | @ -2615,8 +2617,9 @@ void doCmdAction(const uint32_t mod) { | 
		
	
		
			
				|  |  |                 showLedOk = true; |  |  |                 showLedOk = true; | 
		
	
		
			
				|  |  |             #endif
 |  |  |             #endif
 | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |         case SLEEP_TIMER_MOD_30:    // Enables/disables sleep after 30 minutes
 |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         case SLEEP_TIMER_MOD_30: {   // Enables/disables sleep after 30 minutes
 | 
		
	
		
			
				|  |  |             if (sleepTimerStartTimestamp && sleepTimer == 30) { |  |  |             if (sleepTimerStartTimestamp && sleepTimer == 30) { | 
		
	
		
			
				|  |  |                 sleepTimerStartTimestamp = 0; |  |  |                 sleepTimerStartTimestamp = 0; | 
		
	
		
			
				|  |  |                 #ifdef NEOPIXEL_ENABLE
 |  |  |                 #ifdef NEOPIXEL_ENABLE
 | 
		
	
	
		
			
				|  | @ -2648,8 +2651,9 @@ void doCmdAction(const uint32_t mod) { | 
		
	
		
			
				|  |  |                 showLedOk = true; |  |  |                 showLedOk = true; | 
		
	
		
			
				|  |  |             #endif
 |  |  |             #endif
 | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |         case SLEEP_TIMER_MOD_60:    // Enables/disables sleep after 60 minutes
 |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         case SLEEP_TIMER_MOD_60: {   // Enables/disables sleep after 60 minutes
 | 
		
	
		
			
				|  |  |             if (sleepTimerStartTimestamp && sleepTimer == 60) { |  |  |             if (sleepTimerStartTimestamp && sleepTimer == 60) { | 
		
	
		
			
				|  |  |                 sleepTimerStartTimestamp = 0; |  |  |                 sleepTimerStartTimestamp = 0; | 
		
	
		
			
				|  |  |                 #ifdef NEOPIXEL_ENABLE
 |  |  |                 #ifdef NEOPIXEL_ENABLE
 | 
		
	
	
		
			
				|  | @ -2681,8 +2685,9 @@ void doCmdAction(const uint32_t mod) { | 
		
	
		
			
				|  |  |                 showLedOk = true; |  |  |                 showLedOk = true; | 
		
	
		
			
				|  |  |             #endif
 |  |  |             #endif
 | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |         case SLEEP_TIMER_MOD_120:    // Enables/disables sleep after 2 hrs
 |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         case SLEEP_TIMER_MOD_120: {   // Enables/disables sleep after 2 hrs
 | 
		
	
		
			
				|  |  |             if (sleepTimerStartTimestamp && sleepTimer == 120) { |  |  |             if (sleepTimerStartTimestamp && sleepTimer == 120) { | 
		
	
		
			
				|  |  |                 sleepTimerStartTimestamp = 0; |  |  |                 sleepTimerStartTimestamp = 0; | 
		
	
		
			
				|  |  |                 #ifdef NEOPIXEL_ENABLE
 |  |  |                 #ifdef NEOPIXEL_ENABLE
 | 
		
	
	
		
			
				|  | @ -2714,8 +2719,9 @@ void doCmdAction(const uint32_t mod) { | 
		
	
		
			
				|  |  |                 showLedOk = true; |  |  |                 showLedOk = true; | 
		
	
		
			
				|  |  |             #endif
 |  |  |             #endif
 | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |         case SLEEP_AFTER_END_OF_TRACK:  // Puts uC to sleep after end of current track
 |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         case SLEEP_AFTER_END_OF_TRACK: { // Puts uC to sleep after end of current track
 | 
		
	
		
			
				|  |  |             if (playProperties.playMode == NO_PLAYLIST) { |  |  |             if (playProperties.playMode == NO_PLAYLIST) { | 
		
	
		
			
				|  |  |                 loggerNl(serialDebug, (char *) FPSTR(modificatorNotallowedWhenIdle), LOGLEVEL_NOTICE); |  |  |                 loggerNl(serialDebug, (char *) FPSTR(modificatorNotallowedWhenIdle), LOGLEVEL_NOTICE); | 
		
	
		
			
				|  |  |                 #ifdef NEOPIXEL_ENABLE
 |  |  |                 #ifdef NEOPIXEL_ENABLE
 | 
		
	
	
		
			
				|  | @ -2753,8 +2759,9 @@ void doCmdAction(const uint32_t mod) { | 
		
	
		
			
				|  |  |                 showLedOk = true; |  |  |                 showLedOk = true; | 
		
	
		
			
				|  |  |             #endif
 |  |  |             #endif
 | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |         case SLEEP_AFTER_END_OF_PLAYLIST:   // Puts uC to sleep after end of whole playlist (can take a while :->)
 |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         case SLEEP_AFTER_END_OF_PLAYLIST: {  // Puts uC to sleep after end of whole playlist (can take a while :->)
 | 
		
	
		
			
				|  |  |             if (playProperties.playMode == NO_PLAYLIST) { |  |  |             if (playProperties.playMode == NO_PLAYLIST) { | 
		
	
		
			
				|  |  |                 loggerNl(serialDebug, (char *) FPSTR(modificatorNotallowedWhenIdle), LOGLEVEL_NOTICE); |  |  |                 loggerNl(serialDebug, (char *) FPSTR(modificatorNotallowedWhenIdle), LOGLEVEL_NOTICE); | 
		
	
		
			
				|  |  |                 #ifdef NEOPIXEL_ENABLE
 |  |  |                 #ifdef NEOPIXEL_ENABLE
 | 
		
	
	
		
			
				|  | @ -2792,8 +2799,9 @@ void doCmdAction(const uint32_t mod) { | 
		
	
		
			
				|  |  |                 showLedOk = true; |  |  |                 showLedOk = true; | 
		
	
		
			
				|  |  |             #endif
 |  |  |             #endif
 | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |         case SLEEP_AFTER_5_TRACKS: |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         case SLEEP_AFTER_5_TRACKS:{ | 
		
	
		
			
				|  |  |             if (playProperties.playMode == NO_PLAYLIST) { |  |  |             if (playProperties.playMode == NO_PLAYLIST) { | 
		
	
		
			
				|  |  |                 loggerNl(serialDebug, (char *) FPSTR(modificatorNotallowedWhenIdle), LOGLEVEL_NOTICE); |  |  |                 loggerNl(serialDebug, (char *) FPSTR(modificatorNotallowedWhenIdle), LOGLEVEL_NOTICE); | 
		
	
		
			
				|  |  |                 #ifdef NEOPIXEL_ENABLE
 |  |  |                 #ifdef NEOPIXEL_ENABLE
 | 
		
	
	
		
			
				|  | @ -2840,8 +2848,9 @@ void doCmdAction(const uint32_t mod) { | 
		
	
		
			
				|  |  |                 showLedOk = true; |  |  |                 showLedOk = true; | 
		
	
		
			
				|  |  |             #endif
 |  |  |             #endif
 | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |         case REPEAT_PLAYLIST: |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         case REPEAT_PLAYLIST: { | 
		
	
		
			
				|  |  |             if (playProperties.playMode == NO_PLAYLIST) { |  |  |             if (playProperties.playMode == NO_PLAYLIST) { | 
		
	
		
			
				|  |  |                 loggerNl(serialDebug, (char *) FPSTR(modificatorNotallowedWhenIdle), LOGLEVEL_NOTICE); |  |  |                 loggerNl(serialDebug, (char *) FPSTR(modificatorNotallowedWhenIdle), LOGLEVEL_NOTICE); | 
		
	
		
			
				|  |  |                 #ifdef NEOPIXEL_ENABLE
 |  |  |                 #ifdef NEOPIXEL_ENABLE
 | 
		
	
	
		
			
				|  | @ -2864,8 +2873,9 @@ void doCmdAction(const uint32_t mod) { | 
		
	
		
			
				|  |  |                 #endif
 |  |  |                 #endif
 | 
		
	
		
			
				|  |  |             } |  |  |             } | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |         case REPEAT_TRACK:      // Introduces looping for track-mode
 |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         case REPEAT_TRACK: {     // Introduces looping for track-mode
 | 
		
	
		
			
				|  |  |             if (playProperties.playMode == NO_PLAYLIST) { |  |  |             if (playProperties.playMode == NO_PLAYLIST) { | 
		
	
		
			
				|  |  |                 loggerNl(serialDebug, (char *) FPSTR(modificatorNotallowedWhenIdle), LOGLEVEL_NOTICE); |  |  |                 loggerNl(serialDebug, (char *) FPSTR(modificatorNotallowedWhenIdle), LOGLEVEL_NOTICE); | 
		
	
		
			
				|  |  |                 #ifdef NEOPIXEL_ENABLE
 |  |  |                 #ifdef NEOPIXEL_ENABLE
 | 
		
	
	
		
			
				|  | @ -2888,8 +2898,9 @@ void doCmdAction(const uint32_t mod) { | 
		
	
		
			
				|  |  |                 #endif
 |  |  |                 #endif
 | 
		
	
		
			
				|  |  |             } |  |  |             } | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |         case DIMM_LEDS_NIGHTMODE: |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         case DIMM_LEDS_NIGHTMODE: { | 
		
	
		
			
				|  |  |             #ifdef MQTT_ENABLE
 |  |  |             #ifdef MQTT_ENABLE
 | 
		
	
		
			
				|  |  |                 publishMqtt((char *) FPSTR(topicLedBrightnessState), ledBrightness, false); |  |  |                 publishMqtt((char *) FPSTR(topicLedBrightnessState), ledBrightness, false); | 
		
	
		
			
				|  |  |             #endif
 |  |  |             #endif
 | 
		
	
	
		
			
				|  | @ -2899,8 +2910,9 @@ void doCmdAction(const uint32_t mod) { | 
		
	
		
			
				|  |  |                 showLedOk = true; |  |  |                 showLedOk = true; | 
		
	
		
			
				|  |  |             #endif
 |  |  |             #endif
 | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |         case TOGGLE_WIFI_STATUS: |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         case TOGGLE_WIFI_STATUS: { | 
		
	
		
			
				|  |  |             if (writeWifiStatusToNVS(!getWifiEnableStatusFromNVS())) { |  |  |             if (writeWifiStatusToNVS(!getWifiEnableStatusFromNVS())) { | 
		
	
		
			
				|  |  |                 #ifdef NEOPIXEL_ENABLE
 |  |  |                 #ifdef NEOPIXEL_ENABLE
 | 
		
	
		
			
				|  |  |                     showLedOk = true; |  |  |                     showLedOk = true; | 
		
	
	
		
			
				|  | @ -2911,8 +2923,9 @@ void doCmdAction(const uint32_t mod) { | 
		
	
		
			
				|  |  |                 #endif
 |  |  |                 #endif
 | 
		
	
		
			
				|  |  |             } |  |  |             } | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  |         #ifdef BLUETOOTH_ENABLE
 |  |  |         #ifdef BLUETOOTH_ENABLE
 | 
		
	
		
			
				|  |  |             case TOGGLE_BLUETOOTH_MODE: |  |  |  | 
		
	
		
			
				|  |  |  |  |  |             case TOGGLE_BLUETOOTH_MODE: { | 
		
	
		
			
				|  |  |                 if (readOperationModeFromNVS() == OPMODE_NORMAL) { |  |  |                 if (readOperationModeFromNVS() == OPMODE_NORMAL) { | 
		
	
		
			
				|  |  |                     #ifdef NEOPIXEL_ENABLE
 |  |  |                     #ifdef NEOPIXEL_ENABLE
 | 
		
	
		
			
				|  |  |                         showLedOk = true; |  |  |                         showLedOk = true; | 
		
	
	
		
			
				|  | @ -2929,8 +2942,9 @@ void doCmdAction(const uint32_t mod) { | 
		
	
		
			
				|  |  |                     #endif
 |  |  |                     #endif
 | 
		
	
		
			
				|  |  |                 } |  |  |                 } | 
		
	
		
			
				|  |  |                 break; |  |  |                 break; | 
		
	
		
			
				|  |  |  |  |  |             } | 
		
	
		
			
				|  |  |         #endif
 |  |  |         #endif
 | 
		
	
		
			
				|  |  |         case ENABLE_FTP_SERVER: |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         case ENABLE_FTP_SERVER: { | 
		
	
		
			
				|  |  |             if (wifiManager() == WL_CONNECTED && !ftpEnableLastStatus && !ftpEnableCurrentStatus) { |  |  |             if (wifiManager() == WL_CONNECTED && !ftpEnableLastStatus && !ftpEnableCurrentStatus) { | 
		
	
		
			
				|  |  |                 ftpEnableLastStatus = true; |  |  |                 ftpEnableLastStatus = true; | 
		
	
		
			
				|  |  |                 #ifdef NEOPIXEL_ENABLE
 |  |  |                 #ifdef NEOPIXEL_ENABLE
 | 
		
	
	
		
			
				|  | @ -2944,31 +2958,40 @@ void doCmdAction(const uint32_t mod) { | 
		
	
		
			
				|  |  |             } |  |  |             } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |         case CMD_PLAYPAUSE: |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |  |         case CMD_PLAYPAUSE: { | 
		
	
		
			
				|  |  |             trackControlToQueueSender(PAUSEPLAY); |  |  |             trackControlToQueueSender(PAUSEPLAY); | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |         case CMD_PREVTRACK: |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |  |         case CMD_PREVTRACK: { | 
		
	
		
			
				|  |  |             trackControlToQueueSender(PREVIOUSTRACK); |  |  |             trackControlToQueueSender(PREVIOUSTRACK); | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |         case CMD_NEXTTRACK: |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |  |         case CMD_NEXTTRACK: { | 
		
	
		
			
				|  |  |             trackControlToQueueSender(NEXTTRACK); |  |  |             trackControlToQueueSender(NEXTTRACK); | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |         case CMD_FIRSTTRACK: |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |  |         case CMD_FIRSTTRACK: { | 
		
	
		
			
				|  |  |             trackControlToQueueSender(FIRSTTRACK); |  |  |             trackControlToQueueSender(FIRSTTRACK); | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |         case CMD_LASTTRACK: |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |  |         case CMD_LASTTRACK: { | 
		
	
		
			
				|  |  |             trackControlToQueueSender(LASTTRACK); |  |  |             trackControlToQueueSender(LASTTRACK); | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |         case CMD_VOLUMEINIT: |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |  |         case CMD_VOLUMEINIT: { | 
		
	
		
			
				|  |  |             volumeToQueueSender(initVolume); |  |  |             volumeToQueueSender(initVolume); | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |         case CMD_VOLUMEUP: |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |  |         case CMD_VOLUMEUP: { | 
		
	
		
			
				|  |  |             volumeToQueueSender(currentVolume + 2); |  |  |             volumeToQueueSender(currentVolume + 2); | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |         case CMD_VOLUMEDOWN: |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |  |         case CMD_VOLUMEDOWN: { | 
		
	
		
			
				|  |  |             volumeToQueueSender(currentVolume - 2); |  |  |             volumeToQueueSender(currentVolume - 2); | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |         case CMD_MEASUREBATTERY: |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |  |         case CMD_MEASUREBATTERY: { | 
		
	
		
			
				|  |  |             #ifdef MEASURE_BATTERY_VOLTAGE
 |  |  |             #ifdef MEASURE_BATTERY_VOLTAGE
 | 
		
	
		
			
				|  |  |                 float voltage = measureBatteryVoltage(); |  |  |                 float voltage = measureBatteryVoltage(); | 
		
	
		
			
				|  |  |                 snprintf(logBuf, serialLoglength, "%s: %.2f V", (char *) FPSTR(currentVoltageMsg), voltage); |  |  |                 snprintf(logBuf, serialLoglength, "%s: %.2f V", (char *) FPSTR(currentVoltageMsg), voltage); | 
		
	
	
		
			
				|  | @ -2983,10 +3006,12 @@ void doCmdAction(const uint32_t mod) { | 
		
	
		
			
				|  |  |                 #endif
 |  |  |                 #endif
 | 
		
	
		
			
				|  |  |             #endif
 |  |  |             #endif
 | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |         case CMD_SLEEPMODE: |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |  |         case CMD_SLEEPMODE: { | 
		
	
		
			
				|  |  |             gotoSleep = true; |  |  |             gotoSleep = true; | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |         default: |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |  |         default: { | 
		
	
		
			
				|  |  |             snprintf(logBuf, serialLoglength, "%s %d !", (char *) FPSTR(modificatorDoesNotExist), mod); |  |  |             snprintf(logBuf, serialLoglength, "%s %d !", (char *) FPSTR(modificatorDoesNotExist), mod); | 
		
	
		
			
				|  |  |             loggerNl(serialDebug, logBuf, LOGLEVEL_ERROR); |  |  |             loggerNl(serialDebug, logBuf, LOGLEVEL_ERROR); | 
		
	
		
			
				|  |  |             #ifdef NEOPIXEL_ENABLE
 |  |  |             #ifdef NEOPIXEL_ENABLE
 | 
		
	
	
		
			
				|  | @ -2994,6 +3019,7 @@ void doCmdAction(const uint32_t mod) { | 
		
	
		
			
				|  |  |             #endif
 |  |  |             #endif
 | 
		
	
		
			
				|  |  |         } |  |  |         } | 
		
	
		
			
				|  |  |     } |  |  |     } | 
		
	
		
			
				|  |  |  |  |  | } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | // Tries to lookup RFID-tag-string in NVS and extracts parameter from it if found
 |  |  | // Tries to lookup RFID-tag-string in NVS and extracts parameter from it if found
 | 
		
	
	
		
			
				|  | @ -4582,11 +4608,26 @@ void setup() { | 
		
	
		
			
				|  |  |         0 /* Core where the task should run */ |  |  |         0 /* Core where the task should run */ | 
		
	
		
			
				|  |  |     ); |  |  |     ); | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |     // Activate internal pullups for all buttons
 |  |  |  | 
		
	
		
			
				|  |  |     pinMode(DREHENCODER_BUTTON, INPUT_PULLUP); |  |  |  | 
		
	
		
			
				|  |  |     pinMode(PAUSEPLAY_BUTTON, INPUT_PULLUP); |  |  |  | 
		
	
		
			
				|  |  |  |  |  |     // Activate internal pullups for all enabled buttons
 | 
		
	
		
			
				|  |  |  |  |  |     #ifdef BUTTON_0_ENABLE
 | 
		
	
		
			
				|  |  |         pinMode(NEXT_BUTTON, INPUT_PULLUP); |  |  |         pinMode(NEXT_BUTTON, INPUT_PULLUP); | 
		
	
		
			
				|  |  |  |  |  |     #endif
 | 
		
	
		
			
				|  |  |  |  |  |     #ifdef BUTTON_1_ENABLE
 | 
		
	
		
			
				|  |  |         pinMode(PREVIOUS_BUTTON, INPUT_PULLUP); |  |  |         pinMode(PREVIOUS_BUTTON, INPUT_PULLUP); | 
		
	
		
			
				|  |  |  |  |  |     #endif
 | 
		
	
		
			
				|  |  |  |  |  |     #ifdef BUTTON_2_ENABLE
 | 
		
	
		
			
				|  |  |  |  |  |         pinMode(PAUSEPLAY_BUTTON, INPUT_PULLUP); | 
		
	
		
			
				|  |  |  |  |  |     #endif
 | 
		
	
		
			
				|  |  |  |  |  |     #ifdef BUTTON_3_ENABLE
 | 
		
	
		
			
				|  |  |  |  |  |         pinMode(DREHENCODER_BUTTON, INPUT_PULLUP); | 
		
	
		
			
				|  |  |  |  |  |     #endif
 | 
		
	
		
			
				|  |  |  |  |  |     #ifdef BUTTON_4_ENABLE
 | 
		
	
		
			
				|  |  |  |  |  |         pinMode(BUTTON_4, INPUT_PULLUP); | 
		
	
		
			
				|  |  |  |  |  |     #endif
 | 
		
	
		
			
				|  |  |  |  |  |     #ifdef BUTTON_5_ENABLE
 | 
		
	
		
			
				|  |  |  |  |  |         pinMode(BUTTON_5, INPUT_PULLUP); | 
		
	
		
			
				|  |  |  |  |  |     #endif
 | 
		
	
		
			
				|  |  |  |  |  |     unsigned long currentTimestamp = millis(); | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |     // Init rotary encoder
 |  |  |     // Init rotary encoder
 | 
		
	
		
			
				|  |  |     encoder.attachHalfQuad(DREHENCODER_CLK, DREHENCODER_DT); |  |  |     encoder.attachHalfQuad(DREHENCODER_CLK, DREHENCODER_DT); | 
		
	
	
		
			
				|  | 
 |