This commit is contained in:
e2002
2022-07-10 17:46:26 +03:00
parent f1186e0ab4
commit f065d1505d
19 changed files with 266 additions and 176 deletions

View File

@@ -7,6 +7,9 @@ Config config;
void Config::init() {
EEPROM.begin(EEPROM_SIZE);
#if IR_PIN!=255
irindex=-1;
#endif
eepromRead(EEPROM_START, store);
if (store.tz_set != 57) { // update to v0.4.200
store.tz_set = 57;
@@ -26,6 +29,13 @@ void Config::init() {
save();
}
loadStation(store.lastStation);
#if IR_PIN!=255
eepromRead(EEPROM_START_IR, ircodes);
if(ircodes.ir_set!=4224){
ircodes.ir_set=4224;
memset(ircodes.irVals, 0, sizeof(ircodes.irVals));
}
#endif
}
template <class T> int Config::eepromWrite(int ee, const T& value) {
@@ -82,6 +92,12 @@ void Config::save() {
eepromWrite(EEPROM_START, store);
}
#if IR_PIN!=255
void Config::saveIR(){
eepromWrite(EEPROM_START_IR, ircodes);
}
#endif
byte Config::setVolume(byte val, bool dosave) {
store.volume = val;
if (dosave) {

View File

@@ -1,14 +1,16 @@
#ifndef config_h
#define config_h
#include "Arduino.h"
#include "options.h"
#define EEPROM_SIZE 32
#define EEPROM_START 0
#define BUFLEN 140
#define PLAYLIST_PATH "/data/playlist.csv"
#define SSIDS_PATH "/data/wifi.csv"
#define TMP_PATH "/data/tmpfile.txt"
#define INDEX_PATH "/data/index.dat"
#define EEPROM_SIZE 768
#define EEPROM_START 0
#define EEPROM_START_IR 100
#define BUFLEN 140
#define PLAYLIST_PATH "/data/playlist.csv"
#define SSIDS_PATH "/data/wifi.csv"
#define TMP_PATH "/data/tmpfile.txt"
#define INDEX_PATH "/data/index.dat"
struct config_t
{
@@ -29,6 +31,14 @@ struct config_t
uint16_t timezoneOffset;
};
#if IR_PIN!=255
struct ircodes_t
{
unsigned int ir_set; //must be 4224
uint64_t irVals[20][3];
};
#endif
struct station_t
{
char name[BUFLEN];
@@ -48,11 +58,19 @@ class Config {
public:
config_t store;
station_t station;
#if IR_PIN!=255
int irindex;
uint8_t irchck;
ircodes_t ircodes;
#endif
neworkItem ssids[5];
byte ssidsCount;
public:
Config() {};
void save();
#if IR_PIN!=255
void saveIR();
#endif
void init();
byte setVolume(byte val, bool dosave);
void setTone(int8_t bass, int8_t middle, int8_t trebble);

View File

@@ -4,6 +4,7 @@
#include "config.h"
#include "player.h"
#include "display.h"
#include "netserver.h"
long encOldPosition = 0;
long enc2OldPosition = 0;
@@ -210,8 +211,12 @@ void irNum(byte num) {
void irLoop() {
if (irrecv.decode(&irResults)) {
if (IR_DEBUG) {
if(irResults.value<256) return;
if (netserver.irRecordEnable) {
Serial.print(resultToHumanReadableBasic(&irResults));
Serial.println("--------------------------");
config.ircodes.irVals[config.irindex][config.irchck]=irResults.value;
netserver.irToWs(typeToString(irResults.decode_type, irResults.repeat).c_str(), irResults.value);
return;
}
if (!irResults.repeat/* && irResults.command!=0*/) {
@@ -227,88 +232,99 @@ void irLoop() {
break;
}
}
switch (irResults.value) {
case IR_CODE_PLAY: {
irBlink();
if (display.mode == NUMBERS) {
display.putRequest({NEWMODE, PLAYER});
player.play(display.numOfNextStation);
display.numOfNextStation = 0;
break;
}
onBtnClick(1);
for(int target=0; target<17; target++){
for(int j=0; j<3; j++){
if(config.ircodes.irVals[target][j]==irResults.value){
switch (target){
case IR_PLAY: {
irBlink();
if (display.mode == NUMBERS) {
display.putRequest({NEWMODE, PLAYER});
player.play(display.numOfNextStation);
display.numOfNextStation = 0;
break;
}
onBtnClick(1);
break;
}
case IR_PREV: {
player.prev();
break;
}
case IR_NEXT: {
player.next();
break;
}
case IR_UP: {
controlsEvent(display.mode == STATIONS ? false : true);
irVolRepeat = 1;
break;
}
case IR_DOWN: {
controlsEvent(display.mode == STATIONS ? true : false);
irVolRepeat = 2;
break;
}
case IR_HASH: {
if (display.mode == NUMBERS) {
display.putRequest({RETURNTITLE, 0});
display.putRequest({NEWMODE, PLAYER});
display.numOfNextStation = 0;
break;
}
display.putRequest({NEWMODE, display.mode == PLAYER ? STATIONS : PLAYER});
break;
}
case IR_0: {
irNum(0);
break;
}
case IR_1: {
irNum(1);
break;
}
case IR_2: {
irNum(2);
break;
}
case IR_3: {
irNum(3);
break;
}
case IR_4: {
irNum(4);
break;
}
case IR_5: {
irNum(5);
break;
}
case IR_6: {
irNum(6);
break;
}
case IR_7: {
irNum(7);
break;
}
case IR_8: {
irNum(8);
break;
}
case IR_9: {
irNum(9);
break;
}
case IR_AST: {
break;
}
} /* switch (target) */
target=17;
break;
}
case IR_CODE_PREV: {
player.prev();
break;
}
case IR_CODE_NEXT: {
player.next();
break;
}
case IR_CODE_VOLUP: {
controlsEvent(display.mode == STATIONS ? false : true);
irVolRepeat = 1;
break;
}
case IR_CODE_VOLDN: {
controlsEvent(display.mode == STATIONS ? true : false);
irVolRepeat = 2;
break;
}
case IR_CODE_HASH: {
if (display.mode == NUMBERS) {
display.putRequest({RETURNTITLE, 0});
display.putRequest({NEWMODE, PLAYER});
display.numOfNextStation = 0;
break;
}
display.putRequest({NEWMODE, display.mode == PLAYER ? STATIONS : PLAYER});
break;
}
case IR_CODE_NUM0: {
irNum(0);
break;
}
case IR_CODE_NUM1: {
irNum(1);
break;
}
case IR_CODE_NUM2: {
irNum(2);
break;
}
case IR_CODE_NUM3: {
irNum(3);
break;
}
case IR_CODE_NUM4: {
irNum(4);
break;
}
case IR_CODE_NUM5: {
irNum(5);
break;
}
case IR_CODE_NUM6: {
irNum(6);
break;
}
case IR_CODE_NUM7: {
irNum(7);
break;
}
case IR_CODE_NUM8: {
irNum(8);
break;
}
case IR_CODE_NUM9: {
irNum(9);
break;
}
}
}
} /* if(config.ircodes.irVals[target][j]==irResults.value) */
} /* for(int j=0; j<3; j++) */
} /* for(int target=0; target<16; target++) */
} /* if (irrecv.decode(&irResults)) */
}
#endif // if IR_PIN!=255

View File

@@ -1,10 +1,14 @@
#ifndef controls_h
#define controls_h
#include "options.h"
enum controlEvt_e { EVT_BTNLEFT, EVT_BTNCENTER, EVT_BTNRIGHT, EVT_ENCBTNB, EVT_BTNUP, EVT_BTNDOWN, EVT_ENC2BTNB };
enum tsDirection_e { TSD_STAY, TSD_LEFT, TSD_RIGHT, TSD_UP, TSD_DOWN, TDS_REQUEST };
#if IR_PIN!=255
enum : uint8_t { IR_UP=0, IR_PREV=1, IR_PLAY=2, IR_NEXT=3, IR_DOWN=4, IR_1=5, IR_2=6, IR_3=7, IR_4=8, IR_5=9, IR_6=10, IR_7=11, IR_8=12, IR_9=13, IR_AST=14, IR_0=15, IR_HASH=16 };
#endif
boolean checklpdelay(int m, unsigned long &tstamp);

View File

@@ -16,9 +16,10 @@
<div id="navbar"%APMODE%>
<div class="playerbytton navbutton" id="playlistbutton" onclick="showEditor()"></div>
<div class="playerbytton navbutton" id="settingsbutton" onclick="event.stopPropagation(); showSettings()"></div>
<div id="settingspopup" class="hidden">
<div id="settingspopup" class="hidden%IRMODE%">
<div class="button" id="settingsbuttonwifi" onclick="showSettingsWifi()">Wi-Fi</div>
<div class="button" id="settingsbuttonupload" onclick="showSettingsUoload()">Update</div>
<div class="button" id="settingsbuttonir" onclick="location.href='/ir'">IR</div>
<div class="button" id="settingsbuttonupload" onclick="showSettingsUpload()">Update</div>
</div>
</div>
<div class="playerwrap">

BIN
yoRadio/data/www/ir.css.gz Normal file

Binary file not shown.

49
yoRadio/data/www/ir.html Normal file
View File

@@ -0,0 +1,49 @@
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, minimum-scale=0.25">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
<link rel="apple-touch-icon" type="image/png" href="elogo.png">
<link rel="icon" type="image/png" href="elogo.png">
<link rel="stylesheet" title="base" href="style.css" type="text/css">
<link rel="stylesheet" title="base" href="ir.css" type="text/css">
<title>ёRadio IR recorder</title>
<style> </style>
</head>
<body>
<div class="content">
<h2 class="irtitle">IR Recorder</h2>
<div class="playerwrap">
<div class="irwrap">
<div id="irremote">
<div class="irblank"></div><div class="irbutton blue">&#9650;</div><div class="irblank"></div>
<div class="irbutton blue">&#9194;</div><div class="irbutton red">&#9199;</div><div class="irbutton blue">&#9193;</div>
<div class="irblank"></div><div class="irbutton blue">&#9660;</div><div class="irblank"></div>
<div class="irbutton">1</div><div class="irbutton">2</div><div class="irbutton">3</div>
<div class="irbutton">4</div><div class="irbutton">5</div><div class="irbutton">6</div>
<div class="irbutton">7</div><div class="irbutton">8</div><div class="irbutton">9</div>
<div class="irbutton red">*</div><div class="irbutton">0</div><div class="irbutton red">#</div>
</div><!--irremote-->
<div id="irform">
<div id="irstartrecord"><h3>Welcome to IR Recorder!</h3>
Press the button on the left<br />to record the code.
<a href="/" class="button" id="done_ir" onclick="doneRecord()">DONE</a>
</div>
<div id="irrecord" class="hidden">
<h3 id="irrecordtitle"></h3>
<form id="irrecordfields">
<div class="irrecordrow"><div class="irradio" data-id="0"><span></span></div><div class="irrecordvalue">0xAF00B5</div><div class="irclear" onclick="irClear(this)"></div></div>
<div class="irrecordrow"><div class="irradio" data-id="1"><span></span></div><div class="irrecordvalue"></div><div class="irclear" onclick="irClear(this)"></div></div>
<div class="irrecordrow"><div class="irradio" data-id="2"><span></span></div><div class="irrecordvalue"></div><div class="irclear" onclick="irClear(this)"></div></div>
</form>
<div id="protocol"></div>
<div class="button" id="back_ir" onclick="backRecord()">Back</div>
</div>
</div><!--irform-->
</div><!--irwrap-->
</div><!--playerwrap-->
<div id="copy">powered by <a target="_blank" href="https://github.com/e2002/yoradio/">ёRadio</a> | v%VERSION%</div>
</div>
<script src="ir.js"></script>
</body>

BIN
yoRadio/data/www/ir.js.gz Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -36,7 +36,7 @@ char* updateError(){
bool NetServer::begin() {
importRequest = false;
irRecordEnable = false;
webserver.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
ssidCount = 0;
int mcb = heap_caps_get_free_size(MALLOC_CAP_8BIT);
@@ -73,6 +73,11 @@ bool NetServer::begin() {
webserver.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/www/update.html", String(), false, processor);
});
#if IR_PIN!=255
webserver.on("/ir", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/www/ir.html", String(), false, processor);
});
#endif
webserver.on("/update", HTTP_POST, [](AsyncWebServerRequest *request){
shouldReboot = !Update.hasError();
AsyncWebServerResponse *response = request->beginResponse(200, "text/plain", shouldReboot?"OK": updateError());
@@ -139,7 +144,19 @@ void NetServer::loop() {
requestOnChange(NRSSI, 0);
}
}
#if IR_PIN!=255
void NetServer::irToWs(const char* protocol, uint64_t irvalue) {
char buf[BUFLEN] = { 0 };
sprintf (buf, "{\"ircode\": %llu, \"protocol\": \"%s\"}", irvalue, protocol);
websocket.textAll(buf);
}
void NetServer::irValsToWs(){
if(!irRecordEnable) return;
char buf[BUFLEN] = { 0 };
sprintf (buf, "{\"irvals\": [%llu, %llu, %llu]}", config.ircodes.irVals[config.irindex][0], config.ircodes.irVals[config.irindex][1], config.ircodes.irVals[config.irindex][2]);
websocket.textAll(buf);
}
#endif
void NetServer::onWsMessage(void *arg, uint8_t *data, size_t len) {
AwsFrameInfo *info = (AwsFrameInfo*)arg;
if (info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT) {
@@ -150,6 +167,22 @@ void NetServer::onWsMessage(void *arg, uint8_t *data, size_t len) {
byte v = atoi(val);
player.setVol(v, false);
}
#if IR_PIN!=255
if (strcmp(cmd, "irbtn") == 0) {
config.irindex=atoi(val);
irRecordEnable=(config.irindex>=0);
config.irchck=0;
irValsToWs();
if(config.irindex<0) config.saveIR();
}
if (strcmp(cmd, "chkid") == 0) {
config.irchck=atoi(val);
}
if (strcmp(cmd, "irclr") == 0) {
byte cl = atoi(val);
config.ircodes.irVals[config.irindex][cl]=0;
}
#endif
}
}
}
@@ -323,6 +356,9 @@ String processor(const String& var) { // %Templates%
if (var == "NOTAPMODE") {
return network.status == CONNECTED ? " hidden" : "";
}
if (var == "IRMODE") {
return IR_PIN == 255 ? "" : " ir";
}
return String();
}

View File

@@ -20,6 +20,11 @@ class NetServer {
void setRSSI(int val);
void onWsMessage(void *arg, uint8_t *data, size_t len);
bool savePlaylist(const char* post);
#if IR_PIN!=255
bool irRecordEnable;
void irToWs(const char* protocol, uint64_t irvalue);
void irValsToWs();
#endif
private:
requestType_e request;
int rssi;

View File

@@ -1,7 +1,7 @@
#ifndef options_h
#define options_h
#define VERSION "0.6.400"
#define VERSION "0.6.450"
/*******************************************************
DO NOT EDIT THIS FILE.
@@ -242,65 +242,11 @@ INITR_REDTAB
#ifndef IR_PIN
#define IR_PIN 255
#endif
#ifndef IR_DEBUG
#define IR_DEBUG 0 // 1 - for capture ir codes from serial
#endif
#ifndef IR_TIMEOUT
#define IR_TIMEOUT 80 // kTimeout, see IRremoteESP8266 documentation
#endif
#ifndef IR_TLP
#define IR_TLP 40 // kTolerancePercentage, see IRremoteESP8266 documentation
#endif
#ifndef IR_CODE_PLAY
#define IR_CODE_PLAY 0xFF02FD
#endif
#ifndef IR_CODE_PREV
#define IR_CODE_PREV 0xFF22DD
#endif
#ifndef IR_CODE_NEXT
#define IR_CODE_NEXT 0xFFC23D
#endif
#ifndef IR_CODE_VOLUP
#define IR_CODE_VOLUP 0xFF629D
#endif
#ifndef IR_CODE_VOLDN
#define IR_CODE_VOLDN 0xFFA857
#endif
#ifndef IR_CODE_NUM0
#define IR_CODE_NUM0 0xFF4AB5
#endif
#ifndef IR_CODE_NUM1
#define IR_CODE_NUM1 0xFF6897
#endif
#ifndef IR_CODE_NUM2
#define IR_CODE_NUM2 0xFF9867
#endif
#ifndef IR_CODE_NUM3
#define IR_CODE_NUM3 0xFFB04F
#endif
#ifndef IR_CODE_NUM4
#define IR_CODE_NUM4 0xFF30CF
#endif
#ifndef IR_CODE_NUM5
#define IR_CODE_NUM5 0xFF18E7
#endif
#ifndef IR_CODE_NUM6
#define IR_CODE_NUM6 0xFF7A85
#endif
#ifndef IR_CODE_NUM7
#define IR_CODE_NUM7 0xFF10EF
#endif
#ifndef IR_CODE_NUM8
#define IR_CODE_NUM8 0xFF38C7
#endif
#ifndef IR_CODE_NUM9
#define IR_CODE_NUM9 0xFF5AA5
#endif
#ifndef IR_CODE_HASH
#define IR_CODE_HASH 0xFF52AD // Toggle playlist mode
#endif
#ifndef IR_CODE_AST
#define IR_CODE_AST 0xFF42BD
#endif
#endif

View File

@@ -164,7 +164,7 @@ Audio::Audio(bool internalDAC /* = false */, i2s_dac_mode_t channelEnabled /* =
m_i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN );
#if ESP_ARDUINO_VERSION_MAJOR >= 2
m_i2s_config.communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_STAND_I2S); // vers >= 2.0.0
m_i2s_config.communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_STAND_MSB); // vers >= 2.0.0
#else
m_i2s_config.communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S_MSB);
#endif