// AX2358 5.1 Surround System
// DaacWaves <https://d...content-available-to-author-only...t.com>
#include <Wire.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <IRremote.h>
#define AX2358_address 0b1001010
#define btn_delay 300
#define sw01 9 // SW
#define sw02 11 // DT
#define sw03 10 // CLK
#define sw04 A0 // Input
#define sw05 A1 // Mute
#define sw06 A2 // Power
#define sw_power 13 // Out
// IR HEX code
#define ir_power 0x807F827D // IR power ON/OFF
#define ir_mute 0x609FFF80 // IR mute
#define ir_in_0 0x807F629D // IR input USB
#define ir_in_1 0x807F52AD // IR input BLU
#define ir_in_2 0x807FA25D // IR input FM
#define ir_in_3 0x807F22DD // IR input AUX
#define ir_in_4 0x807F20DF // IR input DVD
#define ir_vol_i 0x807F906F // IR vol++
#define ir_vol_d 0x807FA05F // IR vol--
#define ir_fl_i 0x807F40BF // IR fl++
#define ir_fl_d 0x807FC03F // IR fl--
#define ir_fr_i 0x807F00FF // IR fr++
#define ir_fr_d 0x807F807F // IR fr--
#define ir_sl_i 0x807F48B7 // IR sl++
#define ir_sl_d 0x807FC837 // IR sl--
#define ir_sr_i 0x807F08F7 // IR sr++
#define ir_sr_d 0x807F8877 // IR sr--
#define ir_cn_i 0x807F50AF // IR cn++
#define ir_cn_d 0x807F609F // IR cn--
#define ir_sub_i 0x807FD02F // IR sub++
#define ir_sub_d 0x807FE01F // IR sub--
#define ir_sp_mode 0x807F0AF5 // IR speaker mode change
#define ir_surr_mode 0x807FA857 // IR surround ON/OFF
#define ir_mix_mode 0x00000000 // IR -6dB ON/OFF
#define ir_reset 0x807F1AE5 // IR reset
IRrecv irrecv(8);
decode_results results;
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};
byte arrow_right[8] = {B00000, B10000, B11000, B11100, B11110, B11100, B11000, B10000};
LiquidCrystal_I2C lcd(0x27, 16, 2);
int in
, mute
, return_d
, surr
, mix
, a
, b
, x
, power
, menu
, menu_active
, ch_mute
, speaker_mode
, btn_press
, long_press
, vol_menu
, vol_menu_jup
, reset;int fl, fr, sl, sr, cn, sub, ir_menu, ir_on, mas_vol, fl_vol, fr_vol, sl_vol, sr_vol, cn_vol, sub_vol;
long btn_timer = 0;
long long_press_time = 600;
void setup() {
Wire.begin();
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(sw01, INPUT); // SW
pinMode(sw02, INPUT); // DT
pinMode(sw03, INPUT); // CLK
pinMode(sw04, INPUT); // Input
pinMode(sw05, INPUT); // Mute
pinMode(sw06, INPUT); // Power
pinMode(sw_power, OUTPUT); // Out
digitalWrite(sw_power, LOW);
lcd.begin(16, 2);
power = 0;
eeprom_read();
start_up();
power_up();
}
void loop() {
lcd_update();
eeprom_update();
ir_control();
return_delay();
if (menu_active == 0) {
custom_num_shape();
} else {
custom_shape();
}
//power -------------------------------------------------//
if (analogRead(sw06) > 900) {
power++;
if (power > 1) {
power = 0;
}
power_up();
delay(btn_delay);
}
if (power == 1) {
//select input -------------------------------------------------//
if (analogRead(sw04) > 900) {
in++;
set_in();
delay(btn_delay);
}
//select menu -------------------------------------------------//
if (digitalRead(sw01) == LOW) {
if (btn_press == 0) {
btn_press = 1;
btn_timer = millis();
}
if ((millis() - btn_timer > long_press_time) && (long_press == 0) && (menu_active == 0)) {
long_press = 1;
menu_active = 1;
menu = 1;
btn_cl();
lcd.clear();
} else if ((millis() - btn_timer > long_press_time) && (long_press == 0) && (menu_active == 1)) {
long_press = 1;
menu_active = 0;
vol_menu = 0;
btn_cl();
lcd.clear();
}
} else {
if (btn_press == 1) {
if (long_press == 1) {
long_press = 0;
} else {
if (menu_active == 1) {
menu++;
if (menu > 4) {
menu = 1;
}
btn_cl();
lcd.clear();
} else if (menu_active == 0 && speaker_mode == 0) {
vol_menu++;
if (vol_menu > 6) {
vol_menu = 0;
}
btn_cl();
} else if (menu_active == 0 && speaker_mode == 1) {
vol_menu++;
if (vol_menu_jup == 0) {
if (vol_menu > 2) {
vol_menu = 6;
vol_menu_jup = 1;
}
}
if (vol_menu_jup == 1) {
if (vol_menu > 6) {
vol_menu = 0;
vol_menu_jup = 0;
}
}
btn_cl();
}
}
btn_press = 0;
}
}
//mute -------------------------------------------------//
if (analogRead(sw05) > 900 && mas_vol != 19) {
mute++;
if (mute == 1) {
menu_active = 99;
} else {
menu_active = 0;
}
set_mute();
delay(btn_delay);
lcd.clear();
}
}
//menu active 0 -------------------------------------------------//
if (menu_active == 0) {
if (digitalRead(sw02) == LOW) {
if (vol_menu == 0) {
mas_vol++;
}
if (vol_menu == 1) {
fl_vol++;
}
if (vol_menu == 2) {
fr_vol++;
}
if (vol_menu == 3) {
sl_vol++;
}
if (vol_menu == 4) {
sr_vol++;
}
if (vol_menu == 5) {
cn_vol++;
}
if (vol_menu == 6) {
sub_vol++;
}
set_mas_vol();
set_fl();
set_fr();
set_sub();
if (speaker_mode == 0) {
set_sl();
set_sr();
set_cn();
}
btn_cl();
}
if (digitalRead(sw03) == LOW) {
if (vol_menu == 0) {
mas_vol--;
}
if (vol_menu == 1) {
fl_vol--;
}
if (vol_menu == 2) {
fr_vol--;
}
if (vol_menu == 3) {
sl_vol--;
}
if (vol_menu == 4) {
sr_vol--;
}
if (vol_menu == 5) {
cn_vol--;
}
if (vol_menu == 6) {
sub_vol--;
}
set_mas_vol();
set_fl();
set_fr();
set_sub();
if (speaker_mode == 0) {
set_sl();
set_sr();
set_cn();
}
btn_cl();
}
}
//menu active 1 -------------------------------------------------//
if (menu_active == 1) {
if (menu == 1) {
if (digitalRead(sw02) == LOW) {
surr++;
set_surr();
btn_cl();
}
}
if (menu == 2) {
if (digitalRead(sw02) == LOW) {
speaker_mode++;
if (speaker_mode == 1) {
vol_menu_jup = 0;
}
set_speaker_mode();
btn_cl();
}
}
if (menu == 3) {
if (digitalRead(sw02) == LOW) {
mix++;
set_mix();
btn_cl();
}
}
if (menu == 4) {
if (digitalRead(sw02) == LOW) {
set_reset();
btn_cl();
}
}
}
}
//eeprom -----------------------------------------------------//
void eeprom_update() {
EEPROM.update(0, in);
EEPROM.update(1, mas_vol);
EEPROM.update(2, fl_vol + 10);
EEPROM.update(3, fr_vol + 10);
EEPROM.update(4, sl_vol + 10);
EEPROM.update(5, sr_vol + 10);
EEPROM.update(6, cn_vol + 10);
EEPROM.update(7, sub_vol + 10);
EEPROM.update(8, surr);
EEPROM.update(9, speaker_mode);
EEPROM.update(10, mix);
}
void eeprom_read() {
in = EEPROM.read(0);
mas_vol = EEPROM.read(1);
fl_vol = EEPROM.read(2) - 10;
fr_vol = EEPROM.read(3) - 10;
sl_vol = EEPROM.read(4) - 10;
sr_vol = EEPROM.read(5) - 10;
cn_vol = EEPROM.read(6) - 10;
sub_vol = EEPROM.read(7) - 10;
surr = EEPROM.read(8);
speaker_mode = EEPROM.read(9);
mix = EEPROM.read(10);
}
void btn_cl() {
delay(btn_delay);
return_d = 1;
}
void ir_cl() {
return_d = 1;
}
void return_delay() {
if (millis
() - time > 5000 && return_d
== 1 && mute
== 0 && menu_active
!= 0) { menu_active = 0;
vol_menu = 0;
return_d = 0;
lcd.clear();
} else if (millis
() - time > 5000 && return_d
== 1 && mute
== 0 && menu_active
== 0) { vol_menu = 0;
return_d = 0;
}
}
//power up -----------------------------------------------------//
void power_up() {
if (power == 1) {
lcd.clear();
delay(500);
lcd.setCursor(0, 1);
lcd.print(" LOADING... ");
delay(1000);
lcd.clear();
if (mas_vol > 19) {
mute = 0;
}
set_mute();
vol_menu = 0;
menu_active = 0;
delay(300);
ir_on = 1;
vol_menu_jup = 0;
digitalWrite(sw_power, HIGH);
} else {
(sw_power, LOW);
mute = 1;
set_mute();
delay(100);
menu_active = 100;
ir_on = 0;
}
}
void start_up() {
mute = 1;
set_mute();
delay(500);
lcd.setCursor(0, 0);
lcd.print(" Ui Tech ");
delay(500);
lcd.setCursor(0, 1);
lcd.print(" 5.1 SYSTEM ");
delay(1000);
lcd.clear();
delay(300);
lcd.setCursor(0, 1);
lcd.print(" LOADING... ");
delay(1500);
lcd.clear();
delay(300);
AX2358();
set_in();
set_surr();
set_mix();
set_fl();
set_fr();
set_sl();
set_sr();
set_cn();
set_sub();
}
//IR control --------------------------------------------------------------------------------//
void ir_control() {
if ( irrecv.decode( &results )) {
switch (results.value) {
//power -------------------------------------------------//
case ir_power:
power++;
if (power > 1) {
power = 0;
}
power_up();
break;
}
if (ir_on == 1) {
switch (results.value) {
//mute -------------------------------------------------//
case ir_mute:
if (mas_vol != 19) {
mute++;
if (mute == 1) {
menu_active = 99;
} else {
menu_active = 0;
}
set_mute();
lcd.clear();
}
break;
//select input -------------------------------------------------//
case ir_in_0:
in = 0;
set_in();
ir_cl();
break;
case ir_in_1:
in = 1;
set_in();
ir_cl();
break;
case ir_in_2:
in = 2;
set_in();
ir_cl();
break;
case ir_in_3:
in = 3;
set_in();
ir_cl();
break;
case ir_in_4:
in = 4;
set_in();
ir_cl();
break;
}
}
if (ir_on == 1 && menu_active == 0) {
switch (results.value) {
//VOL -------------------------------------------------//
case ir_vol_i:
if (speaker_mode == 0 || speaker_mode == 1) {
mas_vol++;
vol_menu = 0;
set_mas_vol();
set_fl();
set_fr();
set_sub();
if (speaker_mode == 0) {
set_sl();
set_sr();
set_cn();
}
}
break;
case ir_vol_d:
if (speaker_mode == 0 || speaker_mode == 1) {
mas_vol--;
vol_menu = 0;
set_mas_vol();
set_fl();
set_fr();
set_sub();
if (speaker_mode == 0) {
set_sl();
set_sr();
set_cn();
}
}
break;
//FL -------------------------------------------------//
case ir_fl_i:
if (speaker_mode == 0 || speaker_mode == 1) {
fl_vol++;
vol_menu = 1;
set_fl();
}
break;
case ir_fl_d:
if (speaker_mode == 0 || speaker_mode == 1) {
fl_vol--;
vol_menu = 1;
set_fl();
}
break;
//FR -------------------------------------------------//
case ir_fr_i:
if (speaker_mode == 0 || speaker_mode == 1) {
fr_vol++;
vol_menu = 2;
set_fr();
}
break;
case ir_fr_d:
if (speaker_mode == 0 || speaker_mode == 1) {
fr_vol--;
vol_menu = 2;
set_fr();
}
break;
//SL -------------------------------------------------//
case ir_sl_i:
if (speaker_mode == 0) {
sl_vol++;
vol_menu = 3;
set_sl();
}
break;
case ir_sl_d:
if (speaker_mode == 0) {
sl_vol--;
vol_menu = 3;
set_sl();
}
break;
//SR -------------------------------------------------//
case ir_sr_i:
if (speaker_mode == 0) {
sr_vol++;
vol_menu = 4;
set_sr();
}
break;
case ir_sr_d:
if (speaker_mode == 0) {
sr_vol--;
vol_menu = 4;
set_sr();
}
break;
//CN -------------------------------------------------//
case ir_cn_i:
if (speaker_mode == 0) {
cn_vol++;
vol_menu = 5;
set_cn();
}
break;
case ir_cn_d:
if (speaker_mode == 0) {
cn_vol--;
vol_menu = 5;
set_cn();
}
break;
//SUB -------------------------------------------------//
case ir_sub_i:
if (speaker_mode == 0 || speaker_mode == 1) {
sub_vol++;
vol_menu = 6;
set_sub();
}
break;
case ir_sub_d:
if (speaker_mode == 0 || speaker_mode == 1) {
sub_vol--;
vol_menu = 6;
set_sub();
}
break;
//speaker mode -------------------------------------------------//
case ir_sp_mode:
speaker_mode++;
vol_menu = 0;
if (speaker_mode == 1) {
vol_menu_jup = 0;
}
set_speaker_mode();
break;
//surround -------------------------------------------------//
case ir_surr_mode:
surr++;
vol_menu = 0;
set_surr();
break;
// -------------------------------------------------//
case ir_mix_mode:
mix++;
vol_menu = 0;
set_mix();
break;
// -------------------------------------------------//
case ir_reset:
vol_menu = 0;
set_reset();
break;
}
ir_cl();
}
irrecv.resume();
}
}
//custom shape --------------------------------------------------------------------------------//
void custom_num_shape() {
for (int i = 0; i < 8; i++)
lcd.createChar(i, custom_num[i]);
}
void custom_shape() {
lcd.createChar(1, arrow_right);
}
//lcd ---------------------------------------------------------//
void lcd_update() {
int c;
switch (menu_active) {
case 0:
//input -------------------------------------------------//
lcd.setCursor(0, 0);
if (in == 0) {
lcd.print("IN1");
}
if (in == 1) {
lcd.print("IN2");
}
if (in == 2) {
lcd.print("IN3");
}
if (in == 3) {
lcd.print("AUX");
}
if (in == 4) {
lcd.print("DVD");
}
//speaker mode ------------------------------------------//
lcd.setCursor(4, 0);
if (speaker_mode == 0) {
lcd.print("5.1");
}
if (speaker_mode == 1) {
lcd.print("2.1");
}
//vol ----------------------------------------------//
switch (vol_menu) {
case 0:
lcd.setCursor(0, 1);
// (" ");
lcd.print("MAS-VOL");
c = mas_vol - 19;
break;
case 1:
lcd.setCursor(0, 1);
// (" ");
lcd.print("FL-VOL ");
c = fl_vol;
break;
case 2:
lcd.setCursor(0, 1);
// (" ");
lcd.print("FR-VOL ");
c = fr_vol;
break;
case 3:
lcd.setCursor(0, 1);
// (" ");
lcd.print("SL-VOL ");
c = sl_vol;
break;
case 4:
lcd.setCursor(0, 1);
// (" ");
lcd.print("SR-VOL ");
c = sr_vol;
break;
case 5:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CN-VOL ");
c = cn_vol;
break;
case 6:
lcd.setCursor(0, 1);
// (" ");
lcd.print("SUB-VOL");
c = sub_vol;
break;
}
break;
case 1:
switch (menu) {
case 1:
lcd.setCursor(0, 0);
lcd.print("Surround");
lcd.setCursor(1, 1);
lcd.print("ON");
lcd.setCursor(6, 1);
lcd.print("OFF");
if (surr == 0) {
lcd.setCursor(0, 1);
lcd.write(1);
lcd.setCursor(5, 1);
lcd.print(" ");
}
if (surr == 1) {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(5, 1);
lcd.write(1);
}
break;
case 2:
lcd.setCursor(0, 0);
lcd.print("Speaker Mode");
lcd.setCursor(1, 1);
lcd.print("5.1");
lcd.setCursor(6, 1);
lcd.print("2.1");
if (speaker_mode == 0) {
lcd.setCursor(0, 1);
lcd.write(1);
lcd.setCursor(5, 1);
lcd.print(" ");
}
if (speaker_mode == 1) {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(5, 1);
lcd.write(1);
}
break;
case 3:
lcd.setCursor(0, 0);
lcd.print("-6dB");
lcd.setCursor(1, 1);
lcd.print("ON");
lcd.setCursor(6, 1);
lcd.print("OFF");
if (mix == 0) {
lcd.setCursor(0, 1);
lcd.write(1);
lcd.setCursor(5, 1);
lcd.print(" ");
}
if (mix == 1) {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(5, 1);
lcd.write(1);
}
break;
case 4:
lcd.setCursor(0, 0);
lcd.print("All Reset");
lcd.setCursor(1, 1);
lcd.print("Reset");
lcd.setCursor(0, 1);
lcd.write(1);
}
lcd.setCursor(0, 0);
lcd.print("All Reset");
lcd.setCursor(1, 1);
lcd.print("Custom");
lcd.setCursor(9, 1);
lcd.print("Reset");
lcd.setCursor(0, 1);
lcd.write(1);
lcd.setCursor(8, 1);
lcd.print(" ");
}
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.write(1);
}
break;
}
break;
case 99:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" MUTE ");
break;
case 100:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" STANDBY ");
break;
}
if (menu_active == 0) {
int y;
if (c < 0) {
lcd.setCursor(8, 1);
lcd.print("-");
y = 10 - (c + 10);
} else if (c == -10) {
lcd.setCursor(8, 1);
lcd.print("-");
y = 10;
} 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]);
}
}
//all reset --------------------------------------------------------------------------------//
void set_reset() {
in = 0;
mas_vol = 44;
fl_vol = 0;
fr_vol = 0;
sl_vol = 0;
sr_vol = 0;
cn_vol = 0;
sub_vol = 0;
speaker_mode = 0;
surr = 0;
mix = 0;
vol_menu = 0;
menu_active = 0;
lcd.clear();
}
set_in();
set_fl();
set_fr();
set_sl();
set_sr();
set_cn();
set_sub();
set_speaker_mode();
set_surr();
set_mix();
}
//speaker mode --------------------------------------------------------------------------------//
void set_speaker_mode() {
if (speaker_mode > 1) {
speaker_mode = 0;
}
if (speaker_mode < 0) {
speaker_mode = 1;
}
switch (speaker_mode) {
case 0: // 5.1 mode
ch_mute = 0;
break;
case 1: // 2.1 mode
ch_mute = 1;
break;
}
set_sl();
set_sr();
set_cn();
}
//AX2358 settings -----------------------------------------------------//
void set_in() {
if (in > 4) {
in = 0;
}
switch (in) {
case 0: a = 0b11001011; break; // 1 input
case 1: a = 0b11001010; break; // 2 input
case 2: a = 0b11001001; break; // 3 input
case 3: a = 0b11001000; break; // 4 input
case 4: a = 0b11001111; break; // 6 CH input
}
AX2358_send(a);
}
void set_surr() {
if (surr > 1) {
surr = 0;
}
if (surr < 0) {
surr = 1;
}
switch (surr) {
case 0: a = 0b11000000; break; // Surround ON
case 1: a = 0b11000001; break; // Surround OFF
}
AX2358_send(a);
}
void set_mix() {
if (mix > 1) {
mix = 0;
}
switch (mix) {
case 0: a = 0b11000010; break; // (-6dB) on
case 1: a = 0b11000011; break; // (-6dB) off
}
AX2358_send(a);
}
//AX2358 Volume settings ----------------------------------------------//
void set_mas_vol() {
if (mas_vol > 69) {
mas_vol = 69;
}
if (mas_vol < 19) {
mas_vol = 19;
}
if (mas_vol == 19) {
mute = 1;
} else {
mute = 0;
}
set_mute();
}
void set_mute() {
if (mute > 1) {
mute = 0;
}
switch (mute) {
case 0: // 5.1 mode
ch_mute = 0;
break;
case 1: // 2.1 mode
ch_mute = 1;
break;
}
set_fl();
set_fr();
set_sub();
if (speaker_mode == 0) {
set_sl();
set_sr();
set_cn();
}
}
void set_fl() {
if (fl_vol > 10) {
fl_vol = 10;
}
if (fl_vol < -10) {
fl_vol = -10;
}
fl = mas_vol + fl_vol;
int c = 79 - fl;
a = c / 10;
b = c - a * 10;
AX2358_vol(0b10000000 + a, 0b10010000 + b); // CH1
switch (ch_mute) {
case 0: x = 0b11110000; break; // Mute disabled
case 1: x = 0b11110001; break; // Mute
}
AX2358_send(x);
}
void set_fr() {
if (fr_vol > 10) {
fr_vol = 10;
}
if (fr_vol < -10) {
fr_vol = -10;
}
fr = mas_vol + fr_vol;
int c = 79 - fr;
a = c / 10;
b = c - a * 10;
AX2358_vol(0b01000000 + a, 0b01010000 + b); // CH2
switch (ch_mute) {
case 0: x = 0b11110010; break; // Mute disabled
case 1: x = 0b11110011; break; // Mute
}
AX2358_send(x);
}
void set_cn() {
if (cn_vol > 10) {
cn_vol = 10;
}
if (cn_vol < -10) {
cn_vol = -10;
}
cn = mas_vol + cn_vol;
int c = 79 - cn;
a = c / 10;
b = c - a * 10;
AX2358_vol(0b00000000 + a, 0b00010000 + b); // CH3
switch (ch_mute) {
case 0: x = 0b11110100; break; // Mute disabled
case 1: x = 0b11110101; break; // Mute
}
AX2358_send(x);
}
void set_sub() {
if (sub_vol > 10) {
sub_vol = 10;
}
if (sub_vol < -10) {
sub_vol = -10;
}
sub = mas_vol + sub_vol;
int c = 79 - sub;
a = c / 10;
b = c - a * 10;
AX2358_vol(0b00100000 + a, 0b00110000 + b); // CH4
switch (ch_mute) {
case 0: x = 0b11110110; break; // Mute disabled
case 1: x = 0b11110111; break; // Mute
}
AX2358_send(x);
}
void set_sl() {
if (sl_vol > 10) {
sl_vol = 10;
}
if (sl_vol < -10) {
sl_vol = -10;
}
sl = mas_vol + sl_vol;
int c = 79 - sl;
a = c / 10;
b = c - a * 10;
AX2358_vol(0b01100000 + a, 0b01110000 + b); // CH5
switch (ch_mute) {
case 0: x = 0b11111000; break; // Mute disabled
case 1: x = 0b11111001; break; // Mute
}
AX2358_send(x);
}
void set_sr() {
if (sr_vol > 10) {
sr_vol = 10;
}
if (sr_vol < -10) {
sr_vol = -10;
}
sr = mas_vol + sr_vol;
int c = 79 - sr;
a = c / 10;
b = c - a * 10;
AX2358_vol(0b10100000 + a, 0b10110000 + b); // CH6
switch (ch_mute) {
case 0: x = 0b11111010; break; // Mute disabled
case 1: x = 0b11111011; break; // Mute
}
AX2358_send(x);
}
//AX2358 send -----------------------------------------------------//
void AX2358_send(char c) {
Wire.beginTransmission(AX2358_address);
Wire.write (c);
Wire.endTransmission();
}
void AX2358() {
Wire.beginTransmission(AX2358_address);
Wire.write (0b11000100);
Wire.endTransmission();
}
void AX2358_vol(char c, char d) {
Wire.beginTransmission(AX2358_address);
Wire.write (c);
Wire.write (d);
Wire.endTransmission();
}
//end code
Ly8gQVgyMzU4IDUuMSBTdXJyb3VuZCBTeXN0ZW0KLy8gRGFhY1dhdmVzIDxodHRwczovL2QuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnQuY29tPgoKI2luY2x1ZGUgPFdpcmUuaD4KI2luY2x1ZGUgPEVFUFJPTS5oPgojaW5jbHVkZSA8TGlxdWlkQ3J5c3RhbF9JMkMuaD4KI2luY2x1ZGUgPElScmVtb3RlLmg+CgojZGVmaW5lIEFYMjM1OF9hZGRyZXNzIDBiMTAwMTAxMAoKI2RlZmluZSBidG5fZGVsYXkgMzAwCgojZGVmaW5lIHN3MDEgOSAgICAgICAgICAvLyBTVwojZGVmaW5lIHN3MDIgMTEgICAgICAgICAvLyBEVAojZGVmaW5lIHN3MDMgMTAgICAgICAgICAvLyBDTEsKI2RlZmluZSBzdzA0IEEwICAgICAgICAgLy8gSW5wdXQKI2RlZmluZSBzdzA1IEExICAgICAgICAgLy8gTXV0ZQojZGVmaW5lIHN3MDYgQTIgICAgICAgICAvLyBQb3dlcgoKI2RlZmluZSBzd19wb3dlciAxMyAgICAgLy8gT3V0CgovLyBJUiBIRVggY29kZQojZGVmaW5lIGlyX3Bvd2VyICAgICAgMHg4MDdGODI3RCAgICAvLyBJUiBwb3dlciBPTi9PRkYKI2RlZmluZSBpcl9tdXRlICAgICAgIDB4NjA5RkZGODAgICAgLy8gSVIgbXV0ZQojZGVmaW5lIGlyX2luXzAgICAgICAgMHg4MDdGNjI5RCAgICAvLyBJUiBpbnB1dCBVU0IKI2RlZmluZSBpcl9pbl8xICAgICAgIDB4ODA3RjUyQUQgICAgLy8gSVIgaW5wdXQgQkxVCiNkZWZpbmUgaXJfaW5fMiAgICAgICAweDgwN0ZBMjVEICAgIC8vIElSIGlucHV0IEZNCiNkZWZpbmUgaXJfaW5fMyAgICAgICAweDgwN0YyMkREICAgIC8vIElSIGlucHV0IEFVWAojZGVmaW5lIGlyX2luXzQgICAgICAgMHg4MDdGMjBERiAgICAvLyBJUiBpbnB1dCBEVkQKI2RlZmluZSBpcl92b2xfaSAgICAgIDB4ODA3RjkwNkYgICAgLy8gSVIgdm9sKysKI2RlZmluZSBpcl92b2xfZCAgICAgIDB4ODA3RkEwNUYgICAgLy8gSVIgdm9sLS0gCiNkZWZpbmUgaXJfZmxfaSAgICAgICAweDgwN0Y0MEJGICAgIC8vIElSIGZsKysKI2RlZmluZSBpcl9mbF9kICAgICAgIDB4ODA3RkMwM0YgICAgLy8gSVIgZmwtLSAKI2RlZmluZSBpcl9mcl9pICAgICAgIDB4ODA3RjAwRkYgICAgLy8gSVIgZnIrKwojZGVmaW5lIGlyX2ZyX2QgICAgICAgMHg4MDdGODA3RiAgICAvLyBJUiBmci0tCiNkZWZpbmUgaXJfc2xfaSAgICAgICAweDgwN0Y0OEI3ICAgIC8vIElSIHNsKysKI2RlZmluZSBpcl9zbF9kICAgICAgIDB4ODA3RkM4MzcgICAgLy8gSVIgc2wtLQojZGVmaW5lIGlyX3NyX2kgICAgICAgMHg4MDdGMDhGNyAgICAvLyBJUiBzcisrCiNkZWZpbmUgaXJfc3JfZCAgICAgICAweDgwN0Y4ODc3ICAgIC8vIElSIHNyLS0KI2RlZmluZSBpcl9jbl9pICAgICAgIDB4ODA3RjUwQUYgICAgLy8gSVIgY24rKwojZGVmaW5lIGlyX2NuX2QgICAgICAgMHg4MDdGNjA5RiAgICAvLyBJUiBjbi0tCiNkZWZpbmUgaXJfc3ViX2kgICAgICAweDgwN0ZEMDJGICAgIC8vIElSIHN1YisrCiNkZWZpbmUgaXJfc3ViX2QgICAgICAweDgwN0ZFMDFGICAgIC8vIElSIHN1Yi0tIAojZGVmaW5lIGlyX3NwX21vZGUgICAgMHg4MDdGMEFGNSAgICAvLyBJUiBzcGVha2VyIG1vZGUgY2hhbmdlCiNkZWZpbmUgaXJfc3Vycl9tb2RlICAweDgwN0ZBODU3ICAgIC8vIElSIHN1cnJvdW5kIE9OL09GRgojZGVmaW5lIGlyX21peF9tb2RlICAgMHgwMDAwMDAwMCAgICAvLyBJUiAtNmRCIE9OL09GRgojZGVmaW5lIGlyX3Jlc2V0ICAgICAgMHg4MDdGMUFFNSAgICAvLyBJUiByZXNldAoKSVJyZWN2IGlycmVjdig4KTsKZGVjb2RlX3Jlc3VsdHMgcmVzdWx0czsKCmJ5dGUgY3VzdG9tX251bVs4XVs4XSA9IHsKICB7IEIwMDExMSwgQjAxMTExLCBCMTExMTEsIEIxMTExMSwgQjExMTExLCBCMTExMTEsIEIxMTExMSwgQjExMTExIH0sCiAgeyBCMTExMTEsIEIxMTExMSwgQjExMTExLCBCMDAwMDAsIEIwMDAwMCwgQjAwMDAwLCBCMDAwMDAsIEIwMDAwMCB9LAogIHsgQjExMTAwLCBCMTExMTAsIEIxMTExMSwgQjExMTExLCBCMTExMTEsIEIxMTExMSwgQjExMTExLCBCMTExMTEgfSwKICB7IEIxMTExMSwgQjExMTExLCBCMTExMTEsIEIxMTExMSwgQjExMTExLCBCMTExMTEsIEIwMTExMSwgQjAwMTExIH0sCiAgeyBCMDAwMDAsIEIwMDAwMCwgQjAwMDAwLCBCMDAwMDAsIEIwMDAwMCwgQjExMTExLCBCMTExMTEsIEIxMTExMSB9LAogIHsgQjExMTExLCBCMTExMTEsIEIxMTExMSwgQjExMTExLCBCMTExMTEsIEIxMTExMSwgQjExMTEwLCBCMTExMDAgfSwKICB7IEIxMTExMSwgQjExMTExLCBCMTExMTEsIEIwMDAwMCwgQjAwMDAwLCBCMDAwMDAsIEIxMTExMSwgQjExMTExIH0sCiAgeyBCMTExMTEsIEIxMTExMSwgQjExMTExLCBCMTExMTEsIEIxMTExMSwgQjExMTExLCBCMTExMTEsIEIxMTExMSB9Cn07Cgpjb25zdCBpbnQgZGlnaXRfd2lkdGggPSAzOwpjb25zdCBjaGFyIGN1c3RvbV9udW1fdG9wWzEwXVtkaWdpdF93aWR0aF0gPSB7IDAsIDEsIDIsIDEsIDIsIDMyLCA2LCA2LCAyLCA2LCA2LCAyLCAzLCA0LCA3LCAgIDcsIDYsIDYsIDAsIDYsIDYsIDEsIDEsIDIsICAgMCwgNiwgMiwgMCwgNiwgMn07CmNvbnN0IGNoYXIgY3VzdG9tX251bV9ib3RbMTBdW2RpZ2l0X3dpZHRoXSA9IHsgMywgNCwgNSwgNCwgNywgNCwgIDcsIDQsIDQsIDQsIDQsIDUsIDMyLCAzMiwgNywgNCwgNCwgNSwgMywgNCwgNSwgMzIsIDMyLCA3LCAzLCA0LCA1LCA0LCA0LCA1fTsKCmJ5dGUgYXJyb3dfcmlnaHRbOF0gPSB7QjAwMDAwLCBCMTAwMDAsIEIxMTAwMCwgQjExMTAwLCBCMTExMTAsIEIxMTEwMCwgQjExMDAwLCBCMTAwMDB9OwoKTGlxdWlkQ3J5c3RhbF9JMkMgbGNkKDB4MjcsIDE2LCAyKTsgCgp1bnNpZ25lZCBsb25nIHRpbWU7CmludCBpbiwgbXV0ZSwgcmV0dXJuX2QsIHN1cnIsIG1peCwgYSwgYiwgeCwgcG93ZXIsIG1lbnUsIG1lbnVfYWN0aXZlLCBjaF9tdXRlLCBzcGVha2VyX21vZGUsIGJ0bl9wcmVzcywgbG9uZ19wcmVzcywgdm9sX21lbnUsIHZvbF9tZW51X2p1cCwgcmVzZXQ7CmludCBmbCwgZnIsIHNsLCBzciwgY24sIHN1YiwgaXJfbWVudSwgaXJfb24sIG1hc192b2wsIGZsX3ZvbCwgZnJfdm9sLCBzbF92b2wsIHNyX3ZvbCwgY25fdm9sLCBzdWJfdm9sOwoKbG9uZyBidG5fdGltZXIgPSAwOwpsb25nIGxvbmdfcHJlc3NfdGltZSA9IDYwMDsKCnZvaWQgc2V0dXAoKSB7CiAgV2lyZS5iZWdpbigpOwogIFNlcmlhbC5iZWdpbig5NjAwKTsKICBpcnJlY3YuZW5hYmxlSVJJbigpOwoKICBwaW5Nb2RlKHN3MDEsIElOUFVUKTsgICAgICAvLyBTVwogIHBpbk1vZGUoc3cwMiwgSU5QVVQpOyAgICAgIC8vIERUCiAgcGluTW9kZShzdzAzLCBJTlBVVCk7ICAgICAgLy8gQ0xLCiAgcGluTW9kZShzdzA0LCBJTlBVVCk7ICAgICAgLy8gSW5wdXQKICBwaW5Nb2RlKHN3MDUsIElOUFVUKTsgICAgICAvLyBNdXRlCiAgcGluTW9kZShzdzA2LCBJTlBVVCk7ICAgICAgLy8gUG93ZXIKICBwaW5Nb2RlKHN3X3Bvd2VyLCBPVVRQVVQpOyAvLyBPdXQKCiAgZGlnaXRhbFdyaXRlKHN3X3Bvd2VyLCBMT1cpOwoKICBsY2QuYmVnaW4oMTYsIDIpOwogIAogIHBvd2VyID0gMDsKICBlZXByb21fcmVhZCgpOwogIHN0YXJ0X3VwKCk7CiAgcG93ZXJfdXAoKTsKCn0KCnZvaWQgbG9vcCgpIHsKICBsY2RfdXBkYXRlKCk7CiAgZWVwcm9tX3VwZGF0ZSgpOwogIGlyX2NvbnRyb2woKTsKICByZXR1cm5fZGVsYXkoKTsKCiAgaWYgKG1lbnVfYWN0aXZlID09IDApIHsKICAgIGN1c3RvbV9udW1fc2hhcGUoKTsKICB9IGVsc2UgewogICAgY3VzdG9tX3NoYXBlKCk7CiAgfQoKICAvL3Bvd2VyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwogIGlmIChhbmFsb2dSZWFkKHN3MDYpID4gOTAwKSB7CiAgICBwb3dlcisrOwogICAgaWYgKHBvd2VyID4gMSkgewogICAgICBwb3dlciA9IDA7CiAgICB9CiAgICBwb3dlcl91cCgpOwogICAgZGVsYXkoYnRuX2RlbGF5KTsKICB9CgogIGlmIChwb3dlciA9PSAxKSB7CiAgICAvL3NlbGVjdCBpbnB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KICAgIGlmIChhbmFsb2dSZWFkKHN3MDQpID4gOTAwKSB7CiAgICAgIGluKys7CiAgICAgIHNldF9pbigpOwogICAgICBkZWxheShidG5fZGVsYXkpOwogICAgfQoKICAgIC8vc2VsZWN0IG1lbnUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCiAgICBpZiAoZGlnaXRhbFJlYWQoc3cwMSkgPT0gTE9XKSB7CiAgICAgIGlmIChidG5fcHJlc3MgPT0gMCkgewogICAgICAgIGJ0bl9wcmVzcyA9IDE7CiAgICAgICAgYnRuX3RpbWVyID0gbWlsbGlzKCk7CiAgICAgIH0KICAgICAgaWYgKChtaWxsaXMoKSAtIGJ0bl90aW1lciA+IGxvbmdfcHJlc3NfdGltZSkgJiYgKGxvbmdfcHJlc3MgPT0gMCkgJiYgKG1lbnVfYWN0aXZlID09IDApKSB7CiAgICAgICAgbG9uZ19wcmVzcyA9IDE7CiAgICAgICAgbWVudV9hY3RpdmUgPSAxOwogICAgICAgIG1lbnUgPSAxOwogICAgICAgIGJ0bl9jbCgpOwogICAgICAgIGxjZC5jbGVhcigpOwogICAgICB9IGVsc2UgaWYgKChtaWxsaXMoKSAtIGJ0bl90aW1lciA+IGxvbmdfcHJlc3NfdGltZSkgJiYgKGxvbmdfcHJlc3MgPT0gMCkgJiYgKG1lbnVfYWN0aXZlID09IDEpKSB7CiAgICAgICAgbG9uZ19wcmVzcyA9IDE7CiAgICAgICAgbWVudV9hY3RpdmUgPSAwOwogICAgICAgIHZvbF9tZW51ID0gMDsKICAgICAgICByZXNldCA9IDA7CiAgICAgICAgYnRuX2NsKCk7CiAgICAgICAgbGNkLmNsZWFyKCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChidG5fcHJlc3MgPT0gMSkgewogICAgICAgIGlmIChsb25nX3ByZXNzID09IDEpIHsKICAgICAgICAgIGxvbmdfcHJlc3MgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAobWVudV9hY3RpdmUgPT0gMSkgewogICAgICAgICAgICBtZW51Kys7CiAgICAgICAgICAgIGlmIChtZW51ID4gNCkgewogICAgICAgICAgICAgIG1lbnUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJ0bl9jbCgpOwogICAgICAgICAgICBsY2QuY2xlYXIoKTsKICAgICAgICAgIH0gZWxzZSBpZiAobWVudV9hY3RpdmUgPT0gMCAmJiBzcGVha2VyX21vZGUgPT0gMCkgewogICAgICAgICAgICB2b2xfbWVudSsrOwogICAgICAgICAgICBpZiAodm9sX21lbnUgPiA2KSB7CiAgICAgICAgICAgICAgdm9sX21lbnUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJ0bl9jbCgpOwogICAgICAgICAgfSBlbHNlIGlmIChtZW51X2FjdGl2ZSA9PSAwICYmIHNwZWFrZXJfbW9kZSA9PSAxKSB7CiAgICAgICAgICAgIHZvbF9tZW51Kys7CiAgICAgICAgICAgIGlmICh2b2xfbWVudV9qdXAgPT0gMCkgewogICAgICAgICAgICAgIGlmICh2b2xfbWVudSA+IDIpIHsKICAgICAgICAgICAgICAgIHZvbF9tZW51ID0gNjsKICAgICAgICAgICAgICAgIHZvbF9tZW51X2p1cCA9IDE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2b2xfbWVudV9qdXAgPT0gMSkgewogICAgICAgICAgICAgIGlmICh2b2xfbWVudSA+IDYpIHsKICAgICAgICAgICAgICAgIHZvbF9tZW51ID0gMDsKICAgICAgICAgICAgICAgIHZvbF9tZW51X2p1cCA9IDA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJ0bl9jbCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBidG5fcHJlc3MgPSAwOwogICAgICB9CiAgICB9CgogICAgLy9tdXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwogICAgaWYgKGFuYWxvZ1JlYWQoc3cwNSkgPiA5MDAgJiYgbWFzX3ZvbCAhPSAxOSkgewogICAgICBtdXRlKys7CiAgICAgIGlmIChtdXRlID09IDEpIHsKICAgICAgICBtZW51X2FjdGl2ZSA9IDk5OwogICAgICB9IGVsc2UgewogICAgICAgIG1lbnVfYWN0aXZlID0gMDsKICAgICAgfQogICAgICBzZXRfbXV0ZSgpOwogICAgICBkZWxheShidG5fZGVsYXkpOwogICAgICBsY2QuY2xlYXIoKTsKICAgIH0KICB9CgogIC8vbWVudSBhY3RpdmUgMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KICBpZiAobWVudV9hY3RpdmUgPT0gMCkgewogICAgaWYgKGRpZ2l0YWxSZWFkKHN3MDIpID09IExPVykgewogICAgICBpZiAodm9sX21lbnUgPT0gMCkgewogICAgICAgIG1hc192b2wrKzsKICAgICAgfQogICAgICBpZiAodm9sX21lbnUgPT0gMSkgewogICAgICAgIGZsX3ZvbCsrOwogICAgICB9CiAgICAgIGlmICh2b2xfbWVudSA9PSAyKSB7CiAgICAgICAgZnJfdm9sKys7CiAgICAgIH0KICAgICAgaWYgKHZvbF9tZW51ID09IDMpIHsKICAgICAgICBzbF92b2wrKzsKICAgICAgfQogICAgICBpZiAodm9sX21lbnUgPT0gNCkgewogICAgICAgIHNyX3ZvbCsrOwogICAgICB9CiAgICAgIGlmICh2b2xfbWVudSA9PSA1KSB7CiAgICAgICAgY25fdm9sKys7CiAgICAgIH0KICAgICAgaWYgKHZvbF9tZW51ID09IDYpIHsKICAgICAgICBzdWJfdm9sKys7CiAgICAgIH0KICAgICAgc2V0X21hc192b2woKTsKICAgICAgc2V0X2ZsKCk7CiAgICAgIHNldF9mcigpOwogICAgICBzZXRfc3ViKCk7CiAgICAgIGlmIChzcGVha2VyX21vZGUgPT0gMCkgewogICAgICAgIHNldF9zbCgpOwogICAgICAgIHNldF9zcigpOwogICAgICAgIHNldF9jbigpOwogICAgICB9CiAgICAgIGJ0bl9jbCgpOwogICAgfQogICAgaWYgKGRpZ2l0YWxSZWFkKHN3MDMpID09IExPVykgewogICAgICBpZiAodm9sX21lbnUgPT0gMCkgewogICAgICAgIG1hc192b2wtLTsKICAgICAgfQogICAgICBpZiAodm9sX21lbnUgPT0gMSkgewogICAgICAgIGZsX3ZvbC0tOwogICAgICB9CiAgICAgIGlmICh2b2xfbWVudSA9PSAyKSB7CiAgICAgICAgZnJfdm9sLS07CiAgICAgIH0KICAgICAgaWYgKHZvbF9tZW51ID09IDMpIHsKICAgICAgICBzbF92b2wtLTsKICAgICAgfQogICAgICBpZiAodm9sX21lbnUgPT0gNCkgewogICAgICAgIHNyX3ZvbC0tOwogICAgICB9CiAgICAgIGlmICh2b2xfbWVudSA9PSA1KSB7CiAgICAgICAgY25fdm9sLS07CiAgICAgIH0KICAgICAgaWYgKHZvbF9tZW51ID09IDYpIHsKICAgICAgICBzdWJfdm9sLS07CiAgICAgIH0KICAgICAgc2V0X21hc192b2woKTsKICAgICAgc2V0X2ZsKCk7CiAgICAgIHNldF9mcigpOwogICAgICBzZXRfc3ViKCk7CiAgICAgIGlmIChzcGVha2VyX21vZGUgPT0gMCkgewogICAgICAgIHNldF9zbCgpOwogICAgICAgIHNldF9zcigpOwogICAgICAgIHNldF9jbigpOwogICAgICB9CiAgICAgIGJ0bl9jbCgpOwogICAgfQogIH0KCiAgLy9tZW51IGFjdGl2ZSAxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwogIGlmIChtZW51X2FjdGl2ZSA9PSAxKSB7CiAgICBpZiAobWVudSA9PSAxKSB7CiAgICAgIGlmIChkaWdpdGFsUmVhZChzdzAyKSA9PSBMT1cpIHsKICAgICAgICBzdXJyKys7CiAgICAgICAgc2V0X3N1cnIoKTsKICAgICAgICBidG5fY2woKTsKICAgICAgfQogICAgfQogICAgaWYgKG1lbnUgPT0gMikgewogICAgICBpZiAoZGlnaXRhbFJlYWQoc3cwMikgPT0gTE9XKSB7CiAgICAgICAgc3BlYWtlcl9tb2RlKys7CiAgICAgICAgaWYgKHNwZWFrZXJfbW9kZSA9PSAxKSB7CiAgICAgICAgICB2b2xfbWVudV9qdXAgPSAwOwogICAgICAgIH0KICAgICAgICBzZXRfc3BlYWtlcl9tb2RlKCk7CiAgICAgICAgYnRuX2NsKCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChtZW51ID09IDMpIHsKICAgICAgaWYgKGRpZ2l0YWxSZWFkKHN3MDIpID09IExPVykgewogICAgICAgIG1peCsrOwogICAgICAgIHNldF9taXgoKTsKICAgICAgICBidG5fY2woKTsKICAgICAgfQogICAgfQogICAgaWYgKG1lbnUgPT0gNCkgewogICAgICBpZiAoZGlnaXRhbFJlYWQoc3cwMikgPT0gTE9XKSB7CiAgICAgICAgcmVzZXQrKzsKICAgICAgICBzZXRfcmVzZXQoKTsKICAgICAgICBidG5fY2woKTsKICAgICAgfQogICAgfQogIH0KfQoKLy9lZXByb20gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwoKdm9pZCBlZXByb21fdXBkYXRlKCkgewogIEVFUFJPTS51cGRhdGUoMCwgaW4pOwogIEVFUFJPTS51cGRhdGUoMSwgbWFzX3ZvbCk7CiAgRUVQUk9NLnVwZGF0ZSgyLCBmbF92b2wgKyAxMCk7CiAgRUVQUk9NLnVwZGF0ZSgzLCBmcl92b2wgKyAxMCk7CiAgRUVQUk9NLnVwZGF0ZSg0LCBzbF92b2wgKyAxMCk7CiAgRUVQUk9NLnVwZGF0ZSg1LCBzcl92b2wgKyAxMCk7CiAgRUVQUk9NLnVwZGF0ZSg2LCBjbl92b2wgKyAxMCk7CiAgRUVQUk9NLnVwZGF0ZSg3LCBzdWJfdm9sICsgMTApOwogIEVFUFJPTS51cGRhdGUoOCwgc3Vycik7CiAgRUVQUk9NLnVwZGF0ZSg5LCBzcGVha2VyX21vZGUpOwogIEVFUFJPTS51cGRhdGUoMTAsIG1peCk7Cn0KCnZvaWQgZWVwcm9tX3JlYWQoKSB7CiAgaW4gPSBFRVBST00ucmVhZCgwKTsKICBtYXNfdm9sID0gRUVQUk9NLnJlYWQoMSk7CiAgZmxfdm9sID0gRUVQUk9NLnJlYWQoMikgLSAxMDsKICBmcl92b2wgPSBFRVBST00ucmVhZCgzKSAtIDEwOwogIHNsX3ZvbCA9IEVFUFJPTS5yZWFkKDQpIC0gMTA7CiAgc3Jfdm9sID0gRUVQUk9NLnJlYWQoNSkgLSAxMDsKICBjbl92b2wgPSBFRVBST00ucmVhZCg2KSAtIDEwOwogIHN1Yl92b2wgPSBFRVBST00ucmVhZCg3KSAtIDEwOwogIHN1cnIgPSBFRVBST00ucmVhZCg4KTsKICBzcGVha2VyX21vZGUgPSBFRVBST00ucmVhZCg5KTsKICBtaXggPSBFRVBST00ucmVhZCgxMCk7Cn0KCnZvaWQgYnRuX2NsKCkgewogIGRlbGF5KGJ0bl9kZWxheSk7CiAgdGltZSA9IG1pbGxpcygpOwogIHJldHVybl9kID0gMTsKfQp2b2lkIGlyX2NsKCkgewogIHRpbWUgPSBtaWxsaXMoKTsKICByZXR1cm5fZCA9IDE7Cn0Kdm9pZCByZXR1cm5fZGVsYXkoKSB7CiAgaWYgKG1pbGxpcygpIC0gdGltZSA+IDUwMDAgJiYgcmV0dXJuX2QgPT0gMSAmJiBtdXRlID09IDAgJiYgbWVudV9hY3RpdmUgIT0gMCkgewogICAgbWVudV9hY3RpdmUgPSAwOwogICAgdm9sX21lbnUgPSAwOwogICAgcmVzZXQgPSAwOwogICAgcmV0dXJuX2QgPSAwOwogICAgbGNkLmNsZWFyKCk7CiAgfSBlbHNlIGlmIChtaWxsaXMoKSAtIHRpbWUgPiA1MDAwICYmIHJldHVybl9kID09IDEgJiYgbXV0ZSA9PSAwICYmIG1lbnVfYWN0aXZlID09IDApIHsKICAgIHZvbF9tZW51ID0gMDsKICAgIHJldHVybl9kID0gMDsKICB9Cn0KCi8vcG93ZXIgdXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwoKdm9pZCBwb3dlcl91cCgpIHsKICBpZiAocG93ZXIgPT0gMSkgewogICAgbGNkLmNsZWFyKCk7CiAgICBkZWxheSg1MDApOwogICAgbGNkLnNldEN1cnNvcigwLCAxKTsKICAgIGxjZC5wcmludCgiICAgTE9BRElORy4uLiAgICIpOwogICAgZGVsYXkoMTAwMCk7CiAgICBsY2QuY2xlYXIoKTsKICAgIGlmIChtYXNfdm9sID4gMTkpIHsKICAgICAgbXV0ZSA9IDA7CiAgICB9CiAgICBzZXRfbXV0ZSgpOwogICAgdm9sX21lbnUgPSAwOwogICAgbWVudV9hY3RpdmUgPSAwOwogICAgZGVsYXkoMzAwKTsKICAgIGlyX29uID0gMTsKICAgIHZvbF9tZW51X2p1cCA9IDA7CiAgICBkaWdpdGFsV3JpdGUoc3dfcG93ZXIsIEhJR0gpOwoKICB9IGVsc2UgewoKICAgIChzd19wb3dlciwgTE9XKTsKICAgIG11dGUgPSAxOwogICAgc2V0X211dGUoKTsKICAgIGRlbGF5KDEwMCk7CiAgICBtZW51X2FjdGl2ZSA9IDEwMDsKICAgIGlyX29uID0gMDsKICB9Cn0KCnZvaWQgc3RhcnRfdXAoKSB7CiAgbXV0ZSA9IDE7CiAgc2V0X211dGUoKTsKICBkZWxheSg1MDApOwogIGxjZC5zZXRDdXJzb3IoMCwgMCk7CiAgbGNkLnByaW50KCIgICAgVWkgVGVjaCAgICAgIik7CiAgZGVsYXkoNTAwKTsKICBsY2Quc2V0Q3Vyc29yKDAsIDEpOwogIGxjZC5wcmludCgiICAgNS4xIFNZU1RFTSAgICIpOwogIGRlbGF5KDEwMDApOwogIGxjZC5jbGVhcigpOwogIGRlbGF5KDMwMCk7CiAgbGNkLnNldEN1cnNvcigwLCAxKTsKICBsY2QucHJpbnQoIiAgIExPQURJTkcuLi4gICAiKTsKICBkZWxheSgxNTAwKTsKICBsY2QuY2xlYXIoKTsKICBkZWxheSgzMDApOwogIEFYMjM1OCgpOwogIHNldF9pbigpOwogIHNldF9zdXJyKCk7CiAgc2V0X21peCgpOwogIHNldF9mbCgpOwogIHNldF9mcigpOwogIHNldF9zbCgpOwogIHNldF9zcigpOwogIHNldF9jbigpOwogIHNldF9zdWIoKTsKfQoKLy9JUiBjb250cm9sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KCnZvaWQgaXJfY29udHJvbCgpIHsKICBpZiAoIGlycmVjdi5kZWNvZGUoICZyZXN1bHRzICkpIHsKCiAgICBzd2l0Y2ggKHJlc3VsdHMudmFsdWUpIHsKICAgICAgLy9wb3dlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KICAgICAgY2FzZSBpcl9wb3dlcjoKICAgICAgICBwb3dlcisrOwogICAgICAgIGlmIChwb3dlciA+IDEpIHsKICAgICAgICAgIHBvd2VyID0gMDsKICAgICAgICB9CiAgICAgICAgcG93ZXJfdXAoKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChpcl9vbiA9PSAxKSB7CiAgICAgIHN3aXRjaCAocmVzdWx0cy52YWx1ZSkgewogICAgICAgIC8vbXV0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KICAgICAgICBjYXNlIGlyX211dGU6CiAgICAgICAgICBpZiAobWFzX3ZvbCAhPSAxOSkgewogICAgICAgICAgICBtdXRlKys7CiAgICAgICAgICAgIGlmIChtdXRlID09IDEpIHsKICAgICAgICAgICAgICBtZW51X2FjdGl2ZSA9IDk5OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG1lbnVfYWN0aXZlID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRfbXV0ZSgpOwogICAgICAgICAgICBsY2QuY2xlYXIoKTsgIAogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBicmVhazsKCiAgICAgICAgLy9zZWxlY3QgaW5wdXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCiAgICAgICAgY2FzZSBpcl9pbl8wOgogICAgICAgICAgaW4gPSAwOwogICAgICAgICAgc2V0X2luKCk7CiAgICAgICAgICBpcl9jbCgpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgaXJfaW5fMToKICAgICAgICAgIGluID0gMTsKICAgICAgICAgIHNldF9pbigpOwogICAgICAgICAgaXJfY2woKTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIGlyX2luXzI6CiAgICAgICAgICBpbiA9IDI7CiAgICAgICAgICBzZXRfaW4oKTsKICAgICAgICAgIGlyX2NsKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICAgIAogICAgICAgIGNhc2UgaXJfaW5fMzoKICAgICAgICAgIGluID0gMzsKICAgICAgICAgIHNldF9pbigpOwogICAgICAgICAgaXJfY2woKTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIGlyX2luXzQ6CiAgICAgICAgICBpbiA9IDQ7CiAgICAgICAgICBzZXRfaW4oKTsKICAgICAgICAgIGlyX2NsKCk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIGlmIChpcl9vbiA9PSAxICYmIG1lbnVfYWN0aXZlID09IDApIHsKICAgICAgc3dpdGNoIChyZXN1bHRzLnZhbHVlKSB7CiAgICAgICAgLy9WT0wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCiAgICAgICAgY2FzZSBpcl92b2xfaToKICAgICAgICAgIGlmIChzcGVha2VyX21vZGUgPT0gMCB8fCBzcGVha2VyX21vZGUgPT0gMSkgewogICAgICAgICAgICBtYXNfdm9sKys7CiAgICAgICAgICAgIHZvbF9tZW51ID0gMDsKICAgICAgICAgICAgc2V0X21hc192b2woKTsKICAgICAgICAgICAgc2V0X2ZsKCk7CiAgICAgICAgICAgIHNldF9mcigpOwogICAgICAgICAgICBzZXRfc3ViKCk7CiAgICAgICAgICAgIGlmIChzcGVha2VyX21vZGUgPT0gMCkgewogICAgICAgICAgICAgIHNldF9zbCgpOwogICAgICAgICAgICAgIHNldF9zcigpOwogICAgICAgICAgICAgIHNldF9jbigpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBpcl92b2xfZDoKICAgICAgICAgIGlmIChzcGVha2VyX21vZGUgPT0gMCB8fCBzcGVha2VyX21vZGUgPT0gMSkgewogICAgICAgICAgICBtYXNfdm9sLS07CiAgICAgICAgICAgIHZvbF9tZW51ID0gMDsKICAgICAgICAgICAgc2V0X21hc192b2woKTsKICAgICAgICAgICAgc2V0X2ZsKCk7CiAgICAgICAgICAgIHNldF9mcigpOwogICAgICAgICAgICBzZXRfc3ViKCk7CiAgICAgICAgICAgIGlmIChzcGVha2VyX21vZGUgPT0gMCkgewogICAgICAgICAgICAgIHNldF9zbCgpOwogICAgICAgICAgICAgIHNldF9zcigpOwogICAgICAgICAgICAgIHNldF9jbigpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgLy9GTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KICAgICAgICBjYXNlIGlyX2ZsX2k6CiAgICAgICAgICBpZiAoc3BlYWtlcl9tb2RlID09IDAgfHwgc3BlYWtlcl9tb2RlID09IDEpIHsKICAgICAgICAgICAgZmxfdm9sKys7CiAgICAgICAgICAgIHZvbF9tZW51ID0gMTsKICAgICAgICAgICAgc2V0X2ZsKCk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBpcl9mbF9kOgogICAgICAgICAgaWYgKHNwZWFrZXJfbW9kZSA9PSAwIHx8IHNwZWFrZXJfbW9kZSA9PSAxKSB7CiAgICAgICAgICAgIGZsX3ZvbC0tOwogICAgICAgICAgICB2b2xfbWVudSA9IDE7CiAgICAgICAgICAgIHNldF9mbCgpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIC8vRlIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCiAgICAgICAgY2FzZSBpcl9mcl9pOgogICAgICAgICAgaWYgKHNwZWFrZXJfbW9kZSA9PSAwIHx8IHNwZWFrZXJfbW9kZSA9PSAxKSB7CiAgICAgICAgICAgIGZyX3ZvbCsrOwogICAgICAgICAgICB2b2xfbWVudSA9IDI7CiAgICAgICAgICAgIHNldF9mcigpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgaXJfZnJfZDoKICAgICAgICAgIGlmIChzcGVha2VyX21vZGUgPT0gMCB8fCBzcGVha2VyX21vZGUgPT0gMSkgewogICAgICAgICAgICBmcl92b2wtLTsKICAgICAgICAgICAgdm9sX21lbnUgPSAyOwogICAgICAgICAgICBzZXRfZnIoKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICAvL1NMIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwogICAgICAgIGNhc2UgaXJfc2xfaToKICAgICAgICAgIGlmIChzcGVha2VyX21vZGUgPT0gMCkgewogICAgICAgICAgICBzbF92b2wrKzsKICAgICAgICAgICAgdm9sX21lbnUgPSAzOwogICAgICAgICAgICBzZXRfc2woKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIGlyX3NsX2Q6CiAgICAgICAgICBpZiAoc3BlYWtlcl9tb2RlID09IDApIHsKICAgICAgICAgICAgc2xfdm9sLS07CiAgICAgICAgICAgIHZvbF9tZW51ID0gMzsKICAgICAgICAgICAgc2V0X3NsKCk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgLy9TUiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KICAgICAgICBjYXNlIGlyX3NyX2k6CiAgICAgICAgICBpZiAoc3BlYWtlcl9tb2RlID09IDApIHsKICAgICAgICAgICAgc3Jfdm9sKys7CiAgICAgICAgICAgIHZvbF9tZW51ID0gNDsKICAgICAgICAgICAgc2V0X3NyKCk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBpcl9zcl9kOgogICAgICAgICAgaWYgKHNwZWFrZXJfbW9kZSA9PSAwKSB7CiAgICAgICAgICAgIHNyX3ZvbC0tOwogICAgICAgICAgICB2b2xfbWVudSA9IDQ7CiAgICAgICAgICAgIHNldF9zcigpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIC8vQ04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCiAgICAgICAgY2FzZSBpcl9jbl9pOgogICAgICAgICAgaWYgKHNwZWFrZXJfbW9kZSA9PSAwKSB7CiAgICAgICAgICAgIGNuX3ZvbCsrOwogICAgICAgICAgICB2b2xfbWVudSA9IDU7CiAgICAgICAgICAgIHNldF9jbigpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgaXJfY25fZDoKICAgICAgICAgIGlmIChzcGVha2VyX21vZGUgPT0gMCkgewogICAgICAgICAgICBjbl92b2wtLTsKICAgICAgICAgICAgdm9sX21lbnUgPSA1OwogICAgICAgICAgICBzZXRfY24oKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICAvL1NVQiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KICAgICAgICBjYXNlIGlyX3N1Yl9pOgogICAgICAgICAgaWYgKHNwZWFrZXJfbW9kZSA9PSAwIHx8IHNwZWFrZXJfbW9kZSA9PSAxKSB7CiAgICAgICAgICAgIHN1Yl92b2wrKzsKICAgICAgICAgICAgdm9sX21lbnUgPSA2OwogICAgICAgICAgICBzZXRfc3ViKCk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBpcl9zdWJfZDoKICAgICAgICAgIGlmIChzcGVha2VyX21vZGUgPT0gMCB8fCBzcGVha2VyX21vZGUgPT0gMSkgewogICAgICAgICAgICBzdWJfdm9sLS07CiAgICAgICAgICAgIHZvbF9tZW51ID0gNjsKICAgICAgICAgICAgc2V0X3N1YigpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIC8vc3BlYWtlciBtb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwogICAgICAgIGNhc2UgaXJfc3BfbW9kZToKICAgICAgICAgIHNwZWFrZXJfbW9kZSsrOwogICAgICAgICAgdm9sX21lbnUgPSAwOwogICAgICAgICAgaWYgKHNwZWFrZXJfbW9kZSA9PSAxKSB7CiAgICAgICAgICAgIHZvbF9tZW51X2p1cCA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBzZXRfc3BlYWtlcl9tb2RlKCk7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgLy9zdXJyb3VuZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KICAgICAgICBjYXNlIGlyX3N1cnJfbW9kZToKICAgICAgICAgIHN1cnIrKzsKICAgICAgICAgIHZvbF9tZW51ID0gMDsKICAgICAgICAgIHNldF9zdXJyKCk7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCiAgICAgICAgY2FzZSBpcl9taXhfbW9kZToKICAgICAgICAgIG1peCsrOwogICAgICAgICAgdm9sX21lbnUgPSAwOwogICAgICAgICAgc2V0X21peCgpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwogICAgICAgIGNhc2UgaXJfcmVzZXQ6CiAgICAgICAgICByZXNldCsrOwogICAgICAgICAgdm9sX21lbnUgPSAwOwogICAgICAgICAgc2V0X3Jlc2V0KCk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpcl9jbCgpOwogICAgfQogICAgaXJyZWN2LnJlc3VtZSgpOwogIH0KfQoKLy9jdXN0b20gc2hhcGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwoKdm9pZCBjdXN0b21fbnVtX3NoYXBlKCkgewogIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKQogICAgbGNkLmNyZWF0ZUNoYXIoaSwgY3VzdG9tX251bVtpXSk7Cn0KCnZvaWQgY3VzdG9tX3NoYXBlKCkgewogIGxjZC5jcmVhdGVDaGFyKDEsIGFycm93X3JpZ2h0KTsKfQoKCi8vbGNkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCgp2b2lkIGxjZF91cGRhdGUoKSB7CiAgaW50IGM7CiAgc3dpdGNoIChtZW51X2FjdGl2ZSkgewogICAgY2FzZSAwOgogICAgICAvL2lucHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwogICAgICBsY2Quc2V0Q3Vyc29yKDAsIDApOwogICAgICBpZiAoaW4gPT0gMCkgewogICAgICAgIGxjZC5wcmludCgiSU4xIik7CiAgICAgIH0KICAgICAgaWYgKGluID09IDEpIHsKICAgICAgICBsY2QucHJpbnQoIklOMiIpOwogICAgICB9CiAgICAgIGlmIChpbiA9PSAyKSB7CiAgICAgICAgbGNkLnByaW50KCJJTjMiKTsKICAgICAgfQogICAgICBpZiAoaW4gPT0gMykgewogICAgICAgIGxjZC5wcmludCgiQVVYIik7CiAgICAgIH0KICAgICAgaWYgKGluID09IDQpIHsKICAgICAgICBsY2QucHJpbnQoIkRWRCIpOwogICAgICB9CgogICAgICAvL3NwZWFrZXIgbW9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwogICAgICBsY2Quc2V0Q3Vyc29yKDQsIDApOwogICAgICBpZiAoc3BlYWtlcl9tb2RlID09IDApIHsKICAgICAgICBsY2QucHJpbnQoIjUuMSIpOwogICAgICB9CiAgICAgIGlmIChzcGVha2VyX21vZGUgPT0gMSkgewogICAgICAgIGxjZC5wcmludCgiMi4xIik7CiAgICAgIH0KCiAgICAgIC8vdm9sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwogICAgICBzd2l0Y2ggKHZvbF9tZW51KSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgbGNkLnNldEN1cnNvcigwLCAxKTsKICAgICAgICAgIC8vICAgICAgICgiICAgICAgICIpOwogICAgICAgICAgbGNkLnByaW50KCJNQVMtVk9MIik7CiAgICAgICAgICBjID0gbWFzX3ZvbCAtIDE5OwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMToKICAgICAgICAgIGxjZC5zZXRDdXJzb3IoMCwgMSk7CiAgICAgICAgICAvLyAgICAgICAoIiAgICAgICAiKTsKICAgICAgICAgIGxjZC5wcmludCgiRkwtVk9MICIpOwogICAgICAgICAgYyA9IGZsX3ZvbDsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDI6CiAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDAsIDEpOwogICAgICAgICAgLy8gICAgICAgKCIgICAgICAgIik7CiAgICAgICAgICBsY2QucHJpbnQoIkZSLVZPTCAiKTsKICAgICAgICAgIGMgPSBmcl92b2w7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAzOgogICAgICAgICAgbGNkLnNldEN1cnNvcigwLCAxKTsKICAgICAgICAgIC8vICAgICAgICgiICAgICAgICIpOwogICAgICAgICAgbGNkLnByaW50KCJTTC1WT0wgIik7CiAgICAgICAgICBjID0gc2xfdm9sOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgNDoKICAgICAgICAgIGxjZC5zZXRDdXJzb3IoMCwgMSk7CiAgICAgICAgICAvLyAgICAgICAoIiAgICAgICAiKTsKICAgICAgICAgIGxjZC5wcmludCgiU1ItVk9MICIpOwogICAgICAgICAgYyA9IHNyX3ZvbDsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDU6CiAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDAsIDEpOwogICAgICAgICAgLy8gICAgICAgKCIgICAgICAgIik7CiAgICAgICAgICBsY2QucHJpbnQoIkNOLVZPTCAiKTsKICAgICAgICAgIGMgPSBjbl92b2w7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSA2OgogICAgICAgICAgbGNkLnNldEN1cnNvcigwLCAxKTsKICAgICAgICAgIC8vICAgICAgICgiICAgICAgICIpOwogICAgICAgICAgbGNkLnByaW50KCJTVUItVk9MIik7CiAgICAgICAgICBjID0gc3ViX3ZvbDsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgMToKICAgICAgc3dpdGNoIChtZW51KSB7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgbGNkLnNldEN1cnNvcigwLCAwKTsKICAgICAgICAgIGxjZC5wcmludCgiU3Vycm91bmQiKTsKICAgICAgICAgIGxjZC5zZXRDdXJzb3IoMSwgMSk7CiAgICAgICAgICBsY2QucHJpbnQoIk9OIik7CiAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDYsIDEpOwogICAgICAgICAgbGNkLnByaW50KCJPRkYiKTsKICAgICAgICAgIGlmIChzdXJyID09IDApIHsKICAgICAgICAgICAgbGNkLnNldEN1cnNvcigwLCAxKTsKICAgICAgICAgICAgbGNkLndyaXRlKDEpOwogICAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDUsIDEpOwogICAgICAgICAgICBsY2QucHJpbnQoIiAiKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdXJyID09IDEpIHsKICAgICAgICAgICAgbGNkLnNldEN1cnNvcigwLCAxKTsKICAgICAgICAgICAgbGNkLnByaW50KCIgIik7CiAgICAgICAgICAgIGxjZC5zZXRDdXJzb3IoNSwgMSk7CiAgICAgICAgICAgIGxjZC53cml0ZSgxKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDI6CiAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDAsIDApOwogICAgICAgICAgbGNkLnByaW50KCJTcGVha2VyIE1vZGUiKTsKICAgICAgICAgIGxjZC5zZXRDdXJzb3IoMSwgMSk7CiAgICAgICAgICBsY2QucHJpbnQoIjUuMSIpOwogICAgICAgICAgbGNkLnNldEN1cnNvcig2LCAxKTsKICAgICAgICAgIGxjZC5wcmludCgiMi4xIik7CiAgICAgICAgICBpZiAoc3BlYWtlcl9tb2RlID09IDApIHsKICAgICAgICAgICAgbGNkLnNldEN1cnNvcigwLCAxKTsKICAgICAgICAgICAgbGNkLndyaXRlKDEpOwogICAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDUsIDEpOwogICAgICAgICAgICBsY2QucHJpbnQoIiAiKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzcGVha2VyX21vZGUgPT0gMSkgewogICAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDAsIDEpOwogICAgICAgICAgICBsY2QucHJpbnQoIiAiKTsKICAgICAgICAgICAgbGNkLnNldEN1cnNvcig1LCAxKTsKICAgICAgICAgICAgbGNkLndyaXRlKDEpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMzoKICAgICAgICAgIGxjZC5zZXRDdXJzb3IoMCwgMCk7CiAgICAgICAgICBsY2QucHJpbnQoIi02ZEIiKTsKICAgICAgICAgIGxjZC5zZXRDdXJzb3IoMSwgMSk7CiAgICAgICAgICBsY2QucHJpbnQoIk9OIik7CiAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDYsIDEpOwogICAgICAgICAgbGNkLnByaW50KCJPRkYiKTsKICAgICAgICAgIGlmIChtaXggPT0gMCkgewogICAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDAsIDEpOwogICAgICAgICAgICBsY2Qud3JpdGUoMSk7CiAgICAgICAgICAgIGxjZC5zZXRDdXJzb3IoNSwgMSk7CiAgICAgICAgICAgIGxjZC5wcmludCgiICIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG1peCA9PSAxKSB7CiAgICAgICAgICAgIGxjZC5zZXRDdXJzb3IoMCwgMSk7CiAgICAgICAgICAgIGxjZC5wcmludCgiICIpOwogICAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDUsIDEpOwogICAgICAgICAgICBsY2Qud3JpdGUoMSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSA0OgogICAgICAgICAgbGNkLnNldEN1cnNvcigwLCAwKTsKICAgICAgICAgIGxjZC5wcmludCgiQWxsIFJlc2V0Iik7CiAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDEsIDEpOwogICAgICAgICAgbGNkLnByaW50KCJSZXNldCIpOwogICAgICAgICAgaWYgKHJlc2V0ID09IDEpIHsKICAgICAgICAgICAgbGNkLnNldEN1cnNvcigwLCAxKTsKICAgICAgICAgICAgbGNkLndyaXRlKDEpOwogICAgICAgICAgfQoKCiAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDAsIDApOwogICAgICAgICAgbGNkLnByaW50KCJBbGwgUmVzZXQiKTsKICAgICAgICAgIGxjZC5zZXRDdXJzb3IoMSwgMSk7CiAgICAgICAgICBsY2QucHJpbnQoIkN1c3RvbSIpOwogICAgICAgICAgbGNkLnNldEN1cnNvcig5LCAxKTsKICAgICAgICAgIGxjZC5wcmludCgiUmVzZXQiKTsKICAgICAgICAgIGlmIChyZXNldCA9PSAwKSB7CiAgICAgICAgICAgIGxjZC5zZXRDdXJzb3IoMCwgMSk7CiAgICAgICAgICAgIGxjZC53cml0ZSgxKTsKICAgICAgICAgICAgbGNkLnNldEN1cnNvcig4LCAxKTsKICAgICAgICAgICAgbGNkLnByaW50KCIgIik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocmVzZXQgPT0gMSkgewogICAgICAgICAgICBsY2Quc2V0Q3Vyc29yKDAsIDEpOwogICAgICAgICAgICBsY2QucHJpbnQoIiAiKTsKICAgICAgICAgICAgbGNkLnNldEN1cnNvcig4LCAxKTsKICAgICAgICAgICAgbGNkLndyaXRlKDEpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgYnJlYWs7CgogICAgY2FzZSA5OToKICAgICAgbGNkLnNldEN1cnNvcigwLCAwKTsKICAgICAgbGNkLnByaW50KCIgICAgICAgICAgICAgICAgIik7CiAgICAgIGxjZC5zZXRDdXJzb3IoMCwgMSk7CiAgICAgIGxjZC5wcmludCgiICAgICAgTVVURSAgICAgICIpOwogICAgICBicmVhazsKCiAgICBjYXNlIDEwMDoKICAgICAgbGNkLnNldEN1cnNvcigwLCAwKTsKICAgICAgbGNkLnByaW50KCIgICAgICAgICAgICAgICAgIik7CiAgICAgIGxjZC5zZXRDdXJzb3IoMCwgMSk7CiAgICAgIGxjZC5wcmludCgiICAgIFNUQU5EQlkgICAgICIpOwogICAgICBicmVhazsKICB9CiAgaWYgKG1lbnVfYWN0aXZlID09IDApIHsKICAgIGludCB5OwogICAgaWYgKGMgPCAwKSB7CiAgICAgIGxjZC5zZXRDdXJzb3IoOCwgMSk7CiAgICAgIGxjZC5wcmludCgiLSIpOwogICAgICB5ID0gMTAgLSAoYyArIDEwKTsKICAgIH0gZWxzZSBpZiAoYyA9PSAtMTApIHsKICAgICAgbGNkLnNldEN1cnNvcig4LCAxKTsKICAgICAgbGNkLnByaW50KCItIik7CiAgICAgIHkgPSAxMDsKICAgIH0gZWxzZSB7CiAgICAgIGxjZC5zZXRDdXJzb3IoOCwgMSk7CiAgICAgIGxjZC5wcmludCgiICIpOwogICAgICB5ID0gYzsKICAgIH0KICAgIGEgPSB5IC8gMTA7CiAgICBiID0geSAtIGEgKiAxMDsKCiAgICBsY2Quc2V0Q3Vyc29yKDksIDApOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWdpdF93aWR0aDsgaSsrKQogICAgICBsY2QucHJpbnQoY3VzdG9tX251bV90b3BbYV1baV0pOwoKICAgIGxjZC5zZXRDdXJzb3IoOSwgMSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpZ2l0X3dpZHRoOyBpKyspCiAgICAgIGxjZC5wcmludChjdXN0b21fbnVtX2JvdFthXVtpXSk7CgogICAgbGNkLnNldEN1cnNvcigxMywgMCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpZ2l0X3dpZHRoOyBpKyspCiAgICAgIGxjZC5wcmludChjdXN0b21fbnVtX3RvcFtiXVtpXSk7CgogICAgbGNkLnNldEN1cnNvcigxMywgMSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpZ2l0X3dpZHRoOyBpKyspCiAgICAgIGxjZC5wcmludChjdXN0b21fbnVtX2JvdFtiXVtpXSk7CiAgfQoKfQoKLy9hbGwgcmVzZXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwoKdm9pZCBzZXRfcmVzZXQoKSB7CiAgaWYgKHJlc2V0ID09IDEpIHsKICAgIGluID0gMDsKICAgIG1hc192b2wgPSA0NDsKICAgIGZsX3ZvbCA9IDA7CiAgICBmcl92b2wgPSAwOwogICAgc2xfdm9sID0gMDsKICAgIHNyX3ZvbCA9IDA7CiAgICBjbl92b2wgPSAwOwogICAgc3ViX3ZvbCA9IDA7CiAgICBzcGVha2VyX21vZGUgPSAwOwogICAgc3VyciA9IDA7CiAgICBtaXggPSAwOwogICAgdm9sX21lbnUgPSAwOwogICAgbWVudV9hY3RpdmUgPSAwOwogICAgcmVzZXQgPSAwOwogICAgbGNkLmNsZWFyKCk7CiAgfQogIHNldF9pbigpOwogIHNldF9mbCgpOwogIHNldF9mcigpOwogIHNldF9zbCgpOwogIHNldF9zcigpOwogIHNldF9jbigpOwogIHNldF9zdWIoKTsKICBzZXRfc3BlYWtlcl9tb2RlKCk7CiAgc2V0X3N1cnIoKTsKICBzZXRfbWl4KCk7Cn0KCi8vc3BlYWtlciBtb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KCnZvaWQgc2V0X3NwZWFrZXJfbW9kZSgpIHsKICBpZiAoc3BlYWtlcl9tb2RlID4gMSkgewogICAgc3BlYWtlcl9tb2RlID0gMDsKICB9CiAgaWYgKHNwZWFrZXJfbW9kZSA8IDApIHsKICAgIHNwZWFrZXJfbW9kZSA9IDE7CiAgfQogIHN3aXRjaCAoc3BlYWtlcl9tb2RlKSB7CiAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgLy8gNS4xIG1vZGUKICAgICAgY2hfbXV0ZSA9IDA7CiAgICAgIGJyZWFrOwogICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgIC8vIDIuMSBtb2RlCiAgICAgIGNoX211dGUgPSAxOwogICAgICBicmVhazsKICB9CiAgc2V0X3NsKCk7CiAgc2V0X3NyKCk7CiAgc2V0X2NuKCk7Cn0KCi8vQVgyMzU4IHNldHRpbmdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KCnZvaWQgc2V0X2luKCkgewogIGlmIChpbiA+IDQpIHsKICAgIGluID0gMDsKICB9CiAgc3dpdGNoIChpbikgewogICAgY2FzZSAwOiBhID0gMGIxMTAwMTAxMTsgYnJlYWs7IC8vIDEgaW5wdXQKICAgIGNhc2UgMTogYSA9IDBiMTEwMDEwMTA7IGJyZWFrOyAvLyAyIGlucHV0CiAgICBjYXNlIDI6IGEgPSAwYjExMDAxMDAxOyBicmVhazsgLy8gMyBpbnB1dAogICAgY2FzZSAzOiBhID0gMGIxMTAwMTAwMDsgYnJlYWs7IC8vIDQgaW5wdXQKICAgIGNhc2UgNDogYSA9IDBiMTEwMDExMTE7IGJyZWFrOyAvLyA2IENIIGlucHV0CiAgfQogIEFYMjM1OF9zZW5kKGEpOwp9CnZvaWQgc2V0X3N1cnIoKSB7CiAgaWYgKHN1cnIgPiAxKSB7CiAgICBzdXJyID0gMDsKICB9CiAgaWYgKHN1cnIgPCAwKSB7CiAgICBzdXJyID0gMTsKICB9CiAgc3dpdGNoIChzdXJyKSB7CiAgICBjYXNlIDA6IGEgPSAwYjExMDAwMDAwOyBicmVhazsgLy8gU3Vycm91bmQgT04KICAgIGNhc2UgMTogYSA9IDBiMTEwMDAwMDE7IGJyZWFrOyAvLyBTdXJyb3VuZCBPRkYKICB9CiAgQVgyMzU4X3NlbmQoYSk7Cn0Kdm9pZCBzZXRfbWl4KCkgewogIGlmIChtaXggPiAxKSB7CiAgICBtaXggPSAwOwogIH0KICBzd2l0Y2ggKG1peCkgewogICAgY2FzZSAwOiBhID0gMGIxMTAwMDAxMDsgYnJlYWs7IC8vICgtNmRCKSBvbgogICAgY2FzZSAxOiBhID0gMGIxMTAwMDAxMTsgYnJlYWs7IC8vICgtNmRCKSBvZmYKICB9CiAgQVgyMzU4X3NlbmQoYSk7Cn0KCi8vQVgyMzU4IFZvbHVtZSBzZXR0aW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KCnZvaWQgc2V0X21hc192b2woKSB7CiAgaWYgKG1hc192b2wgPiA2OSkgewogICAgbWFzX3ZvbCA9IDY5OwogIH0KICBpZiAobWFzX3ZvbCA8IDE5KSB7CiAgICBtYXNfdm9sID0gMTk7CiAgfQogIGlmIChtYXNfdm9sID09IDE5KSB7CiAgICBtdXRlID0gMTsKICB9IGVsc2UgewogICAgbXV0ZSA9IDA7CiAgfQogIHNldF9tdXRlKCk7Cn0Kdm9pZCBzZXRfbXV0ZSgpIHsKICBpZiAobXV0ZSA+IDEpIHsKICAgIG11dGUgPSAwOwogIH0KICBzd2l0Y2ggKG11dGUpIHsKICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAvLyA1LjEgbW9kZQogICAgICBjaF9tdXRlID0gMDsKICAgICAgYnJlYWs7CiAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgLy8gMi4xIG1vZGUKICAgICAgY2hfbXV0ZSA9IDE7CiAgICAgIGJyZWFrOwogIH0KICBzZXRfZmwoKTsKICBzZXRfZnIoKTsKICBzZXRfc3ViKCk7CiAgaWYgKHNwZWFrZXJfbW9kZSA9PSAwKSB7CiAgICBzZXRfc2woKTsKICAgIHNldF9zcigpOwogICAgc2V0X2NuKCk7CiAgfQp9CnZvaWQgc2V0X2ZsKCkgewogIGlmIChmbF92b2wgPiAxMCkgewogICAgZmxfdm9sID0gMTA7CiAgfQogIGlmIChmbF92b2wgPCAtMTApIHsKICAgIGZsX3ZvbCA9IC0xMDsKICB9CiAgZmwgPSBtYXNfdm9sICsgZmxfdm9sOwogIGludCBjID0gNzkgLSBmbDsKICBhID0gYyAvIDEwOwogIGIgPSBjIC0gYSAqIDEwOwogIEFYMjM1OF92b2woMGIxMDAwMDAwMCArIGEsIDBiMTAwMTAwMDAgKyBiKTsgIC8vIENIMQogIAogIHN3aXRjaCAoY2hfbXV0ZSkgewogICAgY2FzZSAwOiB4ID0gMGIxMTExMDAwMDsgYnJlYWs7IC8vIE11dGUgZGlzYWJsZWQKICAgIGNhc2UgMTogeCA9IDBiMTExMTAwMDE7IGJyZWFrOyAvLyBNdXRlCiAgfQogIEFYMjM1OF9zZW5kKHgpOwp9CnZvaWQgc2V0X2ZyKCkgewogIGlmIChmcl92b2wgPiAxMCkgewogICAgZnJfdm9sID0gMTA7CiAgfQogIGlmIChmcl92b2wgPCAtMTApIHsKICAgIGZyX3ZvbCA9IC0xMDsKICB9CiAgZnIgPSBtYXNfdm9sICsgZnJfdm9sOwogIGludCBjID0gNzkgLSBmcjsKICBhID0gYyAvIDEwOwogIGIgPSBjIC0gYSAqIDEwOwogIEFYMjM1OF92b2woMGIwMTAwMDAwMCArIGEsIDBiMDEwMTAwMDAgKyBiKTsgIC8vIENIMgoKICBzd2l0Y2ggKGNoX211dGUpIHsKICAgIGNhc2UgMDogeCA9IDBiMTExMTAwMTA7IGJyZWFrOyAvLyBNdXRlIGRpc2FibGVkCiAgICBjYXNlIDE6IHggPSAwYjExMTEwMDExOyBicmVhazsgLy8gTXV0ZQogIH0KICBBWDIzNThfc2VuZCh4KTsKfQp2b2lkIHNldF9jbigpIHsKICBpZiAoY25fdm9sID4gMTApIHsKICAgIGNuX3ZvbCA9IDEwOwogIH0KICBpZiAoY25fdm9sIDwgLTEwKSB7CiAgICBjbl92b2wgPSAtMTA7CiAgfQogIGNuID0gbWFzX3ZvbCArIGNuX3ZvbDsKICBpbnQgYyA9IDc5IC0gY247CiAgYSA9IGMgLyAxMDsKICBiID0gYyAtIGEgKiAxMDsKICBBWDIzNThfdm9sKDBiMDAwMDAwMDAgKyBhLCAwYjAwMDEwMDAwICsgYik7ICAvLyBDSDMKCiAgc3dpdGNoIChjaF9tdXRlKSB7CiAgICBjYXNlIDA6IHggPSAwYjExMTEwMTAwOyBicmVhazsgLy8gTXV0ZSBkaXNhYmxlZAogICAgY2FzZSAxOiB4ID0gMGIxMTExMDEwMTsgYnJlYWs7IC8vIE11dGUKICB9CiAgQVgyMzU4X3NlbmQoeCk7Cn0Kdm9pZCBzZXRfc3ViKCkgewogIGlmIChzdWJfdm9sID4gMTApIHsKICAgIHN1Yl92b2wgPSAxMDsKICB9CiAgaWYgKHN1Yl92b2wgPCAtMTApIHsKICAgIHN1Yl92b2wgPSAtMTA7CiAgfQogIHN1YiA9IG1hc192b2wgKyBzdWJfdm9sOwogIGludCBjID0gNzkgLSBzdWI7CiAgYSA9IGMgLyAxMDsKICBiID0gYyAtIGEgKiAxMDsKICBBWDIzNThfdm9sKDBiMDAxMDAwMDAgKyBhLCAwYjAwMTEwMDAwICsgYik7ICAvLyBDSDQKCiAgc3dpdGNoIChjaF9tdXRlKSB7CiAgICBjYXNlIDA6IHggPSAwYjExMTEwMTEwOyBicmVhazsgLy8gTXV0ZSBkaXNhYmxlZAogICAgY2FzZSAxOiB4ID0gMGIxMTExMDExMTsgYnJlYWs7IC8vIE11dGUKICB9CiAgQVgyMzU4X3NlbmQoeCk7Cn0Kdm9pZCBzZXRfc2woKSB7CiAgaWYgKHNsX3ZvbCA+IDEwKSB7CiAgICBzbF92b2wgPSAxMDsKICB9CiAgaWYgKHNsX3ZvbCA8IC0xMCkgewogICAgc2xfdm9sID0gLTEwOwogIH0KICBzbCA9IG1hc192b2wgKyBzbF92b2w7CiAgaW50IGMgPSA3OSAtIHNsOwogIGEgPSBjIC8gMTA7CiAgYiA9IGMgLSBhICogMTA7CiAgQVgyMzU4X3ZvbCgwYjAxMTAwMDAwICsgYSwgMGIwMTExMDAwMCArIGIpOyAgLy8gQ0g1CgogIHN3aXRjaCAoY2hfbXV0ZSkgewogICAgY2FzZSAwOiB4ID0gMGIxMTExMTAwMDsgYnJlYWs7IC8vIE11dGUgZGlzYWJsZWQKICAgIGNhc2UgMTogeCA9IDBiMTExMTEwMDE7IGJyZWFrOyAvLyBNdXRlCiAgfQogIEFYMjM1OF9zZW5kKHgpOwp9CnZvaWQgc2V0X3NyKCkgewogIGlmIChzcl92b2wgPiAxMCkgewogICAgc3Jfdm9sID0gMTA7CiAgfQogIGlmIChzcl92b2wgPCAtMTApIHsKICAgIHNyX3ZvbCA9IC0xMDsKICB9CiAgc3IgPSBtYXNfdm9sICsgc3Jfdm9sOwogIGludCBjID0gNzkgLSBzcjsKICBhID0gYyAvIDEwOwogIGIgPSBjIC0gYSAqIDEwOyAKICBBWDIzNThfdm9sKDBiMTAxMDAwMDAgKyBhLCAwYjEwMTEwMDAwICsgYik7ICAvLyBDSDYKCiAgc3dpdGNoIChjaF9tdXRlKSB7CiAgICBjYXNlIDA6IHggPSAwYjExMTExMDEwOyBicmVhazsgLy8gTXV0ZSBkaXNhYmxlZAogICAgY2FzZSAxOiB4ID0gMGIxMTExMTAxMTsgYnJlYWs7IC8vIE11dGUKICB9CiAgQVgyMzU4X3NlbmQoeCk7Cn0KCi8vQVgyMzU4IHNlbmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwoKdm9pZCBBWDIzNThfc2VuZChjaGFyIGMpIHsKICBXaXJlLmJlZ2luVHJhbnNtaXNzaW9uKEFYMjM1OF9hZGRyZXNzKTsKICBXaXJlLndyaXRlIChjKTsKICBXaXJlLmVuZFRyYW5zbWlzc2lvbigpOwp9CnZvaWQgQVgyMzU4KCkgewogIFdpcmUuYmVnaW5UcmFuc21pc3Npb24oQVgyMzU4X2FkZHJlc3MpOwogIFdpcmUud3JpdGUgKDBiMTEwMDAxMDApOwogIFdpcmUuZW5kVHJhbnNtaXNzaW9uKCk7Cn0Kdm9pZCBBWDIzNThfdm9sKGNoYXIgYywgY2hhciBkKSB7CiAgV2lyZS5iZWdpblRyYW5zbWlzc2lvbihBWDIzNThfYWRkcmVzcyk7CiAgV2lyZS53cml0ZSAoYyk7CiAgV2lyZS53cml0ZSAoZCk7CiAgV2lyZS5lbmRUcmFuc21pc3Npb24oKTsKfQoKLy9lbmQgY29kZQ==
// AX2358 5.1 Surround System
// DaacWaves <https://d...content-available-to-author-only...t.com>
#include <Wire.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <IRremote.h>
#define AX2358_address 0b1001010
#define btn_delay 300
#define sw01 9 // SW
#define sw02 11 // DT
#define sw03 10 // CLK
#define sw04 A0 // Input
#define sw05 A1 // Mute
#define sw06 A2 // Power
#define sw_power 13 // Out
// IR HEX code
#define ir_power 0x807F827D // IR power ON/OFF
#define ir_mute 0x609FFF80 // IR mute
#define ir_in_0 0x807F629D // IR input USB
#define ir_in_1 0x807F52AD // IR input BLU
#define ir_in_2 0x807FA25D // IR input FM
#define ir_in_3 0x807F22DD // IR input AUX
#define ir_in_4 0x807F20DF // IR input DVD
#define ir_vol_i 0x807F906F // IR vol++
#define ir_vol_d 0x807FA05F // IR vol--
#define ir_fl_i 0x807F40BF // IR fl++
#define ir_fl_d 0x807FC03F // IR fl--
#define ir_fr_i 0x807F00FF // IR fr++
#define ir_fr_d 0x807F807F // IR fr--
#define ir_sl_i 0x807F48B7 // IR sl++
#define ir_sl_d 0x807FC837 // IR sl--
#define ir_sr_i 0x807F08F7 // IR sr++
#define ir_sr_d 0x807F8877 // IR sr--
#define ir_cn_i 0x807F50AF // IR cn++
#define ir_cn_d 0x807F609F // IR cn--
#define ir_sub_i 0x807FD02F // IR sub++
#define ir_sub_d 0x807FE01F // IR sub--
#define ir_sp_mode 0x807F0AF5 // IR speaker mode change
#define ir_surr_mode 0x807FA857 // IR surround ON/OFF
#define ir_mix_mode 0x00000000 // IR -6dB ON/OFF
#define ir_reset 0x807F1AE5 // IR reset
IRrecv irrecv(8);
decode_results results;
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};
byte arrow_right[8] = {B00000, B10000, B11000, B11100, B11110, B11100, B11000, B10000};
LiquidCrystal_I2C lcd(0x27, 16, 2);
unsigned long time;
int in, mute, return_d, surr, mix, a, b, x, power, menu, menu_active, ch_mute, speaker_mode, btn_press, long_press, vol_menu, vol_menu_jup, reset;
int fl, fr, sl, sr, cn, sub, ir_menu, ir_on, mas_vol, fl_vol, fr_vol, sl_vol, sr_vol, cn_vol, sub_vol;
long btn_timer = 0;
long long_press_time = 600;
void setup() {
Wire.begin();
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(sw01, INPUT); // SW
pinMode(sw02, INPUT); // DT
pinMode(sw03, INPUT); // CLK
pinMode(sw04, INPUT); // Input
pinMode(sw05, INPUT); // Mute
pinMode(sw06, INPUT); // Power
pinMode(sw_power, OUTPUT); // Out
digitalWrite(sw_power, LOW);
lcd.begin(16, 2);
power = 0;
eeprom_read();
start_up();
power_up();
}
void loop() {
lcd_update();
eeprom_update();
ir_control();
return_delay();
if (menu_active == 0) {
custom_num_shape();
} else {
custom_shape();
}
//power -------------------------------------------------//
if (analogRead(sw06) > 900) {
power++;
if (power > 1) {
power = 0;
}
power_up();
delay(btn_delay);
}
if (power == 1) {
//select input -------------------------------------------------//
if (analogRead(sw04) > 900) {
in++;
set_in();
delay(btn_delay);
}
//select menu -------------------------------------------------//
if (digitalRead(sw01) == LOW) {
if (btn_press == 0) {
btn_press = 1;
btn_timer = millis();
}
if ((millis() - btn_timer > long_press_time) && (long_press == 0) && (menu_active == 0)) {
long_press = 1;
menu_active = 1;
menu = 1;
btn_cl();
lcd.clear();
} else if ((millis() - btn_timer > long_press_time) && (long_press == 0) && (menu_active == 1)) {
long_press = 1;
menu_active = 0;
vol_menu = 0;
reset = 0;
btn_cl();
lcd.clear();
}
} else {
if (btn_press == 1) {
if (long_press == 1) {
long_press = 0;
} else {
if (menu_active == 1) {
menu++;
if (menu > 4) {
menu = 1;
}
btn_cl();
lcd.clear();
} else if (menu_active == 0 && speaker_mode == 0) {
vol_menu++;
if (vol_menu > 6) {
vol_menu = 0;
}
btn_cl();
} else if (menu_active == 0 && speaker_mode == 1) {
vol_menu++;
if (vol_menu_jup == 0) {
if (vol_menu > 2) {
vol_menu = 6;
vol_menu_jup = 1;
}
}
if (vol_menu_jup == 1) {
if (vol_menu > 6) {
vol_menu = 0;
vol_menu_jup = 0;
}
}
btn_cl();
}
}
btn_press = 0;
}
}
//mute -------------------------------------------------//
if (analogRead(sw05) > 900 && mas_vol != 19) {
mute++;
if (mute == 1) {
menu_active = 99;
} else {
menu_active = 0;
}
set_mute();
delay(btn_delay);
lcd.clear();
}
}
//menu active 0 -------------------------------------------------//
if (menu_active == 0) {
if (digitalRead(sw02) == LOW) {
if (vol_menu == 0) {
mas_vol++;
}
if (vol_menu == 1) {
fl_vol++;
}
if (vol_menu == 2) {
fr_vol++;
}
if (vol_menu == 3) {
sl_vol++;
}
if (vol_menu == 4) {
sr_vol++;
}
if (vol_menu == 5) {
cn_vol++;
}
if (vol_menu == 6) {
sub_vol++;
}
set_mas_vol();
set_fl();
set_fr();
set_sub();
if (speaker_mode == 0) {
set_sl();
set_sr();
set_cn();
}
btn_cl();
}
if (digitalRead(sw03) == LOW) {
if (vol_menu == 0) {
mas_vol--;
}
if (vol_menu == 1) {
fl_vol--;
}
if (vol_menu == 2) {
fr_vol--;
}
if (vol_menu == 3) {
sl_vol--;
}
if (vol_menu == 4) {
sr_vol--;
}
if (vol_menu == 5) {
cn_vol--;
}
if (vol_menu == 6) {
sub_vol--;
}
set_mas_vol();
set_fl();
set_fr();
set_sub();
if (speaker_mode == 0) {
set_sl();
set_sr();
set_cn();
}
btn_cl();
}
}
//menu active 1 -------------------------------------------------//
if (menu_active == 1) {
if (menu == 1) {
if (digitalRead(sw02) == LOW) {
surr++;
set_surr();
btn_cl();
}
}
if (menu == 2) {
if (digitalRead(sw02) == LOW) {
speaker_mode++;
if (speaker_mode == 1) {
vol_menu_jup = 0;
}
set_speaker_mode();
btn_cl();
}
}
if (menu == 3) {
if (digitalRead(sw02) == LOW) {
mix++;
set_mix();
btn_cl();
}
}
if (menu == 4) {
if (digitalRead(sw02) == LOW) {
reset++;
set_reset();
btn_cl();
}
}
}
}
//eeprom -----------------------------------------------------//
void eeprom_update() {
EEPROM.update(0, in);
EEPROM.update(1, mas_vol);
EEPROM.update(2, fl_vol + 10);
EEPROM.update(3, fr_vol + 10);
EEPROM.update(4, sl_vol + 10);
EEPROM.update(5, sr_vol + 10);
EEPROM.update(6, cn_vol + 10);
EEPROM.update(7, sub_vol + 10);
EEPROM.update(8, surr);
EEPROM.update(9, speaker_mode);
EEPROM.update(10, mix);
}
void eeprom_read() {
in = EEPROM.read(0);
mas_vol = EEPROM.read(1);
fl_vol = EEPROM.read(2) - 10;
fr_vol = EEPROM.read(3) - 10;
sl_vol = EEPROM.read(4) - 10;
sr_vol = EEPROM.read(5) - 10;
cn_vol = EEPROM.read(6) - 10;
sub_vol = EEPROM.read(7) - 10;
surr = EEPROM.read(8);
speaker_mode = EEPROM.read(9);
mix = EEPROM.read(10);
}
void btn_cl() {
delay(btn_delay);
time = millis();
return_d = 1;
}
void ir_cl() {
time = millis();
return_d = 1;
}
void return_delay() {
if (millis() - time > 5000 && return_d == 1 && mute == 0 && menu_active != 0) {
menu_active = 0;
vol_menu = 0;
reset = 0;
return_d = 0;
lcd.clear();
} else if (millis() - time > 5000 && return_d == 1 && mute == 0 && menu_active == 0) {
vol_menu = 0;
return_d = 0;
}
}
//power up -----------------------------------------------------//
void power_up() {
if (power == 1) {
lcd.clear();
delay(500);
lcd.setCursor(0, 1);
lcd.print(" LOADING... ");
delay(1000);
lcd.clear();
if (mas_vol > 19) {
mute = 0;
}
set_mute();
vol_menu = 0;
menu_active = 0;
delay(300);
ir_on = 1;
vol_menu_jup = 0;
digitalWrite(sw_power, HIGH);
} else {
(sw_power, LOW);
mute = 1;
set_mute();
delay(100);
menu_active = 100;
ir_on = 0;
}
}
void start_up() {
mute = 1;
set_mute();
delay(500);
lcd.setCursor(0, 0);
lcd.print(" Ui Tech ");
delay(500);
lcd.setCursor(0, 1);
lcd.print(" 5.1 SYSTEM ");
delay(1000);
lcd.clear();
delay(300);
lcd.setCursor(0, 1);
lcd.print(" LOADING... ");
delay(1500);
lcd.clear();
delay(300);
AX2358();
set_in();
set_surr();
set_mix();
set_fl();
set_fr();
set_sl();
set_sr();
set_cn();
set_sub();
}
//IR control --------------------------------------------------------------------------------//
void ir_control() {
if ( irrecv.decode( &results )) {
switch (results.value) {
//power -------------------------------------------------//
case ir_power:
power++;
if (power > 1) {
power = 0;
}
power_up();
break;
}
if (ir_on == 1) {
switch (results.value) {
//mute -------------------------------------------------//
case ir_mute:
if (mas_vol != 19) {
mute++;
if (mute == 1) {
menu_active = 99;
} else {
menu_active = 0;
}
set_mute();
lcd.clear();
}
break;
//select input -------------------------------------------------//
case ir_in_0:
in = 0;
set_in();
ir_cl();
break;
case ir_in_1:
in = 1;
set_in();
ir_cl();
break;
case ir_in_2:
in = 2;
set_in();
ir_cl();
break;
case ir_in_3:
in = 3;
set_in();
ir_cl();
break;
case ir_in_4:
in = 4;
set_in();
ir_cl();
break;
}
}
if (ir_on == 1 && menu_active == 0) {
switch (results.value) {
//VOL -------------------------------------------------//
case ir_vol_i:
if (speaker_mode == 0 || speaker_mode == 1) {
mas_vol++;
vol_menu = 0;
set_mas_vol();
set_fl();
set_fr();
set_sub();
if (speaker_mode == 0) {
set_sl();
set_sr();
set_cn();
}
}
break;
case ir_vol_d:
if (speaker_mode == 0 || speaker_mode == 1) {
mas_vol--;
vol_menu = 0;
set_mas_vol();
set_fl();
set_fr();
set_sub();
if (speaker_mode == 0) {
set_sl();
set_sr();
set_cn();
}
}
break;
//FL -------------------------------------------------//
case ir_fl_i:
if (speaker_mode == 0 || speaker_mode == 1) {
fl_vol++;
vol_menu = 1;
set_fl();
}
break;
case ir_fl_d:
if (speaker_mode == 0 || speaker_mode == 1) {
fl_vol--;
vol_menu = 1;
set_fl();
}
break;
//FR -------------------------------------------------//
case ir_fr_i:
if (speaker_mode == 0 || speaker_mode == 1) {
fr_vol++;
vol_menu = 2;
set_fr();
}
break;
case ir_fr_d:
if (speaker_mode == 0 || speaker_mode == 1) {
fr_vol--;
vol_menu = 2;
set_fr();
}
break;
//SL -------------------------------------------------//
case ir_sl_i:
if (speaker_mode == 0) {
sl_vol++;
vol_menu = 3;
set_sl();
}
break;
case ir_sl_d:
if (speaker_mode == 0) {
sl_vol--;
vol_menu = 3;
set_sl();
}
break;
//SR -------------------------------------------------//
case ir_sr_i:
if (speaker_mode == 0) {
sr_vol++;
vol_menu = 4;
set_sr();
}
break;
case ir_sr_d:
if (speaker_mode == 0) {
sr_vol--;
vol_menu = 4;
set_sr();
}
break;
//CN -------------------------------------------------//
case ir_cn_i:
if (speaker_mode == 0) {
cn_vol++;
vol_menu = 5;
set_cn();
}
break;
case ir_cn_d:
if (speaker_mode == 0) {
cn_vol--;
vol_menu = 5;
set_cn();
}
break;
//SUB -------------------------------------------------//
case ir_sub_i:
if (speaker_mode == 0 || speaker_mode == 1) {
sub_vol++;
vol_menu = 6;
set_sub();
}
break;
case ir_sub_d:
if (speaker_mode == 0 || speaker_mode == 1) {
sub_vol--;
vol_menu = 6;
set_sub();
}
break;
//speaker mode -------------------------------------------------//
case ir_sp_mode:
speaker_mode++;
vol_menu = 0;
if (speaker_mode == 1) {
vol_menu_jup = 0;
}
set_speaker_mode();
break;
//surround -------------------------------------------------//
case ir_surr_mode:
surr++;
vol_menu = 0;
set_surr();
break;
// -------------------------------------------------//
case ir_mix_mode:
mix++;
vol_menu = 0;
set_mix();
break;
// -------------------------------------------------//
case ir_reset:
reset++;
vol_menu = 0;
set_reset();
break;
}
ir_cl();
}
irrecv.resume();
}
}
//custom shape --------------------------------------------------------------------------------//
void custom_num_shape() {
for (int i = 0; i < 8; i++)
lcd.createChar(i, custom_num[i]);
}
void custom_shape() {
lcd.createChar(1, arrow_right);
}
//lcd ---------------------------------------------------------//
void lcd_update() {
int c;
switch (menu_active) {
case 0:
//input -------------------------------------------------//
lcd.setCursor(0, 0);
if (in == 0) {
lcd.print("IN1");
}
if (in == 1) {
lcd.print("IN2");
}
if (in == 2) {
lcd.print("IN3");
}
if (in == 3) {
lcd.print("AUX");
}
if (in == 4) {
lcd.print("DVD");
}
//speaker mode ------------------------------------------//
lcd.setCursor(4, 0);
if (speaker_mode == 0) {
lcd.print("5.1");
}
if (speaker_mode == 1) {
lcd.print("2.1");
}
//vol ----------------------------------------------//
switch (vol_menu) {
case 0:
lcd.setCursor(0, 1);
// (" ");
lcd.print("MAS-VOL");
c = mas_vol - 19;
break;
case 1:
lcd.setCursor(0, 1);
// (" ");
lcd.print("FL-VOL ");
c = fl_vol;
break;
case 2:
lcd.setCursor(0, 1);
// (" ");
lcd.print("FR-VOL ");
c = fr_vol;
break;
case 3:
lcd.setCursor(0, 1);
// (" ");
lcd.print("SL-VOL ");
c = sl_vol;
break;
case 4:
lcd.setCursor(0, 1);
// (" ");
lcd.print("SR-VOL ");
c = sr_vol;
break;
case 5:
lcd.setCursor(0, 1);
// (" ");
lcd.print("CN-VOL ");
c = cn_vol;
break;
case 6:
lcd.setCursor(0, 1);
// (" ");
lcd.print("SUB-VOL");
c = sub_vol;
break;
}
break;
case 1:
switch (menu) {
case 1:
lcd.setCursor(0, 0);
lcd.print("Surround");
lcd.setCursor(1, 1);
lcd.print("ON");
lcd.setCursor(6, 1);
lcd.print("OFF");
if (surr == 0) {
lcd.setCursor(0, 1);
lcd.write(1);
lcd.setCursor(5, 1);
lcd.print(" ");
}
if (surr == 1) {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(5, 1);
lcd.write(1);
}
break;
case 2:
lcd.setCursor(0, 0);
lcd.print("Speaker Mode");
lcd.setCursor(1, 1);
lcd.print("5.1");
lcd.setCursor(6, 1);
lcd.print("2.1");
if (speaker_mode == 0) {
lcd.setCursor(0, 1);
lcd.write(1);
lcd.setCursor(5, 1);
lcd.print(" ");
}
if (speaker_mode == 1) {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(5, 1);
lcd.write(1);
}
break;
case 3:
lcd.setCursor(0, 0);
lcd.print("-6dB");
lcd.setCursor(1, 1);
lcd.print("ON");
lcd.setCursor(6, 1);
lcd.print("OFF");
if (mix == 0) {
lcd.setCursor(0, 1);
lcd.write(1);
lcd.setCursor(5, 1);
lcd.print(" ");
}
if (mix == 1) {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(5, 1);
lcd.write(1);
}
break;
case 4:
lcd.setCursor(0, 0);
lcd.print("All Reset");
lcd.setCursor(1, 1);
lcd.print("Reset");
if (reset == 1) {
lcd.setCursor(0, 1);
lcd.write(1);
}
lcd.setCursor(0, 0);
lcd.print("All Reset");
lcd.setCursor(1, 1);
lcd.print("Custom");
lcd.setCursor(9, 1);
lcd.print("Reset");
if (reset == 0) {
lcd.setCursor(0, 1);
lcd.write(1);
lcd.setCursor(8, 1);
lcd.print(" ");
}
if (reset == 1) {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.write(1);
}
break;
}
break;
case 99:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" MUTE ");
break;
case 100:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" STANDBY ");
break;
}
if (menu_active == 0) {
int y;
if (c < 0) {
lcd.setCursor(8, 1);
lcd.print("-");
y = 10 - (c + 10);
} else if (c == -10) {
lcd.setCursor(8, 1);
lcd.print("-");
y = 10;
} 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]);
}
}
//all reset --------------------------------------------------------------------------------//
void set_reset() {
if (reset == 1) {
in = 0;
mas_vol = 44;
fl_vol = 0;
fr_vol = 0;
sl_vol = 0;
sr_vol = 0;
cn_vol = 0;
sub_vol = 0;
speaker_mode = 0;
surr = 0;
mix = 0;
vol_menu = 0;
menu_active = 0;
reset = 0;
lcd.clear();
}
set_in();
set_fl();
set_fr();
set_sl();
set_sr();
set_cn();
set_sub();
set_speaker_mode();
set_surr();
set_mix();
}
//speaker mode --------------------------------------------------------------------------------//
void set_speaker_mode() {
if (speaker_mode > 1) {
speaker_mode = 0;
}
if (speaker_mode < 0) {
speaker_mode = 1;
}
switch (speaker_mode) {
case 0: // 5.1 mode
ch_mute = 0;
break;
case 1: // 2.1 mode
ch_mute = 1;
break;
}
set_sl();
set_sr();
set_cn();
}
//AX2358 settings -----------------------------------------------------//
void set_in() {
if (in > 4) {
in = 0;
}
switch (in) {
case 0: a = 0b11001011; break; // 1 input
case 1: a = 0b11001010; break; // 2 input
case 2: a = 0b11001001; break; // 3 input
case 3: a = 0b11001000; break; // 4 input
case 4: a = 0b11001111; break; // 6 CH input
}
AX2358_send(a);
}
void set_surr() {
if (surr > 1) {
surr = 0;
}
if (surr < 0) {
surr = 1;
}
switch (surr) {
case 0: a = 0b11000000; break; // Surround ON
case 1: a = 0b11000001; break; // Surround OFF
}
AX2358_send(a);
}
void set_mix() {
if (mix > 1) {
mix = 0;
}
switch (mix) {
case 0: a = 0b11000010; break; // (-6dB) on
case 1: a = 0b11000011; break; // (-6dB) off
}
AX2358_send(a);
}
//AX2358 Volume settings ----------------------------------------------//
void set_mas_vol() {
if (mas_vol > 69) {
mas_vol = 69;
}
if (mas_vol < 19) {
mas_vol = 19;
}
if (mas_vol == 19) {
mute = 1;
} else {
mute = 0;
}
set_mute();
}
void set_mute() {
if (mute > 1) {
mute = 0;
}
switch (mute) {
case 0: // 5.1 mode
ch_mute = 0;
break;
case 1: // 2.1 mode
ch_mute = 1;
break;
}
set_fl();
set_fr();
set_sub();
if (speaker_mode == 0) {
set_sl();
set_sr();
set_cn();
}
}
void set_fl() {
if (fl_vol > 10) {
fl_vol = 10;
}
if (fl_vol < -10) {
fl_vol = -10;
}
fl = mas_vol + fl_vol;
int c = 79 - fl;
a = c / 10;
b = c - a * 10;
AX2358_vol(0b10000000 + a, 0b10010000 + b); // CH1
switch (ch_mute) {
case 0: x = 0b11110000; break; // Mute disabled
case 1: x = 0b11110001; break; // Mute
}
AX2358_send(x);
}
void set_fr() {
if (fr_vol > 10) {
fr_vol = 10;
}
if (fr_vol < -10) {
fr_vol = -10;
}
fr = mas_vol + fr_vol;
int c = 79 - fr;
a = c / 10;
b = c - a * 10;
AX2358_vol(0b01000000 + a, 0b01010000 + b); // CH2
switch (ch_mute) {
case 0: x = 0b11110010; break; // Mute disabled
case 1: x = 0b11110011; break; // Mute
}
AX2358_send(x);
}
void set_cn() {
if (cn_vol > 10) {
cn_vol = 10;
}
if (cn_vol < -10) {
cn_vol = -10;
}
cn = mas_vol + cn_vol;
int c = 79 - cn;
a = c / 10;
b = c - a * 10;
AX2358_vol(0b00000000 + a, 0b00010000 + b); // CH3
switch (ch_mute) {
case 0: x = 0b11110100; break; // Mute disabled
case 1: x = 0b11110101; break; // Mute
}
AX2358_send(x);
}
void set_sub() {
if (sub_vol > 10) {
sub_vol = 10;
}
if (sub_vol < -10) {
sub_vol = -10;
}
sub = mas_vol + sub_vol;
int c = 79 - sub;
a = c / 10;
b = c - a * 10;
AX2358_vol(0b00100000 + a, 0b00110000 + b); // CH4
switch (ch_mute) {
case 0: x = 0b11110110; break; // Mute disabled
case 1: x = 0b11110111; break; // Mute
}
AX2358_send(x);
}
void set_sl() {
if (sl_vol > 10) {
sl_vol = 10;
}
if (sl_vol < -10) {
sl_vol = -10;
}
sl = mas_vol + sl_vol;
int c = 79 - sl;
a = c / 10;
b = c - a * 10;
AX2358_vol(0b01100000 + a, 0b01110000 + b); // CH5
switch (ch_mute) {
case 0: x = 0b11111000; break; // Mute disabled
case 1: x = 0b11111001; break; // Mute
}
AX2358_send(x);
}
void set_sr() {
if (sr_vol > 10) {
sr_vol = 10;
}
if (sr_vol < -10) {
sr_vol = -10;
}
sr = mas_vol + sr_vol;
int c = 79 - sr;
a = c / 10;
b = c - a * 10;
AX2358_vol(0b10100000 + a, 0b10110000 + b); // CH6
switch (ch_mute) {
case 0: x = 0b11111010; break; // Mute disabled
case 1: x = 0b11111011; break; // Mute
}
AX2358_send(x);
}
//AX2358 send -----------------------------------------------------//
void AX2358_send(char c) {
Wire.beginTransmission(AX2358_address);
Wire.write (c);
Wire.endTransmission();
}
void AX2358() {
Wire.beginTransmission(AX2358_address);
Wire.write (0b11000100);
Wire.endTransmission();
}
void AX2358_vol(char c, char d) {
Wire.beginTransmission(AX2358_address);
Wire.write (c);
Wire.write (d);
Wire.endTransmission();
}
//end code