#include <Wire.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <IRremote.h>
#include <PT2258.h>
#define PT2258_address 0b1000100
#define RotaryB 11
#define RotaryA 12
#define RotarySW 13
#define SW1 A1
#define SW2 A2
#define SW3 A3
#define RECV_PIN 8
#define powerOut 10
// IR HEX code
#define ir_power 0x807F827D // IR Power ON/OFF
#define ir_mute 0x807F42BD // IR Mute
#define ir_vol_up 0x807F906F // IR Vol++
#define ir_vol_down 0x807FA05F // IR Vol--
#define ir_ch_up 0x807F40BF // IR CH++
#define ir_ch_down 0x807FC03F // IR CH--
LiquidCrystal_I2C lcd(0x27, 16, 2);
byte custom_num[8][8] = {
{ B00111, B01111, B11111, B11111, B11111, B11111, B11111, B11111 },
{ B11111, B11111, B11111, B00000, B00000, B00000, B00000, B00000 },
{ B11100, B11110, B11111, B11111, B11111, B11111, B11111, B11111 },
{ B11111, B11111, B11111, B11111, B11111, B11111, B01111, B00111 },
{ B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111 },
{ B11111, B11111, B11111, B11111, B11111, B11111, B11110, B11100 },
{ B11111, B11111, B11111, B00000, B00000, B00000, B11111, B11111 },
{ B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111 }
};
const int digit_width = 3;
const char custom_num_top[10][digit_width] = { 0, 1, 2, 1, 2, 32, 6, 6, 2, 6, 6, 2, 3, 4, 7, 7, 6, 6, 0, 6, 6, 1, 1, 2, 0, 6, 2, 0, 6, 2 };
const char custom_num_bot[10][digit_width] = { 3, 4, 5, 4, 7, 4, 7, 4, 4, 4, 4, 5, 32, 32, 7, 4, 4, 5, 3, 4, 5, 32, 32, 7, 3, 4, 5, 4, 4, 5 };
unsigned long returnTime;
unsigned long lastRotaryTime = 0;
unsigned long lastButtonTime = 0;
unsigned long muteLcdTime = 0;
int rotaryDelayTime = 200;
int buttonDelayTime = 100;
int muteLcdDelay = 0;
int muteLcdOnTime = 500;
int muteLcdOffTime = 500;
int masVolLimitMax = 69;
int masVolLimitMin = 19;
int chVolLimitMax = 10;
int chVolLimitMin = -10;
int lastEncoded = 0;
int vol_menu, mas_vol, ch1_vol, ch2_vol, ch3_vol, ch4_vol, ch5_vol, ch6_vol, mute, ch1, ch2, ch3, ch4, ch5, ch6;
int return_d, power, menu_active;
set_mute;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
Wire.begin();
lcd.begin(16, 2);
irrecv.enableIRIn();
pinMode(RotaryA, INPUT);
pinMode(RotaryB, INPUT);
pinMode(RotarySW, INPUT_PULLUP);
pinMode(SW1, INPUT);
pinMode(SW2, INPUT);
pinMode(SW3, INPUT);
pinMode(powerOut, OUTPUT);
digitalWrite(RotaryA, HIGH);
digitalWrite(RotaryB, HIGH);
power = 0;
eepromRead();
startUp();
powerUp();
}
void loop() {
lcdDisplay();
eepromUpdate();
IRControl();
returnDelay();
//Power -------------------------------------------------//
if (analogRead(SW1) > 900) {
if (millis() - lastButtonTime > buttonDelayTime) {
power++;
if (power > 1) power = 0;
powerUp();
}
lastButtonTime = millis();
}
if (power == 1) {
updateEncoder();
//Mute -------------------------------------------------//
if (analogRead(SW2) > 900) {
if (millis() - lastButtonTime > buttonDelayTime) {
soundMute();
}
lastButtonTime = millis();
}
if (digitalRead(RotarySW) == LOW) {
if (millis() - lastButtonTime > buttonDelayTime) {
volumeMenuUp();
}
lastButtonTime = millis();
}
}
}
void updateEncoder() {
int CLK = digitalRead(RotaryA);
int DT = digitalRead(RotaryB);
int encoded = (CLK << 1) | DT;
int addData = (lastEncoded << 2) | encoded;
if (addData == 0b1101 || addData == 0b0100 || addData == 0b0010 || addData == 0b1011) {
if ((millis() - lastRotaryTime) > rotaryDelayTime) {
volumeUp();
lastRotaryTime = millis();
}
}
if (addData == 0b1110 || addData == 0b0111 || addData == 0b0001 || addData == 0b1000) {
if ((millis() - lastRotaryTime) > rotaryDelayTime) {
volumeDown();
lastRotaryTime = millis();
}
}
lastEncoded = encoded;
}
void volumeMenuUp() {
vol_menu++;
if (vol_menu > 6) vol_menu = 0;
btnPress();
}
void volumeMenuDown() {
vol_menu--;
if (vol_menu < 0) vol_menu = 6;
btnPress();
}
void volumeUp() {
if (vol_menu == 0) {
mas_vol++;
masVol();
}
if (vol_menu == 1) {
ch1_vol++;
ch1Vol(1);
}
if (vol_menu == 2) {
ch2_vol++;
ch2Vol(1);
}
if (vol_menu == 3) {
ch3_vol++;
ch3Vol(1);
}
if (vol_menu == 4) {
ch4_vol++;
ch4Vol(1);
}
if (vol_menu == 5) {
ch5_vol++;
ch5Vol(1);
}
if (vol_menu == 6) {
ch6_vol++;
ch6Vol(1);
}
btnPress();
}
void volumeDown() {
if (vol_menu == 0) {
mas_vol--;
masVol();
}
if (vol_menu == 1) {
ch1_vol--;
ch1Vol(1);
}
if (vol_menu == 2) {
ch2_vol--;
ch2Vol(1);
}
if (vol_menu == 3) {
ch3_vol--;
ch3Vol(1);
}
if (vol_menu == 4) {
ch4_vol--;
ch4Vol(1);
}
if (vol_menu == 5) {
ch5_vol--;
ch5Vol(1);
}
if (vol_menu == 6) {
ch6_vol--;
ch6Vol(1);
}
btnPress();
}
void soundMute() {
mute++;
if (mute > 1) mute = 0;
set_mute(mute);
}
void masVol() {
if (mas_vol > masVolLimitMax) mas_vol = masVolLimitMax;
if (mas_vol < masVolLimitMin) mas_vol = masVolLimitMin;
if (mute == 0) {
if (mas_vol == masVolLimitMin) set_mute(1);
else set_mute(0);
}
for (int i = 1; i < 5; i++) {
ch1Vol(i);
ch2Vol(i);
ch3Vol(i);
ch4Vol(i);
ch5Vol(i);
ch6Vol(i);
}
}
void ch1Vol(int adr) {
if (ch1_vol > chVolLimitMax) ch1_vol = chVolLimitMax;
if (ch1_vol < chVolLimitMin) ch1_vol = chVolLimitMin;
ch1 = mas_vol + ch1_vol;
set_address(adr);
set_ch1(ch1);
}
void ch2Vol(int adr) {
if (ch2_vol > chVolLimitMax) ch2_vol = chVolLimitMax;
if (ch2_vol < chVolLimitMin) ch2_vol = chVolLimitMin;
ch2 = mas_vol + ch2_vol;
set_address(adr);
set_ch2(ch2);
}
void ch3Vol(int adr) {
if (ch3_vol > chVolLimitMax) ch3_vol = chVolLimitMax;
if (ch3_vol < chVolLimitMin) ch3_vol = chVolLimitMin;
ch3 = mas_vol + ch3_vol;
set_address(adr);
set_ch3(ch3);
}
void ch4Vol(int adr) {
if (ch4_vol > chVolLimitMax) ch4_vol = chVolLimitMax;
if (ch4_vol < chVolLimitMin) ch4_vol = chVolLimitMin;
ch4 = mas_vol + ch4_vol;
set_address(adr);
set_ch4(ch4);
}
void ch5Vol(int adr) {
if (ch5_vol > chVolLimitMax) ch5_vol = chVolLimitMax;
if (ch5_vol < chVolLimitMin) ch5_vol = chVolLimitMin;
ch5 = mas_vol + ch5_vol;
set_address(adr);
set_ch5(ch5);
}
void ch6Vol(int adr) {
if (ch6_vol > chVolLimitMax) ch6_vol = chVolLimitMax;
if (ch6_vol < chVolLimitMin) ch6_vol = chVolLimitMin;
ch6 = mas_vol + ch6_vol;
set_address(adr);
set_ch6(ch6);
}
void powerUp() {
if (power == 1) {
lcd.clear();
delay(500);
lcd.setCursor(0, 1);
lcd.print(" LOADING... ");
delay(1000);
lcd.clear();
if (mas_vol == masVolLimitMin) {
set_mute(1);
} else {
mute = 0;
set_mute(mute);
}
vol_menu = 0;
menu_active = 0;
digitalWrite(powerOut, HIGH);
delay(300);
} else {
set_mute(1);
delay(100);
digitalWrite(powerOut, LOW);
menu_active = 100;
}
}
void startUp() {
delay(500);
pt2258();
lcd.setCursor(0, 0);
lcd.print(" DaacWave ");
delay(300);
lcd.setCursor(0, 1);
lcd.print(" AUDIOS ");
delay(1500);
lcd.clear();
delay(300);
lcd.setCursor(0, 0);
lcd.print(" 6CH-DVC ");
lcd.setCursor(0, 1);
lcd.print(" LOADING... ");
delay(1200);
lcd.clear();
delay(200);
for (int i = 1; i < 5; i++) {
ch1Vol(i);
ch2Vol(i);
ch3Vol(i);
ch4Vol(i);
ch5Vol(i);
ch6Vol(i);
}
}
//IR control --------------------------------------------------------------------------------//
void IRControl() {
if (irrecv.decode(&results)) {
switch (results.value) {
//power -------------------------------------------------//
case ir_power:
power++;
if (power > 1) power = 0;
powerUp();
break;
}
if (power == 1) {
switch (results.value) {
//mute -------------------------------------------------//
case ir_mute:
soundMute();
break;
if (mute == 0) {
//VOL -------------------------------------------------//
case ir_vol_up:
volumeUp();
break;
case ir_vol_down:
volumeDown();
break;
}
//CH1 -------------------------------------------------//
case ir_ch_up:
volumeMenuUp();
break;
case ir_ch_down:
volumeMenuDown();
break;
}
}
irrecv.resume();
}
}
void lcdDisplay() {
int a, b, c;
switch (menu_active) {
case 0:
//vol ----------------------------------------------//
switch (vol_menu) {
case 0:
lcd.setCursor(0, 1);
// (" ");
lcd.print("MAS-VOL");
lcd.setCursor(0, 0);
c = mas_vol - masVolLimitMin;
break;
case 1:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH1-VOL");
c = ch1_vol;
break;
case 2:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH2-VOL");
c = ch2_vol;
break;
case 3:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH3-VOL");
c = ch3_vol;
break;
case 4:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH4-VOL");
c = ch4_vol;
break;
case 5:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH5-VOL");
c = ch5_vol;
break;
case 6:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH6-VOL");
c = ch6_vol;
break;
}
break;
case 100:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
if (muteLcdDelay == 0) {
if ((millis() - muteLcdTime) >= muteLcdOnTime) {
lcd.print(" ");
muteLcdDelay = 1;
muteLcdTime = millis();
}
} else {
if ((millis() - muteLcdTime) >= muteLcdOffTime) {
lcd.print(" STANDBY ");
muteLcdDelay = 0;
muteLcdTime = millis();
}
}
break;
}
if (menu_active == 0) {
if (mute == 1) {
lcd.setCursor(0, 0);
if (muteLcdDelay == 0) {
if ((millis() - muteLcdTime) >= muteLcdOnTime) {
lcd.print(" ");
muteLcdDelay = 1;
muteLcdTime = millis();
}
} else {
if ((millis() - muteLcdTime) >= muteLcdOffTime) {
lcd.print("MUTE ");
muteLcdDelay = 0;
muteLcdTime = millis();
}
}
} else {
lcd.setCursor(0, 0);
lcd.print("6CH-DVC");
}
for (int i = 0; i < 8; i++)
lcd.createChar(i, custom_num[i]);
int y;
if (c < 0) {
lcd.setCursor(8, 1);
lcd.print("-");
y = chVolLimitMax - (c + chVolLimitMax);
} else if (c == chVolLimitMin) {
lcd.setCursor(8, 1);
lcd.print("-");
y = chVolLimitMax;
} else {
lcd.setCursor(8, 1);
lcd.print(" ");
y = c;
}
a = y / 10;
b = y - a * 10;
lcd.setCursor(9, 0);
for (int i = 0; i < digit_width; i++)
lcd.print(custom_num_top[a][i]);
lcd.setCursor(9, 1);
for (int i = 0; i < digit_width; i++)
lcd.print(custom_num_bot[a][i]);
lcd.setCursor(13, 0);
for (int i = 0; i < digit_width; i++)
lcd.print(custom_num_top[b][i]);
lcd.setCursor(13, 1);
for (int i = 0; i < digit_width; i++)
lcd.print(custom_num_bot[b][i]);
}
}
//EEPROM -----------------------------------------------------//
void eepromUpdate() {
EEPROM.update(0, mas_vol);
EEPROM.update(1, ch1_vol + 10);
EEPROM.update(2, ch2_vol + 10);
EEPROM.update(3, ch3_vol + 10);
EEPROM.update(4, ch4_vol + 10);
EEPROM.update(5, ch5_vol + 10);
EEPROM.update(6, ch6_vol + 10);
}
void eepromRead() {
mas_vol = EEPROM.read(0);
ch1_vol = EEPROM.read(1) - 10;
ch2_vol = EEPROM.read(2) - 10;
ch3_vol = EEPROM.read(3) - 10;
ch4_vol = EEPROM.read(4) - 10;
ch5_vol = EEPROM.read(5) - 10;
ch6_vol = EEPROM.read(6) - 10;
}
void btnPress() {
returnTime = millis();
return_d = 1;
}
void returnDelay() {
if (millis() - returnTime > 5000 && return_d == 1 && vol_menu != 0) {
vol_menu = 0;
return_d = 0;
lcd.clear();
}
}
if (power == 1) {
updateEncoder();
//Mute -------------------------------------------------//
if (analogRead(SW2) > 900) {
if (millis() - lastButtonTime > buttonDelayTime) {
soundMute();
}
lastButtonTime = millis();
}
if (digitalRead(RotarySW) == LOW) {
if (millis() - lastButtonTime > buttonDelayTime) {
volumeMenuUp();
}
lastButtonTime = millis();
}
}
}
void updateEncoder() {
int CLK = digitalRead(RotaryA);
int DT = digitalRead(RotaryB);
int encoded = (CLK << 1) | DT;
int addData = (lastEncoded << 2) | encoded;
if (addData == 0b1101 || addData == 0b0100 || addData == 0b0010 || addData == 0b1011) {
if ((millis() - lastRotaryTime) > rotaryDelayTime) {
volumeUp();
lastRotaryTime = millis();
}
}
if (addData == 0b1110 || addData == 0b0111 || addData == 0b0001 || addData == 0b1000) {
if ((millis() - lastRotaryTime) > rotaryDelayTime) {
volumeDown();
lastRotaryTime = millis();
}
}
lastEncoded = encoded;
}
void volumeMenuUp() {
vol_menu++;
if (vol_menu > 6) vol_menu = 0;
btnPress();
}
void volumeMenuDown() {
vol_menu--;
if (vol_menu < 0) vol_menu = 6;
btnPress();
}
void volumeUp() {
if (vol_menu == 0) {
mas_vol++;
masVol();
}
if (vol_menu == 1) {
ch1_vol++;
ch1Vol(1);
}
if (vol_menu == 2) {
ch2_vol++;
ch2Vol(1);
}
if (vol_menu == 3) {
ch3_vol++;
ch3Vol(1);
}
if (vol_menu == 4) {
ch4_vol++;
ch4Vol(1);
}
if (vol_menu == 5) {
ch5_vol++;
ch5Vol(1);
}
if (vol_menu == 6) {
ch6_vol++;
ch6Vol(1);
}
btnPress();
}
void volumeDown() {
if (vol_menu == 0) {
mas_vol--;
masVol();
}
if (vol_menu == 1) {
ch1_vol--;
ch1Vol(1);
}
if (vol_menu == 2) {
ch2_vol--;
ch2Vol(1);
}
if (vol_menu == 3) {
ch3_vol--;
ch3Vol(1);
}
if (vol_menu == 4) {
ch4_vol--;
ch4Vol(1);
}
if (vol_menu == 5) {
ch5_vol--;
ch5Vol(1);
}
if (vol_menu == 6) {
ch6_vol--;
ch6Vol(1);
}
btnPress();
}
void soundMute() {
mute++;
if (mute > 1) mute = 0;
set_mute(mute);
}
void masVol() {
if (mas_vol > masVolLimitMax) mas_vol = masVolLimitMax;
if (mas_vol < masVolLimitMin) mas_vol = masVolLimitMin;
if (mute == 0) {
if (mas_vol == masVolLimitMin) set_mute(1);
else set_mute(0);
}
for (int i = 1; i < 5; i++) {
ch1Vol(i);
ch2Vol(i);
ch3Vol(i);
ch4Vol(i);
ch5Vol(i);
ch6Vol(i);
}
}
void ch1Vol(int adr) {
if (ch1_vol > chVolLimitMax) ch1_vol = chVolLimitMax;
if (ch1_vol < chVolLimitMin) ch1_vol = chVolLimitMin;
ch1 = mas_vol + ch1_vol;
set_address(adr);
set_ch1(ch1);
}
void ch2Vol(int adr) {
if (ch2_vol > chVolLimitMax) ch2_vol = chVolLimitMax;
if (ch2_vol < chVolLimitMin) ch2_vol = chVolLimitMin;
ch2 = mas_vol + ch2_vol;
set_address(adr);
set_ch2(ch2);
}
void ch3Vol(int adr) {
if (ch3_vol > chVolLimitMax) ch3_vol = chVolLimitMax;
if (ch3_vol < chVolLimitMin) ch3_vol = chVolLimitMin;
ch3 = mas_vol + ch3_vol;
set_address(adr);
set_ch3(ch3);
}
void ch4Vol(int adr) {
if (ch4_vol > chVolLimitMax) ch4_vol = chVolLimitMax;
if (ch4_vol < chVolLimitMin) ch4_vol = chVolLimitMin;
ch4 = mas_vol + ch4_vol;
set_address(adr);
set_ch4(ch4);
}
void ch5Vol(int adr) {
if (ch5_vol > chVolLimitMax) ch5_vol = chVolLimitMax;
if (ch5_vol < chVolLimitMin) ch5_vol = chVolLimitMin;
ch5 = mas_vol + ch5_vol;
set_address(adr);
set_ch5(ch5);
}
void ch6Vol(int adr) {
if (ch6_vol > chVolLimitMax) ch6_vol = chVolLimitMax;
if (ch6_vol < chVolLimitMin) ch6_vol = chVolLimitMin;
ch6 = mas_vol + ch6_vol;
set_address(adr);
set_ch6(ch6);
}
void powerUp() {
if (power == 1) {
lcd.clear();
delay(500);
lcd.setCursor(0, 1);
lcd.print(" LOADING... ");
delay(1000);
lcd.clear();
if (mas_vol == masVolLimitMin) {
set_mute(1);
} else {
mute = 0;
set_mute(mute);
}
vol_menu = 0;
menu_active = 0;
digitalWrite(powerOut, HIGH);
delay(300);
} else {
set_mute(1);
delay(100);
digitalWrite(powerOut, LOW);
menu_active = 100;
}
}
void startUp() {
delay(500);
pt2258();
lcd.setCursor(0, 0);
lcd.print(" DaacWave ");
delay(300);
lcd.setCursor(0, 1);
lcd.print(" AUDIOS ");
delay(1500);
lcd.clear();
delay(300);
lcd.setCursor(0, 0);
lcd.print(" 6CH-DVC ");
lcd.setCursor(0, 1);
lcd.print(" LOADING... ");
delay(1200);
lcd.clear();
delay(200);
for (int i = 1; i < 5; i++) {
ch1Vol(i);
ch2Vol(i);
ch3Vol(i);
ch4Vol(i);
ch5Vol(i);
ch6Vol(i);
}
}
//IR control --------------------------------------------------------------------------------//
void IRControl() {
if (irrecv.decode(&results)) {
switch (results.value) {
//power -------------------------------------------------//
case ir_power:
power++;
if (power > 1) power = 0;
powerUp();
break;
}
if (power == 1) {
switch (results.value) {
//mute -------------------------------------------------//
case ir_mute:
soundMute();
break;
if (mute == 0) {
//VOL -------------------------------------------------//
case ir_vol_up:
volumeUp();
break;
case ir_vol_down:
volumeDown();
break;
}
//CH1 -------------------------------------------------//
case ir_ch_up:
volumeMenuUp();
break;
case ir_ch_down:
volumeMenuDown();
break;
}
}
irrecv.resume();
}
}
void lcdDisplay() {
int a, b, c;
switch (menu_active) {
case 0:
//vol ----------------------------------------------//
switch (vol_menu) {
case 0:
lcd.setCursor(0, 1);
// (" ");
lcd.print("MAS-VOL");
lcd.setCursor(0, 0);
c = mas_vol - masVolLimitMin;
break;
case 1:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH1-VOL");
c = ch1_vol;
break;
case 2:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH2-VOL");
c = ch2_vol;
break;
case 3:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH3-VOL");
c = ch3_vol;
break;
case 4:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH4-VOL");
c = ch4_vol;
break;
case 5:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH5-VOL");
c = ch5_vol;
break;
case 6:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH6-VOL");
c = ch6_vol;
break;
}
break;
case 100:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
if (muteLcdDelay == 0) {
if ((millis() - muteLcdTime) >= muteLcdOnTime) {
lcd.print(" ");
muteLcdDelay = 1;
muteLcdTime = millis();
}
} else {
if ((millis() - muteLcdTime) >= muteLcdOffTime) {
lcd.print(" STANDBY ");
muteLcdDelay = 0;
muteLcdTime = millis();
}
}
break;
}
if (menu_active == 0) {
if (mute == 1) {
lcd.setCursor(0, 0);
if (muteLcdDelay == 0) {
if ((millis() - muteLcdTime) >= muteLcdOnTime) {
lcd.print(" ");
muteLcdDelay = 1;
muteLcdTime = millis();
}
} else {
if ((millis() - muteLcdTime) >= muteLcdOffTime) {
lcd.print("MUTE ");
muteLcdDelay = 0;
muteLcdTime = millis();
}
}
} else {
lcd.setCursor(0, 0);
lcd.print("6CH-DVC");
}
for (int i = 0; i < 8; i++)
lcd.createChar(i, custom_num[i]);
int y;
if (c < 0) {
lcd.setCursor(8, 1);
lcd.print("-");
y = chVolLimitMax - (c + chVolLimitMax);
} else if (c == chVolLimitMin) {
lcd.setCursor(8, 1);
lcd.print("-");
y = chVolLimitMax;
} else {
lcd.setCursor(8, 1);
lcd.print(" ");
y = c;
}
a = y / 10;
b = y - a * 10;
lcd.setCursor(9, 0);
for (int i = 0; i < digit_width; i++)
lcd.print(custom_num_top[a][i]);
lcd.setCursor(9, 1);
for (int i = 0; i < digit_width; i++)
lcd.print(custom_num_bot[a][i]);
lcd.setCursor(13, 0);
for (int i = 0; i < digit_width; i++)
lcd.print(custom_num_top[b][i]);
lcd.setCursor(13, 1);
for (int i = 0; i < digit_width; i++)
lcd.print(custom_num_bot[b][i]);
}
}
//EEPROM -----------------------------------------------------//
void eepromUpdate() {
EEPROM.update(0, mas_vol);
EEPROM.update(1, ch1_vol + 10);
EEPROM.update(2, ch2_vol + 10);
EEPROM.update(3, ch3_vol + 10);
EEPROM.update(4, ch4_vol + 10);
EEPROM.update(5, ch5_vol + 10);
EEPROM.update(6, ch6_vol + 10);
}
void eepromRead() {
mas_vol = EEPROM.read(0);
ch1_vol = EEPROM.read(1) - 10;
ch2_vol = EEPROM.read(2) - 10;
ch3_vol = EEPROM.read(3) - 10;
ch4_vol = EEPROM.read(4) - 10;
ch5_vol = EEPROM.read(5) - 10;
ch6_vol = EEPROM.read(6) - 10;
}
void btnPress() {
returnTime = millis();
return_d = 1;
}
void returnDelay() {
if (millis() - returnTime > 5000 && return_d == 1 && vol_menu != 0) {
vol_menu = 0;
return_d = 0;
lcd.clear();
}
}
CiNpbmNsdWRlIDxXaXJlLmg+CiNpbmNsdWRlIDxFRVBST00uaD4KI2luY2x1ZGUgPExpcXVpZENyeXN0YWxfSTJDLmg+CiNpbmNsdWRlIDxJUnJlbW90ZS5oPiAKI2luY2x1ZGUgPFBUMjI1OC5oPgojZGVmaW5lIFBUMjI1OF9hZGRyZXNzIDBiMTAwMDEwMAojZGVmaW5lIFJvdGFyeUIgMTEKI2RlZmluZSBSb3RhcnlBIDEyCiNkZWZpbmUgUm90YXJ5U1cgMTMKI2RlZmluZSBTVzEgQTEgICAgICAKI2RlZmluZSBTVzIgQTIgICAgICAgIAojZGVmaW5lIFNXMyBBMyAgICAgICAKI2RlZmluZSBSRUNWX1BJTiA4ICAgCiNkZWZpbmUgcG93ZXJPdXQgMTAKLy8gSVIgSEVYIGNvZGUKI2RlZmluZSBpcl9wb3dlciAweDgwN0Y4MjdEICAgICAvLyBJUiBQb3dlciBPTi9PRkYKI2RlZmluZSBpcl9tdXRlIDB4ODA3RjQyQkQgICAgICAvLyBJUiBNdXRlCiNkZWZpbmUgaXJfdm9sX3VwIDB4ODA3RjkwNkYgICAgLy8gSVIgVm9sKysKI2RlZmluZSBpcl92b2xfZG93biAweDgwN0ZBMDVGICAvLyBJUiBWb2wtLQojZGVmaW5lIGlyX2NoX3VwIDB4ODA3RjQwQkYgICAgIC8vIElSIENIKysKI2RlZmluZSBpcl9jaF9kb3duIDB4ODA3RkMwM0YgICAvLyBJUiBDSC0tIApMaXF1aWRDcnlzdGFsX0kyQyBsY2QoMHgyNywgMTYsIDIpOwoKYnl0ZSBjdXN0b21fbnVtWzhdWzhdID0gewogIHsgQjAwMTExLCBCMDExMTEsIEIxMTExMSwgQjExMTExLCBCMTExMTEsIEIxMTExMSwgQjExMTExLCBCMTExMTEgfSwKICB7IEIxMTExMSwgQjExMTExLCBCMTExMTEsIEIwMDAwMCwgQjAwMDAwLCBCMDAwMDAsIEIwMDAwMCwgQjAwMDAwIH0sCiAgeyBCMTExMDAsIEIxMTExMCwgQjExMTExLCBCMTExMTEsIEIxMTExMSwgQjExMTExLCBCMTExMTEsIEIxMTExMSB9LAogIHsgQjExMTExLCBCMTExMTEsIEIxMTExMSwgQjExMTExLCBCMTExMTEsIEIxMTExMSwgQjAxMTExLCBCMDAxMTEgfSwKICB7IEIwMDAwMCwgQjAwMDAwLCBCMDAwMDAsIEIwMDAwMCwgQjAwMDAwLCBCMTExMTEsIEIxMTExMSwgQjExMTExIH0sCiAgeyBCMTExMTEsIEIxMTExMSwgQjExMTExLCBCMTExMTEsIEIxMTExMSwgQjExMTExLCBCMTExMTAsIEIxMTEwMCB9LAogIHsgQjExMTExLCBCMTExMTEsIEIxMTExMSwgQjAwMDAwLCBCMDAwMDAsIEIwMDAwMCwgQjExMTExLCBCMTExMTEgfSwKICB7IEIxMTExMSwgQjExMTExLCBCMTExMTEsIEIxMTExMSwgQjExMTExLCBCMTExMTEsIEIxMTExMSwgQjExMTExIH0KfTsKY29uc3QgaW50IGRpZ2l0X3dpZHRoID0gMzsKY29uc3QgY2hhciBjdXN0b21fbnVtX3RvcFsxMF1bZGlnaXRfd2lkdGhdID0geyAwLCAxLCAyLCAxLCAyLCAzMiwgNiwgNiwgMiwgNiwgNiwgMiwgMywgNCwgNywgNywgNiwgNiwgMCwgNiwgNiwgMSwgMSwgMiwgMCwgNiwgMiwgMCwgNiwgMiB9Owpjb25zdCBjaGFyIGN1c3RvbV9udW1fYm90WzEwXVtkaWdpdF93aWR0aF0gPSB7IDMsIDQsIDUsIDQsIDcsIDQsIDcsIDQsIDQsIDQsIDQsIDUsIDMyLCAzMiwgNywgNCwgNCwgNSwgMywgNCwgNSwgMzIsIDMyLCA3LCAzLCA0LCA1LCA0LCA0LCA1IH07CnVuc2lnbmVkIGxvbmcgcmV0dXJuVGltZTsKdW5zaWduZWQgbG9uZyBsYXN0Um90YXJ5VGltZSA9IDA7CnVuc2lnbmVkIGxvbmcgbGFzdEJ1dHRvblRpbWUgPSAwOwp1bnNpZ25lZCBsb25nIG11dGVMY2RUaW1lID0gMDsKaW50IHJvdGFyeURlbGF5VGltZSA9IDIwMDsKaW50IGJ1dHRvbkRlbGF5VGltZSA9IDEwMDsKaW50IG11dGVMY2REZWxheSA9IDA7CmludCBtdXRlTGNkT25UaW1lID0gNTAwOwppbnQgbXV0ZUxjZE9mZlRpbWUgPSA1MDA7CgppbnQgbWFzVm9sTGltaXRNYXggPSA2OTsKaW50IG1hc1ZvbExpbWl0TWluID0gMTk7CmludCBjaFZvbExpbWl0TWF4ID0gMTA7CmludCBjaFZvbExpbWl0TWluID0gLTEwOwppbnQgbGFzdEVuY29kZWQgPSAwOwoKaW50IHZvbF9tZW51LCBtYXNfdm9sLCBjaDFfdm9sLCBjaDJfdm9sLCBjaDNfdm9sLCBjaDRfdm9sLCBjaDVfdm9sLCBjaDZfdm9sLCBtdXRlLCBjaDEsIGNoMiwgY2gzLCBjaDQsIGNoNSwgY2g2OwppbnQgcmV0dXJuX2QsIHBvd2VyLCBtZW51X2FjdGl2ZTsKc2V0X211dGU7CklScmVjdiBpcnJlY3YoUkVDVl9QSU4pOwpkZWNvZGVfcmVzdWx0cyByZXN1bHRzOwoKdm9pZCBzZXR1cCgpIHsKICBXaXJlLmJlZ2luKCk7CiAgbGNkLmJlZ2luKDE2LCAyKTsKICBpcnJlY3YuZW5hYmxlSVJJbigpOwoKICBwaW5Nb2RlKFJvdGFyeUEsIElOUFVUKTsKICBwaW5Nb2RlKFJvdGFyeUIsIElOUFVUKTsKICBwaW5Nb2RlKFJvdGFyeVNXLCBJTlBVVF9QVUxMVVApOwogIHBpbk1vZGUoU1cxLCBJTlBVVCk7CiAgcGluTW9kZShTVzIsIElOUFVUKTsKICBwaW5Nb2RlKFNXMywgSU5QVVQpOwogIHBpbk1vZGUocG93ZXJPdXQsIE9VVFBVVCk7CgogIGRpZ2l0YWxXcml0ZShSb3RhcnlBLCBISUdIKTsKICBkaWdpdGFsV3JpdGUoUm90YXJ5QiwgSElHSCk7CgogIHBvd2VyID0gMDsKICBlZXByb21SZWFkKCk7CiAgc3RhcnRVcCgpOwogIHBvd2VyVXAoKTsKfQp2b2lkIGxvb3AoKSB7CiAgbGNkRGlzcGxheSgpOwogIGVlcHJvbVVwZGF0ZSgpOwogIElSQ29udHJvbCgpOwogIHJldHVybkRlbGF5KCk7CiAgLy9Qb3dlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KICBpZiAoYW5hbG9nUmVhZChTVzEpID4gOTAwKSB7CiAgICBpZiAobWlsbGlzKCkgLSBsYXN0QnV0dG9uVGltZSA+IGJ1dHRvbkRlbGF5VGltZSkgewogICAgICBwb3dlcisrOwogICAgICBpZiAocG93ZXIgPiAxKSBwb3dlciA9IDA7CiAgICAgIHBvd2VyVXAoKTsKICAgIH0KICAgIGxhc3RCdXR0b25UaW1lID0gbWlsbGlzKCk7CiAgfQogIGlmIChwb3dlciA9PSAxKSB7CiAgICB1cGRhdGVFbmNvZGVyKCk7CiAgICAvL011dGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCiAgICBpZiAoYW5hbG9nUmVhZChTVzIpID4gOTAwKSB7CiAgICAgIGlmIChtaWxsaXMoKSAtIGxhc3RCdXR0b25UaW1lID4gYnV0dG9uRGVsYXlUaW1lKSB7CiAgICAgICAgc291bmRNdXRlKCk7CiAgICAgIH0KICAgICAgbGFzdEJ1dHRvblRpbWUgPSBtaWxsaXMoKTsKICAgIH0KICAgIGlmIChkaWdpdGFsUmVhZChSb3RhcnlTVykgPT0gTE9XKSB7CiAgICAgIGlmIChtaWxsaXMoKSAtIGxhc3RCdXR0b25UaW1lID4gYnV0dG9uRGVsYXlUaW1lKSB7CiAgICAgICAgdm9sdW1lTWVudVVwKCk7CiAgICAgIH0KICAgICAgbGFzdEJ1dHRvblRpbWUgPSBtaWxsaXMoKTsKICAgIH0KICB9Cn0KCnZvaWQgdXBkYXRlRW5jb2RlcigpIHsKICBpbnQgQ0xLID0gZGlnaXRhbFJlYWQoUm90YXJ5QSk7CiAgaW50IERUID0gZGlnaXRhbFJlYWQoUm90YXJ5Qik7CgogIGludCBlbmNvZGVkID0gKENMSyA8PCAxKSB8IERUOwogIGludCBhZGREYXRhID0gKGxhc3RFbmNvZGVkIDw8IDIpIHwgZW5jb2RlZDsKCiAgaWYgKGFkZERhdGEgPT0gMGIxMTAxIHx8IGFkZERhdGEgPT0gMGIwMTAwIHx8IGFkZERhdGEgPT0gMGIwMDEwIHx8IGFkZERhdGEgPT0gMGIxMDExKSB7CiAgICBpZiAoKG1pbGxpcygpIC0gbGFzdFJvdGFyeVRpbWUpID4gcm90YXJ5RGVsYXlUaW1lKSB7CiAgICAgIHZvbHVtZVVwKCk7CiAgICAgIGxhc3RSb3RhcnlUaW1lID0gbWlsbGlzKCk7CiAgICB9CiAgfQogIGlmIChhZGREYXRhID09IDBiMTExMCB8fCBhZGREYXRhID09IDBiMDExMSB8fCBhZGREYXRhID09IDBiMDAwMSB8fCBhZGREYXRhID09IDBiMTAwMCkgewogICAgaWYgKChtaWxsaXMoKSAtIGxhc3RSb3RhcnlUaW1lKSA+IHJvdGFyeURlbGF5VGltZSkgewogICAgICB2b2x1bWVEb3duKCk7CiAgICAgIGxhc3RSb3RhcnlUaW1lID0gbWlsbGlzKCk7CiAgICB9CiAgfQogIGxhc3RFbmNvZGVkID0gZW5jb2RlZDsKfQoKdm9pZCB2b2x1bWVNZW51VXAoKSB7CiAgdm9sX21lbnUrKzsKICBpZiAodm9sX21lbnUgPiA2KSB2b2xfbWVudSA9IDA7CiAgYnRuUHJlc3MoKTsKfQoKdm9pZCB2b2x1bWVNZW51RG93bigpIHsKICB2b2xfbWVudS0tOwogIGlmICh2b2xfbWVudSA8IDApIHZvbF9tZW51ID0gNjsKICBidG5QcmVzcygpOwp9Cgp2b2lkIHZvbHVtZVVwKCkgewogIGlmICh2b2xfbWVudSA9PSAwKSB7CiAgICBtYXNfdm9sKys7CiAgICBtYXNWb2woKTsKICB9CiAgaWYgKHZvbF9tZW51ID09IDEpIHsKICAgIGNoMV92b2wrKzsKICAgIGNoMVZvbCgxKTsKICB9CiAgaWYgKHZvbF9tZW51ID09IDIpIHsKICAgIGNoMl92b2wrKzsKICAgIGNoMlZvbCgxKTsKICB9CiAgaWYgKHZvbF9tZW51ID09IDMpIHsKICAgIGNoM192b2wrKzsKICAgIGNoM1ZvbCgxKTsKICB9CiAgaWYgKHZvbF9tZW51ID09IDQpIHsKICAgIGNoNF92b2wrKzsKICAgIGNoNFZvbCgxKTsKICB9CiAgaWYgKHZvbF9tZW51ID09IDUpIHsKICAgIGNoNV92b2wrKzsKICAgIGNoNVZvbCgxKTsKICB9CiAgaWYgKHZvbF9tZW51ID09IDYpIHsKICAgIGNoNl92b2wrKzsKICAgIGNoNlZvbCgxKTsKICB9CiAgYnRuUHJlc3MoKTsKfQoKdm9pZCB2b2x1bWVEb3duKCkgewogIGlmICh2b2xfbWVudSA9PSAwKSB7CiAgICBtYXNfdm9sLS07CiAgICBtYXNWb2woKTsKICB9CiAgaWYgKHZvbF9tZW51ID09IDEpIHsKICAgIGNoMV92b2wtLTsKICAgIGNoMVZvbCgxKTsKICB9CiAgaWYgKHZvbF9tZW51ID09IDIpIHsKICAgIGNoMl92b2wtLTsKICAgIGNoMlZvbCgxKTsKICB9CiAgaWYgKHZvbF9tZW51ID09IDMpIHsKICAgIGNoM192b2wtLTsKICAgIGNoM1ZvbCgxKTsKICB9CiAgaWYgKHZvbF9tZW51ID09IDQpIHsKICAgIGNoNF92b2wtLTsKICAgIGNoNFZvbCgxKTsKICB9CiAgaWYgKHZvbF9tZW51ID09IDUpIHsKICAgIGNoNV92b2wtLTsKICAgIGNoNVZvbCgxKTsKICB9CiAgaWYgKHZvbF9tZW51ID09IDYpIHsKICAgIGNoNl92b2wtLTsKICAgIGNoNlZvbCgxKTsKICB9CiAgYnRuUHJlc3MoKTsKfQoKdm9pZCBzb3VuZE11dGUoKSB7CiAgbXV0ZSsrOwogIGlmIChtdXRlID4gMSkgbXV0ZSA9IDA7CiAgc2V0X211dGUobXV0ZSk7Cn0KCnZvaWQgbWFzVm9sKCkgewogIGlmIChtYXNfdm9sID4gbWFzVm9sTGltaXRNYXgpIG1hc192b2wgPSBtYXNWb2xMaW1pdE1heDsKICBpZiAobWFzX3ZvbCA8IG1hc1ZvbExpbWl0TWluKSBtYXNfdm9sID0gbWFzVm9sTGltaXRNaW47CgogIGlmIChtdXRlID09IDApIHsKICAgIGlmIChtYXNfdm9sID09IG1hc1ZvbExpbWl0TWluKSBzZXRfbXV0ZSgxKTsKICAgIGVsc2Ugc2V0X211dGUoMCk7CiAgfQoKICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgewogICAgY2gxVm9sKGkpOwogICAgY2gyVm9sKGkpOwogICAgY2gzVm9sKGkpOwogICAgY2g0Vm9sKGkpOwogICAgY2g1Vm9sKGkpOwogICAgY2g2Vm9sKGkpOwogIH0KfQoKdm9pZCBjaDFWb2woaW50IGFkcikgewogIGlmIChjaDFfdm9sID4gY2hWb2xMaW1pdE1heCkgY2gxX3ZvbCA9IGNoVm9sTGltaXRNYXg7CiAgaWYgKGNoMV92b2wgPCBjaFZvbExpbWl0TWluKSBjaDFfdm9sID0gY2hWb2xMaW1pdE1pbjsKICBjaDEgPSBtYXNfdm9sICsgY2gxX3ZvbDsKICBzZXRfYWRkcmVzcyhhZHIpOwogIHNldF9jaDEoY2gxKTsKfQoKdm9pZCBjaDJWb2woaW50IGFkcikgewogIGlmIChjaDJfdm9sID4gY2hWb2xMaW1pdE1heCkgY2gyX3ZvbCA9IGNoVm9sTGltaXRNYXg7CiAgaWYgKGNoMl92b2wgPCBjaFZvbExpbWl0TWluKSBjaDJfdm9sID0gY2hWb2xMaW1pdE1pbjsKICBjaDIgPSBtYXNfdm9sICsgY2gyX3ZvbDsKICBzZXRfYWRkcmVzcyhhZHIpOwogIHNldF9jaDIoY2gyKTsKfQoKdm9pZCBjaDNWb2woaW50IGFkcikgewogIGlmIChjaDNfdm9sID4gY2hWb2xMaW1pdE1heCkgY2gzX3ZvbCA9IGNoVm9sTGltaXRNYXg7CiAgaWYgKGNoM192b2wgPCBjaFZvbExpbWl0TWluKSBjaDNfdm9sID0gY2hWb2xMaW1pdE1pbjsKICBjaDMgPSBtYXNfdm9sICsgY2gzX3ZvbDsKICBzZXRfYWRkcmVzcyhhZHIpOwogIHNldF9jaDMoY2gzKTsKfQoKdm9pZCBjaDRWb2woaW50IGFkcikgewogIGlmIChjaDRfdm9sID4gY2hWb2xMaW1pdE1heCkgY2g0X3ZvbCA9IGNoVm9sTGltaXRNYXg7CiAgaWYgKGNoNF92b2wgPCBjaFZvbExpbWl0TWluKSBjaDRfdm9sID0gY2hWb2xMaW1pdE1pbjsKICBjaDQgPSBtYXNfdm9sICsgY2g0X3ZvbDsKICBzZXRfYWRkcmVzcyhhZHIpOwogIHNldF9jaDQoY2g0KTsKfQoKdm9pZCBjaDVWb2woaW50IGFkcikgewogIGlmIChjaDVfdm9sID4gY2hWb2xMaW1pdE1heCkgY2g1X3ZvbCA9IGNoVm9sTGltaXRNYXg7CiAgaWYgKGNoNV92b2wgPCBjaFZvbExpbWl0TWluKSBjaDVfdm9sID0gY2hWb2xMaW1pdE1pbjsKICBjaDUgPSBtYXNfdm9sICsgY2g1X3ZvbDsKICBzZXRfYWRkcmVzcyhhZHIpOwogIHNldF9jaDUoY2g1KTsKfQoKdm9pZCBjaDZWb2woaW50IGFkcikgewogIGlmIChjaDZfdm9sID4gY2hWb2xMaW1pdE1heCkgY2g2X3ZvbCA9IGNoVm9sTGltaXRNYXg7CiAgaWYgKGNoNl92b2wgPCBjaFZvbExpbWl0TWluKSBjaDZfdm9sID0gY2hWb2xMaW1pdE1pbjsKICBjaDYgPSBtYXNfdm9sICsgY2g2X3ZvbDsKICBzZXRfYWRkcmVzcyhhZHIpOwogIHNldF9jaDYoY2g2KTsKfQoKdm9pZCBwb3dlclVwKCkgewogIGlmIChwb3dlciA9PSAxKSB7CiAgICBsY2QuY2xlYXIoKTsKICAgIGRlbGF5KDUwMCk7CiAgICBsY2Quc2V0Q3Vyc29yKDAsIDEpOwogICAgbGNkLnByaW50KCIgICBMT0FESU5HLi4uICAgIik7CiAgICBkZWxheSgxMDAwKTsKICAgIGxjZC5jbGVhcigpOwogICAgaWYgKG1hc192b2wgPT0gbWFzVm9sTGltaXRNaW4pIHsKICAgICAgc2V0X211dGUoMSk7CiAgICB9IGVsc2UgewogICAgICBtdXRlID0gMDsKICAgICAgc2V0X211dGUobXV0ZSk7CiAgICB9CiAgICB2b2xfbWVudSA9IDA7CiAgICBtZW51X2FjdGl2ZSA9IDA7CiAgICBkaWdpdGFsV3JpdGUocG93ZXJPdXQsIEhJR0gpOwogICAgZGVsYXkoMzAwKTsKCiAgfSBlbHNlIHsKCiAgICBzZXRfbXV0ZSgxKTsKICAgIGRlbGF5KDEwMCk7CiAgICBkaWdpdGFsV3JpdGUocG93ZXJPdXQsIExPVyk7CiAgICBtZW51X2FjdGl2ZSA9IDEwMDsKICB9Cn0KCnZvaWQgc3RhcnRVcCgpIHsKICBkZWxheSg1MDApOwogIHB0MjI1OCgpOwogIGxjZC5zZXRDdXJzb3IoMCwgMCk7CiAgbGNkLnByaW50KCIgICAgRGFhY1dhdmUgICAgIik7CiAgZGVsYXkoMzAwKTsKICBsY2Quc2V0Q3Vyc29yKDAsIDEpOwogIGxjZC5wcmludCgiICAgICBBVURJT1MgICAgICIpOwogIGRlbGF5KDE1MDApOwogIGxjZC5jbGVhcigpOwogIGRlbGF5KDMwMCk7CiAgbGNkLnNldEN1cnNvcigwLCAwKTsKICBsY2QucHJpbnQoIiAgIDZDSC1EVkMgICAgICAiKTsKICBsY2Quc2V0Q3Vyc29yKDAsIDEpOwogIGxjZC5wcmludCgiICAgTE9BRElORy4uLiAgICIpOwogIGRlbGF5KDEyMDApOwogIGxjZC5jbGVhcigpOwogIGRlbGF5KDIwMCk7CiAgZm9yIChpbnQgaSA9IDE7IGkgPCA1OyBpKyspIHsKICAgIGNoMVZvbChpKTsKICAgIGNoMlZvbChpKTsKICAgIGNoM1ZvbChpKTsKICAgIGNoNFZvbChpKTsKICAgIGNoNVZvbChpKTsKICAgIGNoNlZvbChpKTsKICB9Cn0KCi8vSVIgY29udHJvbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCnZvaWQgSVJDb250cm9sKCkgewogIGlmIChpcnJlY3YuZGVjb2RlKCZyZXN1bHRzKSkgewogICAgc3dpdGNoIChyZXN1bHRzLnZhbHVlKSB7CiAgICAgIC8vcG93ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCiAgICAgIGNhc2UgaXJfcG93ZXI6CiAgICAgICAgcG93ZXIrKzsKICAgICAgICBpZiAocG93ZXIgPiAxKSBwb3dlciA9IDA7CiAgICAgICAgcG93ZXJVcCgpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKHBvd2VyID09IDEpIHsKICAgICAgc3dpdGNoIChyZXN1bHRzLnZhbHVlKSB7CiAgICAgICAgLy9tdXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwogICAgICAgIGNhc2UgaXJfbXV0ZToKICAgICAgICAgIHNvdW5kTXV0ZSgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgICBpZiAobXV0ZSA9PSAwKSB7CiAgICAgICAgICAgIC8vVk9MIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwogICAgICAgICAgICBjYXNlIGlyX3ZvbF91cDoKICAgICAgICAgICAgICB2b2x1bWVVcCgpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBpcl92b2xfZG93bjoKICAgICAgICAgICAgICB2b2x1bWVEb3duKCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgIC8vQ0gxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwogICAgICAgIGNhc2UgaXJfY2hfdXA6CiAgICAgICAgICB2b2x1bWVNZW51VXAoKTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIGlyX2NoX2Rvd246CiAgICAgICAgICB2b2x1bWVNZW51RG93bigpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlycmVjdi5yZXN1bWUoKTsKICB9Cn0KCnZvaWQgbGNkRGlzcGxheSgpIHsKICBpbnQgYSwgYiwgYzsKICBzd2l0Y2ggKG1lbnVfYWN0aXZlKSB7CiAgICBjYXNlIDA6CiAgICAgIC8vdm9sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwogICAgICBzd2l0Y2ggKHZvbF9tZW51KSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgbGNkLnNldEN1cnNvcigwLCAxKTsKICAgICAgICAgIC8vICAgICAgICgiICAgICAgICIpOwogICAgICAgICAgbGNkLnByaW50KCJNQVMtVk9MIik7CiAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDAsIDApOwogICAgICAgICAgYyA9IG1hc192b2wgLSBtYXNWb2xMaW1pdE1pbjsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDE6CiAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDAsIDEpOwogICAgICAgICAgLy8gICAgICAgKCIgICAgICAgIik7CiAgICAgICAgICBsY2QucHJpbnQoIkNIMS1WT0wiKTsKICAgICAgICAgIGMgPSBjaDFfdm9sOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMjoKICAgICAgICAgIGxjZC5zZXRDdXJzb3IoMCwgMSk7CiAgICAgICAgICAvLyAgICAgICAoIiAgICAgICAiKTsKICAgICAgICAgIGxjZC5wcmludCgiQ0gyLVZPTCIpOwogICAgICAgICAgYyA9IGNoMl92b2w7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAzOgogICAgICAgICAgbGNkLnNldEN1cnNvcigwLCAxKTsKICAgICAgICAgIC8vICAgICAgICgiICAgICAgICIpOwogICAgICAgICAgbGNkLnByaW50KCJDSDMtVk9MIik7CiAgICAgICAgICBjID0gY2gzX3ZvbDsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDAsIDEpOwogICAgICAgICAgLy8gICAgICAgKCIgICAgICAgIik7CiAgICAgICAgICBsY2QucHJpbnQoIkNINC1WT0wiKTsKICAgICAgICAgIGMgPSBjaDRfdm9sOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgNToKICAgICAgICAgIGxjZC5zZXRDdXJzb3IoMCwgMSk7CiAgICAgICAgICAvLyAgICAgICAoIiAgICAgICAiKTsKICAgICAgICAgIGxjZC5wcmludCgiQ0g1LVZPTCIpOwogICAgICAgICAgYyA9IGNoNV92b2w7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSA2OgogICAgICAgICAgbGNkLnNldEN1cnNvcigwLCAxKTsKICAgICAgICAgIC8vICAgICAgICgiICAgICAgICIpOwogICAgICAgICAgbGNkLnByaW50KCJDSDYtVk9MIik7CiAgICAgICAgICBjID0gY2g2X3ZvbDsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgMTAwOgogICAgICBsY2Quc2V0Q3Vyc29yKDAsIDApOwogICAgICBsY2QucHJpbnQoIiAgICAgICAgICAgICAgICAiKTsKICAgICAgbGNkLnNldEN1cnNvcigwLCAxKTsKICAgICAgaWYgKG11dGVMY2REZWxheSA9PSAwKSB7CiAgICAgICAgaWYgKChtaWxsaXMoKSAtIG11dGVMY2RUaW1lKSA+PSBtdXRlTGNkT25UaW1lKSB7CiAgICAgICAgICBsY2QucHJpbnQoIiAgICAgICAgICAgICAgICAiKTsKICAgICAgICAgIG11dGVMY2REZWxheSA9IDE7CiAgICAgICAgICBtdXRlTGNkVGltZSA9IG1pbGxpcygpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoKG1pbGxpcygpIC0gbXV0ZUxjZFRpbWUpID49IG11dGVMY2RPZmZUaW1lKSB7CiAgICAgICAgICBsY2QucHJpbnQoIiAgICBTVEFOREJZICAgICAiKTsKICAgICAgICAgIG11dGVMY2REZWxheSA9IDA7CiAgICAgICAgICBtdXRlTGNkVGltZSA9IG1pbGxpcygpOwogICAgICAgIH0KICAgICAgfQogICAgICBicmVhazsKICB9CiAgaWYgKG1lbnVfYWN0aXZlID09IDApIHsKICAgIGlmIChtdXRlID09IDEpIHsKICAgICAgbGNkLnNldEN1cnNvcigwLCAwKTsKICAgICAgaWYgKG11dGVMY2REZWxheSA9PSAwKSB7CiAgICAgICAgaWYgKChtaWxsaXMoKSAtIG11dGVMY2RUaW1lKSA+PSBtdXRlTGNkT25UaW1lKSB7CiAgICAgICAgICBsY2QucHJpbnQoIiAgICAgICAiKTsKICAgICAgICAgIG11dGVMY2REZWxheSA9IDE7CiAgICAgICAgICBtdXRlTGNkVGltZSA9IG1pbGxpcygpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoKG1pbGxpcygpIC0gbXV0ZUxjZFRpbWUpID49IG11dGVMY2RPZmZUaW1lKSB7CiAgICAgICAgICBsY2QucHJpbnQoIk1VVEUgICAiKTsKICAgICAgICAgIG11dGVMY2REZWxheSA9IDA7CiAgICAgICAgICBtdXRlTGNkVGltZSA9IG1pbGxpcygpOwogICAgICAgIH0KICAgICAgfQoKICAgIH0gZWxzZSB7CiAgICAgIGxjZC5zZXRDdXJzb3IoMCwgMCk7CiAgICAgIGxjZC5wcmludCgiNkNILURWQyIpOwogICAgfQoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKQogICAgICBsY2QuY3JlYXRlQ2hhcihpLCBjdXN0b21fbnVtW2ldKTsKCiAgICBpbnQgeTsKICAgIGlmIChjIDwgMCkgewogICAgICBsY2Quc2V0Q3Vyc29yKDgsIDEpOwogICAgICBsY2QucHJpbnQoIi0iKTsKICAgICAgeSA9IGNoVm9sTGltaXRNYXggLSAoYyArIGNoVm9sTGltaXRNYXgpOwogICAgfSBlbHNlIGlmIChjID09IGNoVm9sTGltaXRNaW4pIHsKICAgICAgbGNkLnNldEN1cnNvcig4LCAxKTsKICAgICAgbGNkLnByaW50KCItIik7CiAgICAgIHkgPSBjaFZvbExpbWl0TWF4OwogICAgfSBlbHNlIHsKICAgICAgbGNkLnNldEN1cnNvcig4LCAxKTsKICAgICAgbGNkLnByaW50KCIgIik7CiAgICAgIHkgPSBjOwogICAgfQogICAgYSA9IHkgLyAxMDsKICAgIGIgPSB5IC0gYSAqIDEwOwoKICAgIGxjZC5zZXRDdXJzb3IoOSwgMCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpZ2l0X3dpZHRoOyBpKyspCiAgICAgIGxjZC5wcmludChjdXN0b21fbnVtX3RvcFthXVtpXSk7CgogICAgbGNkLnNldEN1cnNvcig5LCAxKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlnaXRfd2lkdGg7IGkrKykKICAgICAgbGNkLnByaW50KGN1c3RvbV9udW1fYm90W2FdW2ldKTsKCiAgICBsY2Quc2V0Q3Vyc29yKDEzLCAwKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlnaXRfd2lkdGg7IGkrKykKICAgICAgbGNkLnByaW50KGN1c3RvbV9udW1fdG9wW2JdW2ldKTsKCiAgICBsY2Quc2V0Q3Vyc29yKDEzLCAxKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlnaXRfd2lkdGg7IGkrKykKICAgICAgbGNkLnByaW50KGN1c3RvbV9udW1fYm90W2JdW2ldKTsKICB9Cn0KCi8vRUVQUk9NIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8Kdm9pZCBlZXByb21VcGRhdGUoKSB7CiAgRUVQUk9NLnVwZGF0ZSgwLCBtYXNfdm9sKTsKICBFRVBST00udXBkYXRlKDEsIGNoMV92b2wgKyAxMCk7CiAgRUVQUk9NLnVwZGF0ZSgyLCBjaDJfdm9sICsgMTApOwogIEVFUFJPTS51cGRhdGUoMywgY2gzX3ZvbCArIDEwKTsKICBFRVBST00udXBkYXRlKDQsIGNoNF92b2wgKyAxMCk7CiAgRUVQUk9NLnVwZGF0ZSg1LCBjaDVfdm9sICsgMTApOwogIEVFUFJPTS51cGRhdGUoNiwgY2g2X3ZvbCArIDEwKTsKfQoKdm9pZCBlZXByb21SZWFkKCkgewogIG1hc192b2wgPSBFRVBST00ucmVhZCgwKTsKICBjaDFfdm9sID0gRUVQUk9NLnJlYWQoMSkgLSAxMDsKICBjaDJfdm9sID0gRUVQUk9NLnJlYWQoMikgLSAxMDsKICBjaDNfdm9sID0gRUVQUk9NLnJlYWQoMykgLSAxMDsKICBjaDRfdm9sID0gRUVQUk9NLnJlYWQoNCkgLSAxMDsKICBjaDVfdm9sID0gRUVQUk9NLnJlYWQoNSkgLSAxMDsKICBjaDZfdm9sID0gRUVQUk9NLnJlYWQoNikgLSAxMDsKfQoKdm9pZCBidG5QcmVzcygpIHsKICByZXR1cm5UaW1lID0gbWlsbGlzKCk7CiAgcmV0dXJuX2QgPSAxOwp9CnZvaWQgcmV0dXJuRGVsYXkoKSB7CiAgaWYgKG1pbGxpcygpIC0gcmV0dXJuVGltZSA+IDUwMDAgJiYgcmV0dXJuX2QgPT0gMSAmJiB2b2xfbWVudSAhPSAwKSB7CiAgICB2b2xfbWVudSA9IDA7CiAgICByZXR1cm5fZCA9IDA7CiAgICBsY2QuY2xlYXIoKTsKICB9Cn0KaWYgKHBvd2VyID09IDEpIHsKICAgIHVwZGF0ZUVuY29kZXIoKTsKICAgIC8vTXV0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KICAgIGlmIChhbmFsb2dSZWFkKFNXMikgPiA5MDApIHsKICAgICAgaWYgKG1pbGxpcygpIC0gbGFzdEJ1dHRvblRpbWUgPiBidXR0b25EZWxheVRpbWUpIHsKICAgICAgICBzb3VuZE11dGUoKTsKICAgICAgfQogICAgICBsYXN0QnV0dG9uVGltZSA9IG1pbGxpcygpOwogICAgfQogICAgaWYgKGRpZ2l0YWxSZWFkKFJvdGFyeVNXKSA9PSBMT1cpIHsKICAgICAgaWYgKG1pbGxpcygpIC0gbGFzdEJ1dHRvblRpbWUgPiBidXR0b25EZWxheVRpbWUpIHsKICAgICAgICB2b2x1bWVNZW51VXAoKTsKICAgICAgfQogICAgICBsYXN0QnV0dG9uVGltZSA9IG1pbGxpcygpOwogICAgfQogIH0KfQoKdm9pZCB1cGRhdGVFbmNvZGVyKCkgewogIGludCBDTEsgPSBkaWdpdGFsUmVhZChSb3RhcnlBKTsKICBpbnQgRFQgPSBkaWdpdGFsUmVhZChSb3RhcnlCKTsKCiAgaW50IGVuY29kZWQgPSAoQ0xLIDw8IDEpIHwgRFQ7CiAgaW50IGFkZERhdGEgPSAobGFzdEVuY29kZWQgPDwgMikgfCBlbmNvZGVkOwoKICBpZiAoYWRkRGF0YSA9PSAwYjExMDEgfHwgYWRkRGF0YSA9PSAwYjAxMDAgfHwgYWRkRGF0YSA9PSAwYjAwMTAgfHwgYWRkRGF0YSA9PSAwYjEwMTEpIHsKICAgIGlmICgobWlsbGlzKCkgLSBsYXN0Um90YXJ5VGltZSkgPiByb3RhcnlEZWxheVRpbWUpIHsKICAgICAgdm9sdW1lVXAoKTsKICAgICAgbGFzdFJvdGFyeVRpbWUgPSBtaWxsaXMoKTsKICAgIH0KICB9CiAgaWYgKGFkZERhdGEgPT0gMGIxMTEwIHx8IGFkZERhdGEgPT0gMGIwMTExIHx8IGFkZERhdGEgPT0gMGIwMDAxIHx8IGFkZERhdGEgPT0gMGIxMDAwKSB7CiAgICBpZiAoKG1pbGxpcygpIC0gbGFzdFJvdGFyeVRpbWUpID4gcm90YXJ5RGVsYXlUaW1lKSB7CiAgICAgIHZvbHVtZURvd24oKTsKICAgICAgbGFzdFJvdGFyeVRpbWUgPSBtaWxsaXMoKTsKICAgIH0KICB9CiAgbGFzdEVuY29kZWQgPSBlbmNvZGVkOwp9Cgp2b2lkIHZvbHVtZU1lbnVVcCgpIHsKICB2b2xfbWVudSsrOwogIGlmICh2b2xfbWVudSA+IDYpIHZvbF9tZW51ID0gMDsKICBidG5QcmVzcygpOwp9Cgp2b2lkIHZvbHVtZU1lbnVEb3duKCkgewogIHZvbF9tZW51LS07CiAgaWYgKHZvbF9tZW51IDwgMCkgdm9sX21lbnUgPSA2OwogIGJ0blByZXNzKCk7Cn0KCnZvaWQgdm9sdW1lVXAoKSB7CiAgaWYgKHZvbF9tZW51ID09IDApIHsKICAgIG1hc192b2wrKzsKICAgIG1hc1ZvbCgpOwogIH0KICBpZiAodm9sX21lbnUgPT0gMSkgewogICAgY2gxX3ZvbCsrOwogICAgY2gxVm9sKDEpOwogIH0KICBpZiAodm9sX21lbnUgPT0gMikgewogICAgY2gyX3ZvbCsrOwogICAgY2gyVm9sKDEpOwogIH0KICBpZiAodm9sX21lbnUgPT0gMykgewogICAgY2gzX3ZvbCsrOwogICAgY2gzVm9sKDEpOwogIH0KICBpZiAodm9sX21lbnUgPT0gNCkgewogICAgY2g0X3ZvbCsrOwogICAgY2g0Vm9sKDEpOwogIH0KICBpZiAodm9sX21lbnUgPT0gNSkgewogICAgY2g1X3ZvbCsrOwogICAgY2g1Vm9sKDEpOwogIH0KICBpZiAodm9sX21lbnUgPT0gNikgewogICAgY2g2X3ZvbCsrOwogICAgY2g2Vm9sKDEpOwogIH0KICBidG5QcmVzcygpOwp9Cgp2b2lkIHZvbHVtZURvd24oKSB7CiAgaWYgKHZvbF9tZW51ID09IDApIHsKICAgIG1hc192b2wtLTsKICAgIG1hc1ZvbCgpOwogIH0KICBpZiAodm9sX21lbnUgPT0gMSkgewogICAgY2gxX3ZvbC0tOwogICAgY2gxVm9sKDEpOwogIH0KICBpZiAodm9sX21lbnUgPT0gMikgewogICAgY2gyX3ZvbC0tOwogICAgY2gyVm9sKDEpOwogIH0KICBpZiAodm9sX21lbnUgPT0gMykgewogICAgY2gzX3ZvbC0tOwogICAgY2gzVm9sKDEpOwogIH0KICBpZiAodm9sX21lbnUgPT0gNCkgewogICAgY2g0X3ZvbC0tOwogICAgY2g0Vm9sKDEpOwogIH0KICBpZiAodm9sX21lbnUgPT0gNSkgewogICAgY2g1X3ZvbC0tOwogICAgY2g1Vm9sKDEpOwogIH0KICBpZiAodm9sX21lbnUgPT0gNikgewogICAgY2g2X3ZvbC0tOwogICAgY2g2Vm9sKDEpOwogIH0KICBidG5QcmVzcygpOwp9Cgp2b2lkIHNvdW5kTXV0ZSgpIHsKICBtdXRlKys7CiAgaWYgKG11dGUgPiAxKSBtdXRlID0gMDsKICBzZXRfbXV0ZShtdXRlKTsKfQoKdm9pZCBtYXNWb2woKSB7CiAgaWYgKG1hc192b2wgPiBtYXNWb2xMaW1pdE1heCkgbWFzX3ZvbCA9IG1hc1ZvbExpbWl0TWF4OwogIGlmIChtYXNfdm9sIDwgbWFzVm9sTGltaXRNaW4pIG1hc192b2wgPSBtYXNWb2xMaW1pdE1pbjsKCiAgaWYgKG11dGUgPT0gMCkgewogICAgaWYgKG1hc192b2wgPT0gbWFzVm9sTGltaXRNaW4pIHNldF9tdXRlKDEpOwogICAgZWxzZSBzZXRfbXV0ZSgwKTsKICB9CgogIGZvciAoaW50IGkgPSAxOyBpIDwgNTsgaSsrKSB7CiAgICBjaDFWb2woaSk7CiAgICBjaDJWb2woaSk7CiAgICBjaDNWb2woaSk7CiAgICBjaDRWb2woaSk7CiAgICBjaDVWb2woaSk7CiAgICBjaDZWb2woaSk7CiAgfQp9Cgp2b2lkIGNoMVZvbChpbnQgYWRyKSB7CiAgaWYgKGNoMV92b2wgPiBjaFZvbExpbWl0TWF4KSBjaDFfdm9sID0gY2hWb2xMaW1pdE1heDsKICBpZiAoY2gxX3ZvbCA8IGNoVm9sTGltaXRNaW4pIGNoMV92b2wgPSBjaFZvbExpbWl0TWluOwogIGNoMSA9IG1hc192b2wgKyBjaDFfdm9sOwogIHNldF9hZGRyZXNzKGFkcik7CiAgc2V0X2NoMShjaDEpOwp9Cgp2b2lkIGNoMlZvbChpbnQgYWRyKSB7CiAgaWYgKGNoMl92b2wgPiBjaFZvbExpbWl0TWF4KSBjaDJfdm9sID0gY2hWb2xMaW1pdE1heDsKICBpZiAoY2gyX3ZvbCA8IGNoVm9sTGltaXRNaW4pIGNoMl92b2wgPSBjaFZvbExpbWl0TWluOwogIGNoMiA9IG1hc192b2wgKyBjaDJfdm9sOwogIHNldF9hZGRyZXNzKGFkcik7CiAgc2V0X2NoMihjaDIpOwp9Cgp2b2lkIGNoM1ZvbChpbnQgYWRyKSB7CiAgaWYgKGNoM192b2wgPiBjaFZvbExpbWl0TWF4KSBjaDNfdm9sID0gY2hWb2xMaW1pdE1heDsKICBpZiAoY2gzX3ZvbCA8IGNoVm9sTGltaXRNaW4pIGNoM192b2wgPSBjaFZvbExpbWl0TWluOwogIGNoMyA9IG1hc192b2wgKyBjaDNfdm9sOwogIHNldF9hZGRyZXNzKGFkcik7CiAgc2V0X2NoMyhjaDMpOwp9Cgp2b2lkIGNoNFZvbChpbnQgYWRyKSB7CiAgaWYgKGNoNF92b2wgPiBjaFZvbExpbWl0TWF4KSBjaDRfdm9sID0gY2hWb2xMaW1pdE1heDsKICBpZiAoY2g0X3ZvbCA8IGNoVm9sTGltaXRNaW4pIGNoNF92b2wgPSBjaFZvbExpbWl0TWluOwogIGNoNCA9IG1hc192b2wgKyBjaDRfdm9sOwogIHNldF9hZGRyZXNzKGFkcik7CiAgc2V0X2NoNChjaDQpOwp9Cgp2b2lkIGNoNVZvbChpbnQgYWRyKSB7CiAgaWYgKGNoNV92b2wgPiBjaFZvbExpbWl0TWF4KSBjaDVfdm9sID0gY2hWb2xMaW1pdE1heDsKICBpZiAoY2g1X3ZvbCA8IGNoVm9sTGltaXRNaW4pIGNoNV92b2wgPSBjaFZvbExpbWl0TWluOwogIGNoNSA9IG1hc192b2wgKyBjaDVfdm9sOwogIHNldF9hZGRyZXNzKGFkcik7CiAgc2V0X2NoNShjaDUpOwp9Cgp2b2lkIGNoNlZvbChpbnQgYWRyKSB7CiAgaWYgKGNoNl92b2wgPiBjaFZvbExpbWl0TWF4KSBjaDZfdm9sID0gY2hWb2xMaW1pdE1heDsKICBpZiAoY2g2X3ZvbCA8IGNoVm9sTGltaXRNaW4pIGNoNl92b2wgPSBjaFZvbExpbWl0TWluOwogIGNoNiA9IG1hc192b2wgKyBjaDZfdm9sOwogIHNldF9hZGRyZXNzKGFkcik7CiAgc2V0X2NoNihjaDYpOwp9Cgp2b2lkIHBvd2VyVXAoKSB7CiAgaWYgKHBvd2VyID09IDEpIHsKICAgIGxjZC5jbGVhcigpOwogICAgZGVsYXkoNTAwKTsKICAgIGxjZC5zZXRDdXJzb3IoMCwgMSk7CiAgICBsY2QucHJpbnQoIiAgIExPQURJTkcuLi4gICAiKTsKICAgIGRlbGF5KDEwMDApOwogICAgbGNkLmNsZWFyKCk7CiAgICBpZiAobWFzX3ZvbCA9PSBtYXNWb2xMaW1pdE1pbikgewogICAgICBzZXRfbXV0ZSgxKTsKICAgIH0gZWxzZSB7CiAgICAgIG11dGUgPSAwOwogICAgICBzZXRfbXV0ZShtdXRlKTsKICAgIH0KICAgIHZvbF9tZW51ID0gMDsKICAgIG1lbnVfYWN0aXZlID0gMDsKICAgIGRpZ2l0YWxXcml0ZShwb3dlck91dCwgSElHSCk7CiAgICBkZWxheSgzMDApOwoKICB9IGVsc2UgewoKICAgIHNldF9tdXRlKDEpOwogICAgZGVsYXkoMTAwKTsKICAgIGRpZ2l0YWxXcml0ZShwb3dlck91dCwgTE9XKTsKICAgIG1lbnVfYWN0aXZlID0gMTAwOwogIH0KfQoKdm9pZCBzdGFydFVwKCkgewogIGRlbGF5KDUwMCk7CiAgcHQyMjU4KCk7CiAgbGNkLnNldEN1cnNvcigwLCAwKTsKICBsY2QucHJpbnQoIiAgICBEYWFjV2F2ZSAgICAiKTsKICBkZWxheSgzMDApOwogIGxjZC5zZXRDdXJzb3IoMCwgMSk7CiAgbGNkLnByaW50KCIgICAgIEFVRElPUyAgICAgIik7CiAgZGVsYXkoMTUwMCk7CiAgbGNkLmNsZWFyKCk7CiAgZGVsYXkoMzAwKTsKICBsY2Quc2V0Q3Vyc29yKDAsIDApOwogIGxjZC5wcmludCgiICAgNkNILURWQyAgICAgICIpOwogIGxjZC5zZXRDdXJzb3IoMCwgMSk7CiAgbGNkLnByaW50KCIgICBMT0FESU5HLi4uICAgIik7CiAgZGVsYXkoMTIwMCk7CiAgbGNkLmNsZWFyKCk7CiAgZGVsYXkoMjAwKTsKICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgewogICAgY2gxVm9sKGkpOwogICAgY2gyVm9sKGkpOwogICAgY2gzVm9sKGkpOwogICAgY2g0Vm9sKGkpOwogICAgY2g1Vm9sKGkpOwogICAgY2g2Vm9sKGkpOwogIH0KfQoKLy9JUiBjb250cm9sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8Kdm9pZCBJUkNvbnRyb2woKSB7CiAgaWYgKGlycmVjdi5kZWNvZGUoJnJlc3VsdHMpKSB7CiAgICBzd2l0Y2ggKHJlc3VsdHMudmFsdWUpIHsKICAgICAgLy9wb3dlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KICAgICAgY2FzZSBpcl9wb3dlcjoKICAgICAgICBwb3dlcisrOwogICAgICAgIGlmIChwb3dlciA+IDEpIHBvd2VyID0gMDsKICAgICAgICBwb3dlclVwKCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAocG93ZXIgPT0gMSkgewogICAgICBzd2l0Y2ggKHJlc3VsdHMudmFsdWUpIHsKICAgICAgICAvL211dGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCiAgICAgICAgY2FzZSBpcl9tdXRlOgogICAgICAgICAgc291bmRNdXRlKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICAgIGlmIChtdXRlID09IDApIHsKICAgICAgICAgICAgLy9WT0wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCiAgICAgICAgICAgIGNhc2UgaXJfdm9sX3VwOgogICAgICAgICAgICAgIHZvbHVtZVVwKCk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIGlyX3ZvbF9kb3duOgogICAgICAgICAgICAgIHZvbHVtZURvd24oKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgLy9DSDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCiAgICAgICAgY2FzZSBpcl9jaF91cDoKICAgICAgICAgIHZvbHVtZU1lbnVVcCgpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgaXJfY2hfZG93bjoKICAgICAgICAgIHZvbHVtZU1lbnVEb3duKCk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaXJyZWN2LnJlc3VtZSgpOwogIH0KfQoKdm9pZCBsY2REaXNwbGF5KCkgewogIGludCBhLCBiLCBjOwogIHN3aXRjaCAobWVudV9hY3RpdmUpIHsKICAgIGNhc2UgMDoKICAgICAgLy92b2wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCiAgICAgIHN3aXRjaCAodm9sX21lbnUpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDAsIDEpOwogICAgICAgICAgLy8gICAgICAgKCIgICAgICAgIik7CiAgICAgICAgICBsY2QucHJpbnQoIk1BUy1WT0wiKTsKICAgICAgICAgIGxjZC5zZXRDdXJzb3IoMCwgMCk7CiAgICAgICAgICBjID0gbWFzX3ZvbCAtIG1hc1ZvbExpbWl0TWluOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMToKICAgICAgICAgIGxjZC5zZXRDdXJzb3IoMCwgMSk7CiAgICAgICAgICAvLyAgICAgICAoIiAgICAgICAiKTsKICAgICAgICAgIGxjZC5wcmludCgiQ0gxLVZPTCIpOwogICAgICAgICAgYyA9IGNoMV92b2w7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAyOgogICAgICAgICAgbGNkLnNldEN1cnNvcigwLCAxKTsKICAgICAgICAgIC8vICAgICAgICgiICAgICAgICIpOwogICAgICAgICAgbGNkLnByaW50KCJDSDItVk9MIik7CiAgICAgICAgICBjID0gY2gyX3ZvbDsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDM6CiAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDAsIDEpOwogICAgICAgICAgLy8gICAgICAgKCIgICAgICAgIik7CiAgICAgICAgICBsY2QucHJpbnQoIkNIMy1WT0wiKTsKICAgICAgICAgIGMgPSBjaDNfdm9sOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgNDoKICAgICAgICAgIGxjZC5zZXRDdXJzb3IoMCwgMSk7CiAgICAgICAgICAvLyAgICAgICAoIiAgICAgICAiKTsKICAgICAgICAgIGxjZC5wcmludCgiQ0g0LVZPTCIpOwogICAgICAgICAgYyA9IGNoNF92b2w7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSA1OgogICAgICAgICAgbGNkLnNldEN1cnNvcigwLCAxKTsKICAgICAgICAgIC8vICAgICAgICgiICAgICAgICIpOwogICAgICAgICAgbGNkLnByaW50KCJDSDUtVk9MIik7CiAgICAgICAgICBjID0gY2g1X3ZvbDsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDY6CiAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDAsIDEpOwogICAgICAgICAgLy8gICAgICAgKCIgICAgICAgIik7CiAgICAgICAgICBsY2QucHJpbnQoIkNINi1WT0wiKTsKICAgICAgICAgIGMgPSBjaDZfdm9sOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgYnJlYWs7CgogICAgY2FzZSAxMDA6CiAgICAgIGxjZC5zZXRDdXJzb3IoMCwgMCk7CiAgICAgIGxjZC5wcmludCgiICAgICAgICAgICAgICAgICIpOwogICAgICBsY2Quc2V0Q3Vyc29yKDAsIDEpOwogICAgICBpZiAobXV0ZUxjZERlbGF5ID09IDApIHsKICAgICAgICBpZiAoKG1pbGxpcygpIC0gbXV0ZUxjZFRpbWUpID49IG11dGVMY2RPblRpbWUpIHsKICAgICAgICAgIGxjZC5wcmludCgiICAgICAgICAgICAgICAgICIpOwogICAgICAgICAgbXV0ZUxjZERlbGF5ID0gMTsKICAgICAgICAgIG11dGVMY2RUaW1lID0gbWlsbGlzKCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmICgobWlsbGlzKCkgLSBtdXRlTGNkVGltZSkgPj0gbXV0ZUxjZE9mZlRpbWUpIHsKICAgICAgICAgIGxjZC5wcmludCgiICAgIFNUQU5EQlkgICAgICIpOwogICAgICAgICAgbXV0ZUxjZERlbGF5ID0gMDsKICAgICAgICAgIG11dGVMY2RUaW1lID0gbWlsbGlzKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGJyZWFrOwogIH0KICBpZiAobWVudV9hY3RpdmUgPT0gMCkgewogICAgaWYgKG11dGUgPT0gMSkgewogICAgICBsY2Quc2V0Q3Vyc29yKDAsIDApOwogICAgICBpZiAobXV0ZUxjZERlbGF5ID09IDApIHsKICAgICAgICBpZiAoKG1pbGxpcygpIC0gbXV0ZUxjZFRpbWUpID49IG11dGVMY2RPblRpbWUpIHsKICAgICAgICAgIGxjZC5wcmludCgiICAgICAgICIpOwogICAgICAgICAgbXV0ZUxjZERlbGF5ID0gMTsKICAgICAgICAgIG11dGVMY2RUaW1lID0gbWlsbGlzKCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmICgobWlsbGlzKCkgLSBtdXRlTGNkVGltZSkgPj0gbXV0ZUxjZE9mZlRpbWUpIHsKICAgICAgICAgIGxjZC5wcmludCgiTVVURSAgICIpOwogICAgICAgICAgbXV0ZUxjZERlbGF5ID0gMDsKICAgICAgICAgIG11dGVMY2RUaW1lID0gbWlsbGlzKCk7CiAgICAgICAgfQogICAgICB9CgogICAgfSBlbHNlIHsKICAgICAgbGNkLnNldEN1cnNvcigwLCAwKTsKICAgICAgbGNkLnByaW50KCI2Q0gtRFZDIik7CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspCiAgICAgIGxjZC5jcmVhdGVDaGFyKGksIGN1c3RvbV9udW1baV0pOwoKICAgIGludCB5OwogICAgaWYgKGMgPCAwKSB7CiAgICAgIGxjZC5zZXRDdXJzb3IoOCwgMSk7CiAgICAgIGxjZC5wcmludCgiLSIpOwogICAgICB5ID0gY2hWb2xMaW1pdE1heCAtIChjICsgY2hWb2xMaW1pdE1heCk7CiAgICB9IGVsc2UgaWYgKGMgPT0gY2hWb2xMaW1pdE1pbikgewogICAgICBsY2Quc2V0Q3Vyc29yKDgsIDEpOwogICAgICBsY2QucHJpbnQoIi0iKTsKICAgICAgeSA9IGNoVm9sTGltaXRNYXg7CiAgICB9IGVsc2UgewogICAgICBsY2Quc2V0Q3Vyc29yKDgsIDEpOwogICAgICBsY2QucHJpbnQoIiAiKTsKICAgICAgeSA9IGM7CiAgICB9CiAgICBhID0geSAvIDEwOwogICAgYiA9IHkgLSBhICogMTA7CgogICAgbGNkLnNldEN1cnNvcig5LCAwKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlnaXRfd2lkdGg7IGkrKykKICAgICAgbGNkLnByaW50KGN1c3RvbV9udW1fdG9wW2FdW2ldKTsKCiAgICBsY2Quc2V0Q3Vyc29yKDksIDEpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWdpdF93aWR0aDsgaSsrKQogICAgICBsY2QucHJpbnQoY3VzdG9tX251bV9ib3RbYV1baV0pOwoKICAgIGxjZC5zZXRDdXJzb3IoMTMsIDApOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWdpdF93aWR0aDsgaSsrKQogICAgICBsY2QucHJpbnQoY3VzdG9tX251bV90b3BbYl1baV0pOwoKICAgIGxjZC5zZXRDdXJzb3IoMTMsIDEpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWdpdF93aWR0aDsgaSsrKQogICAgICBsY2QucHJpbnQoY3VzdG9tX251bV9ib3RbYl1baV0pOwogIH0KfQoKLy9FRVBST00gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwp2b2lkIGVlcHJvbVVwZGF0ZSgpIHsKICBFRVBST00udXBkYXRlKDAsIG1hc192b2wpOwogIEVFUFJPTS51cGRhdGUoMSwgY2gxX3ZvbCArIDEwKTsKICBFRVBST00udXBkYXRlKDIsIGNoMl92b2wgKyAxMCk7CiAgRUVQUk9NLnVwZGF0ZSgzLCBjaDNfdm9sICsgMTApOwogIEVFUFJPTS51cGRhdGUoNCwgY2g0X3ZvbCArIDEwKTsKICBFRVBST00udXBkYXRlKDUsIGNoNV92b2wgKyAxMCk7CiAgRUVQUk9NLnVwZGF0ZSg2LCBjaDZfdm9sICsgMTApOwp9Cgp2b2lkIGVlcHJvbVJlYWQoKSB7CiAgbWFzX3ZvbCA9IEVFUFJPTS5yZWFkKDApOwogIGNoMV92b2wgPSBFRVBST00ucmVhZCgxKSAtIDEwOwogIGNoMl92b2wgPSBFRVBST00ucmVhZCgyKSAtIDEwOwogIGNoM192b2wgPSBFRVBST00ucmVhZCgzKSAtIDEwOwogIGNoNF92b2wgPSBFRVBST00ucmVhZCg0KSAtIDEwOwogIGNoNV92b2wgPSBFRVBST00ucmVhZCg1KSAtIDEwOwogIGNoNl92b2wgPSBFRVBST00ucmVhZCg2KSAtIDEwOwp9Cgp2b2lkIGJ0blByZXNzKCkgewogIHJldHVyblRpbWUgPSBtaWxsaXMoKTsKICByZXR1cm5fZCA9IDE7Cn0Kdm9pZCByZXR1cm5EZWxheSgpIHsKICBpZiAobWlsbGlzKCkgLSByZXR1cm5UaW1lID4gNTAwMCAmJiByZXR1cm5fZCA9PSAxICYmIHZvbF9tZW51ICE9IDApIHsKICAgIHZvbF9tZW51ID0gMDsKICAgIHJldHVybl9kID0gMDsKICAgIGxjZC5jbGVhcigpOwogIH0KfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgog
#include <Wire.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <IRremote.h>
#include <PT2258.h>
#define PT2258_address 0b1000100
#define RotaryB 11
#define RotaryA 12
#define RotarySW 13
#define SW1 A1
#define SW2 A2
#define SW3 A3
#define RECV_PIN 8
#define powerOut 10
// IR HEX code
#define ir_power 0x807F827D // IR Power ON/OFF
#define ir_mute 0x807F42BD // IR Mute
#define ir_vol_up 0x807F906F // IR Vol++
#define ir_vol_down 0x807FA05F // IR Vol--
#define ir_ch_up 0x807F40BF // IR CH++
#define ir_ch_down 0x807FC03F // IR CH--
LiquidCrystal_I2C lcd(0x27, 16, 2);
byte custom_num[8][8] = {
{ B00111, B01111, B11111, B11111, B11111, B11111, B11111, B11111 },
{ B11111, B11111, B11111, B00000, B00000, B00000, B00000, B00000 },
{ B11100, B11110, B11111, B11111, B11111, B11111, B11111, B11111 },
{ B11111, B11111, B11111, B11111, B11111, B11111, B01111, B00111 },
{ B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111 },
{ B11111, B11111, B11111, B11111, B11111, B11111, B11110, B11100 },
{ B11111, B11111, B11111, B00000, B00000, B00000, B11111, B11111 },
{ B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111 }
};
const int digit_width = 3;
const char custom_num_top[10][digit_width] = { 0, 1, 2, 1, 2, 32, 6, 6, 2, 6, 6, 2, 3, 4, 7, 7, 6, 6, 0, 6, 6, 1, 1, 2, 0, 6, 2, 0, 6, 2 };
const char custom_num_bot[10][digit_width] = { 3, 4, 5, 4, 7, 4, 7, 4, 4, 4, 4, 5, 32, 32, 7, 4, 4, 5, 3, 4, 5, 32, 32, 7, 3, 4, 5, 4, 4, 5 };
unsigned long returnTime;
unsigned long lastRotaryTime = 0;
unsigned long lastButtonTime = 0;
unsigned long muteLcdTime = 0;
int rotaryDelayTime = 200;
int buttonDelayTime = 100;
int muteLcdDelay = 0;
int muteLcdOnTime = 500;
int muteLcdOffTime = 500;
int masVolLimitMax = 69;
int masVolLimitMin = 19;
int chVolLimitMax = 10;
int chVolLimitMin = -10;
int lastEncoded = 0;
int vol_menu, mas_vol, ch1_vol, ch2_vol, ch3_vol, ch4_vol, ch5_vol, ch6_vol, mute, ch1, ch2, ch3, ch4, ch5, ch6;
int return_d, power, menu_active;
set_mute;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
Wire.begin();
lcd.begin(16, 2);
irrecv.enableIRIn();
pinMode(RotaryA, INPUT);
pinMode(RotaryB, INPUT);
pinMode(RotarySW, INPUT_PULLUP);
pinMode(SW1, INPUT);
pinMode(SW2, INPUT);
pinMode(SW3, INPUT);
pinMode(powerOut, OUTPUT);
digitalWrite(RotaryA, HIGH);
digitalWrite(RotaryB, HIGH);
power = 0;
eepromRead();
startUp();
powerUp();
}
void loop() {
lcdDisplay();
eepromUpdate();
IRControl();
returnDelay();
//Power -------------------------------------------------//
if (analogRead(SW1) > 900) {
if (millis() - lastButtonTime > buttonDelayTime) {
power++;
if (power > 1) power = 0;
powerUp();
}
lastButtonTime = millis();
}
if (power == 1) {
updateEncoder();
//Mute -------------------------------------------------//
if (analogRead(SW2) > 900) {
if (millis() - lastButtonTime > buttonDelayTime) {
soundMute();
}
lastButtonTime = millis();
}
if (digitalRead(RotarySW) == LOW) {
if (millis() - lastButtonTime > buttonDelayTime) {
volumeMenuUp();
}
lastButtonTime = millis();
}
}
}
void updateEncoder() {
int CLK = digitalRead(RotaryA);
int DT = digitalRead(RotaryB);
int encoded = (CLK << 1) | DT;
int addData = (lastEncoded << 2) | encoded;
if (addData == 0b1101 || addData == 0b0100 || addData == 0b0010 || addData == 0b1011) {
if ((millis() - lastRotaryTime) > rotaryDelayTime) {
volumeUp();
lastRotaryTime = millis();
}
}
if (addData == 0b1110 || addData == 0b0111 || addData == 0b0001 || addData == 0b1000) {
if ((millis() - lastRotaryTime) > rotaryDelayTime) {
volumeDown();
lastRotaryTime = millis();
}
}
lastEncoded = encoded;
}
void volumeMenuUp() {
vol_menu++;
if (vol_menu > 6) vol_menu = 0;
btnPress();
}
void volumeMenuDown() {
vol_menu--;
if (vol_menu < 0) vol_menu = 6;
btnPress();
}
void volumeUp() {
if (vol_menu == 0) {
mas_vol++;
masVol();
}
if (vol_menu == 1) {
ch1_vol++;
ch1Vol(1);
}
if (vol_menu == 2) {
ch2_vol++;
ch2Vol(1);
}
if (vol_menu == 3) {
ch3_vol++;
ch3Vol(1);
}
if (vol_menu == 4) {
ch4_vol++;
ch4Vol(1);
}
if (vol_menu == 5) {
ch5_vol++;
ch5Vol(1);
}
if (vol_menu == 6) {
ch6_vol++;
ch6Vol(1);
}
btnPress();
}
void volumeDown() {
if (vol_menu == 0) {
mas_vol--;
masVol();
}
if (vol_menu == 1) {
ch1_vol--;
ch1Vol(1);
}
if (vol_menu == 2) {
ch2_vol--;
ch2Vol(1);
}
if (vol_menu == 3) {
ch3_vol--;
ch3Vol(1);
}
if (vol_menu == 4) {
ch4_vol--;
ch4Vol(1);
}
if (vol_menu == 5) {
ch5_vol--;
ch5Vol(1);
}
if (vol_menu == 6) {
ch6_vol--;
ch6Vol(1);
}
btnPress();
}
void soundMute() {
mute++;
if (mute > 1) mute = 0;
set_mute(mute);
}
void masVol() {
if (mas_vol > masVolLimitMax) mas_vol = masVolLimitMax;
if (mas_vol < masVolLimitMin) mas_vol = masVolLimitMin;
if (mute == 0) {
if (mas_vol == masVolLimitMin) set_mute(1);
else set_mute(0);
}
for (int i = 1; i < 5; i++) {
ch1Vol(i);
ch2Vol(i);
ch3Vol(i);
ch4Vol(i);
ch5Vol(i);
ch6Vol(i);
}
}
void ch1Vol(int adr) {
if (ch1_vol > chVolLimitMax) ch1_vol = chVolLimitMax;
if (ch1_vol < chVolLimitMin) ch1_vol = chVolLimitMin;
ch1 = mas_vol + ch1_vol;
set_address(adr);
set_ch1(ch1);
}
void ch2Vol(int adr) {
if (ch2_vol > chVolLimitMax) ch2_vol = chVolLimitMax;
if (ch2_vol < chVolLimitMin) ch2_vol = chVolLimitMin;
ch2 = mas_vol + ch2_vol;
set_address(adr);
set_ch2(ch2);
}
void ch3Vol(int adr) {
if (ch3_vol > chVolLimitMax) ch3_vol = chVolLimitMax;
if (ch3_vol < chVolLimitMin) ch3_vol = chVolLimitMin;
ch3 = mas_vol + ch3_vol;
set_address(adr);
set_ch3(ch3);
}
void ch4Vol(int adr) {
if (ch4_vol > chVolLimitMax) ch4_vol = chVolLimitMax;
if (ch4_vol < chVolLimitMin) ch4_vol = chVolLimitMin;
ch4 = mas_vol + ch4_vol;
set_address(adr);
set_ch4(ch4);
}
void ch5Vol(int adr) {
if (ch5_vol > chVolLimitMax) ch5_vol = chVolLimitMax;
if (ch5_vol < chVolLimitMin) ch5_vol = chVolLimitMin;
ch5 = mas_vol + ch5_vol;
set_address(adr);
set_ch5(ch5);
}
void ch6Vol(int adr) {
if (ch6_vol > chVolLimitMax) ch6_vol = chVolLimitMax;
if (ch6_vol < chVolLimitMin) ch6_vol = chVolLimitMin;
ch6 = mas_vol + ch6_vol;
set_address(adr);
set_ch6(ch6);
}
void powerUp() {
if (power == 1) {
lcd.clear();
delay(500);
lcd.setCursor(0, 1);
lcd.print(" LOADING... ");
delay(1000);
lcd.clear();
if (mas_vol == masVolLimitMin) {
set_mute(1);
} else {
mute = 0;
set_mute(mute);
}
vol_menu = 0;
menu_active = 0;
digitalWrite(powerOut, HIGH);
delay(300);
} else {
set_mute(1);
delay(100);
digitalWrite(powerOut, LOW);
menu_active = 100;
}
}
void startUp() {
delay(500);
pt2258();
lcd.setCursor(0, 0);
lcd.print(" DaacWave ");
delay(300);
lcd.setCursor(0, 1);
lcd.print(" AUDIOS ");
delay(1500);
lcd.clear();
delay(300);
lcd.setCursor(0, 0);
lcd.print(" 6CH-DVC ");
lcd.setCursor(0, 1);
lcd.print(" LOADING... ");
delay(1200);
lcd.clear();
delay(200);
for (int i = 1; i < 5; i++) {
ch1Vol(i);
ch2Vol(i);
ch3Vol(i);
ch4Vol(i);
ch5Vol(i);
ch6Vol(i);
}
}
//IR control --------------------------------------------------------------------------------//
void IRControl() {
if (irrecv.decode(&results)) {
switch (results.value) {
//power -------------------------------------------------//
case ir_power:
power++;
if (power > 1) power = 0;
powerUp();
break;
}
if (power == 1) {
switch (results.value) {
//mute -------------------------------------------------//
case ir_mute:
soundMute();
break;
if (mute == 0) {
//VOL -------------------------------------------------//
case ir_vol_up:
volumeUp();
break;
case ir_vol_down:
volumeDown();
break;
}
//CH1 -------------------------------------------------//
case ir_ch_up:
volumeMenuUp();
break;
case ir_ch_down:
volumeMenuDown();
break;
}
}
irrecv.resume();
}
}
void lcdDisplay() {
int a, b, c;
switch (menu_active) {
case 0:
//vol ----------------------------------------------//
switch (vol_menu) {
case 0:
lcd.setCursor(0, 1);
// (" ");
lcd.print("MAS-VOL");
lcd.setCursor(0, 0);
c = mas_vol - masVolLimitMin;
break;
case 1:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH1-VOL");
c = ch1_vol;
break;
case 2:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH2-VOL");
c = ch2_vol;
break;
case 3:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH3-VOL");
c = ch3_vol;
break;
case 4:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH4-VOL");
c = ch4_vol;
break;
case 5:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH5-VOL");
c = ch5_vol;
break;
case 6:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH6-VOL");
c = ch6_vol;
break;
}
break;
case 100:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
if (muteLcdDelay == 0) {
if ((millis() - muteLcdTime) >= muteLcdOnTime) {
lcd.print(" ");
muteLcdDelay = 1;
muteLcdTime = millis();
}
} else {
if ((millis() - muteLcdTime) >= muteLcdOffTime) {
lcd.print(" STANDBY ");
muteLcdDelay = 0;
muteLcdTime = millis();
}
}
break;
}
if (menu_active == 0) {
if (mute == 1) {
lcd.setCursor(0, 0);
if (muteLcdDelay == 0) {
if ((millis() - muteLcdTime) >= muteLcdOnTime) {
lcd.print(" ");
muteLcdDelay = 1;
muteLcdTime = millis();
}
} else {
if ((millis() - muteLcdTime) >= muteLcdOffTime) {
lcd.print("MUTE ");
muteLcdDelay = 0;
muteLcdTime = millis();
}
}
} else {
lcd.setCursor(0, 0);
lcd.print("6CH-DVC");
}
for (int i = 0; i < 8; i++)
lcd.createChar(i, custom_num[i]);
int y;
if (c < 0) {
lcd.setCursor(8, 1);
lcd.print("-");
y = chVolLimitMax - (c + chVolLimitMax);
} else if (c == chVolLimitMin) {
lcd.setCursor(8, 1);
lcd.print("-");
y = chVolLimitMax;
} else {
lcd.setCursor(8, 1);
lcd.print(" ");
y = c;
}
a = y / 10;
b = y - a * 10;
lcd.setCursor(9, 0);
for (int i = 0; i < digit_width; i++)
lcd.print(custom_num_top[a][i]);
lcd.setCursor(9, 1);
for (int i = 0; i < digit_width; i++)
lcd.print(custom_num_bot[a][i]);
lcd.setCursor(13, 0);
for (int i = 0; i < digit_width; i++)
lcd.print(custom_num_top[b][i]);
lcd.setCursor(13, 1);
for (int i = 0; i < digit_width; i++)
lcd.print(custom_num_bot[b][i]);
}
}
//EEPROM -----------------------------------------------------//
void eepromUpdate() {
EEPROM.update(0, mas_vol);
EEPROM.update(1, ch1_vol + 10);
EEPROM.update(2, ch2_vol + 10);
EEPROM.update(3, ch3_vol + 10);
EEPROM.update(4, ch4_vol + 10);
EEPROM.update(5, ch5_vol + 10);
EEPROM.update(6, ch6_vol + 10);
}
void eepromRead() {
mas_vol = EEPROM.read(0);
ch1_vol = EEPROM.read(1) - 10;
ch2_vol = EEPROM.read(2) - 10;
ch3_vol = EEPROM.read(3) - 10;
ch4_vol = EEPROM.read(4) - 10;
ch5_vol = EEPROM.read(5) - 10;
ch6_vol = EEPROM.read(6) - 10;
}
void btnPress() {
returnTime = millis();
return_d = 1;
}
void returnDelay() {
if (millis() - returnTime > 5000 && return_d == 1 && vol_menu != 0) {
vol_menu = 0;
return_d = 0;
lcd.clear();
}
}
if (power == 1) {
updateEncoder();
//Mute -------------------------------------------------//
if (analogRead(SW2) > 900) {
if (millis() - lastButtonTime > buttonDelayTime) {
soundMute();
}
lastButtonTime = millis();
}
if (digitalRead(RotarySW) == LOW) {
if (millis() - lastButtonTime > buttonDelayTime) {
volumeMenuUp();
}
lastButtonTime = millis();
}
}
}
void updateEncoder() {
int CLK = digitalRead(RotaryA);
int DT = digitalRead(RotaryB);
int encoded = (CLK << 1) | DT;
int addData = (lastEncoded << 2) | encoded;
if (addData == 0b1101 || addData == 0b0100 || addData == 0b0010 || addData == 0b1011) {
if ((millis() - lastRotaryTime) > rotaryDelayTime) {
volumeUp();
lastRotaryTime = millis();
}
}
if (addData == 0b1110 || addData == 0b0111 || addData == 0b0001 || addData == 0b1000) {
if ((millis() - lastRotaryTime) > rotaryDelayTime) {
volumeDown();
lastRotaryTime = millis();
}
}
lastEncoded = encoded;
}
void volumeMenuUp() {
vol_menu++;
if (vol_menu > 6) vol_menu = 0;
btnPress();
}
void volumeMenuDown() {
vol_menu--;
if (vol_menu < 0) vol_menu = 6;
btnPress();
}
void volumeUp() {
if (vol_menu == 0) {
mas_vol++;
masVol();
}
if (vol_menu == 1) {
ch1_vol++;
ch1Vol(1);
}
if (vol_menu == 2) {
ch2_vol++;
ch2Vol(1);
}
if (vol_menu == 3) {
ch3_vol++;
ch3Vol(1);
}
if (vol_menu == 4) {
ch4_vol++;
ch4Vol(1);
}
if (vol_menu == 5) {
ch5_vol++;
ch5Vol(1);
}
if (vol_menu == 6) {
ch6_vol++;
ch6Vol(1);
}
btnPress();
}
void volumeDown() {
if (vol_menu == 0) {
mas_vol--;
masVol();
}
if (vol_menu == 1) {
ch1_vol--;
ch1Vol(1);
}
if (vol_menu == 2) {
ch2_vol--;
ch2Vol(1);
}
if (vol_menu == 3) {
ch3_vol--;
ch3Vol(1);
}
if (vol_menu == 4) {
ch4_vol--;
ch4Vol(1);
}
if (vol_menu == 5) {
ch5_vol--;
ch5Vol(1);
}
if (vol_menu == 6) {
ch6_vol--;
ch6Vol(1);
}
btnPress();
}
void soundMute() {
mute++;
if (mute > 1) mute = 0;
set_mute(mute);
}
void masVol() {
if (mas_vol > masVolLimitMax) mas_vol = masVolLimitMax;
if (mas_vol < masVolLimitMin) mas_vol = masVolLimitMin;
if (mute == 0) {
if (mas_vol == masVolLimitMin) set_mute(1);
else set_mute(0);
}
for (int i = 1; i < 5; i++) {
ch1Vol(i);
ch2Vol(i);
ch3Vol(i);
ch4Vol(i);
ch5Vol(i);
ch6Vol(i);
}
}
void ch1Vol(int adr) {
if (ch1_vol > chVolLimitMax) ch1_vol = chVolLimitMax;
if (ch1_vol < chVolLimitMin) ch1_vol = chVolLimitMin;
ch1 = mas_vol + ch1_vol;
set_address(adr);
set_ch1(ch1);
}
void ch2Vol(int adr) {
if (ch2_vol > chVolLimitMax) ch2_vol = chVolLimitMax;
if (ch2_vol < chVolLimitMin) ch2_vol = chVolLimitMin;
ch2 = mas_vol + ch2_vol;
set_address(adr);
set_ch2(ch2);
}
void ch3Vol(int adr) {
if (ch3_vol > chVolLimitMax) ch3_vol = chVolLimitMax;
if (ch3_vol < chVolLimitMin) ch3_vol = chVolLimitMin;
ch3 = mas_vol + ch3_vol;
set_address(adr);
set_ch3(ch3);
}
void ch4Vol(int adr) {
if (ch4_vol > chVolLimitMax) ch4_vol = chVolLimitMax;
if (ch4_vol < chVolLimitMin) ch4_vol = chVolLimitMin;
ch4 = mas_vol + ch4_vol;
set_address(adr);
set_ch4(ch4);
}
void ch5Vol(int adr) {
if (ch5_vol > chVolLimitMax) ch5_vol = chVolLimitMax;
if (ch5_vol < chVolLimitMin) ch5_vol = chVolLimitMin;
ch5 = mas_vol + ch5_vol;
set_address(adr);
set_ch5(ch5);
}
void ch6Vol(int adr) {
if (ch6_vol > chVolLimitMax) ch6_vol = chVolLimitMax;
if (ch6_vol < chVolLimitMin) ch6_vol = chVolLimitMin;
ch6 = mas_vol + ch6_vol;
set_address(adr);
set_ch6(ch6);
}
void powerUp() {
if (power == 1) {
lcd.clear();
delay(500);
lcd.setCursor(0, 1);
lcd.print(" LOADING... ");
delay(1000);
lcd.clear();
if (mas_vol == masVolLimitMin) {
set_mute(1);
} else {
mute = 0;
set_mute(mute);
}
vol_menu = 0;
menu_active = 0;
digitalWrite(powerOut, HIGH);
delay(300);
} else {
set_mute(1);
delay(100);
digitalWrite(powerOut, LOW);
menu_active = 100;
}
}
void startUp() {
delay(500);
pt2258();
lcd.setCursor(0, 0);
lcd.print(" DaacWave ");
delay(300);
lcd.setCursor(0, 1);
lcd.print(" AUDIOS ");
delay(1500);
lcd.clear();
delay(300);
lcd.setCursor(0, 0);
lcd.print(" 6CH-DVC ");
lcd.setCursor(0, 1);
lcd.print(" LOADING... ");
delay(1200);
lcd.clear();
delay(200);
for (int i = 1; i < 5; i++) {
ch1Vol(i);
ch2Vol(i);
ch3Vol(i);
ch4Vol(i);
ch5Vol(i);
ch6Vol(i);
}
}
//IR control --------------------------------------------------------------------------------//
void IRControl() {
if (irrecv.decode(&results)) {
switch (results.value) {
//power -------------------------------------------------//
case ir_power:
power++;
if (power > 1) power = 0;
powerUp();
break;
}
if (power == 1) {
switch (results.value) {
//mute -------------------------------------------------//
case ir_mute:
soundMute();
break;
if (mute == 0) {
//VOL -------------------------------------------------//
case ir_vol_up:
volumeUp();
break;
case ir_vol_down:
volumeDown();
break;
}
//CH1 -------------------------------------------------//
case ir_ch_up:
volumeMenuUp();
break;
case ir_ch_down:
volumeMenuDown();
break;
}
}
irrecv.resume();
}
}
void lcdDisplay() {
int a, b, c;
switch (menu_active) {
case 0:
//vol ----------------------------------------------//
switch (vol_menu) {
case 0:
lcd.setCursor(0, 1);
// (" ");
lcd.print("MAS-VOL");
lcd.setCursor(0, 0);
c = mas_vol - masVolLimitMin;
break;
case 1:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH1-VOL");
c = ch1_vol;
break;
case 2:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH2-VOL");
c = ch2_vol;
break;
case 3:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH3-VOL");
c = ch3_vol;
break;
case 4:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH4-VOL");
c = ch4_vol;
break;
case 5:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH5-VOL");
c = ch5_vol;
break;
case 6:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CH6-VOL");
c = ch6_vol;
break;
}
break;
case 100:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
if (muteLcdDelay == 0) {
if ((millis() - muteLcdTime) >= muteLcdOnTime) {
lcd.print(" ");
muteLcdDelay = 1;
muteLcdTime = millis();
}
} else {
if ((millis() - muteLcdTime) >= muteLcdOffTime) {
lcd.print(" STANDBY ");
muteLcdDelay = 0;
muteLcdTime = millis();
}
}
break;
}
if (menu_active == 0) {
if (mute == 1) {
lcd.setCursor(0, 0);
if (muteLcdDelay == 0) {
if ((millis() - muteLcdTime) >= muteLcdOnTime) {
lcd.print(" ");
muteLcdDelay = 1;
muteLcdTime = millis();
}
} else {
if ((millis() - muteLcdTime) >= muteLcdOffTime) {
lcd.print("MUTE ");
muteLcdDelay = 0;
muteLcdTime = millis();
}
}
} else {
lcd.setCursor(0, 0);
lcd.print("6CH-DVC");
}
for (int i = 0; i < 8; i++)
lcd.createChar(i, custom_num[i]);
int y;
if (c < 0) {
lcd.setCursor(8, 1);
lcd.print("-");
y = chVolLimitMax - (c + chVolLimitMax);
} else if (c == chVolLimitMin) {
lcd.setCursor(8, 1);
lcd.print("-");
y = chVolLimitMax;
} else {
lcd.setCursor(8, 1);
lcd.print(" ");
y = c;
}
a = y / 10;
b = y - a * 10;
lcd.setCursor(9, 0);
for (int i = 0; i < digit_width; i++)
lcd.print(custom_num_top[a][i]);
lcd.setCursor(9, 1);
for (int i = 0; i < digit_width; i++)
lcd.print(custom_num_bot[a][i]);
lcd.setCursor(13, 0);
for (int i = 0; i < digit_width; i++)
lcd.print(custom_num_top[b][i]);
lcd.setCursor(13, 1);
for (int i = 0; i < digit_width; i++)
lcd.print(custom_num_bot[b][i]);
}
}
//EEPROM -----------------------------------------------------//
void eepromUpdate() {
EEPROM.update(0, mas_vol);
EEPROM.update(1, ch1_vol + 10);
EEPROM.update(2, ch2_vol + 10);
EEPROM.update(3, ch3_vol + 10);
EEPROM.update(4, ch4_vol + 10);
EEPROM.update(5, ch5_vol + 10);
EEPROM.update(6, ch6_vol + 10);
}
void eepromRead() {
mas_vol = EEPROM.read(0);
ch1_vol = EEPROM.read(1) - 10;
ch2_vol = EEPROM.read(2) - 10;
ch3_vol = EEPROM.read(3) - 10;
ch4_vol = EEPROM.read(4) - 10;
ch5_vol = EEPROM.read(5) - 10;
ch6_vol = EEPROM.read(6) - 10;
}
void btnPress() {
returnTime = millis();
return_d = 1;
}
void returnDelay() {
if (millis() - returnTime > 5000 && return_d == 1 && vol_menu != 0) {
vol_menu = 0;
return_d = 0;
lcd.clear();
}
}