/*******************************************************************************
 * Aleix Riera                                                                 *
 * www.fjarre.com/~aleix                                                       *
 * aleix@fjarre.com                                                            *
 *******************************************************************************/
void access_flash(rtems_boolean saving){
	int	i;

	rtems_boolean		selection=TRUE;
	rtems_boolean		user_bank=FALSE;
	rtems_unsigned32	flash_key;

	if(saving){
		flash_key=KEY_SAVE;
		panel_out_lcd_print(panel,0,2,PRINT_SAVE);
	}
	else{
		flash_key=KEY_LOAD;
		panel_out_lcd_print(panel,0,2,PRINT_LOAD);
	}
		
	panel_out_lcd_print(panel,1,0,"Are you sure?   ");
	panel_out_lcd_print(panel,1,14,"Y");

	key=0;
	while(key!=flash_key)
		if(panel_in_new_event(panel,TRUE)){
			if(panel_in_potentiometer(panel,&pot,&value)&&pot==PANEL01_POT_VOLUME){
				Volume=value;
				prepare_and_send_DSP();
			}
			else if(panel_in_keypad(panel,&key))
				switch(key){
					case PANEL01_KEY_VALUE_UP:
						selection=TRUE;
						panel_out_lcd_print(panel,1,14,"Y");
						break;
					case PANEL01_KEY_VALUE_DOWN:
						selection=FALSE;
						panel_out_lcd_print(panel,1,14,"N");
						break;
				}
		}

	if(selection){
		//Load an SP Preset?
		if(!saving){
			panel_out_lcd_print(panel,1,0,"Factory/User?   ");
			panel_out_lcd_print(panel,1,14,"F");
			key=0;
			selection=FALSE;
			while(key!=flash_key)
				if(panel_in_new_event(panel,TRUE)){
					if(panel_in_potentiometer(panel,&pot,&value)&&pot==PANEL01_POT_VOLUME){
						Volume=value;
						prepare_and_send_DSP();
					}
					else if(panel_in_keypad(panel,&key))
						switch(key){
							case PANEL01_KEY_VALUE_UP:
								selection=TRUE;
								panel_out_lcd_print(panel,1,14,"U");
								break;
							case PANEL01_KEY_VALUE_DOWN:
								selection=FALSE;
								panel_out_lcd_print(panel,1,14,"F");
								break;
						}
				}
			user_bank=selection;
		}

		panel_out_lcd_print(panel,1,0,"Position:       ");
		print_preset();
		//we will print name if(!saving&&!user_bank)
		if(!saving&&!user_bank)	print_preset_name();

		key=0;
		while(key!=flash_key)
			if(panel_in_new_event(panel,TRUE)){
				if(panel_in_potentiometer(panel,&pot,&value)&&pot==PANEL01_POT_VOLUME){
					Volume=value;
					prepare_and_send_DSP();
				}
				else if(panel_in_encoder(panel,&encoder,&inc)){
					i=flash_preset+inc;
					if(i>=0&&i<MAX_PRESETS_SIZE){
						flash_preset=i;
						print_preset();
					}
					if(!saving&&!user_bank)	print_preset_name();
				}
				else if(panel_in_keypad(panel,&key))
					switch(key){
						case PANEL01_KEY_VALUE_UP:
							if(!(flash_preset==MAX_PRESETS_SIZE-1)){
								flash_preset++;
								print_preset();
								if(!saving&&!user_bank)	print_preset_name();
							}
							break;
						case PANEL01_KEY_VALUE_DOWN:
							if(flash_preset){
								flash_preset--;
								print_preset();
								if(!saving&&!user_bank)	print_preset_name();
							}
							break;
					}
			}

		if(saving)		write_flash();
		else if(user_bank)	read_flash();
		else			read_bank(FALSE);
	}
}
//*****************************************************************
void write_flash(){
	panel_out_lcd_print(panel,1,0,"S A V I N G. . .");
	prepare_mem_to_flash();
	flash_write_data(flash,flash_preset*FLASH_DATA_LEN,dspData_flash,FLASH_DATA_LEN);
	rtems_task_wake_after(WAIT_LOADSAVE);
}
//*****************************************************************
rtems_boolean read_flash(){
	flash_read_data(flash,flash_preset*FLASH_DATA_LEN,dspData_flash,FLASH_DATA_LEN);
	
	if(dspData_flash[FLASH_DATA_LEN-1]==FLASH_FLAG){
		panel_out_lcd_print(panel,1,0,"L O A D I N G...");
		prepare_flash_to_mem();
		rtems_task_wake_after(WAIT_LOADSAVE);
	}
	else{
		panel_out_lcd_print(panel,1,0,"E M P T Y ! ! ! ");
		rtems_task_wake_after(WAIT_LOADSAVE);
		return FALSE;
	}
	
	return TRUE;
}
//*****************************************************************
void prepare_mem_to_flash(){
	dspData_flash[0]=Actual.Mix[2];
	dspData_flash[1]=Actual.Mix[1];
	dspData_flash[2]=Actual.Mix[0];
	dspData_flash[3]=Actual.D[2];
	dspData_flash[4]=Actual.D[1];
	dspData_flash[5]=Actual.D[0];
	
	dspData_flash[6]=Actual.Line[3].Active;
	dspData_flash[7]=Actual.Line[3].Vol;
	dspData_flash[8]=Actual.Line[3].Send;
	dspData_flash[9]=Actual.Line[3].Sat;
	dspData_flash[10]=Actual.Line[3].Filtlvl[2];
	dspData_flash[11]=Actual.Line[3].Filtlvl[1];
	dspData_flash[12]=Actual.Line[3].Filtlvl[0];
	dspData_flash[13]=Actual.Line[3].K[2];
	dspData_flash[14]=Actual.Line[3].K[1];
	dspData_flash[15]=Actual.Line[3].K[0];
	dspData_flash[16]=Actual.Line[3].Freq[2];
	dspData_flash[17]=Actual.Line[3].Freq[1];
	dspData_flash[18]=Actual.Line[3].Freq[0];
	dspData_flash[19]=Actual.Line[3].Amp[2];
	dspData_flash[20]=Actual.Line[3].Amp[1];
	dspData_flash[21]=Actual.Line[3].Amp[0];

	dspData_flash[22]=Actual.Line[2].Active;
	dspData_flash[23]=Actual.Line[2].Vol;
	dspData_flash[24]=Actual.Line[2].Send;
	dspData_flash[25]=Actual.Line[2].Sat;
	dspData_flash[26]=Actual.Line[2].Filtlvl[2];
	dspData_flash[27]=Actual.Line[2].Filtlvl[1];
	dspData_flash[28]=Actual.Line[2].Filtlvl[0];
	dspData_flash[29]=Actual.Line[2].K[2];
	dspData_flash[30]=Actual.Line[2].K[1];
	dspData_flash[31]=Actual.Line[2].K[0];
	dspData_flash[32]=Actual.Line[2].Freq[2];
	dspData_flash[33]=Actual.Line[2].Freq[1];
	dspData_flash[34]=Actual.Line[2].Freq[0];
	dspData_flash[35]=Actual.Line[2].Amp[2];
	dspData_flash[36]=Actual.Line[2].Amp[1];
	dspData_flash[37]=Actual.Line[2].Amp[0];

	dspData_flash[38]=Actual.Line[1].Active;
	dspData_flash[39]=Actual.Line[1].Vol;
	dspData_flash[40]=Actual.Line[1].Send;
	dspData_flash[41]=Actual.Line[1].Sat;
	dspData_flash[42]=Actual.Line[1].Filtlvl[2];
	dspData_flash[43]=Actual.Line[1].Filtlvl[1];
	dspData_flash[44]=Actual.Line[1].Filtlvl[0];
	dspData_flash[45]=Actual.Line[1].K[2];
	dspData_flash[46]=Actual.Line[1].K[1];
	dspData_flash[47]=Actual.Line[1].K[0];
	dspData_flash[48]=Actual.Line[1].Freq[2];
	dspData_flash[49]=Actual.Line[1].Freq[1];
	dspData_flash[50]=Actual.Line[1].Freq[0];
	dspData_flash[51]=Actual.Line[1].Amp[2];
	dspData_flash[52]=Actual.Line[1].Amp[1];
	dspData_flash[53]=Actual.Line[1].Amp[0];

	dspData_flash[54]=Actual.Line[0].Active;
	dspData_flash[55]=Actual.Line[0].Vol;
	dspData_flash[56]=Actual.Line[0].Send;
	dspData_flash[57]=Actual.Line[0].Sat;
	dspData_flash[58]=Actual.Line[0].Filtlvl[2];
	dspData_flash[59]=Actual.Line[0].Filtlvl[1];
	dspData_flash[60]=Actual.Line[0].Filtlvl[0];
	dspData_flash[61]=Actual.Line[0].K[2];
	dspData_flash[62]=Actual.Line[0].K[1];
	dspData_flash[63]=Actual.Line[0].K[0];
	dspData_flash[64]=Actual.Line[0].Freq[2];
	dspData_flash[65]=Actual.Line[0].Freq[1];
	dspData_flash[66]=Actual.Line[0].Freq[0];
	dspData_flash[67]=Actual.Line[0].Amp[2];
	dspData_flash[68]=Actual.Line[0].Amp[1];
	dspData_flash[69]=Actual.Line[0].Amp[0];
	
	//flag saved
	dspData_flash[70]=FLASH_FLAG;
}
//*****************************************************************
void prepare_flash_to_mem(){
	Actual.Mix[2]=			dspData_flash[0];
	Actual.Mix[1]=			dspData_flash[1];
	Actual.Mix[0]=			dspData_flash[2];
	Actual.D[2]=			dspData_flash[3];
	Actual.D[1]=			dspData_flash[4];
	Actual.D[0]=			dspData_flash[5];
	
	Actual.Line[3].Active=		dspData_flash[6];
	Actual.Line[3].Vol=		dspData_flash[7];
	Actual.Line[3].Send=		dspData_flash[8];
	Actual.Line[3].Sat=		dspData_flash[9];
	Actual.Line[3].Filtlvl[2]=	dspData_flash[10];
	Actual.Line[3].Filtlvl[1]=	dspData_flash[11];
	Actual.Line[3].Filtlvl[0]=	dspData_flash[12];
	Actual.Line[3].K[2]=		dspData_flash[13];
	Actual.Line[3].K[1]=		dspData_flash[14];
	Actual.Line[3].K[0]=		dspData_flash[15];
	Actual.Line[3].Freq[2]=		dspData_flash[16];
	Actual.Line[3].Freq[1]=		dspData_flash[17];
	Actual.Line[3].Freq[0]=		dspData_flash[18];
	Actual.Line[3].Amp[2]=		dspData_flash[19];
	Actual.Line[3].Amp[1]=		dspData_flash[20];
	Actual.Line[3].Amp[0]=		dspData_flash[21];
	
	Actual.Line[2].Active=		dspData_flash[22];
	Actual.Line[2].Vol=		dspData_flash[23];
	Actual.Line[2].Send=		dspData_flash[24];
	Actual.Line[2].Sat=		dspData_flash[25];
	Actual.Line[2].Filtlvl[2]=	dspData_flash[26];
	Actual.Line[2].Filtlvl[1]=	dspData_flash[27];
	Actual.Line[2].Filtlvl[0]=	dspData_flash[28];
	Actual.Line[2].K[2]=		dspData_flash[29];
	Actual.Line[2].K[1]=		dspData_flash[30];
	Actual.Line[2].K[0]=		dspData_flash[31];
	Actual.Line[2].Freq[2]=		dspData_flash[32];
	Actual.Line[2].Freq[1]=		dspData_flash[33];
	Actual.Line[2].Freq[0]=		dspData_flash[34];
	Actual.Line[2].Amp[2]=		dspData_flash[35];
	Actual.Line[2].Amp[1]=		dspData_flash[36];
	Actual.Line[2].Amp[0]=		dspData_flash[37];

	Actual.Line[1].Active=		dspData_flash[38];
	Actual.Line[1].Vol=		dspData_flash[39];
	Actual.Line[1].Send=		dspData_flash[40];
	Actual.Line[1].Sat=		dspData_flash[41];
	Actual.Line[1].Filtlvl[2]=	dspData_flash[42];
	Actual.Line[1].Filtlvl[1]=	dspData_flash[43];
	Actual.Line[1].Filtlvl[0]=	dspData_flash[44];
	Actual.Line[1].K[2]=		dspData_flash[45];
	Actual.Line[1].K[1]=		dspData_flash[46];
	Actual.Line[1].K[0]=		dspData_flash[47];
	Actual.Line[1].Freq[2]=		dspData_flash[48];
	Actual.Line[1].Freq[1]=		dspData_flash[49];
	Actual.Line[1].Freq[0]=		dspData_flash[50];
	Actual.Line[1].Amp[2]=		dspData_flash[51];
	Actual.Line[1].Amp[1]=		dspData_flash[52];
	Actual.Line[1].Amp[0]=		dspData_flash[53];

	Actual.Line[0].Active=		dspData_flash[54];
	Actual.Line[0].Vol=		dspData_flash[55];
	Actual.Line[0].Send=		dspData_flash[56];
	Actual.Line[0].Sat=		dspData_flash[57];
	Actual.Line[0].Filtlvl[2]=	dspData_flash[58];
	Actual.Line[0].Filtlvl[1]=	dspData_flash[59];
	Actual.Line[0].Filtlvl[0]=	dspData_flash[60];
	Actual.Line[0].K[2]=		dspData_flash[61];
	Actual.Line[0].K[1]=		dspData_flash[62];
	Actual.Line[0].K[0]=		dspData_flash[63];
	Actual.Line[0].Freq[2]=		dspData_flash[64];
	Actual.Line[0].Freq[1]=		dspData_flash[65];
	Actual.Line[0].Freq[0]=		dspData_flash[66];
	Actual.Line[0].Amp[2]=		dspData_flash[67];
	Actual.Line[0].Amp[1]=		dspData_flash[68];
	Actual.Line[0].Amp[0]=		dspData_flash[69];
}
//*****************************************************************
void read_bank(rtems_boolean initializing){
	if(!initializing)	panel_out_lcd_print(panel,1,0,"L O A D I N G...");

	Actual.Mix[2]=			SP_Presets[flash_preset].Factory.Mix[2];
	Actual.Mix[1]=			SP_Presets[flash_preset].Factory.Mix[1];
	Actual.Mix[0]=			SP_Presets[flash_preset].Factory.Mix[0];
	Actual.D[2]=			SP_Presets[flash_preset].Factory.D[2];
	Actual.D[1]=			SP_Presets[flash_preset].Factory.D[1];
	Actual.D[0]=			SP_Presets[flash_preset].Factory.D[0];
	
	Actual.Line[3].Active=		SP_Presets[flash_preset].Factory.Line[3].Active;
	Actual.Line[3].Vol=		SP_Presets[flash_preset].Factory.Line[3].Vol;
	Actual.Line[3].Send=		SP_Presets[flash_preset].Factory.Line[3].Send;
	Actual.Line[3].Sat=		SP_Presets[flash_preset].Factory.Line[3].Sat;
	Actual.Line[3].Filtlvl[2]=	SP_Presets[flash_preset].Factory.Line[3].Filtlvl[2];
	Actual.Line[3].Filtlvl[1]=	SP_Presets[flash_preset].Factory.Line[3].Filtlvl[1];
	Actual.Line[3].Filtlvl[0]=	SP_Presets[flash_preset].Factory.Line[3].Filtlvl[0];
	Actual.Line[3].K[2]=		SP_Presets[flash_preset].Factory.Line[3].K[2];
	Actual.Line[3].K[1]=		SP_Presets[flash_preset].Factory.Line[3].K[1];
	Actual.Line[3].K[0]=		SP_Presets[flash_preset].Factory.Line[3].K[0];
	Actual.Line[3].Freq[2]=		SP_Presets[flash_preset].Factory.Line[3].Freq[2];
	Actual.Line[3].Freq[1]=		SP_Presets[flash_preset].Factory.Line[3].Freq[1];
	Actual.Line[3].Freq[0]=		SP_Presets[flash_preset].Factory.Line[3].Freq[0];
	Actual.Line[3].Amp[2]=		SP_Presets[flash_preset].Factory.Line[3].Amp[2];
	Actual.Line[3].Amp[1]=		SP_Presets[flash_preset].Factory.Line[3].Amp[1];
	Actual.Line[3].Amp[0]=		SP_Presets[flash_preset].Factory.Line[3].Amp[0];
	
	Actual.Line[2].Active=		SP_Presets[flash_preset].Factory.Line[2].Active;
	Actual.Line[2].Vol=		SP_Presets[flash_preset].Factory.Line[2].Vol;
	Actual.Line[2].Send=		SP_Presets[flash_preset].Factory.Line[2].Send;
	Actual.Line[2].Sat=		SP_Presets[flash_preset].Factory.Line[2].Sat;
	Actual.Line[2].Filtlvl[2]=	SP_Presets[flash_preset].Factory.Line[2].Filtlvl[2];
	Actual.Line[2].Filtlvl[1]=	SP_Presets[flash_preset].Factory.Line[2].Filtlvl[1];
	Actual.Line[2].Filtlvl[0]=	SP_Presets[flash_preset].Factory.Line[2].Filtlvl[0];
	Actual.Line[2].K[2]=		SP_Presets[flash_preset].Factory.Line[2].K[2];
	Actual.Line[2].K[1]=		SP_Presets[flash_preset].Factory.Line[2].K[1];
	Actual.Line[2].K[0]=		SP_Presets[flash_preset].Factory.Line[2].K[0];
	Actual.Line[2].Freq[2]=		SP_Presets[flash_preset].Factory.Line[2].Freq[2];
	Actual.Line[2].Freq[1]=		SP_Presets[flash_preset].Factory.Line[2].Freq[1];
	Actual.Line[2].Freq[0]=		SP_Presets[flash_preset].Factory.Line[2].Freq[0];
	Actual.Line[2].Amp[2]=		SP_Presets[flash_preset].Factory.Line[2].Amp[2];
	Actual.Line[2].Amp[1]=		SP_Presets[flash_preset].Factory.Line[2].Amp[1];
	Actual.Line[2].Amp[0]=		SP_Presets[flash_preset].Factory.Line[2].Amp[0];

	Actual.Line[1].Active=		SP_Presets[flash_preset].Factory.Line[1].Active;
	Actual.Line[1].Vol=		SP_Presets[flash_preset].Factory.Line[1].Vol;
	Actual.Line[1].Send=		SP_Presets[flash_preset].Factory.Line[1].Send;
	Actual.Line[1].Sat=		SP_Presets[flash_preset].Factory.Line[1].Sat;
	Actual.Line[1].Filtlvl[2]=	SP_Presets[flash_preset].Factory.Line[1].Filtlvl[2];
	Actual.Line[1].Filtlvl[1]=	SP_Presets[flash_preset].Factory.Line[1].Filtlvl[1];
	Actual.Line[1].Filtlvl[0]=	SP_Presets[flash_preset].Factory.Line[1].Filtlvl[0];
	Actual.Line[1].K[2]=		SP_Presets[flash_preset].Factory.Line[1].K[2];
	Actual.Line[1].K[1]=		SP_Presets[flash_preset].Factory.Line[1].K[1];
	Actual.Line[1].K[0]=		SP_Presets[flash_preset].Factory.Line[1].K[0];
	Actual.Line[1].Freq[2]=		SP_Presets[flash_preset].Factory.Line[1].Freq[2];
	Actual.Line[1].Freq[1]=		SP_Presets[flash_preset].Factory.Line[1].Freq[1];
	Actual.Line[1].Freq[0]=		SP_Presets[flash_preset].Factory.Line[1].Freq[0];
	Actual.Line[1].Amp[2]=		SP_Presets[flash_preset].Factory.Line[1].Amp[2];
	Actual.Line[1].Amp[1]=		SP_Presets[flash_preset].Factory.Line[1].Amp[1];
	Actual.Line[1].Amp[0]=		SP_Presets[flash_preset].Factory.Line[1].Amp[0];

	Actual.Line[0].Active=		SP_Presets[flash_preset].Factory.Line[0].Active;
	Actual.Line[0].Vol=		SP_Presets[flash_preset].Factory.Line[0].Vol;
	Actual.Line[0].Send=		SP_Presets[flash_preset].Factory.Line[0].Send;
	Actual.Line[0].Sat=		SP_Presets[flash_preset].Factory.Line[0].Sat;
	Actual.Line[0].Filtlvl[2]=	SP_Presets[flash_preset].Factory.Line[0].Filtlvl[2];
	Actual.Line[0].Filtlvl[1]=	SP_Presets[flash_preset].Factory.Line[0].Filtlvl[1];
	Actual.Line[0].Filtlvl[0]=	SP_Presets[flash_preset].Factory.Line[0].Filtlvl[0];
	Actual.Line[0].K[2]=		SP_Presets[flash_preset].Factory.Line[0].K[2];
	Actual.Line[0].K[1]=		SP_Presets[flash_preset].Factory.Line[0].K[1];
	Actual.Line[0].K[0]=		SP_Presets[flash_preset].Factory.Line[0].K[0];
	Actual.Line[0].Freq[2]=		SP_Presets[flash_preset].Factory.Line[0].Freq[2];
	Actual.Line[0].Freq[1]=		SP_Presets[flash_preset].Factory.Line[0].Freq[1];
	Actual.Line[0].Freq[0]=		SP_Presets[flash_preset].Factory.Line[0].Freq[0];
	Actual.Line[0].Amp[2]=		SP_Presets[flash_preset].Factory.Line[0].Amp[2];
	Actual.Line[0].Amp[1]=		SP_Presets[flash_preset].Factory.Line[0].Amp[1];
	Actual.Line[0].Amp[0]=		SP_Presets[flash_preset].Factory.Line[0].Amp[0];

	prepare_and_send_DSP();	//to avoid the rtems_task_wake_after() delay
	
	if(!initializing)	rtems_task_wake_after(WAIT_LOADSAVE);
}