/******************************************************************************\
**	Scan10.c			  
**	
**	First release:			
**	Update release:			
*****************************************************************************/

//Includes
#include "Scan.h"

struct def 	defaults;
FILE		*init_fp;
ushort		buffer[MAX_SAMPLES];

/*****************************************************************************/

void main(void)
{
	char menu_key;
	
	init();

	// Read the initialization file from the CF card
	if ((init_fp = fopen("init.ini", "rb")) == 0)
	{
		printf("\nCouldn't open init file...setting defaults to fallback values\n");
		defaults.stir_speed = 9;
		defaults.start_time = 0;
		defaults.end_time = 0;
		defaults.samples = 1000;
		defaults.start_bin = 1;
		defaults.end_bin = 120;
		defaults.bin_length = 1;
		defaults.x_scan_len = 600;
		defaults.y_scan_len = 300;
		defaults.cell_size = 1;
	}
	else fread(&defaults, sizeof(struct def), 1, init_fp);
	fclose(init_fp);
	
	// Identify the device and its firmware
	printf("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();
	    printf("\n\n\nScanner Main Menu (%s %s %s)" , __FILE__ , __DATE__ , __TIME__);
	    printf("\n1 -- Test Functions");
	    printf("\n2 -- Setup");
	    printf("\n3 -- Deploy");
	    printf("\n4 -- Display Data");
	    printf("\n5 -- Sleep");
	    printf("\n9 -- Reset\n");
    	QRchar("\nEnter Selection: ", "%c", true, &menu_key, false, false);

    	switch(menu_key)
    	{
			case '1':
			    test_func();		// Test
			    break;
		
		    case '2':          	// Setup
			    setup();
			    break;
		
		    case '3':             // Deploy
			    deploy();          	
			    break;
		
		    case '4':             // Display data
		       // display_data();     
			    break;
		
		    case '5':          	// Sleep
		        printf("Press any key to wake from sleep...\n");
//                getchlp();
                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, sample;
  	
  	
  	do
  	{
    	menu_key = '9';
    	kbflush();
    	printf("\n\n\nScanner Test Function Menu");
    	printf("\n\n  1 -- Sensors");
    	printf("\n  2 -- Motors");
    	printf("\n  3 -- Transceiver");
    	printf("\n  4 -- COM");
    	printf("\n  5 -- Video");
    	printf("\n  6 -- Burnwires");
		printf("\n  7 -- Optode");
    	printf("\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 volts", depth());
					printf("\nX-axis limit = %d", PinRead(30));
			      	printf("\nY-axis limit = %d", PinRead(28));
			      	printf("\nZ-axis limit = %d", PinRead(31));
			      	printf("\nGrab limit = %d", PinRead(29));
			      	printf("\nGrab turns = %d", PinRead(32));
			      	printf("\nFootpad = %d", PinRead(27));
					printf("\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':  			// Motors

  				do{
    				kbflush();
					menu_key2 = '9';
				    printf("\n\n\nMotor Test Menu");
				    printf("\n1 -- X Motor");
				    printf("\n2 -- Y Motor");
				    printf("\n3 -- Z Motor");
				    printf("\n4 -- Filter Motor");
				    printf("\n5 -- Grab Motor");
				    printf("\n6 -- Stir Motor");
				    printf("\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':			
							photomult_pwr_on();
							do
							{
						  		kbflush();
								menu_key3 = '9';
								if(	filter_index() ) printf("\n\n\nFilter Index!");
						  		printf("\n\n1 -- Move to filter 1");
						  		printf("\n2 -- Move to filter 2");
						  		printf("\n3 -- Move to filter 3");
							    printf("\n4 -- Move to filter 4");
							    printf("\n9 -- Exit\n");
							   	QRchar("\nEnter Selection: ", "%c", true, &menu_key3, false, false);
							
								switch(menu_key3)
								{
									case '1':
										filter_motor(FILTER1);
										break;

									case '2':
										filter_motor(FILTER2);
										break;

									case '3':
										filter_motor(FILTER3);
										break;

									case '4':
										filter_motor(FILTER4);
										break;
								}
							
							} while(menu_key3 != '9');
						
							photomult_pwr_off();
				    		break;
				    	
				    	
				    	case '5':
				    		g_grab_turns = 0;
				    			
							do
							{
						  		printf("\n\n\nBattery Voltage: %.2f volts", battery());
						  		printf("\nGrab Turns: %d", g_grab_turns);
								if(	grab_limit() ) printf("\nGrab limit!");
								if( footpad() ) printf("\nFootpad!");
						  		
						  		printf("\n\nGrab Motor Menu");
						  		printf("\n  U = Up");
						  		printf("\n  D = Down");
						  		printf("\n  S = Stop");
						  		printf("\n  E = Exit to Test Menu");
						  		printf("\n\nEnter Selection:\n");
						  		kbflush();
						  		in_key = 0;
								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');
							break;		// End case 5
						
							
						case '6':		// Stir motor
							stir_motor(defaults.stir_speed, ON);
							break;		// End case 6	

					}	// End switch	
											
				} while (menu_key2 != '9');
				break;	// End case 2
									

      		case '3':   // Transceiver
				trans_pwr_on();

  				do{
    				kbflush();
					menu_key2 = '9';
				    printf("\n\n\nTransceiver Test Menu");
				    printf("\n1 -- Ping once");
				    printf("\n2 -- Ping once per second");
				    printf("\n3 -- Display data");
				    printf("\n4 -- Scan area");
				    printf("\n9 -- Exit\n");
			    	QRchar("\nEnter Selection: ", "%c", true, &menu_key2, false, false);

					switch(menu_key2)
					{
					    case '1':
							delay_secs(1);
							ping_cycle(buffer);
							break;
					
						case '2':
							delay_secs(1);
							kbflush();

							while(!kbhit())
							{
								ping_cycle(buffer);
								printf("Ping\n");
								delay_secs(1);
							}
							break;
					
						case '3':
							kbflush();
							sample = 0;
							printf("\n\n\nTransceiver data...\n");
							
							while(1){
							    for(x=0; x<25; x++)
							    {
							    	printf("%d  %d\n", sample, buffer[sample]);
							    	sample++;
							    }
							    printf("\nPress any key to continue. <CTRL-X> to exit.\n");
							    if(getch() == 24) break;
							}
							break;
							
						case '4':
							printf("\n\n\nScanning area...\n");
							scan_cycle(ACOUSTIC+OPTIC, buffer);
							break;
							
					}

  				} while (menu_key2 != '9');
				
				trans_pwr_off();
				break;	// End case 3

      		case '4':	// COM		
  				do{
    				kbflush();
					menu_key2 = '9';
				    printf("\n\n\nCOM Test Menu");
				    printf("\n1 -- COM2");
				    printf("\n2 -- COM3");
				    printf("\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;
        					printf("\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;
        					printf("\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 4
				

			case '5': // Video


  				do{
    				kbflush();
					menu_key2 = '9';
				    printf("\n\n\nVideo Test Menu");
				    printf("\n1 -- Start video camera");
				    printf("\n2 -- Stop video camera");
				    printf("\n3 -- Turn on floodlight for 5 sec");
				    printf("\n9 -- Exit");
			    	QRchar("\nEnter Selection: ", "%c", true, &menu_key2, false, false);

					switch(menu_key2)
					{
					    case '1':
							video(VIDEO_START);
    						printf("\nPacket in: ");
    						delay_secs(1);
    						while(COM2ByteAvail())
    						{    								
								ch = COM2GetChar();
								printf("%02x ", ch);
							}      						
							break;
					
						case '2':
							video(VIDEO_STOP);
    						printf("\nPacket in: ");
    						delay_secs(1);
    						while(COM2ByteAvail())
    						{    								
								ch = COM2GetChar();
								printf("%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();
				  	printf("\n\n\nChoose burnwire to toggle:");
				  	printf("\n1 -- Burnwire 1");
				  	printf("\n2 -- Burnwire 2");
				  	printf("\n3 -- Burnwire 3");
				  	printf("\n4 -- Burnwire 4");
				  	printf("\n5 -- Burnwire 5");
				  	printf("\n6 -- Burnwire 6");
				  	printf("\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.
				      			printf("\nBurnwire %c on", menu_key2);
				      			delay_secs(1);
				      			burnwire(wire, OFF);       //Turn burnwire off.
				      			printf("\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();
				printf("\nPress any key to exit");
				kbflush();
				while(!kbhit()) delay_secs(1);
				optode_off();
				break;		// End case 7

		}						// End of switch
	} while(menu_key != '9'); 	// End of main do loop
}								// End test_func


/*************************************************/

void setup(void)
{
  	char	menu_key;
	struct tm *temp_time;	
	time_t ttTemp;

  	do{
		menu_key = '9';
		kbflush();
    	printf("\n\n\n1 -- Set Date/Time");
    	printf("\n2 -- Set Start Time");
    	printf("\n3 -- Set End Time");
    	printf("\n4 -- Set Scan Parameters");
    	printf("\n5 -- Set Video Parameters");
    	printf("\n6 -- ");
    	printf("\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);
				printf("\nCurrent RTC Clock Time: %s\n", asctime(temp_time));	
	    		break;

      		case '2':         // Start Time
				QRushort("\n\nEnter delay time (min): ", "%u", true, &defaults.delay_time, 1, 120);
				
//				defaults.start_time = CmdSetDateTime("\n\nEnter the start date and time ",	defaults.start_time);
        		break;
        		
      		case '3':         // End Time
				defaults.end_time = CmdSetDateTime("\n\nEnter the end date and time ",	defaults.end_time);
        		break;
        		
      		case '4':         // Scan Parameters
				QRushort("\n\nEnter X scan length (mm): ", "%u", true, &defaults.x_scan_len, 1, 600);
				QRushort("\nEnter Y scan length (mm): ", "%u", true, &defaults.y_scan_len, 1, 300);
				QRushort("\nEnter cell size (mm): ", "%u", true, &defaults.cell_size, 1, 20);
				QRushort("\nEnter start bin (mm): ", "%u", true, &defaults.start_bin, 0, 120);
				QRushort("\nEnter end bin (mm): ", "%u", true, &defaults.end_bin, 0, 120);
				QRushort("\nEnter bin length (mm): ", "%u", true, &defaults.bin_length, 1, 120);
        		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, 1, 60);
        		break;
      			

    	} // End switch
  	} while(menu_key != '9');

	if ((init_fp = fopen("init.ini", "wb")) == 0)
	{
		printf("\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 ttTemp;
  
	ttTemp = RTCGetTime(NULL,NULL); 
	timePtr = localtime(&ttTemp);
	printf("\nCurrent RTC Clock Time: %s\n", asctime(timePtr));	

  
  	// Last chance to say no!
  	if(!QRconfirm("\n\nDeploy function...do you want to continue", false, true)) return;
  	printf("\n\n\nDisconnect comm cable and deploy...\n");
	kbflush();

	delay_secs(defaults.delay_time * 60);

	// Check depth and time
//	while(1)
//	{
//		sensor_pwr_on();
//		if(depth() > defaults.camera_start_depth) break;
//		sensor_pwr_off();
//		if(RTCGetTime(NULL,NULL) > defaults.start_time) 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);

		printf("\n\n\nScanning area...\n");
		scan_cycle(ACOUSTIC+OPTIC, buffer);
		
		delay_secs(defaults.camera_on_time * 60);
		flood_off();	  	//Floodlight off.
		video(VIDEO_STOP);


//	}
	
}     	// End deploy()




