/******************************************************************************\
**	Scan.c			  
**	
**	First release:			
**	Update release:			
*****************************************************************************/

// Includes
#include "scan.h"

// Global variables
struct def 	defaults;
FILE		*init_fp;
FILE 		*dep_file_ptr;
FILE		*fluor_file_ptr;
long		g_buffer[MAX_SAMPLES], g_ad_zero;
ushort		g_bin_buffer[END_BIN+1];

// Function prototypes
void 	test_func(void);
void 	setup(void);
void 	deploy(void);

/*****************************************************************************/

void main(void)
{
	char menu_key;
	time_t timer;
	
	init();
	g_ad_zero = 2048;

	// Read the initialization file from the CF card
	if ((init_fp = fopen("scaninfo.dat", "rb")) == 0)
	{
		cprintf("\nCouldn't open scaninfo.bin ...setting defaults to fallback values\n");
		defaults.stir_speed = 9;
		defaults.start_time = 0;
		defaults.end_time = 0;
		defaults.x_scan_len = 60;
		defaults.y_scan_len = 30;
		defaults.depth_cal = 1;
		defaults.depth_zero = 0;
		defaults.grab_turns = 100;
		defaults.burnwire_time = 300;
		defaults.def_elev = 100;
	}
	else fread(&defaults, sizeof(struct def), 1, init_fp);
	fclose(init_fp);
	
	// Identify the device and its firmware
	cprintf("Persistor CF1 SN:%ld   BIOS:%d.%d   PicoDOS:%d.%d\n",
		BIOSGVT.CF1SerNum, BIOSGVT.BIOSVersion, BIOSGVT.BIOSRelease, 
		BIOSGVT.PICOVersion, BIOSGVT.PICORelease);


  	while(1)
  	{
	    
		menu_key = '0';
		kbflush();
    	timer = time(0) + 60;		// 60 seconds to press a key or CF1 will sleep
    
	    cprintf("\n\n\nScanner Main Menu (%s %s %s)" , __FILE__ , __DATE__ , __TIME__);
	    cprintf("\n1 -- Test Functions");
	    cprintf("\n2 -- Setup");
	    cprintf("\n3 -- Deploy");
	    cprintf("\n5 -- Sleep");
	    cprintf("\n9 -- Reset to PicoDOS\n");
    	cprintf("\nEnter Selection: ");

    	while(1){
      		if(kbhit())
      		{
        		menu_key = getch();      // Get the key pressed
        		break;
      		}
      		if(time(0) > timer)      // Time to sleep?
        	{
        		menu_key = '5';          // Choose the sleep function
        		break;
      		}
    	}

    	switch(menu_key)
    	{
			case '1':
			    test_func();		// Test
			    break;
		
		    case '2':          	// Setup
			    setup();
			    break;
		
		    case '3':             // Deploy
			    deploy();          	
			    break;
		
		    case '5':          	// Sleep
                sleep_with_break();
                break;
		
		    case '9':          	// Reset
				//BIOSReset();			// full hardware reset
				//	BIOSResetToPBM();		// full reset, but stay in Pesistor Boot Monitor
					BIOSResetToPicoDOS();	// full reset, but jump to 0xE10000 (PicoDOS)
				break;

    	}
	}
}	//____ main() ____//



/***************************************************/

void test_func(void){
  	char menu_key, menu_key2, menu_key3, in_key;
  	struct RTCTimer *timer = 0;
  	ushort ch, wire;
  	int x, bin, sample, z_elev;
  	
	// Open a deployment test data file
	if ((dep_file_ptr = fopen("deptest.txt", "w")) == 0)
	{
		cprintf("\nCouldn't open test data file!\n");
		return;
	}
	fprintf(dep_file_ptr, "\nTime%tDepth%tBatt(V)");

	// Open a fluorometer test data file
	if ((fluor_file_ptr = fopen("flrtest.txt", "w")) == 0)
	{
		cprintf("\nCouldn't open fluorometer data file...aborting deployment\n");
		return;
	}
	fprintf(fluor_file_ptr, "\nX\tY\tPE\tCl");
	

  	do
  	{
    	menu_key = '9';
    	kbflush();
    	cprintf("\n\n\nScanner Test Function Menu");
    	cprintf("\n\n  1 -- Sensors");
    	cprintf("\n  2 -- Grab");
    	cprintf("\n  3 -- Scanner");
    	cprintf("\n  4 -- COM");
    	cprintf("\n  5 -- Video");
    	cprintf("\n  6 -- Burnwires");
		cprintf("\n  7 -- Optode");
    	cprintf("\n  9 -- Exit\n");
    	QRchar("\nEnter Selection: ", "%c", true, &menu_key, false, false);

    	switch(menu_key)
		{
      		case '1':   // Sensors
	    		sensor_pwr_on();
	    		
	    		while(1)
	    		{
		      		
		      		printf("\n\n\nBattery Voltage: %.2f volts", battery());
		      		printf("\nBackup Bat Voltage: %.2f volts", backup_bat());
		      		printf("\nDepth: %.2f meters\n", depth());
					cprintf("\nX-axis limit = %d", PinRead(30));
			      	cprintf("\nY-axis limit = %d", PinRead(28));
			      	cprintf("\nZ-axis limit = %d", PinRead(31));
			      	cprintf("\nGrab limit = %d", PinRead(29));
			      	cprintf("\nGrab turns = %d", PinRead(32));
			      	cprintf("\nFootpad = %d", PinRead(27));
					cprintf("\nFilter Index = %d\n", PinRead(26));
					
			    	kbflush();
			      	RTCElapsedTimerSetup(timer);
					while( RTCElapsedTime(timer) < 3e6)	if( kbhit() ) break;
		        	if( kbhit() ) break;
		        }

	    		sensor_pwr_off();
			    break;

	  
			case '2':  			// Grab
				sensor_pwr_on();

  				do{
    				kbflush();
					menu_key2 = '9';
				    cprintf("\n\n\nGrab Test Menu");
				    cprintf("\n1 -- Grab Motor");
				    cprintf("\n2 -- Stir Motor");
				    cprintf("\n9 -- Exit");
			    	QRchar("\nEnter Selection: ", "%c", true, &menu_key2, false, false);

					switch(menu_key2)
					{
				    	case '1':
				    		g_grab_turns = 0;
  							CTSAInterruptEnable (SASM18B, ON);	/* Enable grab turns interrupt */
					  		in_key = 0;
				    			
							do
							{
						  		printf("\n\n\nBattery Voltage: %.2f volts", battery());
						  		printf("\nGrab Turns: %d", g_grab_turns);
								if(	grab_limit() ) cprintf("\nGrab limit!");
								if( footpad() ) cprintf("\nFootpad!");
						  		
						  		cprintf("\n\nGrab Motor Menu");
						  		cprintf("\n  U = Up");
						  		cprintf("\n  D = Down");
						  		cprintf("\n  S = Stop");
						  		cprintf("\n  E = Exit to Test Menu");
						  		cprintf("\n\nEnter Selection:\n");
						  		kbflush();
								RTCElapsedTimerSetup(timer);
						  		while( RTCElapsedTime(timer) < 3e6 )    	// Loop round and round until time to print menu again
						    	{
						    		if( kbhit() )
						    		{
						      			in_key = (char)tolower( getch() );       // Get command in lower case
						      			switch(in_key)
						      			{
						        			case 'u':
						          				grab_motor(UP);
						          				break;
						            		case 'd':
						              			grab_motor(DOWN);
						              			break;
						            		case 's':
						              			grab_motor(STOP);
						              			break;
						            		case 'e':
						              			grab_motor(STOP);
						              			break;
						      			}
						    		}
									if(in_key == 'u' && grab_limit()) grab_motor(STOP);
									if(in_key == 'd' && footpad()) grab_motor(STOP);
						  		}
						
							} while(in_key != 'e');


							CTSAInterruptEnable (SASM18B, OFF);	/* Disable grab turns interrupt */
							break;		// End case 5
						
							
						case '2':		// Stir motor
							stir_motor(defaults.stir_speed, ON);
							break;		// End case 6	

					}	// End switch	
											
				} while (menu_key2 != '9');

				sensor_pwr_off();
				break;	// End case 2
									

      		case '3':   // Scanner

  				do{
    				kbflush();
					menu_key2 = '9';
				    cprintf("\n\n\nScanner Test Menu");
				    cprintf("\n1 -- Transceiver");
				    cprintf("\n2 -- Motors");
				    cprintf("\n3 -- Fluorometer");
				    cprintf("\n9 -- Exit\n");
			    	QRchar("\nEnter Selection: ", "%c", true, &menu_key2, false, false);

					switch(menu_key2)
					{
					    case '1':	// Transceiver
							sensor_pwr_on();
							step_pwr_on();
							trans_pwr_on();

							do{
			    				kbflush();
								menu_key3 = '9';
							    cprintf("\n\n\nTransceiver Test Menu");
							    cprintf("\n1 -- Ping once");
							    cprintf("\n2 -- Ping once per second");
							    cprintf("\n3 -- Display raw data");
							    cprintf("\n4 -- Display processed data");
							    cprintf("\n5 -- Scan area");
							    cprintf("\n6 -- Scan Z cycle");
							    cprintf("\n9 -- Exit\n");
						    	QRchar("\nEnter Selection: ", "%c", true, &menu_key3, false, false);
			
								switch(menu_key3)
								{
								    case '1':		// Ping once
										scan_ad_zero();
										ping_cycle(PING_AVG);
										break;
								
									case '2':		// Ping once per second
										scan_ad_zero();
										kbflush();
			
										while(!kbhit())
										{
											ping_cycle(PING_AVG);
											cprintf("Ping\n");
											delay_secs(1);
										}
										break;
								
									case '3':		// Display raw data
										kbflush();
										sample = 0;
										cprintf("\n\n\nTransceiver data...\n");
										
										while(sample < MAX_SAMPLES)
										{
										    for(x=0; x<25; x++)
										    {
										    	cprintf("%d  %ld\n", sample, g_buffer[sample] - g_ad_zero);
										    	sample++;
										    }
										    cprintf("\nPress any key to continue. <CTRL-X> to exit.\n");
										    if(getch() == 24) break;
										}
										break;
										
									case '4':		// Display processed data
										cprintf("\n\n\nBin     Data");
										for(bin=START_BIN; bin<=END_BIN; bin++)	cprintf("\n%5d%10d", bin, (int)g_bin_buffer[bin]);
										break;
										
									case '5':		// Scan area
										cprintf("\n\n\nScanning area...\n");
										scan_cycle();
										break;
										
									case '6':		// Scan Z cycle
										// Move the transducer to about 2cm above sediment
										cprintf("\n\n\nScan Z cycle...\n");
										scan_ad_zero();
										z_elev = 0;
										scan_z_cycle(&z_elev);
										break;
										
								}
			
			  				} while (menu_key3 != '9');

							trans_pwr_off();
							sensor_pwr_off();
							step_pwr_off();
							break;
					
						case '2':	// Motors
							sensor_pwr_on();
							step_pwr_on();
			  				do
			  				{
			    				kbflush();
								menu_key3 = '9';
							    cprintf("\n\n\nMotor Test Menu");
							    cprintf("\n1 -- X Motor");
							    cprintf("\n2 -- Y Motor");
							    cprintf("\n3 -- Z Motor");
							    cprintf("\n4 -- All axes to limits");
							    cprintf("\n9 -- Exit");
						    	QRchar("\nEnter Selection: ", "%c", true, &menu_key2, false, false);
			
								switch(menu_key2)
								{
								    case '1':				// X motor
										test_scan_motor(X);
										break;
								
									case '2':				// Y motor
										test_scan_motor(Y);
										break;
								
								    case '3':				// Z motor
										test_scan_motor(Z);
										break;

								    case '4':				// All axes to limits
										scan_mot_return();
										break;
								}
			  				} while (menu_key3 != '9');

							sensor_pwr_off();
							step_pwr_off();
			  				break;
			  				
			  			case '3':	// Fluorometer
							photomult_pwr_on();
			  				do
			  				{
			    				kbflush();
								menu_key3 = '9';
							    cprintf("\n\n\nFluorometer Test Menu");
							    cprintf("\n1 -- Fluorometer Cycle");
							    cprintf("\n2 -- Filter to index");
							    cprintf("\n3 -- Move to Next Filter");
							    cprintf("\n4 -- LED 1 On");
							    cprintf("\n5 -- PM dark counts");
							    cprintf("\n9 -- Exit");
						    	QRchar("\nEnter Selection: ", "%c", true, &menu_key3, false, false);
			
								switch(menu_key3)
								{
								    case '1':				// Fluorometer cycle
										fluor_cycle(1, 1);	
										break;
								
									case '2':				// Filter to index
										filter_motor(INDEX);
										break;
								
								    case '3':				// Move to next filter
										filter_motor(NEXT_FILTER);
										break;
										
									case '4':				// LED 1 on
										kbflush();
										led1_on();
										while(1)
										{
											if(kbhit()) break;
											delay_secs(1);
											cprintf("\npm_counts = %d", pm_counts());
										}
										led1_off();
										break;
										
									case '5':				// Dark counts
										kbflush();
										while(1)
										{
											if(kbhit()) break;
											delay_secs(1);
											cprintf("\npm_counts = %d", pm_counts());
										}
										break;
								
								}	// End switch
			  				} while (menu_key3 != '9');
							photomult_pwr_off();
			  				break;
			  				
			  		}	// End switch		
  				} while (menu_key2 != '9');
							
				break;	// End case "Scanner"

      		case '4':	// COM		
  				do{
    				kbflush();
					menu_key2 = '9';
				    cprintf("\n\n\nCOM Test Menu");
				    cprintf("\n1 -- COM2");
				    cprintf("\n2 -- COM3");
				    cprintf("\n9 -- Exit\n");
			    	QRchar("\nEnter Selection: ", "%c", true, &menu_key2, false, false);

					switch(menu_key2)
					{
					    case '1':
							U7_control(COM2_ON, ON);
				
		        			in_key = 0;
        					cprintf("\n\nCtrl-X to exit...\n");
        					kbflush();
        
        					while(1)
        					{
          						if(COM2ByteAvail())	putch( (char)COM2GetChar() );
            					if(kbhit())
            					{
            					in_key = (char)getch();
            					if(in_key == 24) break;
            					else COM2PutChar(in_key);
            					}
            				}

							U7_control(COM2_ON, OFF);
          					break;
					
						case '2':
							U7_control(COM3_ON, ON);
				
		        			in_key = 0;
        					cprintf("\n\nCtrl-X to exit...\n");
        					kbflush();
        
        					while(1)
        					{
          						if(COM3ByteAvail())	putch( (char)COM3GetChar() );
            					if(kbhit())
            					{
            					in_key = (char)getch();
            					if(in_key == 24) break;
            					else COM3PutChar(in_key);
            					}
            				}
							U7_control(COM2_ON, OFF);
							break;
					
					}
				
  				} while (menu_key2 != '9');

				break;	// End case "COM"
				

			case '5': // Video


  				do{
    				kbflush();
					menu_key2 = '9';
				    cprintf("\n\n\nVideo Test Menu");
				    cprintf("\n1 -- Start video camera");
				    cprintf("\n2 -- Stop video camera");
				    cprintf("\n3 -- Turn on floodlight for 5 sec");
				    cprintf("\n9 -- Exit");
			    	QRchar("\nEnter Selection: ", "%c", true, &menu_key2, false, false);

					switch(menu_key2)
					{
					    case '1':
							video(VIDEO_START);
    						cprintf("\nPacket in: ");
    						delay_secs(1);
    						while(COM2ByteAvail())
    						{    								
								ch = COM2GetChar();
								cprintf("%02x ", ch);
							}      						
							break;
					
						case '2':
							video(VIDEO_STOP);
    						cprintf("\nPacket in: ");
    						delay_secs(1);
    						while(COM2ByteAvail())
    						{    								
								ch = COM2GetChar();
								cprintf("%02x ", ch);
							}      						
							break;
					
					    case '3':
							flood_on();			//Floodlight on.
							delay_secs(5);
							flood_off();	  	//Floodlight off.
							break;
					
					}

  				} while (menu_key2 != '9');

				break;
			
			case '6':		// Burnwires
				iso_pwr_on();
				
				do{
					menu_key2 = '9';
					kbflush();
				  	cprintf("\n\n\nChoose burnwire to toggle:");
				  	cprintf("\n1 -- Burnwire 1");
				  	cprintf("\n2 -- Burnwire 2");
				  	cprintf("\n3 -- Burnwire 3");
				  	cprintf("\n4 -- Burnwire 4");
				  	cprintf("\n5 -- Burnwire 5");
				  	cprintf("\n6 -- Burnwire 6");
				  	cprintf("\n9 -- Exit\n");
				  	QRchar("\nEnter Selection: ", "%c", true, &menu_key2, false, false);
			
				  	switch(menu_key2)
				  	{
				    	case '1':
				    		wire = BURN_1;
				    		break;
				    		
				    	case '2':
				    		wire = BURN_2;
				    		break;
				    		
				    	case '3':
				    		wire = BURN_3;
				    		break;
				    		
				    	case '4':
				    		wire = BURN_4;
				    		break;
				    		
				    	case '5':
				    		wire = BURN_5;
				    		break;
				    		
				    	case '6':
				    		wire = BURN_6;
				    		break;
				    		
				    	default:
				    		wire = BURN_1;
				    		break;
				    }
				    	if(menu_key2 != '9')
				    	{
				    		kbflush();
				    		do
				    		{
				      			burnwire(wire, ON);        //Turn burnwire on.
				      			cprintf("\nBurnwire %c on", menu_key2);
				      			delay_secs(1);
				      			burnwire(wire, OFF);       //Turn burnwire off.
				      			cprintf("\nBurnwire %c off", menu_key2);
				      			delay_secs(1);
				    		} while(!kbhit());
				 		}
				} while(menu_key2 != '9');

				iso_pwr_off();
				break;		// End case 6
				
			case '7':
				optode_on();
				cprintf("\nPress any key to exit\n");
				kbflush();
				while(!kbhit())
				{
			  		printf("Battery Voltage: %.2f volts\n", battery());
					delay_secs(3);
				}
				optode_off();
				break;		// End case 7

		}						// End of switch

	} while(menu_key != '9'); 	// End of main do loop

	fclose(dep_file_ptr);
	fclose(fluor_file_ptr);
}								// End test_func


/*************************************************/

void setup(void)
{
  	char	menu_key;
	struct tm *temp_time;	
	time_t ttTemp;

  	do
  	{
		menu_key = '9';
		kbflush();
    	cprintf("\n\n\n1 -- Set Date/Time");
    	cprintf("\n2 -- Set Start Time");
    	cprintf("\n3 -- Set End Time");
    	cprintf("\n4 -- Set Scan Parameters");
    	cprintf("\n5 -- Set Camera Start Depth");
    	cprintf("\n6 -- Calibration Factors");
    	cprintf("\n7 -- Grab Parameters");
    	cprintf("\n9 -- Exit\n");
    	QRchar("\nEnter Selection: ", "%c", true, &menu_key, false, false);
    	

		kbflush();
    	switch(menu_key)
    	{
      		case '1':			// Date/Time
				ttTemp = CmdSetDateTime("\n\nEnter the date and time ",	RTCGetTime(NULL,NULL));
				RTCSetTime(ttTemp, 0);
				ttTemp = RTCGetTime(NULL,NULL); 
				temp_time = localtime(&ttTemp);
				cprintf("\nCurrent RTC Clock Time: %s\n", asctime(temp_time));	
	    		break;

      		case '2':         // Start Time
				temp_time = localtime(&defaults.start_time);
				QRdatetime("\n\nEnter the start date and time ", MMDDYY, 1, 1, temp_time);
        		defaults.start_time = mktime(temp_time);
        		break;
        		
      		case '3':         // End Time
				temp_time = localtime(&defaults.end_time);
				QRdatetime("\n\nEnter the end date and time ", MMDDYY, 1, 1, temp_time);
        		defaults.end_time = mktime(temp_time);
        		break;
        		
      		case '4':         // Scan Parameters
				QRushort("\n\nEnter X scan length (cm): ", "%u", true, &defaults.x_scan_len, 0, 60);
				QRushort("\nEnter Y scan length (cm): ", "%u", true, &defaults.y_scan_len, 0, 30);
				QRushort("\n\nEnter default Z elevation (mm): ", "%u", true, &defaults.def_elev, 0, 200);
        		break;
        		
      		case '5':         // Video Camera Parameters 
				QRushort("\n\nEnter camera start depth (m)",	"%u", true, &defaults.camera_start_depth, 1, 7000);
				QRushort("\n\nEnter camera on time (min)",	"%u", true, &defaults.camera_on_time, 0, 60);
        		break;

      		case '6':         // Calibration Factors
      			QRfloat("\n\nEnter depth calibration factor", "%f", true, &defaults.depth_cal, 0, 10); 
      			QRfloat("\n\nEnter depth zero factor", "%f", true, &defaults.depth_zero, 0, 10000); 
				break;
				
      		case '7':         // Grab Parameters
				QRushort("\n\nEnter grab turns (10 turn/in): ", "%u", true, &defaults.grab_turns, 1, 250);
				QRushort("\n\nEnter stir speed (rpm): ", "%u", true, &defaults.stir_speed, 1, 20);
				QRushort("\n\nEnter burnwire time (secs): ", "%u", true, &defaults.burnwire_time, 1, 1000);
				QRushort("\n\nEnter Optode on time (min): ", "%u", true, &defaults.optode_time, 0, 20);
				QRushort("\n\nEnter data period (secs): ", "%u", true, &defaults.data_period, 1, 1000);
      			break;

    	} // End switch
  	} while(menu_key != '9');

	if ((init_fp = fopen("scaninfo.dat", "wb")) == 0)
	{
		cprintf("\nCouldn't open init file!\n");
		return;
	}
	else fwrite(&defaults, sizeof(struct def), 1, init_fp);
	fclose(init_fp);


}	// End Setup


/***************************************************/

void deploy(void)
{
	struct tm *timePtr;	
	time_t temp_time, data_time, time_out;
	  
	cprintf("\nData period = %d sec", (int)defaults.data_period);
	cprintf("\nX scan length = %d cm", (int)defaults.x_scan_len);
	cprintf("\nY scan length = %d cm", (int)defaults.y_scan_len);
	cprintf("\nDefault Z elev. = %d cm", (int)defaults.def_elev);
	cprintf("\nCamera start depth = %d m", (int)defaults.camera_start_depth);
	cprintf("\nCamera on time = %d min", (int)defaults.camera_on_time);
	cprintf("\nStir speed = %d rpm", (int)defaults.stir_speed);
	cprintf("\nGrab turns = %d", (int)defaults.grab_turns);
	cprintf("\nBurnwire time = %d sec", (int)defaults.burnwire_time);
	cprintf("\nOptode time = %d min", (int)defaults.optode_time);
	printf("\nDepth cal = %f", defaults.depth_cal);
	printf("\nDepth zero = %f\n", defaults.depth_zero);
	
	temp_time = RTCGetTime(NULL,NULL); 
	timePtr = localtime(&temp_time);
	cprintf("\nCurrent RTC Clock Time: %s\n", asctime(timePtr));	

	timePtr = localtime(&defaults.start_time);
	cprintf("\nStart time = %s",  asctime(timePtr));

	timePtr = localtime(&defaults.end_time);
	cprintf("\nEnd time = %s",  asctime(timePtr));
	

  
  	// Last chance to say no!
  	if(!QRconfirm("\n\nDeploy function...do you want to continue", false, true)) return;
  	cprintf("\n\n\nDisconnect comm cable and deploy...\n");
	kbflush();


	// Open a deployment data file
	if ((dep_file_ptr = fopen("depdata.txt", "w")) == 0)
	{
		cprintf("\nCouldn't open deployment data file...aborting deployment\n");
		return;
	}
	fprintf(dep_file_ptr, "\nTime\tDepth\tBatt(V)");
	data_time = time(NULL) + defaults.data_period;

	// Open a fluorometer data file
	if ((fluor_file_ptr = fopen("fluor.txt", "w")) == 0)
	{
		cprintf("\nCouldn't open fluorometer data file...aborting deployment\n");
		return;
	}
	fprintf(fluor_file_ptr, "\nX\tY\tPE\tCl");
	
	
	// Check depth and time before starting camera
	while(1)
	{
		// Are we deep enough?
//		if(depth() > defaults.camera_start_depth) break;
		// Has enough time passed yet?
		if(RTCGetTime(NULL,NULL) > defaults.start_time) break;
		// Store some deployment data
		if(data_time < time(NULL))
		{
			store_dep_data("Descending");
			data_time = time(NULL) + defaults.data_period;
		}
		// Hang out a while
		delay_secs(10);
		// Give us a way out
		if(kbhit())
		{
		 	cprintf("\nPress 'x' key to abort...");
		 	kbflush();
		 	time_out = time(NULL) + 30;
		 	while(1)
		 	{
		 		if(time_out > time(NULL)) break;
		 		if(kbhit())
		 		{
		 			if(getch() == 'x') return;
		 			else break;
		 		}
		 		delay_secs(1);
		 	}
		}
	}
	
	// Start video camera to catch landing. Skip if past start time.
	if(RTCGetTime(NULL,NULL) > defaults.start_time)
	{
		video(VIDEO_START);
		flood_on();			//Floodlight on.
		delay_secs(defaults.camera_on_time * 60);
//		flood_off();	  	//Floodlight off.
//		video(VIDEO_STOP);
	}


	
	store_dep_data("Scan started");

	sensor_pwr_on();
	step_pwr_on();
	trans_pwr_on();
	scan_cycle();		// Scan the sediment
	trans_pwr_off();
	store_dep_data("Scan ended");
	fclose(fluor_file_ptr);
	
	// Do this again just in case
	flood_off();	  	//Floodlight off.
	video(VIDEO_STOP);

	if(scan_mot_return())		// Return all scanner axis to limits
	{
		fclose(dep_file_ptr);
		return;
	}
	sensor_pwr_off();
	step_pwr_off();


	// Run the optode in water
	optode_on();
	cprintf("\nOptode on...");
	store_dep_data("Optode started in water");
	delay_secs(defaults.optode_time * 60);
	optode_off();

	
	// Videotape the grab insertion
	video(VIDEO_START);
	flood_on();			//Floodlight on.
	
	store_dep_data("Grab down started");
	if(grab_down_cycle())
	{
		fclose(dep_file_ptr);
		return;
		flood_off();	  	//Floodlight off.
		video(VIDEO_STOP);
	}
	store_dep_data("Grab down ended");

	delay_secs(60);
	flood_off();	  	//Floodlight off.
	video(VIDEO_STOP);
	
	// Close the Niskin bottle
	store_dep_data("Niskin bottle burnwire on");
	iso_pwr_on();
	burnwire(BURN_5, ON);        //Turn burnwire on.
	cprintf("\nNiskin bottle burnwire on");
	delay_secs(defaults.burnwire_time);
	burnwire(BURN_5, OFF);       //Turn burnwire off.
	cprintf("\nBurnwire off");

	// Close the grab valve
	store_dep_data("Grab valve burnwire on");
	burnwire(BURN_1, ON);        //Turn burnwire on.
	cprintf("\nGrab valve burnwire on");
	delay_secs(defaults.burnwire_time);
	burnwire(BURN_1, OFF);       //Turn burnwire off.
	cprintf("\nBurnwire off");
	iso_pwr_off();

	delay_secs(600);				// 10 min delay for Anders
	// Run the optode in sediment
	optode_on();
	cprintf("\nOptode on...");
	store_dep_data("Optode started in sediment");
	delay_secs(defaults.optode_time * 60);
	optode_off();
	

	// Run the stir motor
	cprintf("\nStir motor running...press any key to skip");
	store_dep_data("Stir motor running");
	TMGSetSpeed(320);				// Slow down clock
	stir_5V_on();
	kbflush();
	if(!defaults.stir_speed) defaults.stir_speed = 9;	// Prevent a divide by zero error
	while(1)			// Loop here till key hit
	{
		RTCDelayMicroSeconds ((300000L/defaults.stir_speed));
		PIOToggle(37);	// Toggling the pin makes the stir motor step
		if(kbhit()) break;
		if(time(NULL) > defaults.end_time) break;
	}
	
	stir_5V_off();
	TMGSetSpeed(16000);
	PinWrite(37, 0);			// Stop PWM on STEP pin
	
	// Close the grab doors
	iso_pwr_on();
	burnwire(BURN_3, ON);        //Turn burnwire on.
	cprintf("\nGrab door burnwire on");
	delay_secs(defaults.burnwire_time);
	burnwire(BURN_3, OFF);       //Turn burnwire off.
	cprintf("\nBurnwire off");
	iso_pwr_off();
	
	if(grab_up_cycle())			// Bring the grab back up
	{
		fclose(dep_file_ptr);
		return;
	}
	
	// Run the optode in water
	optode_on();
	cprintf("\nOptode on...");
	store_dep_data("Optode started in water");
	delay_secs(defaults.optode_time * 60);
	optode_off();

	
	store_dep_data("Deployment finished");

	// Clean up before exiting
	fclose(dep_file_ptr);

}     	// End deploy()


/*******************************************************************************/

