From 5d520089e06fd554e80a35d26d125f786bd478fe Mon Sep 17 00:00:00 2001 From: Daniel Rieper Date: Sun, 14 Feb 2021 19:07:50 +0100 Subject: [PATCH] Custom Button Layouts --- src/main.cpp | 286 +++++++++++++++++++++++-------------------------- src/settings.h | 32 ++++++ src/values.h | 65 +++++++++++ 3 files changed, 229 insertions(+), 154 deletions(-) create mode 100644 src/values.h diff --git a/src/main.cpp b/src/main.cpp index 09df3fc..104a41d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -78,6 +78,8 @@ #include "freertos/ringbuf.h" +#include "values.h" + // Serial-logging buffer uint8_t serialLoglength = 200; char *logBuf = (char*) calloc(serialLoglength, sizeof(char)); // Buffer for all log-messages @@ -106,54 +108,6 @@ char *logBuf = (char*) calloc(serialLoglength, sizeof(char)); // Buffer for all bool recoverLastRfid = true; #endif -// Operation Mode -#define OPMODE_NORMAL 0 // Normal mode -#define OPMODE_BLUETOOTH 1 // Bluetooth mode. WiFi is deactivated. Music from SD and webstreams can't be played. - -// Track-Control -#define STOP 1 // Stop play -#define PLAY 2 // Start play (currently not used) -#define PAUSEPLAY 3 // Pause/play -#define NEXTTRACK 4 // Next track of playlist -#define PREVIOUSTRACK 5 // Previous track of playlist -#define FIRSTTRACK 6 // First track of playlist -#define LASTTRACK 7 // Last track of playlist - -// Playmodes -#define NO_PLAYLIST 0 // If no playlist is active -#define SINGLE_TRACK 1 // Play a single track -#define SINGLE_TRACK_LOOP 2 // Play a single track in infinite-loop -#define AUDIOBOOK 3 // Single track, can save last play-position -#define AUDIOBOOK_LOOP 4 // Single track as infinite-loop, can save last play-position -#define ALL_TRACKS_OF_DIR_SORTED 5 // Play all files of a directory (alph. sorted) -#define ALL_TRACKS_OF_DIR_RANDOM 6 // Play all files of a directory (randomized) -#define ALL_TRACKS_OF_DIR_SORTED_LOOP 7 // Play all files of a directory (alph. sorted) in infinite-loop -#define ALL_TRACKS_OF_DIR_RANDOM_LOOP 9 // Play all files of a directory (randomized) in infinite-loop -#define WEBSTREAM 8 // Play webradio-stream -#define BUSY 10 // Used if playlist is created - -// RFID-modifcation-types -#define LOCK_BUTTONS_MOD 100 // Locks all buttons and rotary encoder -#define SLEEP_TIMER_MOD_15 101 // Puts uC into deepsleep after 15 minutes + LED-DIMM -#define SLEEP_TIMER_MOD_30 102 // Puts uC into deepsleep after 30 minutes + LED-DIMM -#define SLEEP_TIMER_MOD_60 103 // Puts uC into deepsleep after 60 minutes + LED-DIMM -#define SLEEP_TIMER_MOD_120 104 // Puts uC into deepsleep after 120 minutes + LED-DIMM -#define SLEEP_AFTER_END_OF_TRACK 105 // Puts uC into deepsleep after track is finished + LED-DIMM -#define SLEEP_AFTER_END_OF_PLAYLIST 106 // Puts uC into deepsleep after playlist is finished + LED-DIMM -#define SLEEP_AFTER_5_TRACKS 107 // Puts uC into deepsleep after five tracks -#define REPEAT_PLAYLIST 110 // Changes active playmode to endless-loop (for a playlist) -#define REPEAT_TRACK 111 // Changes active playmode to endless-loop (for a single track) -#define DIMM_LEDS_NIGHTMODE 120 // Changes LED-brightness -#define TOGGLE_WIFI_STATUS 130 // Toggles WiFi-status -#define TOGGLE_BLUETOOTH_MODE 140 // Toggles Normal/Bluetooth Mode -#define ENABLE_FTP_SERVER 150 // Enables FTP-server - -// Repeat-Modes -#define NO_REPEAT 0 // No repeat -#define TRACK 1 // Repeat current track (infinite loop) -#define PLAYLIST 2 // Repeat whole playlist (infinite loop) -#define TRACK_N_PLAYLIST 3 // Repeat both (infinite loop) - typedef struct { // Bit field uint8_t playMode: 4; // playMode char **playlist; // playlist @@ -370,6 +324,7 @@ void buttonHandler(); void deepSleepManager(void); void doButtonActions(void); void doRfidCardModifications(const uint32_t mod); +void doCmdAction(const uint32_t mod); bool dumpNvsToSd(char *_namespace, char *_destFile); bool endsWith (const char *str, const char *suf); bool fileValid(const char *_fileItem); @@ -561,105 +516,85 @@ void doButtonActions(void) { return; // Avoid button-handling if buttons are locked } - // WiFi-toggle if (buttons[0].isPressed && buttons[1].isPressed) { - if (!wifiStatusToggledTimestamp || (millis() - wifiStatusToggledTimestamp >= 2000)) { - wifiStatusToggledTimestamp = millis(); - buttons[0].isPressed = false; - buttons[1].isPressed = false; - if (writeWifiStatusToNVS(!getWifiEnableStatusFromNVS())) { - #ifdef NEOPIXEL_ENABLE - showLedOk = true; // Tell user action was accepted - #endif - } else { - #ifdef NEOPIXEL_ENABLE - showLedError = true; // Tell user action failed - #endif - } - } - return; + buttons[0].isPressed = false; + buttons[1].isPressed = false; + doCmdAction(BUTTON_MULTI_01); } + else if (buttons[0].isPressed && buttons[2].isPressed) { + buttons[0].isPressed = false; + buttons[2].isPressed = false; + doCmdAction(BUTTON_MULTI_02); + } + else if (buttons[0].isPressed && buttons[3].isPressed) { + buttons[0].isPressed = false; + buttons[3].isPressed = false; + doCmdAction(BUTTON_MULTI_03); + } + else if (buttons[1].isPressed && buttons[2].isPressed) { + buttons[1].isPressed = false; + buttons[2].isPressed = false; + doCmdAction(BUTTON_MULTI_12); + } + else if (buttons[1].isPressed && buttons[3].isPressed) { + buttons[1].isPressed = false; + buttons[3].isPressed = false; + doCmdAction(BUTTON_MULTI_13); + } + else if (buttons[2].isPressed && buttons[3].isPressed) { + buttons[2].isPressed = false; + buttons[3].isPressed = false; + doCmdAction(BUTTON_MULTI_23); + } + else { + for (uint8_t i=0; i < sizeof(buttons) / sizeof(buttons[0]); i++) { + if (buttons[i].isPressed) { + if (buttons[i].lastReleasedTimestamp > buttons[i].lastPressedTimestamp) { + if (buttons[i].lastReleasedTimestamp - buttons[i].lastPressedTimestamp >= intervalToLongPress) { + switch (i) // Long-press-actions + { + case 0: + doCmdAction(BUTTON_0_LONG); + buttons[i].isPressed = false; + break; - // FTP-enable - #ifdef FTP_ENABLE - if (!ftpEnableLastStatus && !ftpEnableCurrentStatus) { - if (buttons[0].isPressed && buttons[2].isPressed) { - buttons[0].isPressed = false; - buttons[2].isPressed = false; - if (wifiManager() != WL_CONNECTED) { - #ifdef NEOPIXEL_ENABLE - showLedError = true; - loggerNl(serialDebug, (char *) FPSTR(unableToStartFtpServer), LOGLEVEL_ERROR); - #endif - return; - } - ftpEnableLastStatus = true; - #ifdef NEOPIXEL_ENABLE - showLedOk = true; - #endif - return; - } - } - #endif - - for (uint8_t i=0; i < sizeof(buttons) / sizeof(buttons[0]); i++) { - if (buttons[i].isPressed) { - if (buttons[i].lastReleasedTimestamp > buttons[i].lastPressedTimestamp) { - if (buttons[i].lastReleasedTimestamp - buttons[i].lastPressedTimestamp >= intervalToLongPress) { - switch (i) // Long-press-actions - { - case 0: - trackControlToQueueSender(LASTTRACK); - buttons[i].isPressed = false; - break; - - case 1: - trackControlToQueueSender(FIRSTTRACK); - buttons[i].isPressed = false; - break; + case 1: + doCmdAction(BUTTON_1_LONG); + buttons[i].isPressed = false; + break; - case 2: - trackControlToQueueSender(PAUSEPLAY); - buttons[i].isPressed = false; - break; + case 2: + doCmdAction(BUTTON_2_LONG); + buttons[i].isPressed = false; + break; - case 3: - gotoSleep = true; - break; - } - } else { - switch (i) // Short-press-actions - { - case 0: - trackControlToQueueSender(NEXTTRACK); - buttons[i].isPressed = false; - break; + case 3: + doCmdAction(BUTTON_3_LONG); + buttons[i].isPressed = false; + break; + } + } else { + switch (i) // Short-press-actions + { + case 0: + doCmdAction(BUTTON_0_SHORT); + buttons[i].isPressed = false; + break; - case 1: - trackControlToQueueSender(PREVIOUSTRACK); - buttons[i].isPressed = false; - break; + case 1: + doCmdAction(BUTTON_1_SHORT); + buttons[i].isPressed = false; + break; - case 2: - trackControlToQueueSender(PAUSEPLAY); - buttons[i].isPressed = false; - break; + case 2: + doCmdAction(BUTTON_2_SHORT); + buttons[i].isPressed = false; + break; - case 3: - buttons[i].isPressed = false; - #ifdef MEASURE_BATTERY_VOLTAGE - float voltage = measureBatteryVoltage(); - snprintf(logBuf, serialLoglength, "%s: %.2f V", (char *) FPSTR(currentVoltageMsg), voltage); - loggerNl(serialDebug, logBuf, LOGLEVEL_INFO); - #ifdef NEOPIXEL_ENABLE - showLedVoltage = true; - #endif - #ifdef MQTT_ENABLE - char vstr[6]; - snprintf(vstr, 6, "%.2f", voltage); - publishMqtt((char *) FPSTR(topicBatteryVoltage), vstr, false); - #endif - #endif + case 3: + doCmdAction(BUTTON_3_SHORT); + buttons[i].isPressed = false; + } } } } @@ -667,7 +602,6 @@ void doButtonActions(void) { } } - /* Wrapper-functions for MQTT-publish */ #ifdef MQTT_ENABLE bool publishMqtt(const char *topic, const char *payload, bool retained) { @@ -2570,6 +2504,10 @@ void doRfidCardModifications(const uint32_t mod) { } #endif + doAction(mod); +} + +void doCmdAction(const uint32_t mod) { switch (mod) { case LOCK_BUTTONS_MOD: // Locks/unlocks all buttons lockControls = !lockControls; @@ -2919,7 +2857,6 @@ void doRfidCardModifications(const uint32_t mod) { showLedError = true; #endif } - break; #ifdef BLUETOOTH_ENABLE case TOGGLE_BLUETOOTH_MODE: @@ -2941,20 +2878,61 @@ void doRfidCardModifications(const uint32_t mod) { break; #endif case ENABLE_FTP_SERVER: - #ifdef FTP_ENABLE - if (wifiManager() == WL_CONNECTED && !ftpEnableLastStatus && !ftpEnableCurrentStatus) { - ftpEnableLastStatus = true; - #ifdef NEOPIXEL_ENABLE - showLedOk = true; - #endif - } else { - #ifdef NEOPIXEL_ENABLE - showLedError = true; - loggerNl(serialDebug, (char *) FPSTR(unableToStartFtpServer), LOGLEVEL_ERROR); - #endif - } + if (wifiManager() == WL_CONNECTED && !ftpEnableLastStatus && !ftpEnableCurrentStatus) { + ftpEnableLastStatus = true; + #ifdef NEOPIXEL_ENABLE + showLedOk = true; + #endif + } else { + #ifdef NEOPIXEL_ENABLE + showLedError = true; + loggerNl(serialDebug, (char *) FPSTR(unableToStartFtpServer), LOGLEVEL_ERROR); + #endif + } + + break; + case CMD_PLAYPAUSE: + trackControlToQueueSender(PAUSEPLAY); + break; + case CMD_PREVTRACK: + trackControlToQueueSender(PREVIOUSTRACK); + break; + case CMD_NEXTTRACK: + trackControlToQueueSender(NEXTTRACK); + break; + case CMD_FIRSTRACK: + trackControlToQueueSender(FIRSTTRACK); + break; + case CMD_LASTRACK: + trackControlToQueueSender(LASTTRACK); + break; + case CMD_VOLUMEINIT: + volumeToQueueSender(initVolume); + break; + case CMD_VOLUMEUP: + volumeToQueueSender(currentVolume + 2); + break; + case CMD_VOLUMEDOWN: + volumeToQueueSender(currentVolume - 2); + break; + case CMD_MEASUREBATTERY: + #ifdef MEASURE_BATTERY_VOLTAGE + float voltage = measureBatteryVoltage(); + snprintf(logBuf, serialLoglength, "%s: %.2f V", (char *) FPSTR(currentVoltageMsg), voltage); + loggerNl(serialDebug, logBuf, LOGLEVEL_INFO); + #ifdef NEOPIXEL_ENABLE + showLedVoltage = true; + #endif + #ifdef MQTT_ENABLE + char vstr[6]; + snprintf(vstr, 6, "%.2f", voltage); + publishMqtt((char *) FPSTR(topicBatteryVoltage), vstr, false); + #endif #endif break; + case CMD_SLEEPMODE: + gotoSleep = true; + break; default: snprintf(logBuf, serialLoglength, "%s %d !", (char *) FPSTR(modificatorDoesNotExist), mod); loggerNl(serialDebug, logBuf, LOGLEVEL_ERROR); @@ -3458,7 +3436,7 @@ bool processJsonRequest(char *_serialJson) { { uint8_t new_vol = doc["controls"]["set_volume"].as(); volumeToQueueSender(new_vol); - } + } if(object["controls"].containsKey("action")) { uint8_t cmd = doc["controls"]["action"].as(); diff --git a/src/settings.h b/src/settings.h index 34a6978..8db58fb 100644 --- a/src/settings.h +++ b/src/settings.h @@ -1,4 +1,5 @@ #include "Arduino.h" +#include "values.h" //######################### INFOS #################################### // This is the general configfile for ESPuino-configuration. @@ -141,3 +142,34 @@ float voltageIndicatorHigh = 4.2; // Upper range for Neopixel- static const char topicBatteryVoltage[] PROGMEM = "State/ESPuino/Voltage"; #endif #endif + +#if defined RFID_READER_TYPE_MFRC522_SPI || defined RFID_READER_TYPE_MFRC522_I2C + #define RFID_CARDMAN +#endif + +#define CHUNK_SIZE 1024 + + +// Button Layout +#define BUTTON_MULTI_01 = TOGGLE_WIFI_STATUS +#define BUTTON_MULTI_02 = ENABLE_FTP_SERVER +#define BUTTON_MULTI_03 = CMD_NOTHING +#define BUTTON_MULTI_12 = CMD_MEASUREBATTERY +#define BUTTON_MULTI_13 = CMD_NOTHING +#define BUTTON_MULTI_23 = CMD_NOTHING + +#define BUTTON_0_SHORT = CMD_NEXTTRACK +#define BUTTON_1_SHORT = CMD_PREVTRACK +#define BUTTON_2_SHORT = CMD_PLAYPAUSE +#define BUTTON_3_SHORT = CMD_MEASUREBATTERY +#define BUTTON_3_LONG = CMD_SLEEPMODE + +#ifdef USEROTARY_ENABLE + #define BUTTON_0_LONG = CMD_LASTTRACK + #define BUTTON_1_LONG = CMD_FIRSTTRACK + #define BUTTON_2_LONG = CMD_PLAYPAUSE +#else + #define BUTTON_0_LONG = CMD_VOLUMEDOWN + #define BUTTON_1_LONG = CMD_VOLUMEUP + #define BUTTON_2_LONG = CMD_SLEEPMODE +#endif \ No newline at end of file diff --git a/src/values.h b/src/values.h new file mode 100644 index 0000000..a26a3f6 --- /dev/null +++ b/src/values.h @@ -0,0 +1,65 @@ +#ifndef __ESPUINO_VALUES_H__ +#define __ESPUINO_VALUES_H__ + +// Operation Mode +#define OPMODE_NORMAL 0 // Normal mode +#define OPMODE_BLUETOOTH 1 // Bluetooth mode. WiFi is deactivated. Music from SD and webstreams can't be played. + +// Track-Control +#define STOP 1 // Stop play +#define PLAY 2 // Start play (currently not used) +#define PAUSEPLAY 3 // Pause/play +#define NEXTTRACK 4 // Next track of playlist +#define PREVIOUSTRACK 5 // Previous track of playlist +#define FIRSTTRACK 6 // First track of playlist +#define LASTTRACK 7 // Last track of playlist + +// Playmodes +#define NO_PLAYLIST 0 // If no playlist is active +#define SINGLE_TRACK 1 // Play a single track +#define SINGLE_TRACK_LOOP 2 // Play a single track in infinite-loop +#define AUDIOBOOK 3 // Single track, can save last play-position +#define AUDIOBOOK_LOOP 4 // Single track as infinite-loop, can save last play-position +#define ALL_TRACKS_OF_DIR_SORTED 5 // Play all files of a directory (alph. sorted) +#define ALL_TRACKS_OF_DIR_RANDOM 6 // Play all files of a directory (randomized) +#define ALL_TRACKS_OF_DIR_SORTED_LOOP 7 // Play all files of a directory (alph. sorted) in infinite-loop +#define ALL_TRACKS_OF_DIR_RANDOM_LOOP 9 // Play all files of a directory (randomized) in infinite-loop +#define WEBSTREAM 8 // Play webradio-stream +#define BUSY 10 // Used if playlist is created + + +// RFID-modifcation-types +#define CMD_NOTHING 0 // Do Nothing +#define LOCK_BUTTONS_MOD 100 // Locks all buttons and rotary encoder +#define SLEEP_TIMER_MOD_15 101 // Puts uC into deepsleep after 15 minutes + LED-DIMM +#define SLEEP_TIMER_MOD_30 102 // Puts uC into deepsleep after 30 minutes + LED-DIMM +#define SLEEP_TIMER_MOD_60 103 // Puts uC into deepsleep after 60 minutes + LED-DIMM +#define SLEEP_TIMER_MOD_120 104 // Puts uC into deepsleep after 120 minutes + LED-DIMM +#define SLEEP_AFTER_END_OF_TRACK 105 // Puts uC into deepsleep after track is finished + LED-DIMM +#define SLEEP_AFTER_END_OF_PLAYLIST 106 // Puts uC into deepsleep after playlist is finished + LED-DIMM +#define SLEEP_AFTER_5_TRACKS 107 // Puts uC into deepsleep after five tracks +#define REPEAT_PLAYLIST 110 // Changes active playmode to endless-loop (for a playlist) +#define REPEAT_TRACK 111 // Changes active playmode to endless-loop (for a single track) +#define DIMM_LEDS_NIGHTMODE 120 // Changes LED-brightness +#define TOGGLE_WIFI_STATUS 130 // Toggles WiFi-status +#define TOGGLE_BLUETOOTH_MODE 140 // Toggles Normal/Bluetooth Mode +#define ENABLE_FTP_SERVER 150 // Enables FTP-server + +#define CMD_PLAYPAUSE 170 // Admin-Cmd Play/Pause +#define CMD_PREVTRACK 171 // Admin-Cmd Prev Track +#define CMD_NEXTTACK 172 // Admin-Cmd Next Track +#define CMD_FIRSTTRACK 173 // Admin-Cmd Prev Track +#define CMD_LASTTACK 174 // Admin-Cmd Next Track +#define CMD_VOLUMEINIT 175 // Set Volume to Initial +#define CMD_VOLUMEUP 176 // Set Volume up +#define CMD_VOLUMEDOWN 177 // Set Volume down +#define CMD_MEASUREBATTERY 178 // Measure Battery Voltage +#define CMD_SLEEPMODE 179 // Goto Sleepmode + +// Repeat-Modes +#define NO_REPEAT 0 // No repeat +#define TRACK 1 // Repeat current track (infinite loop) +#define PLAYLIST 2 // Repeat whole playlist (infinite loop) +#define TRACK_N_PLAYLIST 3 // Repeat both (infinite loop) + +#endif \ No newline at end of file