Main Program

Source Code of Xover44 Main Program (~/Xover44-Main/Xover44-Main.ino):

//Xover44 Modular Crossover Interface software for Arduino DUE

//Copyright of Sirio Maccolini 2018


//Libraries Icluded:

#include <SPI.h> //SPI

#include <SD.h> //SD card

#include <VGA.h> //VGA

#include <IRremote2.h> //Infra-Red receiver

#include <Xover_VGA.h> //Graphic functions

#include <Encoder.h> //Rotary encoder

#include <Xover_relays.h> //I2C Xover44 Boards controller


String CODE_UP; //remote control hex code for UP button

String CODE_DOWN; //remote control hex code for DOWN button

String CODE_RIGHT; //remote control hex code for RIGHT button

String CODE_LEFT; //remote control hex code for LEFT button

String CODE_OK; //remote control hex code for OK button

String CODE_MUTE; //remote control hex code for MUTE button ************************************************ (implementable as function of the volume board loosing half of the volume level options or as a new board.)

String remoteN[6]; //remote control preset number


const int xres=320,yres=240;//vga screen resolution (Maximum 320X240 with Arduino DUE limited by the clock speed)


const int posmax = 5; //last position for menu page

const int posmax2 = 13; //last position for volumes page

const int posmax3 = 19; //last position for frequencies page

const int posmax4 = 31; //last position for resonances page

const int slimitlenght[4]={31,15,31,15}; //****************************************************************** ("Boards number of options" - 1) for the Speaker Limiters with the following SYNTAX: {Left High-Pass, Left Mid-High, Right High-Pass, Right Mid-High}

//*********************************************************************************************************** For Example: if for the Highpass Board you installed 5X3 relays to have 32 maximum option, the number to type is (32-1)=31.

const int freqlenght[6]={31,15,7,31,15,7}; //**************************************************************** ("Boards number of options" - 1) with the following SYNTAX: {Left High-Pass, Left Mid-High, Right High-Pass, Right Mid-High}

//*********************************************************************************************************** For Example: if for the Highpass Board you installed 5X3 relays to have 32 maximum option, the number to type is (32-1)=31.

const int dump_switch=0; //********************************************************************************** infrared hex dump switch for built-in remote control debug!


const int button1_pin = 24; //button1 with function OK

const int button2_pin = 25; //button2 with function SET

const int SSR_pin = 50; //solid state relay control, to allow the Analog PSU to start after the software is started

const int SDcard_RSTpin = 4; //sd card reset pin

const int RECV_PIN = 3; //Iinfra-Red receiver pin number


const int delayr=30; //time necessary for mcp32017 output signals to switch the latching relays affordably


int encoder_res = 4; //encoder resolution in number of ticks


int page = 0; //actual page number

int pos = 0; //default position at the software start (0=menu)


String Preset[20];

char presetName[12];

String presetNameStr = "";

char remotePreset[12];

const String remotePresetFile= "Xremote.txt";

char titlePage[8];

const String titlePageStr= "volumes";


//Default Values:

//Next values need to be set for hardware options.

int colour[11]={0,6,160,255,15,204,253,121,248,255,0}; //default colours

int vol[8] = {15,15,15,15,15,15,15,15}; //default volumes

int freq[6] = {16,8,4,16,8,4}; //default frequencies

int reso[6] = {0,1,2,0,1,2}; //default resonances

int order[6] = {0,0,0,0,0,0}; //default orders

int slimit[4] = {14,6,14,6}; //default speaker limits

int ways = 4; //default number or ways

int mono_stereo = 1; //default control mode (mono or stereo)


//Declare the panel buttons variables

bool button1; //button1 value

bool button2; //button2 value

bool toggle_button; // //button2 toggle


//SD card file name declaration:

File myFile; //set the file name


//Declare preset variables

int presetnumber=1; //default preset number

int lineNum=0;

int nComma = 0;

String codeline;


//Declare Infrared variables:

IRrecv irrecv(RECV_PIN); //IR setup

decode_results results;

String ircode; //remote control hex code variable



Xover_VGA Xover_VGA(13); //VGA Setup starting (using pinnumber for monitor energy save, still to implement)


//Declare Encoder pins:

Encoder myEnc(30, 31); //encoder pin numbers


//Declare encoder variables:

long newPosition;

long oldPosition = -999;//encoder

int encoder_way; //cw or ccw


//Declare notifications variables:

String notification = ""; //notification string

int delayz=3000; //notification time in millisecs






void setup() {

strcpy(remotePreset, remotePresetFile.c_str());

strcpy(titlePage, titlePageStr.c_str());

Serial.begin(9600);

while (!Serial) {} // wait for Arduino DUE


//Serial.print("Initializing SD card...");


if (!SD.begin(SDcard_RSTpin)) {

//Serial.println("initialization failed!");

return;

}

//Serial.println("initialization done.");


pos=0;//set position to menu page volume button as start default


//Set VGA colours and resolution:

Xover_VGA.dot();

VGA.begin(xres,yres,VGA_COLOUR);

//VGA.xstart=32;//X shift for center the monitor image

VGA.synced=0;//Sync VGA usually 0, can be adjusted to different numbers if your monitor doesn't show a proper image.


//Start infrared receiver:

irrecv.enableIRIn(); // Start the receiver


//Load the default preset:

presetNameStr="preset1.txt"; strcpy(presetName, presetNameStr.c_str());//assign name of the default preset

presetnumber=1;//set the default preset number

read_preset(presetName);//read the default preset


//Load the remote control preset:

read_remote(remotePreset);


//start the relay driver:

Xover_rel.setup();


//Draw the startup screen

Xover_VGA.draw_menu(ways, mono_stereo, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

Xover_VGA.draw_graph(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], order[0], order[1], order[2], order[3], order[4], order[5] ,colour[1], colour[2], colour[6], colour[7], colour[10] );

VGA.drawButton(titlePage,20,32,120,20,9,colour[1],colour[3], colour[0]);


//Set the button pins as input:

pinMode(button1_pin, INPUT);

pinMode(button2_pin, INPUT);


//Set the Solid State Relay for the Analog supply pins to Output Mode:

pinMode(SSR_pin, OUTPUT);


//Turn On the Analog Power Supply:

digitalWrite(SSR_pin, HIGH);

}


void loop() {


//------------------------------ Encoder Code: ---------------------------//


//get the actual position:

newPosition = myEnc.read()/encoder_res;

//if the new position is different then the last one:

if (newPosition != oldPosition) {

//check in which sense the encoder it was turned (CW or CCW):

if(newPosition>oldPosition){encoder_way=1;}else{encoder_way=0;}

//DEBUG --> Serial.println(newPosition);

//record the new position as the last one:

oldPosition = newPosition;

//make the new position the actual position:

pos = newPosition;


if(page==0){//menu mage

if(pos<0){myEnc.write(0);}else if(pos>5){myEnc.write(5*encoder_res);}

Xover_VGA.switch_menu(ways, mono_stereo, page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

}

else if(page==1){//volumes page

if(ways==4){

if(pos-(posmax+1)<0){myEnc.write(((posmax+1)*encoder_res)+3);}else if(pos-(posmax+1)>7){myEnc.write(posmax2*encoder_res);}

}

if(ways==3){

if(pos-(posmax+2)<0){myEnc.write(((posmax+2)*encoder_res)+3);}else if(pos-(posmax+1)>7){myEnc.write(posmax2*encoder_res);}

if(encoder_way==1){if(pos==10){pos=11; myEnc.write(encoder_res*pos);}}else{if(pos==10){pos=9; myEnc.write((encoder_res*pos)+(encoder_res*3/4));}}

}else{if(ways==2){

if(pos-(posmax+3)<0){myEnc.write(((posmax+3)*encoder_res)+3);}else if(pos-(posmax+1)>7){myEnc.write(posmax2*encoder_res);}

if(encoder_way==1){if(pos==10 or pos==11){pos=12; myEnc.write(encoder_res*pos);}}else{if(pos==10 or pos==11){pos=9; myEnc.write((encoder_res*pos)+(encoder_res*3/4));}}

}

}

Xover_VGA.switch_volumes(ways, mono_stereo, page, pos, vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);


}else if(page==2){//freq page

if(ways==4){

if(pos-(posmax2+1)<0){myEnc.write((posmax2+1)*encoder_res);}else if(pos-(posmax2+1)>5){myEnc.write(posmax3*encoder_res);}

}else if(ways==3){

if(pos-(posmax2+1)<0){myEnc.write((posmax2+1)*encoder_res);}else if(pos-(posmax2+1)>4){myEnc.write((posmax3-1)*encoder_res);}

if(encoder_way==1){if(pos==16){pos=17; myEnc.write(encoder_res*pos);}}else if(pos==16){pos=15; myEnc.write((encoder_res*pos)+(encoder_res*3/4));}

}else if(ways==2){

if(pos-(posmax2+1)<0){myEnc.write((posmax2+1)*encoder_res);}else if(pos-(posmax2+1)>3){myEnc.write((posmax3-2)*encoder_res);}

if(encoder_way==1){if(pos==15 or pos==16){pos=17; myEnc.write(encoder_res*pos);}}else{if(pos==15 or pos==16){pos=14; myEnc.write((encoder_res*pos)+(encoder_res*3/4));}}

}

limiter();

Xover_VGA.switch_freq(ways, mono_stereo, page, pos, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);

}else if(page==3){//resonances page

Xover_VGA.switch_reso(ways, mono_stereo, page, pos, reso[0], reso[1], reso[2], reso[3], reso[4], reso[5], order[0], order[1], order[2], order[3], order[4], order[5], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);

}else if(page==4){//settings page

if(pos<32){myEnc.write(32*encoder_res);}else if(pos>39){myEnc.write(39*encoder_res);}

Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

}else if(page==5){//encoder resolution page


if(pos<0){myEnc.write(0);}else if(pos>40){myEnc.write(40*encoder_res);}

Xover_VGA.set_encoder_res(pos,1, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

}else if(page==6){//presets page


if(pos<41){myEnc.write(41*encoder_res);}else if(pos>51){myEnc.write(51*encoder_res);}

Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);

}else if(page==7){//speaker limiters page


if(pos<60){myEnc.write(60*encoder_res);}else if(pos>63){myEnc.write(63*encoder_res);}

Xover_VGA.switch_slimit(ways, mono_stereo, page, pos, slimit[0], slimit[1], slimit[2], slimit[3], colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);

}else if(page==9){//colours page


if(pos<120){myEnc.write(120*encoder_res);}else if(pos>141){myEnc.write(141*encoder_res);}

Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);

}else if(page==10){//remote control page


if(pos<150){myEnc.write((150*encoder_res)+2);}else if(pos>156){myEnc.write(156*encoder_res);}

Xover_VGA.draw_remote(page, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]);

Xover_VGA.switch_remote(page, pos, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]);

}

}



//Button 1 code:

button1 = digitalRead(button1_pin);//OK BUTTON

if(button1==1){

//Serial.print("bottone1:");

//Serial.println(button1);

switch(page){

case 0:


if(pos==0){page=1; pos=posmax+5-ways; myEnc.write(encoder_res*(posmax+5-ways)); Xover_VGA.draw_volumes(ways, mono_stereo, vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]); Xover_VGA.switch_volumes(ways, mono_stereo, page, pos, vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);}

else if(pos==1){page=2; pos=posmax2+1; myEnc.write(encoder_res*(posmax2+1)); limiter(); Xover_VGA.draw_freq(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]); Xover_VGA.switch_freq(ways, mono_stereo, page, pos, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);}

else if(pos==2){page=3;pos=posmax3+1; myEnc.write(encoder_res*(posmax3+1)); Xover_VGA.draw_reso(ways, mono_stereo, reso[0], reso[1], reso[2], reso[3], reso[4], reso[5], order[0], order[1], order[2], order[3], order[4], order[5], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]); Xover_VGA.switch_reso(ways, mono_stereo, page, pos, reso[0], reso[1], reso[2], reso[3], reso[4], reso[5], order[0], order[1], order[2], order[3], order[4], order[5], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);}

else if(pos==3){if(ways<4){ways++;} else {ways=2;} Xover_rel.selCtrl0(pos, ways, delayr); Xover_VGA.draw_menu(ways, mono_stereo, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.draw_graph(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], order[0], order[1], order[2], order[3], order[4], order[5] ,colour[1], colour[2], colour[6], colour[7], colour[10]);}

else if(pos==4){if(mono_stereo==1){mono_stereo=0;} else {mono_stereo=1;} Xover_VGA.draw_menu(ways, mono_stereo, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.draw_graph(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], order[0], order[1], order[2], order[3], order[4], order[5] ,colour[1], colour[2], colour[6], colour[7], colour[10] );}

else if(pos==5){page=4; pos=32; myEnc.write(pos*encoder_res); Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

else{}

Xover_VGA.switch_menu(ways, mono_stereo, page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

delay(250);

break;

case 1:

page=0; pos=0; myEnc.write(0); Xover_VGA.draw_menu(ways, mono_stereo, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.draw_graph(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], order[0], order[1], order[2], order[3], order[4], order[5] ,colour[1], colour[2], colour[6], colour[7], colour[10]); Xover_VGA.switch_menu(ways, mono_stereo, page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

delay(250);

break;

case 2:

limiter(); page=0; pos=1; myEnc.write(encoder_res*1); Xover_VGA.draw_menu(ways, mono_stereo, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.draw_graph(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], order[0], order[1], order[2], order[3], order[4], order[5] ,colour[1], colour[2], colour[6], colour[7], colour[10]); Xover_VGA.switch_menu(ways, mono_stereo, page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

delay(250);

break;

case 3:

page=0; pos=2; myEnc.write(encoder_res*2); Xover_VGA.draw_menu(ways, mono_stereo, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.draw_graph(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], order[0], order[1], order[2], order[3], order[4], order[5] ,colour[1], colour[2], colour[6], colour[7], colour[10]); Xover_VGA.switch_menu(ways, mono_stereo, page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

delay(250);

break;

case 4:

if(pos==32){page=0; pos=5; myEnc.write(pos*encoder_res); Xover_VGA.draw_menu(ways, mono_stereo, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.draw_graph(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], order[0], order[1], order[2], order[3], order[4], order[5] ,colour[1], colour[2], colour[6], colour[7], colour[10]); Xover_VGA.switch_menu(ways, mono_stereo, page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

else if(pos==33){page=5; pos=encoder_res/4; myEnc.write(pos*encoder_res); Xover_VGA.set_encoder_res(pos,0, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

else if(pos==34){page=6; pos=41; myEnc.write(pos*encoder_res); Xover_VGA.draw_SD_presets(1,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); readngraph(presetName);}

else if(pos==35){page=7; pos=60; myEnc.write(pos*encoder_res); Xover_VGA.draw_slimit(ways, mono_stereo, page, slimit[0], slimit[1], slimit[2], slimit[3], colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]); Xover_VGA.switch_slimit(ways, mono_stereo, page, pos, slimit[0], slimit[1], slimit[2], slimit[3], colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);}

else if(pos==36){page=8; pos=110; VGA.clear(colour[0]); Xover_VGA.draw_graphB(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], order[0], order[1], order[2], order[3], order[4], order[5] ,colour[1], colour[2], colour[6], colour[7], colour[10] );}

else if(pos==37){page=9; pos=120; myEnc.write(pos*encoder_res); Xover_VGA.draw_colours(page,1, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]); Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}

else if(pos==38){page=10; pos=150; Xover_VGA.draw_remote(page, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]); Xover_VGA.draw_remote(page, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]); Xover_VGA.switch_remote(page, pos, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]);}//------------------------button1--------------------------------------------------------------------------------------------------------------------------------

else if(pos==39){}

delay(250);

break;

case 5: //encoder resolution page

encoder_res = pos*4; page=4; pos=33; myEnc.write(pos*encoder_res); Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

delay(250);

break;

case 6: //presets page

if(pos==41){page=4; pos=34; myEnc.write(pos*encoder_res); Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

else if(pos==42){presetNameStr="preset1.txt"; strcpy(presetName, presetNameStr.c_str()); presetnumber=1; VGA.clear(colour[0]); readngraph(presetName); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==43){presetNameStr="preset2.txt"; strcpy(presetName, presetNameStr.c_str()); presetnumber=2; VGA.clear(colour[0]); readngraph(presetName); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==44){presetNameStr="preset3.txt"; strcpy(presetName, presetNameStr.c_str()); presetnumber=3; VGA.clear(colour[0]); readngraph(presetName); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==45){presetNameStr="preset4.txt"; strcpy(presetName, presetNameStr.c_str()); presetnumber=4; VGA.clear(colour[0]); readngraph(presetName); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==46){presetNameStr="preset5.txt"; strcpy(presetName, presetNameStr.c_str()); presetnumber=5; VGA.clear(colour[0]); readngraph(presetName); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==47){presetNameStr="preset6.txt"; strcpy(presetName, presetNameStr.c_str()); presetnumber=6; VGA.clear(colour[0]); readngraph(presetName); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==48){presetNameStr="preset7.txt"; strcpy(presetName, presetNameStr.c_str()); presetnumber=7; VGA.clear(colour[0]); readngraph(presetName); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==49){presetNameStr="preset8.txt"; strcpy(presetName, presetNameStr.c_str()); presetnumber=8; VGA.clear(colour[0]); readngraph(presetName); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==50){read_preset(presetName); VGA.clear(colour[0]); readngraph(presetName); pos=41+presetnumber; myEnc.write(pos*encoder_res); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==51){delete_preset(presetName); save_preset(presetName,presetnumber); page=0; pos=5; myEnc.write(pos*encoder_res); Xover_VGA.draw_menu(ways, mono_stereo, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.draw_graph(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], order[0], order[1], order[2], order[3], order[4], order[5] ,colour[1], colour[2], colour[6], colour[7], colour[10]); Xover_VGA.switch_menu(ways, mono_stereo, page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

delay(250);

break;

case 7://speaker liomits

limiter(); if(pos>59 and pos<64){page=4; pos=35; myEnc.write(pos*encoder_res); Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

delay(250);

break;

case 8: //big graph page

page=4; pos=36; myEnc.write(pos*encoder_res); Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

delay(250);

break;

case 9: //Colours page

page=4; pos=37; myEnc.write(pos*encoder_res); Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

delay(250);

break;

case 10://remote control page

if(pos==150){page=4; pos=38; myEnc.write(pos*encoder_res); Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

else if(pos==156){

CODE_UP=remoteN[0];

CODE_DOWN=remoteN[1];

CODE_LEFT=remoteN[2];

CODE_RIGHT=remoteN[3];

CODE_OK=remoteN[4];

delete_preset(remotePreset);

save_remote(remotePreset);

page=4;

pos=38;

myEnc.write(pos*encoder_res);

Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

}

delay(250);

break;

}

}



//Button 2 code:

button2 = digitalRead(button2_pin);//SET BUTTON

if(button2==1){


delay(250);

if(toggle_button==0){toggle_button=1;}else if(toggle_button==1){toggle_button=0;}


//Serial.print("toggle button:");

//Serial.println(toggle_button);


int potpos=0;

int oldpos=myEnc.read();

switch(page){


case 1:


myEnc.write(vol[(pos-(posmax+1))]*encoder_res);

while(toggle_button==1) {

if((myEnc.read()/encoder_res)<0) {

myEnc.write(0);

}

if((myEnc.read()/encoder_res)>15) {

myEnc.write(15*encoder_res);

}

int potpos_oldvol=potpos;

potpos=(myEnc.read()/encoder_res);

vol[(pos-posmax-1)]=potpos;

if(potpos_oldvol!=(myEnc.read()/encoder_res)){

Xover_rel.volCtrl0(pos, vol[(pos-posmax-1)], ways, delayr); //Serial.println("potpos e toggle button:"); Serial.println(potpos); Serial.println(toggle_button); //**********************************************************IN TEST

Xover_VGA.switch_volumes(ways, mono_stereo, page, pos, vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);

}

button2 = digitalRead(button2_pin);

if(button2==1){

toggle_button=0;

}

}

myEnc.write(oldpos);

delay(250);

break;


case 2:

if(pos>posmax2 and pos<posmax3){

myEnc.write(freq[(pos-(posmax2+1))]*encoder_res);

//Serial.print("freq di: ");

//Serial.println((pos-(posmax2+1))*encoder_res);

while(toggle_button==1){

if((myEnc.read()/encoder_res)<0) {myEnc.write(0);}

if((myEnc.read()/encoder_res)>freqlenght[(pos-posmax2-1)]) {myEnc.write(freqlenght[(pos-posmax2-1)]*encoder_res);}

int potpos_old=potpos;

potpos=(myEnc.read()/encoder_res);

if(potpos>=0 and potpos<=freqlenght[(pos-posmax2-1)]){

freq[(pos-posmax2-1)]=potpos;

if(potpos_old!=(myEnc.read()/encoder_res)){

if(mono_stereo==1){

Xover_rel.filter1(pos, freq[(pos-posmax2-1)], reso[(pos-posmax2-1)], order[(pos-posmax2-1)], delayr);

}else{

Xover_rel.filter0(pos, freq[(pos-posmax2-1)], reso[(pos-posmax2-1)], order[(pos-posmax2-1)], delayr);

}

Xover_VGA.switch_freq(ways, mono_stereo, page, pos, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);

}

}

button2 = digitalRead(button2_pin);

if(button2==1){toggle_button=0;}

}

myEnc.write(oldpos);

}

delay(250);

break;


case 3:


if(pos<posmax3+7){

myEnc.write(reso[(pos-(posmax3+1))]*encoder_res);

//Serial.print("reso di: ");

//Serial.println((pos-(posmax3+1))*encoder_res);

while(toggle_button==1){

if((myEnc.read()/encoder_res)<0) {myEnc.write(0);}

if((myEnc.read()/encoder_res)>3) {myEnc.write(3*encoder_res);}

int potpos_old=potpos;

potpos=(myEnc.read()/encoder_res);

if(potpos>=0 and potpos<=3){

if(potpos_old!=(myEnc.read()/encoder_res)){

reso[(pos-(posmax3+1))]=potpos;

if(mono_stereo==1){

Xover_rel.filter1(pos, freq[(pos-posmax3-1)], reso[(pos-posmax3-1)], order[(pos-posmax3-1)], delayr);

} else {

Xover_rel.filter0(pos, freq[(pos-posmax3-1)], reso[(pos-posmax3-1)], order[(pos-posmax3-1)], delayr);

}

Xover_VGA.switch_reso(ways, mono_stereo, page, pos, reso[0], reso[1], reso[2], reso[3], reso[4], reso[5], order[0], order[1], order[2], order[3], order[4], order[5], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);

}

}

button2 = digitalRead(button2_pin);

if(button2==1){toggle_button=0;}

}

myEnc.write(oldpos);

delay(250);

}else if(pos>posmax3+6){

myEnc.write(order[(pos-(posmax3+7))]*encoder_res);

//Serial.print("order di: ");

//Serial.println((pos-(posmax3+7))*encoder_res);

while(toggle_button==1){

if((myEnc.read()/encoder_res)<0) {myEnc.write(0);}

if((myEnc.read()/encoder_res)>1) {myEnc.write(1*encoder_res);}

int potpos_old=potpos;

potpos=(myEnc.read()/encoder_res);

if(potpos==0 or potpos==1){

if(potpos_old!=(myEnc.read()/encoder_res)){

order[(pos-(posmax3+7))]=potpos;

if(mono_stereo==1){

Xover_rel.filter1(pos, freq[(pos-posmax3-7)], reso[(pos-posmax3-7)], order[(pos-posmax3-7)], delayr);

} else {

Xover_rel.filter0(pos, freq[(pos-posmax3-7)], reso[(pos-posmax3-7)], order[(pos-posmax3-7)], delayr);

}

Xover_VGA.switch_reso(ways, mono_stereo, page, pos, reso[0], reso[1], reso[2], reso[3], reso[4], reso[5], order[0], order[1], order[2], order[3], order[4], order[5], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);

}

}

button2 = digitalRead(button2_pin);

if(button2==1){toggle_button=0;}

}

myEnc.write(oldpos);

delay(250);

}

break;


case 7:

myEnc.write(slimit[(pos-60)]*encoder_res);

//Serial.print("freq di: ");

//Serial.println((pos-(posmax2+1))*encoder_res);

while(toggle_button==1){if((myEnc.read()/encoder_res)<0) {myEnc.write(0);} if((myEnc.read()/encoder_res)>slimitlenght[(pos-60)]) {myEnc.write(slimitlenght[(pos-60)]*encoder_res);} potpos=(myEnc.read()/encoder_res); slimit[(pos-60)]=potpos; button2 = digitalRead(button2_pin); Xover_VGA.switch_slimit(ways, mono_stereo, page, pos, slimit[0], slimit[1], slimit[2], slimit[3], colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]); if(button2==1){toggle_button=0;}}

myEnc.write(oldpos);

delay(250);

break;


case 9:

myEnc.write(colour[(pos-131)]*encoder_res);

while(toggle_button==1){

if((myEnc.read()/encoder_res)<0) {

myEnc.write(0);

}

if((myEnc.read()/encoder_res)>255) {

myEnc.write(255*encoder_res);

} potpos=(myEnc.read()/encoder_res);

colour[(pos-131)]=potpos;

button2 = digitalRead(button2_pin);

Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]); /*Serial.println("potpos e toggle button:"); Serial.println(potpos); Serial.println(toggle_button); */

if(button2==1){

toggle_button=0;

}

}

myEnc.write(oldpos);

delay(250);

break;

}

}



//Infra-Red Code:

if (irrecv.decode(&results)) {

//Serial.println(results.value, HEX); //debug

if (irrecv.decode(&results) != UNKNOWN) {

//if(pos<156 and pos>150){if(String(results.value, HEX)!="ffffffff"){ircode = String(results.value, HEX);}}else{ircode = String(results.value, HEX);}

ircode = String(results.value, HEX);

}

if(dump_switch==1){dump(&results);} //debug or new remote control!


if(ircode==CODE_MUTE){Serial.println("mute!");}


switch(page){

case 0: //menu pos 0-5

if(ircode == CODE_DOWN) {if(pos<posmax){pos++; myEnc.write(encoder_res*pos);}}

else if(ircode == CODE_UP) {if(pos>0){pos--; myEnc.write(encoder_res*pos);}}

else if(ircode == CODE_OK) {

if(pos==0){page=1; pos=posmax+5-ways; myEnc.write(encoder_res*(posmax+5-ways)); Xover_VGA.draw_volumes(ways, mono_stereo, vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]); Xover_VGA.switch_volumes(ways, mono_stereo, page, pos, vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);}

else if(pos==1){page=2; pos=posmax2+1; myEnc.write(encoder_res*(posmax2+1)); limiter(); Xover_VGA.draw_freq(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]); Xover_VGA.switch_freq(ways, mono_stereo, page, pos, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);}

else if(pos==2){page=3;pos=posmax3+1; myEnc.write(encoder_res*(posmax3+1)); Xover_VGA.draw_reso(ways, mono_stereo, reso[0], reso[1], reso[2], reso[3], reso[4], reso[5], order[0], order[1], order[2], order[3], order[4], order[5], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]); Xover_VGA.switch_reso(ways, mono_stereo, page, pos, reso[0], reso[1], reso[2], reso[3], reso[4], reso[5], order[0], order[1], order[2], order[3], order[4], order[5], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);}

else if(pos==3){if(ways<4){ways++;} else {ways=2;} Xover_rel.selCtrl0(pos, ways, delayr); Xover_VGA.draw_menu(ways, mono_stereo, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.draw_graph(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], order[0], order[1], order[2], order[3], order[4], order[5] ,colour[1], colour[2], colour[6], colour[7], colour[10] );}

else if(pos==4){if(mono_stereo==1){mono_stereo=0;} else {mono_stereo=1;} Xover_VGA.draw_menu(ways, mono_stereo, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.draw_graph(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], order[0], order[1], order[2], order[3], order[4], order[5] ,colour[1], colour[2], colour[6], colour[7], colour[10] );}

else if(pos==5){page=4; pos=32; myEnc.write(pos*encoder_res); Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

else{}

}

Xover_VGA.switch_menu(ways, mono_stereo, page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

break;

case 1: //volumes pos 6-13


if (ways == 4) {

if(ircode == CODE_RIGHT) {if(mono_stereo==1){if(pos<posmax2){pos++; myEnc.write(encoder_res*pos);} myEnc.write(encoder_res*pos);} else {if(pos<9){pos++; myEnc.write(encoder_res*pos);}}}

else if(ircode == CODE_LEFT) {if(pos>(posmax+1)){pos--; myEnc.write(encoder_res*pos);}}

} else if(ways == 3) {

if(ircode == CODE_RIGHT) {if(mono_stereo==1){if(pos==9){pos++; myEnc.write(encoder_res*pos);}if(pos<posmax2){pos++; myEnc.write(encoder_res*pos);}}else{if(pos<9){pos++; myEnc.write(encoder_res*pos);}}}

else if(ircode == CODE_LEFT) {if(pos==11){pos--; myEnc.write(encoder_res*pos);}if(pos>(posmax+2)){pos--; myEnc.write(encoder_res*pos);}}

} else if(ways == 2) {

if(ircode == CODE_RIGHT) {if(mono_stereo==1){if(pos==9 or pos==10){pos=11; myEnc.write(encoder_res*pos);}if(pos<posmax2){pos++; myEnc.write(encoder_res*pos);}}else{if(pos<9){pos++; myEnc.write(encoder_res*pos);}}}

else if(ircode == CODE_LEFT) {if(pos==11 or pos==10){pos=9; myEnc.write(encoder_res*pos);}if(pos>(posmax+3)){pos--; myEnc.write(encoder_res*pos);}}

}

if(ircode == CODE_DOWN) {if(vol[(pos-posmax-1)]>0) { vol[(pos-posmax-1)]--; Xover_rel.volCtrl0(pos, vol[(pos-posmax-1)], ways, delayr);}}

else if(ircode == CODE_UP) {if(vol[(pos-posmax-1)]<15) { vol[(pos-posmax-1)]++; Xover_rel.volCtrl0(pos, vol[(pos-posmax-1)], ways, delayr);}}

else if(ircode == CODE_OK) {page=0; pos=0; myEnc.write(0); Xover_VGA.draw_menu(ways, mono_stereo, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.draw_graph(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], order[0], order[1], order[2], order[3], order[4], order[5] ,colour[1], colour[2], colour[6], colour[7], colour[10]); Xover_VGA.switch_menu(ways, mono_stereo, page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

else{}

//Serial.println(pos-posmax-1);

//Serial.println(vol[(pos-posmax-1)]);

Xover_VGA.switch_volumes(ways, mono_stereo, page, pos, vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);

break;

case 2: //freqs pos 14-19


if (ways == 4) {

if(ircode == CODE_DOWN) {if(mono_stereo==1){if(pos<posmax3) {pos++; myEnc.write(encoder_res*pos);}}else{if(pos<16) {pos++; myEnc.write(encoder_res*pos);}}}

if(ircode == CODE_UP) {if(pos>posmax2+1) {pos--; myEnc.write(encoder_res*pos);}}

} else if(ways == 3) {

if(ircode == CODE_DOWN) {if(mono_stereo==1){if(pos==15){pos++; myEnc.write(encoder_res*pos);}if(pos<posmax3-1) {pos++; myEnc.write(encoder_res*pos);}}else{if(pos<16) {pos++; myEnc.write(encoder_res*pos);}}}

if(ircode == CODE_UP) {if(pos==17){pos--; myEnc.write(encoder_res*pos);}if(pos>posmax2+1){pos--; myEnc.write(encoder_res*pos);}}

} else if(ways == 2) {

if(ircode == CODE_DOWN) {if(mono_stereo==1){if(pos==14 or pos==15 or pos==16){pos=17; myEnc.write(encoder_res*pos);}}else{if(pos<16) {pos++; myEnc.write(encoder_res*pos);}}}

if(ircode == CODE_UP) {if(pos==17 or pos==18 or pos==19){pos=14; myEnc.write(encoder_res*pos);}}

}

if(ircode == CODE_LEFT) {

if(pos==14 or pos==15){if(freq[(pos-posmax2-1)]>0+slimit[(pos-posmax2-1)]) { freq[(pos-posmax2-1)]--; } }

if (pos==17 or pos==18){if(freq[(pos-posmax2-1)]>0+slimit[(pos-posmax2-2)]) { freq[(pos-posmax2-1)]--; } }

if (pos==16 or pos==19){if(freq[(pos-posmax2-1)]>0) { freq[(pos-posmax2-1)]--; } }

if(mono_stereo==1){Xover_rel.filter1(pos, freq[(pos-posmax2-1)], reso[(pos-posmax2-1)], order[(pos-posmax2-1)], delayr);}else{Xover_rel.filter0(pos, freq[(pos-posmax2-1)], reso[(pos-posmax2-1)], order[(pos-posmax2-1)], delayr);}

}

else if(ircode == CODE_RIGHT) {if(freq[(pos-posmax2-1)]<freqlenght[(pos-posmax2-1)]) { freq[(pos-posmax2-1)]++; if(mono_stereo==1){Xover_rel.filter1(pos, freq[(pos-posmax2-1)], reso[(pos-posmax2-1)], order[(pos-posmax2-1)], delayr);}else{Xover_rel.filter0(pos, freq[(pos-posmax2-1)], reso[(pos-posmax2-1)], order[(pos-posmax2-1)], delayr);}} }

else if(ircode == CODE_OK) {limiter(); page=0; pos=1; myEnc.write(encoder_res*1); Xover_VGA.draw_menu(ways, mono_stereo, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.draw_graph(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], order[0], order[1], order[2], order[3], order[4], order[5] ,colour[1], colour[2], colour[6], colour[7], colour[10]); Xover_VGA.switch_menu(ways, mono_stereo, page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

else{}

//Serial.println(pos-posmax2-1);

//Serial.println(freq[(pos-posmax2-1)]);

Xover_VGA.switch_freq(ways, mono_stereo, page, pos, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);

break;

case 3: //resos pos 20-31


if (ways == 4) {

if(ircode == CODE_DOWN) {if(mono_stereo==1){if(pos<posmax4) {pos++; myEnc.write(encoder_res*pos);}}else{if(pos==22 or pos==23 or pos==24){pos=25; myEnc.write(encoder_res*pos);}if(pos<28) {pos++; myEnc.write(encoder_res*pos);}}}

else if(ircode == CODE_UP) {if(mono_stereo==1){if(pos>posmax3+1){pos--; myEnc.write(encoder_res*pos);}}else{if(pos==26 or pos==25 or pos==24){pos=23; myEnc.write(encoder_res*pos);}if(pos>posmax3+1) {pos--; myEnc.write(encoder_res*pos);}}}

} else if (ways == 3) {

if(ircode == CODE_DOWN) {if(mono_stereo==1){if(pos==21 or pos==24 or pos==27){pos++; myEnc.write(encoder_res*pos);}if(pos<posmax4-1) {pos++; myEnc.write(encoder_res*pos);}}else{if(pos==21) {pos=25; myEnc.write(encoder_res*pos);} if(pos<27) {pos++; myEnc.write(encoder_res*pos);}}}

else if(ircode == CODE_UP) {if(mono_stereo==1){if(pos==23 or pos==26 or pos==29){pos--; myEnc.write(encoder_res*pos);}if(pos>posmax3+1) { pos--; myEnc.write(encoder_res*pos);}}else{if(pos==26) {pos=22; myEnc.write(encoder_res*pos);} if(pos>posmax3+1) { pos--; myEnc.write(encoder_res*pos);}}}

} else if(ways == 2) {

if(ircode == CODE_DOWN) {if(mono_stereo==1){if(pos==26) {pos=29; myEnc.write(encoder_res*pos);} if(pos==23) {pos=26; myEnc.write(encoder_res*pos);} if(pos==20) {pos=23; myEnc.write(encoder_res*pos);}}else{if(pos==20) {pos=26; myEnc.write(encoder_res*pos);}}}

else if(ircode == CODE_UP) {if(mono_stereo==1){if(pos==23) {pos=20; myEnc.write(encoder_res*pos);}if(pos==26) {pos=23; myEnc.write(encoder_res*pos);}if(pos==29) {pos=26; myEnc.write(encoder_res*pos);}}else{if(pos==26) {pos=20; myEnc.write(encoder_res*pos);}}}

}

if((pos-posmax3)>0 and (pos-posmax3)<7){

if(ircode == CODE_LEFT) {if(reso[(pos-(posmax3+1))]>0) { reso[(pos-(posmax3+1))]--; if(mono_stereo==1){Xover_rel.filter1(pos, freq[(pos-posmax3-1)], reso[(pos-posmax3-1)], order[(pos-posmax3-1)], delayr);}else{Xover_rel.filter0(pos, freq[(pos-posmax3-1)], reso[(pos-posmax3-1)], order[(pos-posmax3-1)], delayr);}}}

else if(ircode == CODE_RIGHT) {if(reso[(pos-(posmax3+1))]<3) { reso[(pos-(posmax3+1))]++; if(mono_stereo==1){Xover_rel.filter1(pos, freq[(pos-posmax3-1)], reso[(pos-posmax3-1)], order[(pos-posmax3-1)], delayr);}else{Xover_rel.filter0(pos, freq[(pos-posmax3-1)], reso[(pos-posmax3-1)], order[(pos-posmax3-1)], delayr);}}}

else if(ircode == CODE_OK) {page=0; pos=2; myEnc.write(encoder_res*2); Xover_VGA.draw_menu(ways, mono_stereo, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.draw_graph(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], order[0], order[1], order[2], order[3], order[4], order[5] ,colour[1], colour[2], colour[6], colour[7], colour[10]); Xover_VGA.switch_menu(ways, mono_stereo, page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

else{}

//Serial.println(pos-posmax3-1);

//Serial.println(reso[(pos-posmax3-1)]);

}

if((pos-(posmax3+1))>5 and (pos-(posmax3+1))<12){

if(ircode == CODE_LEFT) {if(order[(pos-(posmax3+7))]>0) { order[(pos-(posmax3+7))]--; if(mono_stereo==1){Xover_rel.filter1(pos, freq[(pos-posmax3-7)], reso[(pos-posmax3-7)], order[(pos-posmax3-7)], delayr);}else{Xover_rel.filter0(pos, freq[(pos-posmax3-7)], reso[(pos-posmax3-7)], order[(pos-posmax3-7)], delayr);}}}

else if(ircode == CODE_RIGHT) {if(order[(pos-(posmax3+7))]<1) { order[(pos-(posmax3+7))]++; if(mono_stereo==1){Xover_rel.filter1(pos, freq[(pos-posmax3-7)], reso[(pos-posmax3-7)], order[(pos-posmax3-7)], delayr);}else{Xover_rel.filter0(pos, freq[(pos-posmax3-7)], reso[(pos-posmax3-7)], order[(pos-posmax3-7)], delayr);}}}

else if(ircode == CODE_OK) {page=0; pos=2; myEnc.write(encoder_res*2); Xover_VGA.draw_menu(ways, mono_stereo, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.draw_graph(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], order[0], order[1], order[2], order[3], order[4], order[5] ,colour[1], colour[2], colour[6], colour[7], colour[10]); Xover_VGA.switch_menu(ways, mono_stereo, page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

else{}

//Serial.println(pos-(posmax3+7));

//Serial.println(order[(pos-(posmax3+7))]);

}

Xover_VGA.switch_reso(ways, mono_stereo, page, pos, reso[0], reso[1], reso[2], reso[3], reso[4], reso[5], order[0], order[1], order[2], order[3], order[4], order[5], colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);

break;

case 4: //setting menu pos 32-39

if(ircode == CODE_DOWN) {if(pos<39){pos++; myEnc.write(encoder_res*pos);}}

else if(ircode == CODE_UP) {if(pos>32){pos--; myEnc.write(encoder_res*pos);}}

else if(ircode == CODE_OK) {

if(pos==32){page=0; pos=5; myEnc.write(pos*encoder_res); Xover_VGA.draw_menu(ways, mono_stereo, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.draw_graph(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], order[0], order[1], order[2], order[3], order[4], order[5] ,colour[1], colour[2], colour[6], colour[7], colour[10]); Xover_VGA.switch_menu(ways, mono_stereo, page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

else if(pos==33){page=5; pos=encoder_res/4; myEnc.write(pos*encoder_res); Xover_VGA.set_encoder_res(pos,0, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); }

else if(pos==34){page=6; pos=41; myEnc.write(pos*encoder_res); Xover_VGA.draw_SD_presets(1,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); readngraph(presetName); }

else if(pos==35){page=7; pos=60; myEnc.write(pos*encoder_res); Xover_VGA.draw_slimit(ways, mono_stereo, page, slimit[0], slimit[1], slimit[2], slimit[3], colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]); Xover_VGA.switch_slimit(ways, mono_stereo, page, pos, slimit[0], slimit[1], slimit[2], slimit[3], colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);}

else if(pos==36){page=8; pos=110; VGA.clear(colour[0]); Xover_VGA.draw_graphB(ways, mono_stereo, freq[0], freq[1], freq[2], freq[3], freq[4], freq[5], vol[0], vol[1], vol[2], vol[3], vol[4], vol[5], vol[6], vol[7], order[0], order[1], order[2], order[3], order[4], order[5] ,colour[1], colour[2], colour[6], colour[7], colour[10] );}

else if(pos==37){page=9; pos=120; myEnc.write(pos*encoder_res); Xover_VGA.draw_colours(page, 1, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]); Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}

else if(pos==38){page=10; pos=150; Xover_VGA.draw_remote(page, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]); Xover_VGA.switch_remote(page, pos, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]);}

else if(pos==39){}//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

}

Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

//Serial.print("pos moved by ir:");

//Serial.println(pos);

break;


case 5: //set encoder resolution pos = 40


if (ircode == CODE_UP) {if(pos<100){pos++; myEnc.write(encoder_res*pos); Xover_VGA.set_encoder_res(pos,1, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}}

else if(ircode == CODE_DOWN) {if(pos>0) {pos--; myEnc.write(encoder_res*pos); Xover_VGA.set_encoder_res(pos,1, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}}

else if(ircode == CODE_RIGHT){if(pos<100){pos++; myEnc.write(encoder_res*pos); Xover_VGA.set_encoder_res(pos,1, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}}

else if(ircode == CODE_LEFT) {if(pos>0) {pos--; myEnc.write(encoder_res*pos); Xover_VGA.set_encoder_res(pos,1, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}}

else if(ircode == CODE_OK) {encoder_res = pos*4; page=4; pos=33; myEnc.write(pos*encoder_res); Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

//Serial.print("pos moved by ir:");

//Serial.println(pos);

break;

case 6: //sd presets pos 41-51

if(ircode == CODE_DOWN) {if(pos<51){pos++; myEnc.write(encoder_res*pos);}}

else if(ircode == CODE_UP) {if(pos>41){pos--; myEnc.write(encoder_res*pos);}}

else if(ircode == CODE_OK) {

if(pos==41){page=4; pos=34; myEnc.write(pos*encoder_res); myEnc.write(pos*encoder_res); Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

else if(pos==42){presetNameStr="preset1.txt"; strcpy(presetName, presetNameStr.c_str()); presetnumber=1; VGA.clear(colour[0]); readngraph(presetName); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==43){presetNameStr="preset2.txt"; strcpy(presetName, presetNameStr.c_str()); presetnumber=2; VGA.clear(colour[0]); readngraph(presetName); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==44){presetNameStr="preset3.txt"; strcpy(presetName, presetNameStr.c_str()); presetnumber=3; VGA.clear(colour[0]); readngraph(presetName); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==45){presetNameStr="preset4.txt"; strcpy(presetName, presetNameStr.c_str()); presetnumber=4; VGA.clear(colour[0]); readngraph(presetName); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==46){presetNameStr="preset5.txt"; strcpy(presetName, presetNameStr.c_str()); presetnumber=5; VGA.clear(colour[0]); readngraph(presetName); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==47){presetNameStr="preset6.txt"; strcpy(presetName, presetNameStr.c_str()); presetnumber=6; VGA.clear(colour[0]); readngraph(presetName); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==48){presetNameStr="preset7.txt"; strcpy(presetName, presetNameStr.c_str()); presetnumber=7; VGA.clear(colour[0]); readngraph(presetName); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==49){presetNameStr="preset8.txt"; strcpy(presetName, presetNameStr.c_str()); presetnumber=8; VGA.clear(colour[0]); readngraph(presetName); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==50){read_preset(presetName); VGA.clear(colour[0]); pos=(41+presetnumber); Xover_VGA.draw_SD_presets(0,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]); readngraph(presetName); Xover_VGA.switch_SD_presets(page,pos,presetnumber, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5], colour[8]);}

else if(pos==51){delete_preset(presetName); save_preset(presetName,presetnumber); page=4; pos=34; myEnc.write(pos*encoder_res); Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);} //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

}

Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

//Serial.print("pos moved by ir:");

//Serial.println(pos);

break;

case 7: //speaker limits page: pos 60-63


if(ircode == CODE_DOWN) {if(pos<63){pos++; myEnc.write(encoder_res*pos);}}

else if(ircode == CODE_UP) {if(pos>60){pos--; myEnc.write(encoder_res*pos);}}

else if(ircode == CODE_LEFT) {if(slimit[(pos-60)]>0) { slimit[(pos-60)]--; }}

else if(ircode == CODE_RIGHT) {if(slimit[(pos-60)]<slimitlenght[(pos-60)]) { slimit[(pos-60)]++; }}

else if(ircode == CODE_OK) {limiter(); page=4; pos=35; myEnc.write(pos*encoder_res); Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

else{}

Xover_VGA.switch_slimit(ways, mono_stereo, page, pos, slimit[0], slimit[1], slimit[2], slimit[3], colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[9], colour[10]);

break;

case 8://big graph page: pos 110

if(ircode == CODE_OK) {page=4; pos=36; myEnc.write(pos*encoder_res); Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}


break;

case 9: //colours page

if(ircode == CODE_DOWN) {if(pos<141){pos++; myEnc.write(encoder_res*pos);}}

else if(ircode == CODE_UP) {if(pos>120){pos--; myEnc.write(encoder_res*pos);}}

else if(ircode == CODE_RIGHT){

if(pos==131){if(colour[0]<255){colour[0]++; Xover_VGA.draw_colours(page,1, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==132){if(colour[1]<255){colour[1]++; Xover_VGA.draw_colours(page,1, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==133){if(colour[2]<255){colour[2]++; Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==134){if(colour[3]<255){colour[3]++; Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==135){if(colour[4]<255){colour[4]++; Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==136){if(colour[5]<255){colour[5]++; Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==137){if(colour[6]<255){colour[6]++; Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==138){if(colour[7]<255){colour[7]++; Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==139){if(colour[8]<255){colour[8]++; Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==140){if(colour[9]<255){colour[9]++; Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==141){if(colour[10]<255){colour[10]++; Xover_VGA.draw_colours(page,1, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

}

else if(ircode == CODE_LEFT) {

if(pos==131){if(colour[0]>0){colour[0]--; Xover_VGA.draw_colours(page,1, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==132){if(colour[1]>0){colour[1]--; Xover_VGA.draw_colours(page,1, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==133){if(colour[2]>0){colour[2]--; Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==134){if(colour[3]>0){colour[3]--; Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==135){if(colour[4]>0){colour[4]--; Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==136){if(colour[5]>0){colour[5]--; Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==137){if(colour[6]>0){colour[6]--; Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==138){if(colour[7]>0){colour[7]--; Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==139){if(colour[8]>0){colour[8]--; Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==140){if(colour[9]>0){colour[9]--; Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

else if(pos==141){if(colour[10]>0){colour[10]--; Xover_VGA.draw_colours(page,1, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);}}

}

else if(ircode == CODE_OK) {

if(pos<131){

if(pos==120){page=4; pos=37; myEnc.write(pos*encoder_res); Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

if(pos==121){colour[0]=41; colour[1]=1; colour[2]=192; colour[3]=255; colour[4]=43; colour[5]=111; colour[6]=253; colour[7]=121; colour[8]=248; colour[9]=1; colour[10]=0; VGA.clear(colour[0]);}//navy

if(pos==122){colour[0]=204; colour[1]=64; colour[2]=96; colour[3]=252; colour[4]=118; colour[5]=236; colour[6]=253; colour[7]=121; colour[8]=248; colour[9]=32; colour[10]=0; VGA.clear(colour[0]);}//sahara

if(pos==123){colour[0]=182; colour[1]=34; colour[2]=160; colour[3]=255; colour[4]=67; colour[5]=224; colour[6]=248; colour[7]=48; colour[8]=248; colour[9]=0; colour[10]=255; VGA.clear(colour[0]);}//win

if(pos==124){colour[0]=255; colour[1]=11; colour[2]=193; colour[3]=0; colour[4]=91; colour[5]=252; colour[6]=252; colour[7]=48; colour[8]=248; colour[9]=7; colour[10]=0; VGA.clear(colour[0]);}//Ice

if(pos==125){colour[0]=44; colour[1]=0; colour[2]=132; colour[3]=255; colour[4]=91; colour[5]=236; colour[6]=236; colour[7]=252; colour[8]=248; colour[9]=33; colour[10]=0; VGA.clear(colour[0]);}//golf

if(pos==126){colour[0]=32; colour[1]=0; colour[2]=64; colour[3]=224; colour[4]=1; colour[5]=96; colour[6]=236; colour[7]=252; colour[8]=248; colour[9]=128; colour[10]=0; VGA.clear(colour[0]);}//doom

if(pos==127){colour[0]=251; colour[1]=0; colour[2]=235; colour[3]=226; colour[4]=118; colour[5]=208; colour[6]=236; colour[7]=252; colour[8]=248; colour[9]=0; colour[10]=255; VGA.clear(colour[0]);}//pastels

if(pos==128){colour[0]=41; colour[1]=1; colour[2]=224; colour[3]=255; colour[4]=34; colour[5]=160; colour[6]=248; colour[7]=48; colour[8]=236; colour[9]=7; colour[10]=0; VGA.clear(colour[0]);}//pro

if(pos==129){colour[0]=0; colour[1]=7; colour[2]=224; colour[3]=255; colour[4]=34; colour[5]=160; colour[6]=248; colour[7]=48; colour[8]=236; colour[9]=7; colour[10]=0; VGA.clear(colour[0]);}//contrast

if(pos==130){colour[0]=0; colour[1]=7; colour[2]=226; colour[3]=255; colour[4]=93; colour[5]=235; colour[6]=199; colour[7]=61; colour[8]=236; colour[9]=226; colour[10]=0; VGA.clear(colour[0]);}//neon

Xover_VGA.draw_colours(page,1, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);

}

else if(pos>=131){page=4; pos=37; myEnc.write(pos*encoder_res); Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

}

Xover_VGA.switch_colours(page,pos, colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7], colour[8], colour[9], colour[10]);

break;

case 10: //remote page


if (ircode == CODE_DOWN) {if(pos<156){pos++; myEnc.write(encoder_res*pos); Xover_VGA.switch_remote(page, pos, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]);}}

else if(ircode == CODE_UP) {if(pos>150){pos--; myEnc.write(encoder_res*pos); Xover_VGA.switch_remote(page, pos, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]); }}

else if(ircode!=CODE_UP and ircode!=CODE_DOWN and ircode!=CODE_LEFT and ircode!=CODE_RIGHT and ircode!=CODE_OK) {

if(pos==151){if(ircode!="ffffffff"){remoteN[0]=ircode; Xover_VGA.draw_remote(page, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]); Xover_VGA.switch_remote(page, pos, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]);}}

else if(pos==152){if(ircode!="ffffffff"){remoteN[1]=ircode; Xover_VGA.draw_remote(page, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]); Xover_VGA.switch_remote(page, pos, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]);}}

else if(pos==153){if(ircode!="ffffffff"){remoteN[2]=ircode; Xover_VGA.draw_remote(page, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]); Xover_VGA.switch_remote(page, pos, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]);}}

else if(pos==154){if(ircode!="ffffffff"){remoteN[3]=ircode; Xover_VGA.draw_remote(page, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]); Xover_VGA.switch_remote(page, pos, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]);}}

else if(pos==155){if(ircode!="ffffffff"){remoteN[4]=ircode; Xover_VGA.draw_remote(page, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]); Xover_VGA.switch_remote(page, pos, CODE_UP, CODE_LEFT, CODE_RIGHT, CODE_DOWN, CODE_OK, remoteN[0], remoteN[1], remoteN[2], remoteN[3], remoteN[4], colour[0], colour[1], colour[2], colour[3]);}}

}

if(ircode == CODE_OK) {

if(pos==150){page=4; pos=38; myEnc.write(pos*encoder_res); Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]); Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);}

else if(pos==151){}

else if(pos==152){}

else if(pos==153){}

else if(pos==154){}

else if(pos==155){}

else if(pos==156){

CODE_UP=remoteN[0];

CODE_DOWN=remoteN[1];

CODE_LEFT=remoteN[2];

CODE_RIGHT=remoteN[3];

CODE_OK=remoteN[4];

delete_preset(remotePreset);

save_remote(remotePreset);

page=4;

pos=38;

myEnc.write(pos*encoder_res);

Xover_VGA.draw_settingsMenu(colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

Xover_VGA.switch_settingsMenu(page, pos, colour[0] ,colour[1], colour[2], colour[3], colour[4], colour[5]);

}

}


}


//Serial.println("page: " + String(page)); //debug

//Serial.println("pos: " + String (pos)); //debug

//CODE_LAST=ircode;

irrecv.resume(); // Receive the next value

//delay(1000);

}


//delay(25);

}





unsigned long fillRoundRectaC(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t radius, uint16_t p) {




for(int yy = y;yy<(y+height);yy++){


if(yy == y + 1) {

VGA.drawLine(x+(radius/2),yy,x+width,yy,p);

}


VGA.drawLine(x,yy,x+width,yy,p);



}

}


void limiter(){



if(freq[0]<slimit[0]){freq[0]=slimit[0];}

if(freq[1]<slimit[1]){freq[1]=slimit[1];}

if(freq[3]<slimit[2]){freq[3]=slimit[2];}

if(freq[4]<slimit[3]){freq[4]=slimit[3];}




}




void save_preset(char preset_file[], int presetnumber){

// open the file. note that only one file can be open at a time,

// so you have to close this one before opening another.

myFile = SD.open(preset_file, FILE_WRITE);


// if the file opened okay, write to it:

if (myFile) {

notification="Saving on preset file " + String(preset_file) + ".";

Xover_VGA.draw_notify(notification, colour[0], colour[1], colour[2], delayz);

Serial.print("Writing to preset file...");

myFile.println("Starting transmitting parameters.... preset N.:" + String(presetnumber));

myFile.println(",Volumes:,");

myFile.println(String(vol[0]) + "," + String(vol[1]) + "," + String(vol[2]) + "," + String(vol[3]) + "," + (vol[4]) + "," + String(vol[5]) + "," + String(vol[6]) + "," + String(vol[7]));

myFile.println(",Frequency cuts:,");

myFile.println(String(freq[0]) + "," + String(freq[1]) + "," + String(freq[2]) + "," + String(freq[3]) + "," + (freq[4]) + "," + String(freq[5]));

myFile.println(",Geometries:,");

myFile.println(String(reso[0]) + "," + String(reso[1]) + "," + String(reso[2]) + "," + String(reso[3]) + "," + (reso[4]) + "," + String(reso[5]));

myFile.println(",Filters Orders:,");

myFile.println(String(order[0]) + "," + String(order[1]) + "," + String(order[2]) + "," + String(order[3]) + "," + (order[4]) + "," + String(order[5]));

myFile.println(",Preferences:,");

myFile.println(String(ways) + "," + String(mono_stereo));

myFile.println(",Settings:,");

myFile.println(String(encoder_res));

myFile.println(",Colors:,");

myFile.println(String(colour[0]) + "," + (colour[1]) + "," + (colour[2]) + "," + (colour[3]) + "," + (colour[4]) + "," + (colour[5]) + "," + (colour[6]) + "," + (colour[7]) + "," + (colour[8]) + "," + (colour[9]) + "," + (colour[10]));//------------------TO ADD: speaker limits? remote control? display and energy settings?

myFile.println(",Limits:,");

myFile.println(String(slimit[0]) + "," + (slimit[1]) + "," + (slimit[2]) + "," + (slimit[3]));

// close the file:

myFile.close();

Serial.println("done.");

} else {

// if the file didn't open, print an error:

Serial.println("error opening the preset file.");

}

}



void save_remote(char preset_file[]){

// open the file. note that only one file can be open at a time,

// so you have to close this one before opening another.

myFile = SD.open(preset_file, FILE_WRITE);


// if the file opened okay, write to it:

if (myFile) {

notification="Saving RC preset " + String(preset_file) + ".";

Xover_VGA.draw_notify(notification, colour[0], colour[1], colour[2], delayz);


Serial.print("Writing to preset file...");

myFile.println("Xover44 - Starting transmitting parameters.... ");

myFile.println(",Remote:");

myFile.println("," + CODE_UP + "," + CODE_DOWN + "," + CODE_LEFT + "," + CODE_RIGHT + "," + CODE_OK + "," + CODE_MUTE);

// close the file:

myFile.close();

Serial.println("done.");

} else {

// if the file didn't open, print an error:

Serial.println("error opening the remotepreset file.");

}

}


void delete_preset(char preset_file[]){


// delete the file:

Serial.println("Removing preset file...");

SD.remove(preset_file);


if (SD.exists(preset_file)) {

Serial.println("preset file still exists.");

} else {

notification="Preset file " + String(preset_file) + " erased.";

Xover_VGA.draw_notify(notification, colour[0], colour[1], colour[2], delayz);


Serial.println("preset file doesn't exist anymore.");

}


}



void read_preset(char preset_file[]){



// open the file for reading:

myFile = SD.open(preset_file);

if (myFile) {

Serial.println("preset file:");

Serial.println(preset_file);


notification="Loading preset " + String(preset_file) + ".";

Xover_VGA.draw_notify(notification, colour[0], colour[1], colour[2], delayz);



lineNum=0;

// read from the file until there's nothing else in it:

while (myFile.available()) {

codeline = myFile.readStringUntil(',');

/*Serial.print("------------------------ Linea del File Preset ------------------- Linea Numero: ");

Serial.println(lineNum);

Serial.print("C String: ");

Serial.println(codeline.c_str());

Serial.print("ATOI int: ");

Serial.println(atoi(codeline.c_str()));*/

if(lineNum>=2 and lineNum<10){vol[lineNum-2]=atoi(codeline.c_str()); /*Serial.print("Volume "); Serial.print(lineNum-2); Serial.print(" = "); Serial.println(atoi(codeline.c_str()));*/}

else if(lineNum>=11 and lineNum<17){freq[lineNum-11]=atoi(codeline.c_str()); /*Serial.print("Frequenza "); Serial.print(lineNum-11); Serial.print(" = "); Serial.println(atoi(codeline.c_str()));*/}

else if(lineNum>=18 and lineNum<24){reso[lineNum-18]=atoi(codeline.c_str()); /*Serial.print("Risonanza "); Serial.print(lineNum-18); Serial.print(" = "); Serial.println(atoi(codeline.c_str()));*/}

else if(lineNum>=25 and lineNum<31){order[lineNum-25]=atoi(codeline.c_str()); /*Serial.print("Ordine "); Serial.print(lineNum-25); Serial.print(" = "); Serial.println(atoi(codeline.c_str()));*/}

else if(lineNum==32){ways=atoi(codeline.c_str()); /*Serial.print("Vie del crossover: "); Serial.println(atoi(codeline.c_str()));*/}

else if(lineNum==33){mono_stereo=atoi(codeline.c_str()); /*Serial.print("Controllo Stereo: "); Serial.println(atoi(codeline.c_str()));*/}

else if(lineNum==35){encoder_res=atoi(codeline.c_str()); /*Serial.print("Risoluzione dell'encoder: "); Serial.println(atoi(codeline.c_str()));*/}

else if(lineNum>36 and lineNum<48){colour[lineNum-37]=atoi(codeline.c_str()); /*Serial.print("Colour "); Serial.print(lineNum-37); Serial.print(" = "); Serial.println(atoi(codeline.c_str()));*/}

else if(lineNum>48 and lineNum<53){slimit[lineNum-49]=atoi(codeline.c_str()); /*Serial.print("Colour "); Serial.print(lineNum-37); Serial.print(" = "); Serial.println(atoi(codeline.c_str()));*/}

//Serial.println("");

//Serial.println("Variable Loaded.");


lineNum++;

}

// close the file:

myFile.close();


} else {

// if the file didn't open, print an error:

Serial.println("error opening preset file.");

}


}




void read_remote(char preset_file[]){



// open the file for reading:

myFile = SD.open(preset_file);

if (myFile) {

Serial.println("remote preset file:");

Serial.println(preset_file);

notification="Loading RC preset " + String(preset_file) + ".";

Xover_VGA.draw_notify(notification, colour[0], colour[1], colour[2], delayz);



lineNum=0;

// read from the file until there's nothing else in it:

while (myFile.available()) {

codeline = myFile.readStringUntil(',');

/*Serial.print("------------------------ Linea del File Preset ------------------- Linea Numero: ");

Serial.println(lineNum);

Serial.print("C String: ");

Serial.println(codeline.c_str());

Serial.print("ATOI int: ");

Serial.println(atoi(codeline.c_str()));*/

if(lineNum==2) {CODE_UP=String(codeline);}

else if(lineNum==3) {CODE_DOWN=String(codeline);}

else if(lineNum==4) {CODE_LEFT=String(codeline);}

else if(lineNum==5) {CODE_RIGHT=String(codeline);}

else if(lineNum==6) {CODE_OK=String(codeline);}

else if(lineNum==7) {CODE_MUTE=String(codeline);}


Serial.println("");

Serial.println("Remote code loaded=(" + String(codeline) + ")");

lineNum++;

}

// close the file:

myFile.close();


} else {

// if the file didn't open, print an error:

Serial.println("error opening remote preset file.");

}


}



void readngraph(char preset_file[]){


int Gvol[8];

int Gfreq[6];

int Gorder[6];

int Gways;

int Gmono_stereo;


// re-open the file for reading:

myFile = SD.open(preset_file);

if (myFile) {

Serial.println("preset file:");

Serial.println(preset_file);



lineNum=0;

// read from the file until there's nothing else in it:

while (myFile.available()) {

codeline = myFile.readStringUntil(',');

/*Serial.print("------------------------ Linea del File Preset ------------------- Linea Numero: ");

Serial.println(lineNum);

Serial.print("C String: ");

Serial.println(codeline.c_str());

Serial.print("ATOI int: ");

Serial.println(atoi(codeline.c_str()));*/

if(lineNum>=2 and lineNum<10){Gvol[lineNum-2]=atoi(codeline.c_str()); /*Serial.print("Volume "); Serial.print(lineNum-2); Serial.print(" = "); Serial.println(atoi(codeline.c_str()));*/}

else if(lineNum>=11 and lineNum<17){Gfreq[lineNum-11]=atoi(codeline.c_str()); /*Serial.print("Frequenza "); Serial.print(lineNum-11); Serial.print(" = "); Serial.println(atoi(codeline.c_str()));*/}

else if(lineNum>=25 and lineNum<31){Gorder[lineNum-25]=atoi(codeline.c_str()); /*Serial.print("Ordine "); Serial.print(lineNum-25); Serial.print(" = "); Serial.println(atoi(codeline.c_str()));*/}

else if(lineNum==32){Gways=atoi(codeline.c_str()); /*Serial.print("Vie del crossover: "); Serial.println(atoi(codeline.c_str()));*/}

else if(lineNum==33){Gmono_stereo=atoi(codeline.c_str()); /*Serial.print("Constroolo Stereo: "); Serial.println(atoi(codeline.c_str()));*/}

Serial.println("");

Serial.println("Preset Loaded.");

lineNum++;

}

// close the file:

myFile.close();


Xover_VGA.draw_graphG(Gways, Gmono_stereo, Gfreq[0], Gfreq[1], Gfreq[2], Gfreq[3], Gfreq[4], Gfreq[5], Gvol[0], Gvol[1], Gvol[2], Gvol[3], Gvol[4], Gvol[5], Gvol[6], Gvol[7], Gorder[0], Gorder[1], Gorder[2], Gorder[3], Gorder[4], Gorder[5] ,colour[1], colour[2], colour[6], colour[7], colour[10]);


} else {

// if the file didn't open, print an error:

Serial.println("error opening preset file.");

}


}




// Dumps out the decode_results structure.

// Call this after IRrecv::decode()

// void * to work around compiler issue

//void dump(void *v) {

// decode_results *results = (decode_results *)v

void dump(decode_results *results) {

int count = results->rawlen;

if (results->decode_type == UNKNOWN) {

Serial.print("Unknown encoding: ");

}

else if (results->decode_type == NEC) {

Serial.print("Decoded NEC: ");

}

else if (results->decode_type == SONY) {

Serial.print("Decoded SONY: ");

}

else if (results->decode_type == RC5) {

Serial.print("Decoded RC5: ");

}

else if (results->decode_type == RC6) {

Serial.print("Decoded RC6: ");

}

else if (results->decode_type == PANASONIC) {

Serial.print("Decoded PANASONIC - Address: ");

Serial.print(results->panasonicAddress,HEX);

Serial.print(" Value: ");

}

else if (results->decode_type == JVC) {

Serial.print("Decoded JVC: ");

}

else if (results->decode_type == SAMSUNG) {

Serial.print("Decoded SAMSUNG: ");

}

else if (results->decode_type == SAMSUNG2) {

Serial.print("Decoded SAMSUNG2 - Address: ");

Serial.print(results->panasonicAddress,HEX);

Serial.print(" Value: ");

}

Serial.print(results->value, HEX);

Serial.print(" (");

Serial.print(results->bits, DEC);

Serial.println(" bits)");

Serial.print("Raw (");

Serial.print(count, DEC);

Serial.print("): ");


for (int i = 0; i < count; i++) {

if ((i % 2) == 1) {

Serial.print(results->rawbuf[i]*USECPERTICK, DEC);

}

else {

Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);

}

Serial.print(" ");

}

Serial.println("");

}