/*
 * control_test.java
 *
 * Created on May 10, 2004, 1:00 PM
 */

/**
 *
 * @author  craighea
 */


import javax.comm.*;
import java.io.*;
import java.util.*;


public class control_test {
    private static SerialPortControl spc;
    private static control_packet_coder cpc;
    private static BufferedReader inBufReader;
    private static InputStreamReader inStreamReader = new InputStreamReader(System.in);
    
    /** Creates a new instance of control_test */
    public control_test() {  
        
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        CommPortIdentifier portId;
        Enumeration	   portList;
        portList = CommPortIdentifier.getPortIdentifiers();
        boolean portFound = false;
        byte[] sendPacket;
        
        portId = (CommPortIdentifier) portList.nextElement();
        System.out.println("Got Port " + portId.getName());
        
        while(portList.hasMoreElements()){   
        System.out.println("Got Port " + portId.getName());
        portId = (CommPortIdentifier) portList.nextElement();
        }
        
        if (portId != null) portFound = true;
        
        
        if(portFound == true){
            spc = new SerialPortControl(portId);
            cpc = new control_packet_coder();
        }
        
        while(true){
            sendPacket = cpc.createControlPacket();
            spc.sendCommand(sendPacket);
            sleep(80);
            if(cpc.decodeResponsePacket(spc.getResponsePacket())<0) spc.clearStream();
            doControlStuff();            
        }
        
        
    }
        
    private static void doControlStuff(){
//        inStreamReader = new InputStreamReader(System.in);
//        inBufReader = new BufferedReader(inStreamReader);
        char inChar=0;
        for(int i=0; i<2; i++){
            try{
                if(inStreamReader.ready()){
                    inChar = (char)inStreamReader.read();
//                    System.out.println("inChar " + inChar);
                }  
            }catch(IOException e){}
            
            switch(inChar){
                case 'l': //Toggle lights Max/Off
                    if(cpc.getLight() != (byte)-1) cpc.setLight((byte)-1);
                    else cpc.setLight((byte)0);
                    break;
                    
                case 'L': //Toggle laser
                    if(cpc.getLaser()==true) cpc.setLaser(false);
                    else cpc.setLaser(true);
                    break;     
                    
                case 'a': //Turn left
                    cpc.setRightTrack((byte)127);
                    cpc.setLeftTrack((byte)-127);
                    break;
                    
                case 's': //Turn right
                    cpc.setLeftTrack((byte)127);
                    cpc.setRightTrack((byte)-127);
                    break;
                    
                case 'w': //Move forward
                    cpc.setRightTrack((byte)127);
                    cpc.setLeftTrack((byte)127);
                    break;
                    
                case 'z': //Move backward
                    cpc.setRightTrack((byte)-127);
                    cpc.setLeftTrack((byte)-127);
                    break;
                    
                case 'e': //Tilt up
                    cpc.setTiltUp(true);
                    break;
                
                case 'd': //Tilt down
                    cpc.setTiltDown(true);
                    break;
                
                case 'r': //Raise up
                    cpc.setRaiseUp(true);
                    break;
                  
                case 'f': //Raise down
                    cpc.setRaiseDown(true);
                    break;
                
                case 'W': //Set Warning light
                    cpc.setWarning(!cpc.getWarning());
                    break;
                    
                case '-': //Zoom Out
                    cpc.setZoomIn(false);
                    cpc.setZoomOut(true);
                    break;
                    
                case '+': //Zoom In
                    cpc.setZoomIn(true);
                    cpc.setZoomOut(false);
                    break;
                    
                case '*': //Toggle zoom speed Fast/Slow
                    cpc.setZoomSpeed(!(cpc.getZoomSpeed()));
                    break;
                    
                case '>': //Focus in
                    cpc.setAutofocus(false);
                    cpc.setFocusIn(true);
                    cpc.setFocusOut(false);
                    break;
                    
                case '<': //Focus out
                    cpc.setAutofocus(false);
                    cpc.setFocusIn(false);
                    cpc.setFocusOut(true);
                    break;
                
                case '/': //Toggle Autofocus
                    if(cpc.getAutofocus()==false) cpc.setAutofocus(true);
                    else cpc.setAutofocus(false);
                    break;
                   
                case 'g': //get modifier use like g* where * is one of the following
                    try{
                         if(inStreamReader.ready()){
                            inChar = (char)inStreamReader.read();
                         }
                    }catch(IOException e){}
                    switch(inChar){
                        case 'T': //gT to get temperature
                            System.out.println(cpc.getTemperature());
                            break;
                        case 'P': //gP to get pitch
                            System.out.println(cpc.getPitch());
                            break;
                        case 'R': //gR to get raise
                            System.out.println(cpc.getRaise());
                            break;
                        case 'B': //gB to get battery voltage
                            System.out.println(cpc.getBatteryVoltage());
                            break;
                    }
                    break;
                    
                case '?':  //get status of everything
                                        
                    System.out.println("");
                    
                    System.out.println("Battery: " + cpc.getBatteryVoltage() + "v");
                    
                    System.out.println("Autofocus: " + cpc.getAutofocus());
                    System.out.println("Focus Current: " + cpc.getFocusCurrent() + "mA");
                    System.out.println("FocusIn: " + cpc.getFocusIn());
                    System.out.println("FocusOut: " + cpc.getFocusOut());
                    
                    System.out.println("Joystick X: " + cpc.getJoyX());
                    System.out.println("Joystick Y: " + cpc.getJoyY());
                    
                    System.out.println("Laser: " + cpc.getLaser());
                    
                    System.out.println("Left Track Speed: " + cpc.getLeftTrack());
                    System.out.println("Left Track Current: " + cpc.getLeftTrackCurrent() + "mA");
                    
                    System.out.println("Right Track Speed: " + cpc.getRightTrack());
                    System.out.println("Right Track Current: " + cpc.getRightTrackCurrent() + "mA");
                    
                    System.out.println("Light Intensity: " + cpc.getLight());
                    System.out.println("Light Current: " + cpc.getLightCurrent() + "mA");
                    System.out.println("Light Knob Position: " + cpc.getLightKnob());
                    
                    System.out.println("Pitch: " + cpc.getPitch() + " degrees");
                    
                    System.out.println("Temperature: " + cpc.getTemperature() + " degrees");
                    
                    System.out.println("Raise: " + cpc.getRaise() + " degrees");
                    System.out.println("Raise Current: " + cpc.getRaiseCurrent() + "mA");
                    
                    System.out.println("Tilt Current: " + cpc.getTiltCurrent() + "mA");
                    System.out.println("TiltUp: " + cpc.getTiltUp());
                    System.out.println("TiltDown: " + cpc.getTiltDown());
                    
                    System.out.println("Warning: " + cpc.getWarning());
                    
                    System.out.println("ZoomSpeed: " + cpc.getZoomSpeed());
                    System.out.println("ZoomIn: " + cpc.getZoomIn());
                    System.out.println("ZoomOut: " + cpc.getZoomOut());
                    
                    break;
                    
                default:  //do nothing
                    cpc.setLeftTrack((byte)0);
                    cpc.setRightTrack((byte)0);
                    cpc.setTiltUp(false);
                    cpc.setTiltDown(false);
                    cpc.setRaiseUp(false);
                    cpc.setRaiseDown(false); 
                    cpc.setZoomIn(false);
                    cpc.setZoomOut(false);
                    cpc.setFocusIn(false);
                    cpc.setFocusOut(false);
            }
        }
        
              
    }
    
    private static void sleep(int millis){
        try{
             Thread.sleep(millis);
        }catch(InterruptedException e){}
    }
    
        private static void sleep(){
        try{
             Thread.sleep(10);
        }catch(InterruptedException e){}
    }
    
}
