Browse Source

Custom Button Layouts

master
Daniel Rieper 4 years ago
committed by Torsten Stauder
parent
commit
5d520089e0
  1. 182
      src/main.cpp
  2. 32
      src/settings.h
  3. 65
      src/values.h

182
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,47 +516,37 @@ 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
doCmdAction(BUTTON_MULTI_01);
}
else if (buttons[0].isPressed && buttons[2].isPressed) {
buttons[0].isPressed = false;
buttons[2].isPressed = false;
doCmdAction(BUTTON_MULTI_02);
}
return;
}
// FTP-enable
#ifdef FTP_ENABLE
if (!ftpEnableLastStatus && !ftpEnableCurrentStatus) {
if (buttons[0].isPressed && buttons[2].isPressed) {
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;
if (wifiManager() != WL_CONNECTED) {
#ifdef NEOPIXEL_ENABLE
showLedError = true;
loggerNl(serialDebug, (char *) FPSTR(unableToStartFtpServer), LOGLEVEL_ERROR);
#endif
return;
doCmdAction(BUTTON_MULTI_12);
}
ftpEnableLastStatus = true;
#ifdef NEOPIXEL_ENABLE
showLedOk = true;
#endif
return;
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);
}
#endif
else {
for (uint8_t i=0; i < sizeof(buttons) / sizeof(buttons[0]); i++) {
if (buttons[i].isPressed) {
if (buttons[i].lastReleasedTimestamp > buttons[i].lastPressedTimestamp) {
@ -609,57 +554,47 @@ void doButtonActions(void) {
switch (i) // Long-press-actions
{
case 0:
trackControlToQueueSender(LASTTRACK);
doCmdAction(BUTTON_0_LONG);
buttons[i].isPressed = false;
break;
case 1:
trackControlToQueueSender(FIRSTTRACK);
doCmdAction(BUTTON_1_LONG);
buttons[i].isPressed = false;
break;
case 2:
trackControlToQueueSender(PAUSEPLAY);
doCmdAction(BUTTON_2_LONG);
buttons[i].isPressed = false;
break;
case 3:
gotoSleep = true;
doCmdAction(BUTTON_3_LONG);
buttons[i].isPressed = false;
break;
}
} else {
switch (i) // Short-press-actions
{
case 0:
trackControlToQueueSender(NEXTTRACK);
doCmdAction(BUTTON_0_SHORT);
buttons[i].isPressed = false;
break;
case 1:
trackControlToQueueSender(PREVIOUSTRACK);
doCmdAction(BUTTON_1_SHORT);
buttons[i].isPressed = false;
break;
case 2:
trackControlToQueueSender(PAUSEPLAY);
doCmdAction(BUTTON_2_SHORT);
buttons[i].isPressed = false;
break;
case 3:
doCmdAction(BUTTON_3_SHORT);
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
}
}
}
}
@ -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,7 +2878,6 @@ 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
@ -2953,7 +2889,49 @@ void doRfidCardModifications(const uint32_t mod) {
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);

32
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

65
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
Loading…
Cancel
Save