Kod:
void resetEEPROM() {
lcd.setCursor(0, 0);
lcd.print(F(" FACTORY RESET?"));
lcd.setCursor(0, 1);
lcd.print(F("YES NO"));
while (true) {
input1Button.update();
input4Button.update();
if (input1Button.fell()) {
lcd.setCursor(0, 0);
lcd.print(F(" RESETTING! "));
delay(500);
EEPROM.update(0 + EEPROMOFFSET, 0);
EEPROM.update(1 + EEPROMOFFSET, 7);
EEPROM.update(2 + EEPROMOFFSET, 7);
EEPROM.update(3 + EEPROMOFFSET, 7);
EEPROM.update(4 + EEPROMOFFSET, 36);
EEPROM.update(5 + EEPROMOFFSET, 0);
EEPROM.update(6 + EEPROMOFFSET, 0);
EEPROM.update(7 + EEPROMOFFSET, 0);
EEPROM.update(8 + EEPROMOFFSET, 0);
EEPROM.update(9 + EEPROMOFFSET, 0);
for (int addy = 0; addy < 4; addy++) {
for (byte i = 0; i < 14; i++) {
int address = i + 10 + EEPROMOFFSET + (addy * 14);
EEPROM.update(address, pgm_read_byte(&(inputDefault[addy][i])));
}
}
EEPROM.update(67 + EEPROMOFFSET, 0);
EEPROM.update(68 + EEPROMOFFSET, 4);
EEPROM.update(69 + EEPROMOFFSET, 4);
EEPROM.update(70 + EEPROMOFFSET, 5);
lcd.setCursor(0, 0);
lcd.print(F("DEFAULT RESTORED"));
delay(1000);
break;
}
else if (input4Button.fell()) break;
}
input1Button.update();
input4Button.update();
}
void clearChars(byte startLine, byte startCol, byte char2clear) {
lcd.setCursor(startCol, startLine);
for (byte c = 0; c < char2clear; c++) {
lcd.print(" ");
}
lcd.setCursor(startCol, startLine);
}
int8_t encoderStatus() {
long enc = myEnc.read();
if (enc >= 4) {
dimmingTimer = millis();
myEnc.write(0);
#ifdef REVERSEENCODER
return -1;
#else
return 1;
#endif
}
else if (enc <= -4) {
dimmingTimer = millis();
myEnc.write(0);
#ifdef REVERSEENCODER
return 1;
#else
return -1;
#endif
}
else return 0;
}
void displayGraph(byte value, byte maxValue, byte chars2Use) {
byte totalBars = chars2Use * 5;
byte valuePosition = (float(value) / float(maxValue)) * totalBars;
byte solidChars = valuePosition / 5;
byte partChar = valuePosition % 5;
byte blankChars = 0;
if (value <= maxValue) {
if (partChar > 0) blankChars = chars2Use - solidChars - 1;
else blankChars = chars2Use - solidChars;
for (byte i = 0; i < solidChars; i++) lcd.write(255);
if (partChar > 0) lcd.write(partChar - 1);
for (byte i = 0; i < blankChars; i++) lcd.print("-");
}
else lcd.print(F("V>MV"));
}
void displaySplitGraph(byte value, byte halfPos, byte char2Display) {
byte chars2Use = char2Display / 2 - 1;
byte totalBars = chars2Use * 5;
byte valuePosition;
if (value > halfPos) valuePosition = ((float(value - halfPos) / float(halfPos)) * totalBars);
else if (value < halfPos) valuePosition = (float(halfPos - value) / float(halfPos)) * totalBars;
byte solidChars = valuePosition / 5;
byte partChar = valuePosition % 5;
byte blankChars = 0;
if (partChar > 0) blankChars = chars2Use - solidChars - 1;
else blankChars = chars2Use - solidChars;
if (value > halfPos) {
for (byte i = 0; i < chars2Use; i++) lcd.print("-");
lcd.print("|~");
for (byte i = 0; i < solidChars; i++) lcd.write(255);
if (partChar > 0) lcd.write(partChar - 1);
for (byte i = 0; i < blankChars; i++) lcd.print("-");
}
else if (value < halfPos) {
for (byte i = 0; i < blankChars; i++) lcd.print("-");
if (partChar > 0) lcd.write(partChar + 3);
for (byte i = 0; i < solidChars; i++) lcd.write(255);
lcd.write(127);
lcd.print("|");
for (byte i = 0; i < chars2Use; i++) lcd.print("-");
}
else {
for (byte i = 0; i < chars2Use; i++) lcd.print("-");
lcd.print("||");
for (byte i = 0; i < chars2Use; i++) lcd.print("-");
}
}
boolean flash(unsigned int delayTime) {
static boolean flash = false;
static uint32_t flashTimer = 0;
if ((long)(millis() - flashTimer) > delayTime) {
flash = 1 - flash;
flashTimer = millis();
}
return flash;
}
void powerOn() {
modeChanged = true;
displayUpdate = true;
inputChanged = true;
updateName = true;
mute = false;
volume = EEPROM.read(0 + EEPROMOFFSET);
treble = EEPROM.read(1 + EEPROMOFFSET);
middle = EEPROM.read(2 + EEPROMOFFSET);
bass = EEPROM.read(3 + EEPROMOFFSET);
balance = EEPROM.read(4 + EEPROMOFFSET);
currentInput = EEPROM.read(5 + EEPROMOFFSET);
powerOnInput = currentInput;
for (byte i = 0; i < 4; i++) {
inputLevel[i] = EEPROM.read(i + 6 + EEPROMOFFSET);
}
rgbHue = EEPROM.read(67 + EEPROMOFFSET);
if (rgbHue > 16) {
rgbHue = 0;
EEPROM.update(67 + EEPROMOFFSET, rgbHue);
}
rgbBri = EEPROM.read(68 + EEPROMOFFSET);
rgbSat = EEPROM.read(69 + EEPROMOFFSET);
autoBacklightDelay = EEPROM.read(70 + EEPROMOFFSET);
digitalWrite(shutdownPin, HIGH); // turn on power
setSelectorVolume(40);
delay(1); // short delay to allow amp to bootup
// volumeControl(volume);
setTone(0, bass);
setTone(1, middle);
setTone(2, treble);
setInputBoard(currentInput);
setGain(inputLevel[currentInput]);
setSelectorVolume(5);
setBalance(balance);
lcd.clear();
lcd.createChar_P(0, audion1);
lcd.createChar_P(1, audion2);
lcd.createChar_P(2, audion3);
lcd.createChar_P(3, audion4);
lcd.createChar_P(4, audion5);
lcd.createChar_P(5, audion6);
if (rgbBacklight) {
setHue(80);
setSaturation(255);
setBright(255);
}
else {
lcd.backlight();
}
lcd.setCursor(0, 1);
lcd.print(F(" TONE DA-2004"));
lcd.setCursor(0, 0);
lcd.write(0);
lcd.write(1);
lcd.write(2);
lcd.setCursor(0, 1);
lcd.write(3);
lcd.write(4);
lcd.write(5);
#ifdef DEBUG
lcd.setCursor(5, 0);
lcd.print(F(FIRMWAREVERSION));
#endif
unsigned long millisStart = millis();
unsigned int volumeTimer = 1000 / volume;
unsigned long millisVolume = millisStart;
byte tempVolume = 0;
while ((long)(millis() - millisStart <= 2000)) {
if ((long)(millis() - millisVolume > volumeTimer)) {
millisVolume += volumeTimer;
if (tempVolume < volume) {
tempVolume++;
volumeControl(tempVolume);
}
}
}
lcd.clear();
lcd.createChar_P(0, barR1);
lcd.createChar_P(1, barR2);
lcd.createChar_P(2, barR3);
lcd.createChar_P(3, barR4);
lcd.createChar_P(4, barL1);
lcd.createChar_P(5, barL2);
lcd.createChar_P(6, barL3);
lcd.createChar_P(7, barL4);
if (rgbBacklight) {
setHue(rgbHue * 16);
setBright(((rgbBri + 4) * 32) - 1);
if (rgbSat == 0) setSaturation(0);
else setSaturation((rgbSat * 64) - 1);
}
}
void powerOff() {
lcd.clear();
lcd.createChar_P(0, audion1);
lcd.createChar_P(1, audion2);
lcd.createChar_P(2, audion3);
lcd.createChar_P(3, audion4);
lcd.createChar_P(4, audion5);
lcd.createChar_P(5, audion6);
if (rgbBacklight) {
setHue(80);
setBright(255);
setSaturation(255);
}
lcd.setCursor(0, 1);
lcd.print(F(" TONE DA-2004"));
lcd.setCursor(0, 0);
lcd.write(0);
lcd.write(1);
lcd.write(2);
lcd.setCursor(0, 1);
lcd.write(3);
lcd.write(4);
lcd.write(5);
if (bitRead(valueChange, changeBit)) {
if (bitRead(valueChange, volumeBit)) {
#ifdef DEBUG
Serial.println(F("EEPROM Update Volume"));
#endif
EEPROM.update(0 + EEPROMOFFSET, volume);
bitClear(valueChange, volumeBit);
}
if (bitRead(valueChange, trebleBit)) {
#ifdef DEBUG
Serial.println(F("EEPROM Update Treble"));
#endif
EEPROM.update(1 + EEPROMOFFSET, treble);
bitClear(valueChange, trebleBit);
}
if (bitRead(valueChange, middleBit)) {
#ifdef DEBUG
Serial.println(F("EEPROM Update Midrange"));
#endif
EEPROM.update(2 + EEPROMOFFSET, middle);
bitClear(valueChange, middleBit);
}
if (bitRead(valueChange, bassBit)) {
#ifdef DEBUG
Serial.println(F("EEPROM Update Bass"));
#endif
EEPROM.update(3 + EEPROMOFFSET, bass);
bitClear(valueChange, bassBit);
}
if (bitRead(valueChange, balanceBit)) {
#ifdef DEBUG
Serial.println(F("EEPROM Update Balance"));
#endif
EEPROM.update(4 + EEPROMOFFSET, balance);
bitClear(valueChange, balanceBit);
}
bitClear(valueChange, changeBit);
valueChange = false;
}
if (currentInput != powerOnInput) {
EEPROM.update(5 + EEPROMOFFSET, currentInput);
#ifdef DEBUG
Serial.println(F("EEPROM Update Selected Input"));
#endif
}
unsigned long millisStart = millis();
unsigned int volumeTimer = 1000 / 35;
unsigned long millisVolume = millisStart;
byte tempVolume = 5;
while ((long)(millis() - millisStart <= 2000)) {
if ((long)(millis() - millisVolume > volumeTimer)) {
millisVolume += volumeTimer;
if (tempVolume < 40) {
tempVolume++;
setSelectorVolume(tempVolume);
}
else {
setSelectorVolume(56);
volumeControl(0);
digitalWrite(shutdownPin, LOW); // turn off power
}
}
}
lcd.clear();
// displayon(false);
if (rgbBacklight) setBright(0);
else lcd.noBacklight();
}
void setupMenu() {
byte currentSelection = 0;
lcd.clear();
lcd.print(F("SETUP MENU"));
displayUpdate = true;
do {
muteButton.update();
input4Button.update();
lcd.setCursor(0, 1);
if (currentSelection == 0) {
if (displayUpdate) {
lcd.print(F("VER: "));
clearChars(1, 5, 11);
lcd.print(FIRMWAREVERSION);
displayUpdate = false;
}
}
else if (currentSelection == 1) {
lcd.print(F("RGB: "));
if (rgbBacklight) {
if (displayUpdate) {
clearChars(1, 5, 11);
rgbColourPrint(rgbHue, 1, 5);
displayUpdate = false;
}
if (muteButton.fell()) {
lcd.setCursor(0, 1);
lcd.print(F("RGB> "));
while (1) {
muteButton.update();
if (displayUpdate) {
clearChars(1, 5, 11);
rgbColourPrint(rgbHue, 1, 5);
displayUpdate = false;
}
byte encoder = encoderStatus();
if (encoder != 0) {
rgbHue += encoder;
if (rgbHue > 15 && rgbHue < 255) rgbHue = 0;
else if (rgbHue == 255) rgbHue = 15;
// if (rgbHue <= 15) {
setHue(rgbHue * 16);
// setSaturation(255);
// }
displayUpdate = true;
}
if (muteButton.fell()) {
EEPROM.update(67 + EEPROMOFFSET, rgbHue);
break;
}
}
}
}
else {
if (displayUpdate) {
clearChars(1, 5, 11);
lcd.print(F("NA"));
displayUpdate = false;
}
}
}
else if (currentSelection == 2) {
lcd.print(F("BRI:"));
if (rgbBacklight) {
if (displayUpdate) {
// clearChars(1, 5, 11);
lcd.setCursor(4, 1);
lcd.print(F("[ ]"));
lcd.setCursor(5, 1);
displayGraph(rgbBri, 4, 10);
displayUpdate = false;
}
if (muteButton.fell()) {
lcd.setCursor(0, 1);
lcd.print(F("BRI>"));
while (1) {
muteButton.update();
if (displayUpdate) {
lcd.setCursor(4, 1);
lcd.print(F("[ ]"));
lcd.setCursor(5, 1);
displayGraph(rgbBri, 4, 10);
displayUpdate = false;
}
byte encoder = encoderStatus();
if (encoder != 0) {
rgbBri += encoder;
if (rgbBri > 4 && rgbBri < 255) rgbBri = 4;
else if (rgbBri == 255) rgbBri = 0;
setBright(((rgbBri + 4) * 32) - 1);
displayUpdate = true;
}
if (muteButton.fell()) {
EEPROM.update(68 + EEPROMOFFSET, rgbBri);
break;
}
}
}
}
else {
if (displayUpdate) {
clearChars(1, 5, 11);
lcd.print(F("NA"));
displayUpdate = false;
}
}
}
else if (currentSelection == 3) {
lcd.print(F("SAT:"));
if (rgbBacklight) {
if (displayUpdate) {
// clearChars(1, 5, 11);
lcd.setCursor(4, 1);
lcd.print(F("[ ]"));
lcd.setCursor(5, 1);
displayGraph(rgbSat, 4, 10);
displayUpdate = false;
}
if (muteButton.fell()) {
lcd.setCursor(0, 1);
lcd.print(F("SAT>"));
while (1) {
muteButton.update();
if (displayUpdate) {
lcd.setCursor(4, 1);
lcd.print(F("[ ]"));
lcd.setCursor(5, 1);
displayGraph(rgbSat, 4, 10);
displayUpdate = false;
}
byte encoder = encoderStatus();
if (encoder != 0) {
rgbSat += encoder;
if (rgbSat > 4 && rgbSat < 255) rgbSat = 4;
else if (rgbSat == 255) rgbSat = 0;
if (rgbSat == 0) setSaturation(0);
else setSaturation((rgbSat * 64) - 1);
displayUpdate = true;
}
if (muteButton.fell()) {
EEPROM.update(69 + EEPROMOFFSET, rgbSat);
break;
}
}
}
}
else {
if (displayUpdate) {
clearChars(1, 5, 11);
lcd.print(F("NA"));
displayUpdate = false;
}
}
}
else if (currentSelection == 4) {
lcd.print(F("BL TIME:"));
if (displayUpdate) {
lcd.setCursor(8, 1);
// clearChars(1, 8, 8);
if (delayOptions[autoBacklightDelay] < 9) lcd.print("0");
lcd.print(delayOptions[autoBacklightDelay]);
lcd.setCursor(10, 1);
lcd.print(F(" MINS "));
displayUpdate = false;
}
if (muteButton.fell()) {
lcd.setCursor(0, 1);
lcd.print(F("BL TIME>"));
while (1) {
muteButton.update();
if (displayUpdate) {
lcd.setCursor(8, 1);
if (delayOptions[autoBacklightDelay] < 9) lcd.print("0");
lcd.print(delayOptions[autoBacklightDelay]);
displayUpdate = false;
}
byte encoder = encoderStatus();
if (encoder != 0) {
autoBacklightDelay += encoder;
if (autoBacklightDelay > 7 && autoBacklightDelay < 255) autoBacklightDelay = 0;
else if (autoBacklightDelay == 255) autoBacklightDelay = 7;
displayUpdate = true;
}
if (muteButton.fell()) {
EEPROM.update(70 + EEPROMOFFSET, autoBacklightDelay);
break;
}
}
}
}
byte encoderPos = encoderStatus();
if (encoderPos != 0) {
currentSelection += encoderPos;
displayUpdate = true;
}
if (currentSelection > 4 && currentSelection < 255) currentSelection = 0;
else if (currentSelection == 255) currentSelection = 4;
} while (input4Button.read());
while (input4Button.read() == 0) {
displayUpdate = true;
updateName = true;
modeChanged = true;
input4Button.update();
powerButton.update();
}
}
void rgbColourPrint(byte hueIn, byte line, byte col) {
clearChars(line, col, 16);
lcd.setCursor(col, line);
switch (hueIn) {
case 0:
lcd.print(F("RED"));
break;
case 1:
lcd.print(F("FIRE"));
break;
case 2:
lcd.print(F("ORANGE"));
break;
case 3:
lcd.print(F("GOLD"));
break;
case 4:
lcd.print(F("YELLOW"));
break;
case 5:
lcd.print(F("LIME"));
break;
case 6:
lcd.print(F("GREEN"));
break;
case 7:
lcd.print(F("FERN"));
break;
case 8:
lcd.print(F("SAPPHIRE"));
break;
case 9:
lcd.print(F("SKY"));
break;
case 10:
lcd.print(F("BLUE"));
break;
case 11:
lcd.print(F("BERRY"));
break;
case 12:
lcd.print(F("PURPLE"));
break;
case 13:
lcd.print(F("MAGENTA"));
break;
case 14:
lcd.print(F("HOT PINK"));
break;
case 15:
lcd.print(F("STRAWBERRY"));
break;
}
}
void autoBacklight(byte mode) { // mode: 0 = no auto/backlight on | 1 = automatic mode
unsigned long timing = delayOptions[autoBacklightDelay] * 60000;
byte brightnessLevel = ((rgbBri + 4) * 32) - 1;
if (mode == 0 || timing == 0) {
if (rgbBacklight) setBright(brightnessLevel);
else lcd.backlight();
}
else {
if ((long)(millis() - dimmingTimer) >= timing) {
if (rgbBacklight) setBright(brightnessLevel / 2);
else lcd.noBacklight();
}
else {
if (rgbBacklight) setBright(brightnessLevel);
else lcd.backlight();
}
}
}