netserver_queue

This commit is contained in:
e2002
2022-12-28 10:10:00 +03:00
parent 716f75747f
commit a043f33b3b
8 changed files with 108 additions and 81 deletions

Binary file not shown.

View File

@@ -345,7 +345,7 @@ void Display::loop() {
nextion.loop(); nextion.loop();
#endif #endif
requestParams_t request; requestParams_t request;
if(xQueueReceive(displayQueue, &request, 20)){ if(xQueueReceive(displayQueue, &request, 5)){
switch (request.type){ switch (request.type){
case NEWMODE: _swichMode((displayMode_e)request.payload); break; case NEWMODE: _swichMode((displayMode_e)request.payload); break;
case CLOCK: case CLOCK:

View File

@@ -51,6 +51,8 @@ bool NetServer::begin() {
Serial.print("##[BOOT]#\tnetserver.begin\t"); Serial.print("##[BOOT]#\tnetserver.begin\t");
importRequest = IMDONE; importRequest = IMDONE;
irRecordEnable = false; irRecordEnable = false;
nsQueue = xQueueCreate( 20, sizeof( nsRequestParams_t ) );
while(nsQueue==NULL){;}
webserver.on("/", HTTP_ANY, handleHTTPArgs); webserver.on("/", HTTP_ANY, handleHTTPArgs);
webserver.on(PLAYLIST_PATH, HTTP_GET, handleHTTPArgs); webserver.on(PLAYLIST_PATH, HTTP_GET, handleHTTPArgs);
webserver.on(INDEX_PATH, HTTP_GET, handleHTTPArgs); webserver.on(INDEX_PATH, HTTP_GET, handleHTTPArgs);
@@ -152,6 +154,91 @@ void NetServer::chunkedHtmlPage(const String& contentType, AsyncWebServerRequest
xSemaphoreGive(player.playmutex); xSemaphoreGive(player.playmutex);
} }
#ifndef DSP_NOT_FLIPPED
#define DSP_CAN_FLIPPED true
#else
#define DSP_CAN_FLIPPED false
#endif
#if !defined(HIDE_WEATHER) && (!defined(DUMMYDISPLAY) && !defined(USE_NEXTION))
#define SHOW_WEATHER true
#else
#define SHOW_WEATHER false
#endif
char wsbuf[BUFLEN * 2];
void NetServer::processQueue(){
if(nsQueue==NULL) return;
nsRequestParams_t request;
if(xQueueReceive(nsQueue, &request, 5)){
memset(wsbuf, 0, BUFLEN * 2);
uint8_t clientId = request.clientId;
switch (request.type) {
case PLAYLIST: getPlaylist(clientId); break;
case PLAYLISTSAVED: config.indexPlaylist(); config.initPlaylist(); getPlaylist(clientId); break;
case GETACTIVE: {
bool dbgact = false, nxtn=false;
String act = F("\"group_wifi\",");
if (network.status == CONNECTED) {
act += F("\"group_system\",");
if (BRIGHTNESS_PIN != 255 || DSP_CAN_FLIPPED || DSP_MODEL == DSP_NOKIA5110 || dbgact) act += F("\"group_display\",");
#ifdef USE_NEXTION
act += F("\"group_nextion\",");
if (!SHOW_WEATHER || dbgact) act += F("\"group_weather\",");
nxtn=true;
#endif
#if defined(LCD_I2C) || defined(DSP_OLED)
act += F("\"group_oled\",");
#endif
#ifndef HIDE_VU
act += F("\"group_vu\",");
#endif
if (BRIGHTNESS_PIN != 255 || nxtn || dbgact) act += F("\"group_brightness\",");
if (DSP_CAN_FLIPPED || dbgact) act += F("\"group_tft\",");
if (TS_MODEL != TS_MODEL_UNDEFINED || dbgact) act += F("\"group_touch\",");
if (DSP_MODEL == DSP_NOKIA5110) act += F("\"group_nokia\",");
act += F("\"group_timezone\",");
if (SHOW_WEATHER || dbgact) act += F("\"group_weather\",");
act += F("\"group_controls\",");
if (ENC_BTNL != 255 || ENC2_BTNL != 255 || dbgact) act += F("\"group_encoder\",");
if (IR_PIN != 255 || dbgact) act += F("\"group_ir\",");
}
act = act.substring(0, act.length() - 1);
sprintf (wsbuf, "{\"act\":[%s]}", act.c_str());
break;
}
case GETMODE: sprintf (wsbuf, "{\"pmode\":\"%s\"}", network.status == CONNECTED ? "player" : "ap"); break;
case GETINDEX: requestOnChange(STATION, clientId); requestOnChange(TITLE, clientId); requestOnChange(VOLUME, clientId); requestOnChange(EQUALIZER, clientId); requestOnChange(BALANCE, clientId); requestOnChange(BITRATE, clientId); requestOnChange(MODE, clientId); if (config.store.play_mode==PM_SDCARD) { requestOnChange(SDPOS, clientId); requestOnChange(SDLEN, clientId); requestOnChange(SDSNUFFLE, clientId); } return; break;
case GETSYSTEM: sprintf (wsbuf, "{\"sst\":%d,\"aif\":%d,\"vu\":%d,\"softr\":%d}", config.store.smartstart != 2, config.store.audioinfo, config.store.vumeter, config.store.softapdelay); break;
case GETSCREEN: sprintf (wsbuf, "{\"flip\":%d,\"inv\":%d,\"nump\":%d,\"tsf\":%d,\"tsd\":%d,\"dspon\":%d,\"br\":%d,\"con\":%d}", config.store.flipscreen, config.store.invertdisplay, config.store.numplaylist, config.store.fliptouch, config.store.dbgtouch, config.store.dspon, config.store.brightness, config.store.contrast); break;
case GETTIMEZONE: sprintf (wsbuf, "{\"tzh\":%d,\"tzm\":%d,\"sntp1\":\"%s\",\"sntp2\":\"%s\"}", config.store.tzHour, config.store.tzMin, config.store.sntp1, config.store.sntp2); break;
case GETWEATHER: sprintf (wsbuf, "{\"wen\":%d,\"wlat\":\"%s\",\"wlon\":\"%s\",\"wkey\":\"%s\"}", config.store.showweather, config.store.weatherlat, config.store.weatherlon, config.store.weatherkey); break;
case GETCONTROLS: sprintf (wsbuf, "{\"vols\":%d,\"enca\":%d,\"irtl\":%d}", config.store.volsteps, config.store.encacc, config.store.irtlp); break;
case DSPON: sprintf (wsbuf, "{\"dspontrue\":%d}", 1); break;
case STATION: requestOnChange(STATIONNAME, clientId); requestOnChange(ITEM, clientId); break;
case STATIONNAME: sprintf (wsbuf, "{\"nameset\": \"%s\"}", config.station.name); break;
case ITEM: sprintf (wsbuf, "{\"current\": %d}", config.store.lastStation); break;
case TITLE: sprintf (wsbuf, "{\"meta\": \"%s\"}", config.station.title); if (player.requestToStart) { telnet.info(); player.requestToStart = false; } else { telnet.printf("##CLI.META#: %s\n> ", config.station.title); } break;
case VOLUME: sprintf (wsbuf, "{\"vol\": %d}", config.store.volume); break;
case NRSSI: sprintf (wsbuf, "{\"rssi\": %d}", rssi); /*rssi = 255;*/ break;
case SDPOS: sprintf (wsbuf, "{\"sdpos\": %d,\"sdend\": %d,\"sdtpos\": %d,\"sdtend\": %d}", player.getFilePos(), player.getFileSize(), player.getAudioCurrentTime(), player.getAudioFileDuration()); break;
case SDLEN: sprintf (wsbuf, "{\"sdmin\": %d,\"sdmax\": %d}", player.sd_min, player.sd_max); break;
case SDSNUFFLE: sprintf (wsbuf, "{\"snuffle\": %d}", config.sdSnuffle); break;
case BITRATE: sprintf (wsbuf, "{\"bitrate\": %d}", config.station.bitrate); break;
case MODE: sprintf (wsbuf, "{\"mode\": \"%s\"}", player.mode == PLAYING ? "playing" : "stopped"); break;
case EQUALIZER: sprintf (wsbuf, "{\"bass\": %d, \"middle\": %d, \"trebble\": %d}", config.store.bass, config.store.middle, config.store.trebble); break;
case BALANCE: sprintf (wsbuf, "{\"balance\": %d}", config.store.balance); break;
default: break;
}
if (strlen(wsbuf) > 0) {
if (clientId == 0) { websocket.textAll(wsbuf); }else{ websocket.text(clientId, wsbuf); }
#ifdef MQTT_HOST
if (clientId == 0 && (request.type == STATION || request.type == ITEM || request.type == TITLE || request.type == MODE)) mqttPublishStatus();
if (clientId == 0 && request.type == VOLUME) mqttPublishVolume();
#endif
}
}
}
void NetServer::loop() { void NetServer::loop() {
if (shouldReboot) { if (shouldReboot) {
Serial.println("Rebooting..."); Serial.println("Rebooting...");
@@ -164,7 +251,8 @@ void NetServer::loop() {
case IMWIFI: config.saveWifi(); importRequest = IMDONE; break; case IMWIFI: config.saveWifi(); importRequest = IMDONE; break;
default: break; default: break;
} }
if (rssi < 255) requestOnChange(NRSSI, 0); //if (rssi < 255) requestOnChange(NRSSI, 0);
processQueue();
} }
#if IR_PIN!=255 #if IR_PIN!=255
@@ -543,84 +631,13 @@ bool NetServer::importPlaylist() {
SPIFFS.remove(TMP_PATH); SPIFFS.remove(TMP_PATH);
return false; return false;
} }
#ifndef DSP_NOT_FLIPPED
#define DSP_CAN_FLIPPED true
#else
#define DSP_CAN_FLIPPED false
#endif
#if !defined(HIDE_WEATHER) && (!defined(DUMMYDISPLAY) && !defined(USE_NEXTION))
#define SHOW_WEATHER true
#else
#define SHOW_WEATHER false
#endif
char wsbuf[BUFLEN * 2];
void NetServer::requestOnChange(requestType_e request, uint8_t clientId) { void NetServer::requestOnChange(requestType_e request, uint8_t clientId) {
//char buf[BUFLEN * 2] = { 0 }; //char buf[BUFLEN * 2] = { 0 };
memset(wsbuf, 0, BUFLEN * 2); nsRequestParams_t nsrequest;
switch (request) { nsrequest.type = request;
case PLAYLIST: getPlaylist(clientId); break; nsrequest.clientId = clientId;
case PLAYLISTSAVED: config.indexPlaylist(); config.initPlaylist(); getPlaylist(clientId); break; xQueueSend(nsQueue, &nsrequest, portMAX_DELAY);
case GETACTIVE: {
bool dbgact = false, nxtn=false;
String act = F("\"group_wifi\",");
if (network.status == CONNECTED) {
act += F("\"group_system\",");
if (BRIGHTNESS_PIN != 255 || DSP_CAN_FLIPPED || DSP_MODEL == DSP_NOKIA5110 || dbgact) act += F("\"group_display\",");
#ifdef USE_NEXTION
act += F("\"group_nextion\",");
if (!SHOW_WEATHER || dbgact) act += F("\"group_weather\",");
nxtn=true;
#endif
#if defined(LCD_I2C) || defined(DSP_OLED)
act += F("\"group_oled\",");
#endif
#ifndef HIDE_VU
act += F("\"group_vu\",");
#endif
if (BRIGHTNESS_PIN != 255 || nxtn || dbgact) act += F("\"group_brightness\",");
if (DSP_CAN_FLIPPED || dbgact) act += F("\"group_tft\",");
if (TS_MODEL != TS_MODEL_UNDEFINED || dbgact) act += F("\"group_touch\",");
if (DSP_MODEL == DSP_NOKIA5110) act += F("\"group_nokia\",");
act += F("\"group_timezone\",");
if (SHOW_WEATHER || dbgact) act += F("\"group_weather\",");
act += F("\"group_controls\",");
if (ENC_BTNL != 255 || ENC2_BTNL != 255 || dbgact) act += F("\"group_encoder\",");
if (IR_PIN != 255 || dbgact) act += F("\"group_ir\",");
}
act = act.substring(0, act.length() - 1);
sprintf (wsbuf, "{\"act\":[%s]}", act.c_str());
break;
}
case GETMODE: sprintf (wsbuf, "{\"pmode\":\"%s\"}", network.status == CONNECTED ? "player" : "ap"); break;
case GETINDEX: requestOnChange(STATION, clientId); requestOnChange(TITLE, clientId); requestOnChange(VOLUME, clientId); requestOnChange(EQUALIZER, clientId); requestOnChange(BALANCE, clientId); requestOnChange(BITRATE, clientId); requestOnChange(MODE, clientId); if (config.store.play_mode==PM_SDCARD) { requestOnChange(SDPOS, clientId); requestOnChange(SDLEN, clientId); requestOnChange(SDSNUFFLE, clientId); } return; break;
case GETSYSTEM: sprintf (wsbuf, "{\"sst\":%d,\"aif\":%d,\"vu\":%d,\"softr\":%d}", config.store.smartstart != 2, config.store.audioinfo, config.store.vumeter, config.store.softapdelay); break;
case GETSCREEN: sprintf (wsbuf, "{\"flip\":%d,\"inv\":%d,\"nump\":%d,\"tsf\":%d,\"tsd\":%d,\"dspon\":%d,\"br\":%d,\"con\":%d}", config.store.flipscreen, config.store.invertdisplay, config.store.numplaylist, config.store.fliptouch, config.store.dbgtouch, config.store.dspon, config.store.brightness, config.store.contrast); break;
case GETTIMEZONE: sprintf (wsbuf, "{\"tzh\":%d,\"tzm\":%d,\"sntp1\":\"%s\",\"sntp2\":\"%s\"}", config.store.tzHour, config.store.tzMin, config.store.sntp1, config.store.sntp2); break;
case GETWEATHER: sprintf (wsbuf, "{\"wen\":%d,\"wlat\":\"%s\",\"wlon\":\"%s\",\"wkey\":\"%s\"}", config.store.showweather, config.store.weatherlat, config.store.weatherlon, config.store.weatherkey); break;
case GETCONTROLS: sprintf (wsbuf, "{\"vols\":%d,\"enca\":%d,\"irtl\":%d}", config.store.volsteps, config.store.encacc, config.store.irtlp); break;
case DSPON: sprintf (wsbuf, "{\"dspontrue\":%d}", 1); break;
case STATION: requestOnChange(STATIONNAME, clientId); requestOnChange(ITEM, clientId); break;
case STATIONNAME: sprintf (wsbuf, "{\"nameset\": \"%s\"}", config.station.name); break;
case ITEM: sprintf (wsbuf, "{\"current\": %d}", config.store.lastStation); break;
case TITLE: sprintf (wsbuf, "{\"meta\": \"%s\"}", config.station.title); if (player.requestToStart) { telnet.info(); player.requestToStart = false; } else { telnet.printf("##CLI.META#: %s\n> ", config.station.title); } break;
case VOLUME: sprintf (wsbuf, "{\"vol\": %d}", config.store.volume); break;
case NRSSI: sprintf (wsbuf, "{\"rssi\": %d}", rssi); rssi = 255; break;
case SDPOS: sprintf (wsbuf, "{\"sdpos\": %d,\"sdend\": %d,\"sdtpos\": %d,\"sdtend\": %d}", player.getFilePos(), player.getFileSize(), player.getAudioCurrentTime(), player.getAudioFileDuration()); break;
case SDLEN: sprintf (wsbuf, "{\"sdmin\": %d,\"sdmax\": %d}", player.sd_min, player.sd_max); break;
case SDSNUFFLE: sprintf (wsbuf, "{\"snuffle\": %d}", config.sdSnuffle); break;
case BITRATE: sprintf (wsbuf, "{\"bitrate\": %d}", config.station.bitrate); break;
case MODE: sprintf (wsbuf, "{\"mode\": \"%s\"}", player.mode == PLAYING ? "playing" : "stopped"); break;
case EQUALIZER: sprintf (wsbuf, "{\"bass\": %d, \"middle\": %d, \"trebble\": %d}", config.store.bass, config.store.middle, config.store.trebble); break;
case BALANCE: sprintf (wsbuf, "{\"balance\": %d}", config.store.balance); break;
default: break;
}
if (strlen(wsbuf) > 0) {
if (clientId == 0) { websocket.textAll(wsbuf); }else{ websocket.text(clientId, wsbuf); }
#ifdef MQTT_HOST
if (clientId == 0 && (request == STATION || request == ITEM || request == TITLE || request == MODE)) mqttPublishStatus();
if (clientId == 0 && request == VOLUME) mqttPublishVolume();
#endif
}
} }
String processor(const String& var) { // %Templates% String processor(const String& var) { // %Templates%

View File

@@ -8,6 +8,12 @@
enum requestType_e : uint8_t { PLAYLIST=1, STATION=2, STATIONNAME=3, ITEM=4, TITLE=5, VOLUME=6, NRSSI=7, BITRATE=8, MODE=9, EQUALIZER=10, BALANCE=11, PLAYLISTSAVED=12, GETMODE=13, GETINDEX=14, GETACTIVE=15, GETSYSTEM=16, GETSCREEN=17, GETTIMEZONE=18, GETWEATHER=19, GETCONTROLS=20, DSPON=21, SDPOS=22, SDLEN=23, SDSNUFFLE=24 }; enum requestType_e : uint8_t { PLAYLIST=1, STATION=2, STATIONNAME=3, ITEM=4, TITLE=5, VOLUME=6, NRSSI=7, BITRATE=8, MODE=9, EQUALIZER=10, BALANCE=11, PLAYLISTSAVED=12, GETMODE=13, GETINDEX=14, GETACTIVE=15, GETSYSTEM=16, GETSCREEN=17, GETTIMEZONE=18, GETWEATHER=19, GETCONTROLS=20, DSPON=21, SDPOS=22, SDLEN=23, SDSNUFFLE=24 };
enum import_e : uint8_t { IMDONE=0, IMPL=1, IMWIFI=2 }; enum import_e : uint8_t { IMDONE=0, IMPL=1, IMWIFI=2 };
struct nsRequestParams_t
{
requestType_e type;
uint8_t clientId;
};
class NetServer { class NetServer {
public: public:
import_e importRequest; import_e importRequest;
@@ -28,12 +34,14 @@ class NetServer {
#endif #endif
private: private:
requestType_e request; requestType_e request;
QueueHandle_t nsQueue;
int rssi; int rssi;
void getPlaylist(uint8_t clientId); void getPlaylist(uint8_t clientId);
bool importPlaylist(); bool importPlaylist();
static size_t chunkedHtmlPageCallback(uint8_t* buffer, size_t maxLen, size_t index); static size_t chunkedHtmlPageCallback(uint8_t* buffer, size_t maxLen, size_t index);
static void beginUpload(AsyncWebServerRequest *request); static void beginUpload(AsyncWebServerRequest *request);
static void beginUpdate(AsyncWebServerRequest *request); static void beginUpdate(AsyncWebServerRequest *request);
void processQueue();
}; };
extern NetServer netserver; extern NetServer netserver;

View File

@@ -44,7 +44,9 @@ void ticks() {
if(divrssi) { if(divrssi) {
int rs = WiFi.RSSI(); int rs = WiFi.RSSI();
netserver.setRSSI(rs); netserver.setRSSI(rs);
netserver.requestOnChange(NRSSI, 0);
display.putRequest(DSPRSSI, rs); display.putRequest(DSPRSSI, rs);
} }
} }

View File

@@ -1,7 +1,7 @@
#ifndef options_h #ifndef options_h
#define options_h #define options_h
#define YOVERSION "0.8.855" #define YOVERSION "0.8.883"
/******************************************************* /*******************************************************
DO NOT EDIT THIS FILE. DO NOT EDIT THIS FILE.

View File

@@ -50,7 +50,7 @@ const WidgetConfig bootWdtConf PROGMEM = { 0, 162, 1, WA_CENTER };
const ProgressConfig bootPrgConf PROGMEM = { 90, 14, 4 }; const ProgressConfig bootPrgConf PROGMEM = { 90, 14, 4 };
/* BANDS */ /* { onebandwidth, onebandheight, bandsHspace, bandsVspace, numofbands, fadespeed } */ /* BANDS */ /* { onebandwidth, onebandheight, bandsHspace, bandsVspace, numofbands, fadespeed } */
const VUBandsConfig bandsConf PROGMEM = { 24, 100, 4, 2, 10, 5 }; const VUBandsConfig bandsConf PROGMEM = { 24, 100, 4, 2, 10, 4 };
/* STRINGS */ /* STRINGS */
const char numtxtFmt[] PROGMEM = "%d"; const char numtxtFmt[] PROGMEM = "%d";

View File

@@ -282,7 +282,7 @@ void VuWidget::_draw(){
#if !defined(USE_NEXTION) && I2S_DOUT==255 #if !defined(USE_NEXTION) && I2S_DOUT==255
static uint8_t cc = 0; static uint8_t cc = 0;
cc++; cc++;
if(cc>1){ if(cc>0){
player.getVUlevel(); player.getVUlevel();
cc=0; cc=0;
} }