Loading src/main/java/Aberration_Calibration.java +95 −14 Original line number Original line Diff line number Diff line Loading @@ -519,6 +519,7 @@ public static MatchSimulatedPattern.DistortionParameters DISTORTION =new MatchSi public float [][] SIM_ARRAY=null; // first index - 0 - main, 1 - shifted by 0.5 pixel diagonally (to extract checker greens) public float [][] SIM_ARRAY=null; // first index - 0 - main, 1 - shifted by 0.5 pixel diagonally (to extract checker greens) public static CalibrationHardwareInterface.LaserPointers LASERS=new CalibrationHardwareInterface.LaserPointers(LASER_POINTERS); public static CalibrationHardwareInterface.LaserPointers LASERS=new CalibrationHardwareInterface.LaserPointers(LASER_POINTERS); public static CalibrationHardwareInterface.PowerControl POWER_CONTROL=new CalibrationHardwareInterface.PowerControl(); public static CalibrationHardwareInterface.CamerasInterface CAMERAS=new CalibrationHardwareInterface.CamerasInterface(26,LASERS); public static CalibrationHardwareInterface.CamerasInterface CAMERAS=new CalibrationHardwareInterface.CamerasInterface(26,LASERS); public static CalibrationHardwareInterface.FocusingMotors MOTORS=new CalibrationHardwareInterface.FocusingMotors(); public static CalibrationHardwareInterface.FocusingMotors MOTORS=new CalibrationHardwareInterface.FocusingMotors(); Loading Loading @@ -781,6 +782,7 @@ if (MORE_BUTTONS) { addButton("Auto Focus/Tilt",panelFocusing,color_process); addButton("Auto Focus/Tilt",panelFocusing,color_process); // addButton("List Pre-focus",panelFocusing); // addButton("List Pre-focus",panelFocusing); addButton("Focus Average",panelFocusing,color_report); addButton("Focus Average",panelFocusing,color_report); addButton("Power Control",panelFocusing,color_configure); addButton("Temp. Scan",panelFocusing,color_process); addButton("Temp. Scan",panelFocusing,color_process); // // addButton("List History",panelFocusing,color_report); addButton("List History",panelFocusing,color_report); Loading Loading @@ -3766,6 +3768,7 @@ if (MORE_BUTTONS) { // Use rotation from head lasers // Use rotation from head lasers if (FOCUS_MEASUREMENT_PARAMETERS.useHeadLasers){ if (FOCUS_MEASUREMENT_PARAMETERS.useHeadLasers){ psi=-headPointersTilt; // "-" - correction, instead of the target tilt psi=-headPointersTilt; // "-" - correction, instead of the target tilt FOCUS_MEASUREMENT_PARAMETERS.result_PSI=psi; // Was not here, using relative to the pattern (w/o head lasers) } } double diffY=12*Math.sin(Math.PI/180.0*psi); double diffY=12*Math.sin(Math.PI/180.0*psi); Loading Loading @@ -5069,7 +5072,8 @@ if (MORE_BUTTONS) { Matcher matcher=fileNameFormat.matcher(fileList[i].getName()); Matcher matcher=fileNameFormat.matcher(fileList[i].getName()); if (matcher.find()){ if (matcher.find()){ if ((matcher.group(1)!=null) && multiLensPerSFE) lens= Integer.parseInt(matcher.group(1)); if ((matcher.group(1)!=null) && multiLensPerSFE) lens= Integer.parseInt(matcher.group(1)); if ((matcher.group(2)!=null) && stageResults && multiLensPerSFE) manState=Integer.parseInt(matcher.group(2)); // if ((matcher.group(2)!=null) && stageResults && multiLensPerSFE) manState=Integer.parseInt(matcher.group(2)); if ((matcher.group(2)!=null) && stageResults) manState=Integer.parseInt(matcher.group(2)); } else { } else { matcher=fileNameFormat0.matcher(fileList[i].getName()); matcher=fileNameFormat0.matcher(fileList[i].getName()); if (matcher.find()){ if (matcher.find()){ Loading @@ -5085,6 +5089,7 @@ if (MORE_BUTTONS) { ts=Double.parseDouble(sts); ts=Double.parseDouble(sts); } else { } else { System.out.println("Failed to find timestamp in "+fileList[i].getName()+", lens="+lens+" manState="+manState); System.out.println("Failed to find timestamp in "+fileList[i].getName()+", lens="+lens+" manState="+manState); continue; } } if (DEBUG_LEVEL>1){ if (DEBUG_LEVEL>1){ System.out.println (i+": "+fileList[i].getName()+ " lens="+lens+" manState="+manState+" timestamp="+ts); System.out.println (i+": "+fileList[i].getName()+ " lens="+lens+" manState="+manState+" timestamp="+ts); Loading Loading @@ -5187,8 +5192,8 @@ if (MORE_BUTTONS) { sb.append("\t"+IJ.d2s(sfeParameters[iSFE][iLens][iState].result_B50,3)); sb.append("\t"+IJ.d2s(sfeParameters[iSFE][iLens][iState].result_B50,3)); sb.append("\t"+IJ.d2s(sfeParameters[iSFE][iLens][iState].result_RC50,3)); sb.append("\t"+IJ.d2s(sfeParameters[iSFE][iLens][iState].result_RC50,3)); // if (iState==0) { // to visually separate different lenses // if (iState==0) { // to visually separate different lenses sb.append("\t"+IJ.d2s(sfeParameters[iSFE][iLens][iState].result_PX0-0.5*sensorDimensions[iSFE][0],3)); sb.append("\t"+IJ.d2s(sfeParameters[iSFE][iLens][iState].result_PX0-0.5*sensorDimensions[iSFE][0]-sfeParameters[iSFE][iLens][iState].centerDeltaX,3)); sb.append("\t"+IJ.d2s(sfeParameters[iSFE][iLens][iState].result_PY0-0.5*sensorDimensions[iSFE][1],3)); sb.append("\t"+IJ.d2s(sfeParameters[iSFE][iLens][iState].result_PY0-0.5*sensorDimensions[iSFE][1]-sfeParameters[iSFE][iLens][iState].centerDeltaY,3)); // } else { // } else { // sb.append("\t\t"); // sb.append("\t\t"); // } // } Loading Loading @@ -5267,6 +5272,14 @@ if (MORE_BUTTONS) { DISTORTION.loop_debug_level); DISTORTION.loop_debug_level); return; return; } } /* ======================================================================== */ //"Power Control" if (label.equals("Power Control")) { DEBUG_LEVEL=MASTER_DEBUG_LEVEL; POWER_CONTROL.setDebugLevel(DEBUG_LEVEL); POWER_CONTROL.showDialog("Configure power control", true); return; } /* ======================================================================== */ /* ======================================================================== */ if (label.equals("Temp. Scan") || label.equals("Focus Average")) { if (label.equals("Temp. Scan") || label.equals("Focus Average")) { checkSerialAndRestore(); // returns true if did not change or was restored checkSerialAndRestore(); // returns true if did not change or was restored Loading @@ -5286,16 +5299,27 @@ if (MORE_BUTTONS) { gd.addMessage("Temperature has to be varied separately."); gd.addMessage("Temperature has to be varied separately."); gd.addMessage("Use \"List History\" to see the results."); gd.addMessage("Use \"List History\" to see the results."); gd.addCheckbox("Turn lasers off to protect from overheating",true); gd.addCheckbox("Turn lasers off to protect from overheating",true); if (!POWER_CONTROL.isPowerControlEnabled()){ gd.addMessage("Power control hardware is disabled, use \"Power Control\" command to enable it before proceeding"); } } } gd.addCheckbox("Erase previous measurement history",modeAverage); gd.addCheckbox("Erase previous measurement history",modeAverage); gd.addCheckbox("Allow tilt scan when looking for the best fit",!noTiltScan); gd.addCheckbox("Allow tilt scan when looking for the best fit",!noTiltScan); gd.addCheckbox ("Use lens aberration model (if available) for focal distance and tilts", FOCUS_MEASUREMENT_PARAMETERS.useLMAMetrics); gd.addCheckbox ("Use lens aberration model (if available) for focal distance and tilts", FOCUS_MEASUREMENT_PARAMETERS.useLMAMetrics); // gd.addCheckbox("Use LMA calculations for focus/tilt",useLMA); // gd.addCheckbox("Use LMA calculations for focus/tilt",useLMA); double scanMinutes=modeAverage?2.0:30.0; double scanMinutes=modeAverage?2.0:30.0; if (modeAverage) { gd.addNumericField("Measure for ", scanMinutes , 1,5," minutes"); gd.addNumericField("Measure for ", scanMinutes , 1,5," minutes"); } else { gd.addCheckbox ("Enable power control for heater and fan", FOCUS_MEASUREMENT_PARAMETERS.powerControlEnable); gd.addNumericField("Maximal allowed temperature", FOCUS_MEASUREMENT_PARAMETERS.powerControlMaximalTemperature, 3,5,"C"); gd.addNumericField("Heater ON time", FOCUS_MEASUREMENT_PARAMETERS.powerControlHeaterOnMinutes, 1,5,"min"); gd.addNumericField("Both heater and fan OFF time", FOCUS_MEASUREMENT_PARAMETERS.powerControlNeitherOnMinutes, 1,5,"min"); gd.addNumericField("Fan ON time", FOCUS_MEASUREMENT_PARAMETERS.powerControlFanOnMinutes, 1,5,"min"); } gd.showDialog(); gd.showDialog(); if (gd.wasCanceled()) return; if (gd.wasCanceled()) return; if (!modeAverage && gd.getNextBoolean()){ if (!modeAverage && gd.getNextBoolean()){ // was only asked in thermal scan mode UV_LED_LASERS.debugLevel=DEBUG_LEVEL; UV_LED_LASERS.debugLevel=DEBUG_LEVEL; UV_LED_LASERS.lasersOff(FOCUS_MEASUREMENT_PARAMETERS); UV_LED_LASERS.lasersOff(FOCUS_MEASUREMENT_PARAMETERS); if (MASTER_DEBUG_LEVEL>0) System.out.println ("Turned laser pointers off to protect from overheating"); if (MASTER_DEBUG_LEVEL>0) System.out.println ("Turned laser pointers off to protect from overheating"); Loading @@ -5312,9 +5336,19 @@ if (MORE_BUTTONS) { FOCUSING_FIELD.setDebugLevel(DEBUG_LEVEL); FOCUSING_FIELD.setDebugLevel(DEBUG_LEVEL); } } boolean useLMA=FOCUS_MEASUREMENT_PARAMETERS.useLMAMetrics && (FOCUSING_FIELD!=null); boolean useLMA=FOCUS_MEASUREMENT_PARAMETERS.useLMAMetrics && (FOCUSING_FIELD!=null); if (modeAverage) { // int startHistPos=MOTORS.historySize(); scanMinutes=gd.getNextNumber(); scanMinutes=gd.getNextNumber(); } else { FOCUS_MEASUREMENT_PARAMETERS.powerControlEnable=gd.getNextBoolean(); FOCUS_MEASUREMENT_PARAMETERS.powerControlMaximalTemperature=gd.getNextNumber(); FOCUS_MEASUREMENT_PARAMETERS.powerControlHeaterOnMinutes=gd.getNextNumber(); FOCUS_MEASUREMENT_PARAMETERS.powerControlNeitherOnMinutes=gd.getNextNumber(); FOCUS_MEASUREMENT_PARAMETERS.powerControlFanOnMinutes=gd.getNextNumber(); scanMinutes=FOCUS_MEASUREMENT_PARAMETERS.powerControlMaximalTemperature+ FOCUS_MEASUREMENT_PARAMETERS.powerControlHeaterOnMinutes+ FOCUS_MEASUREMENT_PARAMETERS.powerControlNeitherOnMinutes+ FOCUS_MEASUREMENT_PARAMETERS.powerControlFanOnMinutes; } long startTime=System.nanoTime(); long startTime=System.nanoTime(); long endTime=startTime+(long) (6E10*scanMinutes); long endTime=startTime+(long) (6E10*scanMinutes); if (MASTER_DEBUG_LEVEL>0) System.out.println(" startTime= "+startTime+", endTime="+endTime); if (MASTER_DEBUG_LEVEL>0) System.out.println(" startTime= "+startTime+", endTime="+endTime); Loading Loading @@ -5342,6 +5376,13 @@ if (MORE_BUTTONS) { System.out.println("Optimal Ty="+FOCUSING_FIELD.qualBOptimizationResults[2]); System.out.println("Optimal Ty="+FOCUSING_FIELD.qualBOptimizationResults[2]); } } } } long stateEndTime=endTime; if (!modeAverage) { POWER_CONTROL.setPower("fan","off"); POWER_CONTROL.setPower("heater","on"); stateEndTime=startTime+(long) (6E10*FOCUS_MEASUREMENT_PARAMETERS.powerControlHeaterOnMinutes); } int scanState=(!modeAverage && FOCUS_MEASUREMENT_PARAMETERS.powerControlEnable)?1:-1; while (System.nanoTime()<endTime){ while (System.nanoTime()<endTime){ moveAndMaybeProbe( moveAndMaybeProbe( true, // just move, not probe true, // just move, not probe Loading @@ -5363,15 +5404,48 @@ if (MORE_BUTTONS) { MASTER_DEBUG_LEVEL, MASTER_DEBUG_LEVEL, DISTORTION.loop_debug_level); DISTORTION.loop_debug_level); runs++; runs++; long secondsLeft=(long) (0.000000001*(endTime-System.nanoTime())); if (secondsLeft<0) secondsLeft=0; if (MASTER_DEBUG_LEVEL>0) System.out.println(" Measured "+runs+", "+secondsLeft+" seconds left"); if (this.SYNC_COMMAND.stopRequested.get()>0) { if (this.SYNC_COMMAND.stopRequested.get()>0) { System.out.println("User requested stop"); System.out.println("User requested stop"); break; break; } } // Temperature within limits? if (FOCUS_MEASUREMENT_PARAMETERS.sensorTemperature>=FOCUS_MEASUREMENT_PARAMETERS.powerControlMaximalTemperature){ POWER_CONTROL.setPower("heater","off"); } // long secondsLeft=(long) (0.000000001*(endTime-System.nanoTime())); long secondsLeft=(long) (0.000000001*(endTime-System.nanoTime())); if (secondsLeft<0) secondsLeft=0; long secondsLeftState=(long) (0.000000001*(stateEndTime-System.nanoTime())); if (secondsLeftState<0) secondsLeftState=0; if (MASTER_DEBUG_LEVEL>0) System.out.println(" Measured "+runs+", "+secondsLeftState+" seconds left ("+secondsLeft+")"); boolean timerOver=(System.nanoTime()>=stateEndTime) || ((scanState==1) && (FOCUS_MEASUREMENT_PARAMETERS.sensorTemperature>=FOCUS_MEASUREMENT_PARAMETERS.powerControlMaximalTemperature)); if ((scanState>0) && timerOver) { scanState++; switch (scanState) { case 2: POWER_CONTROL.setPower("heater","off"); POWER_CONTROL.setPower("fan","off"); stateEndTime=System.nanoTime()+(long) (6E10*FOCUS_MEASUREMENT_PARAMETERS.powerControlNeitherOnMinutes); break; case 3: POWER_CONTROL.setPower("heater","off"); POWER_CONTROL.setPower("fan","on"); stateEndTime=System.nanoTime()+(long) (6E10*FOCUS_MEASUREMENT_PARAMETERS.powerControlFanOnMinutes); break; } } // nothing specific is needed for case 4 - it will end anyway } } if (!modeAverage) { if (DEBUG_LEVEL>0) System.out.println("Turning both heater and fan off"); POWER_CONTROL.setPower("fan","off"); POWER_CONTROL.setPower("heater","off"); } // LMA version // LMA version FocusingField ff= null; FocusingField ff= null; if (useLMA){ if (useLMA){ Loading Loading @@ -5475,7 +5549,7 @@ if (MORE_BUTTONS) { // Calculate and show average distances and tilts for measured history // Calculate and show average distances and tilts for measured history if (!modeAverage) { if (!modeAverage) { remoteNotifyComplete(); double [] lastKT=MOTORS.focusingHistory.temperatureLinearApproximation( double [] lastKT=MOTORS.focusingHistory.temperatureLinearApproximation( useLMA, useLMA, runs, // number of last samples from history to use, 0 - use all runs, // number of last samples from history to use, 0 - use all Loading Loading @@ -13820,6 +13894,7 @@ private double [][] jacobianByJacobian(double [][] jacobian, boolean [] mask) { boolean select_GONIOMETER_PARAMETERS=!select; boolean select_GONIOMETER_PARAMETERS=!select; boolean select_ABERRATIONS_PARAMETERS=!select; boolean select_ABERRATIONS_PARAMETERS=!select; boolean select_FOCUSING_FIELD=!select; boolean select_FOCUSING_FIELD=!select; boolean select_POWER_CONTROL=!select; if (select) { if (select) { GenericDialog gd = new GenericDialog("Select parameters to save"); GenericDialog gd = new GenericDialog("Select parameters to save"); gd.addMessage("===== Individual parameters ======"); gd.addMessage("===== Individual parameters ======"); Loading Loading @@ -13859,6 +13934,8 @@ private double [][] jacobianByJacobian(double [][] jacobian, boolean [] mask) { gd.addCheckbox("GONIOMETER_PARAMETERS",select_GONIOMETER_PARAMETERS); gd.addCheckbox("GONIOMETER_PARAMETERS",select_GONIOMETER_PARAMETERS); gd.addCheckbox("ABERRATIONS_PARAMETERS",select_ABERRATIONS_PARAMETERS); gd.addCheckbox("ABERRATIONS_PARAMETERS",select_ABERRATIONS_PARAMETERS); gd.addCheckbox("FOCUSING_FIELD",select_FOCUSING_FIELD); gd.addCheckbox("FOCUSING_FIELD",select_FOCUSING_FIELD); gd.addCheckbox("POWER_CONTROL",select_POWER_CONTROL); WindowTools.addScrollBars(gd); WindowTools.addScrollBars(gd); gd.showDialog(); gd.showDialog(); if (gd.wasCanceled()) return; if (gd.wasCanceled()) return; Loading Loading @@ -13898,6 +13975,7 @@ private double [][] jacobianByJacobian(double [][] jacobian, boolean [] mask) { select_GONIOMETER_PARAMETERS=gd.getNextBoolean(); select_GONIOMETER_PARAMETERS=gd.getNextBoolean(); select_ABERRATIONS_PARAMETERS=gd.getNextBoolean(); select_ABERRATIONS_PARAMETERS=gd.getNextBoolean(); select_FOCUSING_FIELD=gd.getNextBoolean(); select_FOCUSING_FIELD=gd.getNextBoolean(); select_POWER_CONTROL=gd.getNextBoolean(); } } if (select_MASTER_DEBUG_LEVEL) properties.setProperty("MASTER_DEBUG_LEVEL", MASTER_DEBUG_LEVEL+""); if (select_MASTER_DEBUG_LEVEL) properties.setProperty("MASTER_DEBUG_LEVEL", MASTER_DEBUG_LEVEL+""); Loading Loading @@ -13936,6 +14014,8 @@ private double [][] jacobianByJacobian(double [][] jacobian, boolean [] mask) { if (select_GONIOMETER_PARAMETERS) GONIOMETER_PARAMETERS.setProperties("GONIOMETER_PARAMETERS.", properties); if (select_GONIOMETER_PARAMETERS) GONIOMETER_PARAMETERS.setProperties("GONIOMETER_PARAMETERS.", properties); if (select_ABERRATIONS_PARAMETERS) ABERRATIONS_PARAMETERS.setProperties("ABERRATIONS_PARAMETERS.", properties); if (select_ABERRATIONS_PARAMETERS) ABERRATIONS_PARAMETERS.setProperties("ABERRATIONS_PARAMETERS.", properties); if ((select_FOCUSING_FIELD) && (FOCUSING_FIELD!=null)) FOCUSING_FIELD.setProperties("FOCUSING_FIELD.", properties); if ((select_FOCUSING_FIELD) && (FOCUSING_FIELD!=null)) FOCUSING_FIELD.setProperties("FOCUSING_FIELD.", properties); if (select_POWER_CONTROL) POWER_CONTROL.setProperties("POWER_CONTROL.", properties); if (select) properties.remove("selected"); if (select) properties.remove("selected"); } } /* ======================================================================== */ /* ======================================================================== */ Loading Loading @@ -13976,6 +14056,7 @@ private double [][] jacobianByJacobian(double [][] jacobian, boolean [] mask) { GONIOMETER_PARAMETERS.getProperties("GONIOMETER_PARAMETERS.", properties); GONIOMETER_PARAMETERS.getProperties("GONIOMETER_PARAMETERS.", properties); ABERRATIONS_PARAMETERS.getProperties("ABERRATIONS_PARAMETERS.", properties); ABERRATIONS_PARAMETERS.getProperties("ABERRATIONS_PARAMETERS.", properties); if (FOCUSING_FIELD!=null) FOCUSING_FIELD.getProperties("FOCUSING_FIELD.", properties,false); // false -> overwrite distortions center if (FOCUSING_FIELD!=null) FOCUSING_FIELD.getProperties("FOCUSING_FIELD.", properties,false); // false -> overwrite distortions center POWER_CONTROL.getProperties("POWER_CONTROL.", properties); } } private String selectSourceDirectory(String defaultPath) { private String selectSourceDirectory(String defaultPath) { src/main/java/CalibrationHardwareInterface.java +91 −4 Original line number Original line Diff line number Diff line Loading @@ -1797,12 +1797,99 @@ public class CalibrationHardwareInterface { throw new RuntimeException(ie); throw new RuntimeException(ie); } } } } } public static class PowerControl{ public int debugLevel=1; private String powerIP="192.168.0.80"; private final String urlFormat="http://%s/insteon/index.php?cmd=%s&group=%s"; private final String rootElement="Document"; public boolean powerConrtolEnabled=false; public void setProperties(String prefix,Properties properties){ properties.setProperty(prefix+"powerIP",this.powerIP+""); properties.setProperty(prefix+"powerConrtolEnabled",this.powerConrtolEnabled+""); } //Integer.decode(string) public void getProperties(String prefix,Properties properties){ if (properties.getProperty(prefix+"powerIP")!=null) this.powerIP=properties.getProperty(prefix+"powerIP"); if (properties.getProperty(prefix+"powerConrtolEnabled")!=null) this.powerConrtolEnabled=Boolean.parseBoolean(properties.getProperty(prefix+"powerConrtolEnabled")); } } public boolean setPower (String group, String state){ if (!powerConrtolEnabled) { System.out.println("=== Power control is disabled ==="); return false; } String url=String.format(urlFormat,this.powerIP,state,group); if (this.debugLevel>2) System.out.println("setPower: "+url); Document dom=null; try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); dom = db.parse(url); if (!dom.getDocumentElement().getNodeName().equals(rootElement)) { System.out.println("Root element: expected \""+rootElement+"\", got \"" + dom.getDocumentElement().getNodeName()+"\""); IJ.showMessage("Error","Root element: expected \""+rootElement+"\", got \"" + dom.getDocumentElement().getNodeName()+"\""); return false; } // boolean responceError= (dom.getDocumentElement().getElementsByTagName("error").getLength()!=0); // if (responceError) { // System.out.println("ERROR: register write ("+url+") FAILED" ); // IJ.showMessage("Error","register write ("+url+") FAILED"); // return false; // } } catch(MalformedURLException e){ System.out.println("Please check the URL:" + e.toString() ); return false; } catch(IOException e1){ IJ.showStatus(""); String error = e1.getMessage(); if (error==null || error.equals("")) error = ""+e1; IJ.showMessage("setPower ERROR", ""+error); return false; }catch(ParserConfigurationException pce) { pce.printStackTrace(); return false; }catch(SAXException se) { se.printStackTrace(); return false; } return true; } public boolean showDialog(String title, boolean control) { GenericDialog gd = new GenericDialog(title); boolean heaterOn=false, fanOn=false; gd.addCheckbox("Enable power control (heater, fan) ", this.powerConrtolEnabled); gd.addStringField("IP address of the power control",this.powerIP,15); if (control){ gd.addCheckbox("Heater On", heaterOn); gd.addCheckbox("Fan On", fanOn); } WindowTools.addScrollBars(gd); if (control) gd.enableYesNoCancel("OK", "Control Power"); gd.showDialog(); if (gd.wasCanceled()) return false; this.powerConrtolEnabled=gd.getNextBoolean(); this.powerIP=gd.getNextString(); if (control){ heaterOn=gd.getNextBoolean(); fanOn=gd.getNextBoolean(); if (!gd.wasOKed()) { setPower("heater",heaterOn?"on":"off"); setPower("fan",fanOn?"on":"off"); } } return true; } public boolean isPowerControlEnabled(){ return this.powerConrtolEnabled; } public void setDebugLevel(int debugLevel){ this.debugLevel=debugLevel; } } public static class LaserPointers{ public static class LaserPointers{ public int debugLevel=1; public int debugLevel=1; Loading src/main/java/LensAdjustment.java +56 −5 Original line number Original line Diff line number Diff line Loading @@ -330,6 +330,12 @@ public class LensAdjustment { public boolean lensDistanceShowResults=true; // show results window from foca public boolean lensDistanceShowResults=true; // show results window from foca public boolean lensDistanceMoveToGoal=true; // Move to targetMicrons public boolean lensDistanceMoveToGoal=true; // Move to targetMicrons public boolean powerControlEnable=true; public double powerControlMaximalTemperature=60.0; public double powerControlHeaterOnMinutes=10.0; public double powerControlNeitherOnMinutes=5.0; public double powerControlFanOnMinutes=15.0; public String uvLasersIP="192.168.0.236"; // IP address of the camera with UV LEDs and aiming lasers are connected public String uvLasersIP="192.168.0.236"; // IP address of the camera with UV LEDs and aiming lasers are connected public int uvLasersBus=0; // 0 if 103641 board is connected to the sensor port (through 10-359), 1 - to 10369 public int uvLasersBus=0; // 0 if 103641 board is connected to the sensor port (through 10-359), 1 - to 10369 public double [] uvLasersCurrents={40.0,40.0,40.0,40.0}; // default LED on currents (mA) public double [] uvLasersCurrents={40.0,40.0,40.0,40.0}; // default LED on currents (mA) Loading Loading @@ -546,6 +552,11 @@ public class LensAdjustment { boolean lensDistanceInteractive, // Open dialog when calibrating focal distance boolean lensDistanceInteractive, // Open dialog when calibrating focal distance boolean lensDistanceShowResults, // show results window from foca boolean lensDistanceShowResults, // show results window from foca boolean lensDistanceMoveToGoal, // Move to targetMicrons boolean lensDistanceMoveToGoal, // Move to targetMicrons boolean powerControlEnable, double powerControlMaximalTemperature, double powerControlHeaterOnMinutes, double powerControlNeitherOnMinutes, double powerControlFanOnMinutes, String uvLasersIP, // IP address of the camera with UV LEDs and aiming lasers are connected String uvLasersIP, // IP address of the camera with UV LEDs and aiming lasers are connected int uvLasersBus, // 0 if 103641 board is connected to the sensor port (through 10-359), 1 - to 10369 int uvLasersBus, // 0 if 103641 board is connected to the sensor port (through 10-359), 1 - to 10369 double [] uvLasersCurrents, // default LED on currents (mA) double [] uvLasersCurrents, // default LED on currents (mA) Loading Loading @@ -692,6 +703,11 @@ public class LensAdjustment { this.lensDistanceInteractive=lensDistanceInteractive; // Open dialog when calibrating focal distance this.lensDistanceInteractive=lensDistanceInteractive; // Open dialog when calibrating focal distance this.lensDistanceShowResults=lensDistanceShowResults; // show results window from foca this.lensDistanceShowResults=lensDistanceShowResults; // show results window from foca this.lensDistanceMoveToGoal=lensDistanceMoveToGoal; // Move to targetMicrons this.lensDistanceMoveToGoal=lensDistanceMoveToGoal; // Move to targetMicrons this.powerControlEnable=powerControlEnable; this.powerControlMaximalTemperature=powerControlMaximalTemperature; this.powerControlHeaterOnMinutes=powerControlHeaterOnMinutes; this.powerControlNeitherOnMinutes=powerControlNeitherOnMinutes; this.powerControlFanOnMinutes=powerControlFanOnMinutes; this.uvLasersIP=new String(uvLasersIP); // IP address of the camera with UV LEDs and aiming lasers are connected this.uvLasersIP=new String(uvLasersIP); // IP address of the camera with UV LEDs and aiming lasers are connected this.uvLasersBus=uvLasersBus; // 0 if 103641 board is connected to the sensor port (through 10-359), 1 - to 10369 this.uvLasersBus=uvLasersBus; // 0 if 103641 board is connected to the sensor port (through 10-359), 1 - to 10369 this.uvLasersCurrents=uvLasersCurrents.clone(); // default LED on currents (mA) this.uvLasersCurrents=uvLasersCurrents.clone(); // default LED on currents (mA) Loading Loading @@ -840,6 +856,11 @@ public class LensAdjustment { this.lensDistanceInteractive, // Open dialog when calibrating focal distance this.lensDistanceInteractive, // Open dialog when calibrating focal distance this.lensDistanceShowResults, // show results window from foca this.lensDistanceShowResults, // show results window from foca this.lensDistanceMoveToGoal, // Move to targetMicrons this.lensDistanceMoveToGoal, // Move to targetMicrons this.powerControlEnable, this.powerControlMaximalTemperature, this.powerControlHeaterOnMinutes, this.powerControlNeitherOnMinutes, this.powerControlFanOnMinutes, this.uvLasersIP, // IP address of the camera with UV LEDs and aiming lasers are connected this.uvLasersIP, // IP address of the camera with UV LEDs and aiming lasers are connected this.uvLasersBus, // 0 if 103641 board is connected to the sensor port (through 10-359), 1 - to 10369 this.uvLasersBus, // 0 if 103641 board is connected to the sensor port (through 10-359), 1 - to 10369 this.uvLasersCurrents, // default LED on currents (mA) this.uvLasersCurrents, // default LED on currents (mA) Loading Loading @@ -993,6 +1014,12 @@ public class LensAdjustment { properties.setProperty(prefix+"lensDistanceShowResults",this.lensDistanceShowResults+""); properties.setProperty(prefix+"lensDistanceShowResults",this.lensDistanceShowResults+""); properties.setProperty(prefix+"lensDistanceMoveToGoal",this.lensDistanceMoveToGoal+""); properties.setProperty(prefix+"lensDistanceMoveToGoal",this.lensDistanceMoveToGoal+""); properties.setProperty(prefix+"powerControlEnable",this.powerControlEnable+""); properties.setProperty(prefix+"powerControlMaximalTemperature",this.powerControlMaximalTemperature+""); properties.setProperty(prefix+"powerControlHeaterOnMinutes",this.powerControlHeaterOnMinutes+""); properties.setProperty(prefix+"powerControlNeitherOnMinutes",this.powerControlNeitherOnMinutes+""); properties.setProperty(prefix+"powerControlFanOnMinutes",this.powerControlFanOnMinutes+""); properties.setProperty(prefix+"uvLasersIP",this.uvLasersIP); properties.setProperty(prefix+"uvLasersIP",this.uvLasersIP); properties.setProperty(prefix+"uvLasersBus",this.uvLasersBus+""); properties.setProperty(prefix+"uvLasersBus",this.uvLasersBus+""); properties.setProperty(prefix+"uvLasersCurrents_0",this.uvLasersCurrents[0]+""); properties.setProperty(prefix+"uvLasersCurrents_0",this.uvLasersCurrents[0]+""); Loading Loading @@ -1276,6 +1303,18 @@ public class LensAdjustment { if (properties.getProperty(prefix+"lensDistanceMoveToGoal")!=null) if (properties.getProperty(prefix+"lensDistanceMoveToGoal")!=null) this.lensDistanceMoveToGoal=Boolean.parseBoolean(properties.getProperty(prefix+"lensDistanceMoveToGoal")); this.lensDistanceMoveToGoal=Boolean.parseBoolean(properties.getProperty(prefix+"lensDistanceMoveToGoal")); if (properties.getProperty(prefix+"powerControlEnable")!=null) this.powerControlEnable=Boolean.parseBoolean(properties.getProperty(prefix+"powerControlEnable")); if (properties.getProperty(prefix+"powerControlMaximalTemperature")!=null) this.powerControlMaximalTemperature=Double.parseDouble(properties.getProperty(prefix+"powerControlMaximalTemperature")); if (properties.getProperty(prefix+"powerControlHeaterOnMinutes")!=null) this.powerControlHeaterOnMinutes=Double.parseDouble(properties.getProperty(prefix+"powerControlHeaterOnMinutes")); if (properties.getProperty(prefix+"powerControlNeitherOnMinutes")!=null) this.powerControlNeitherOnMinutes=Double.parseDouble(properties.getProperty(prefix+"powerControlNeitherOnMinutes")); if (properties.getProperty(prefix+"powerControlFanOnMinutes")!=null) this.powerControlFanOnMinutes=Double.parseDouble(properties.getProperty(prefix+"powerControlFanOnMinutes")); if (properties.getProperty(prefix+"uvLasersIP")!=null) if (properties.getProperty(prefix+"uvLasersIP")!=null) this.uvLasersIP=properties.getProperty(prefix+"uvLasersIP"); this.uvLasersIP=properties.getProperty(prefix+"uvLasersIP"); if (properties.getProperty(prefix+"uvLasersBus")!=null) if (properties.getProperty(prefix+"uvLasersBus")!=null) Loading Loading @@ -1528,6 +1567,12 @@ public class LensAdjustment { gd.addCheckbox ("Show results window from focal distance calibration", this.lensDistanceShowResults); gd.addCheckbox ("Show results window from focal distance calibration", this.lensDistanceShowResults); gd.addCheckbox ("Move motors together to the requested microns from the \"best focus\"", this.lensDistanceMoveToGoal); gd.addCheckbox ("Move motors together to the requested microns from the \"best focus\"", this.lensDistanceMoveToGoal); gd.addCheckbox ("Enable power control for heater and fan", this.powerControlEnable); gd.addNumericField("Maximal allowed temperature", this.powerControlMaximalTemperature, 3,5,"C"); gd.addNumericField("Heater ON time", this.powerControlHeaterOnMinutes, 1,5,"min"); gd.addNumericField("Both heater and fan OFF time", this.powerControlNeitherOnMinutes, 1,5,"min"); gd.addNumericField("Fan ON time", this.powerControlFanOnMinutes, 1,5,"min"); gd.addStringField ("IP address of the camera with 103641 board (UV LEDs and lasers) are attached", this.uvLasersIP,40); gd.addStringField ("IP address of the camera with 103641 board (UV LEDs and lasers) are attached", this.uvLasersIP,40); gd.addNumericField("I2C bus where LED/laser board is attached (0 - through 10359, 1 - through 10369)",this.uvLasersBus, 0); gd.addNumericField("I2C bus where LED/laser board is attached (0 - through 10359, 1 - through 10369)",this.uvLasersBus, 0); gd.addNumericField("UV LED1 \"on\" current (left/near when looking from the target)", this.uvLasersCurrents[0], 3,5,"mA"); gd.addNumericField("UV LED1 \"on\" current (left/near when looking from the target)", this.uvLasersCurrents[0], 3,5,"mA"); Loading Loading @@ -1701,6 +1746,12 @@ public class LensAdjustment { this.lensDistanceShowResults= gd.getNextBoolean(); this.lensDistanceShowResults= gd.getNextBoolean(); this.lensDistanceMoveToGoal= gd.getNextBoolean(); this.lensDistanceMoveToGoal= gd.getNextBoolean(); this.powerControlEnable= gd.getNextBoolean(); this.powerControlMaximalTemperature=gd.getNextNumber(); this.powerControlHeaterOnMinutes= gd.getNextNumber(); this.powerControlNeitherOnMinutes= gd.getNextNumber(); this.powerControlFanOnMinutes= gd.getNextNumber(); this.uvLasersIP= gd.getNextString(); this.uvLasersIP= gd.getNextString(); this.uvLasersBus= (int) gd.getNextNumber(); this.uvLasersBus= (int) gd.getNextNumber(); this.uvLasersCurrents[0]= gd.getNextNumber(); this.uvLasersCurrents[0]= gd.getNextNumber(); Loading Loading
src/main/java/Aberration_Calibration.java +95 −14 Original line number Original line Diff line number Diff line Loading @@ -519,6 +519,7 @@ public static MatchSimulatedPattern.DistortionParameters DISTORTION =new MatchSi public float [][] SIM_ARRAY=null; // first index - 0 - main, 1 - shifted by 0.5 pixel diagonally (to extract checker greens) public float [][] SIM_ARRAY=null; // first index - 0 - main, 1 - shifted by 0.5 pixel diagonally (to extract checker greens) public static CalibrationHardwareInterface.LaserPointers LASERS=new CalibrationHardwareInterface.LaserPointers(LASER_POINTERS); public static CalibrationHardwareInterface.LaserPointers LASERS=new CalibrationHardwareInterface.LaserPointers(LASER_POINTERS); public static CalibrationHardwareInterface.PowerControl POWER_CONTROL=new CalibrationHardwareInterface.PowerControl(); public static CalibrationHardwareInterface.CamerasInterface CAMERAS=new CalibrationHardwareInterface.CamerasInterface(26,LASERS); public static CalibrationHardwareInterface.CamerasInterface CAMERAS=new CalibrationHardwareInterface.CamerasInterface(26,LASERS); public static CalibrationHardwareInterface.FocusingMotors MOTORS=new CalibrationHardwareInterface.FocusingMotors(); public static CalibrationHardwareInterface.FocusingMotors MOTORS=new CalibrationHardwareInterface.FocusingMotors(); Loading Loading @@ -781,6 +782,7 @@ if (MORE_BUTTONS) { addButton("Auto Focus/Tilt",panelFocusing,color_process); addButton("Auto Focus/Tilt",panelFocusing,color_process); // addButton("List Pre-focus",panelFocusing); // addButton("List Pre-focus",panelFocusing); addButton("Focus Average",panelFocusing,color_report); addButton("Focus Average",panelFocusing,color_report); addButton("Power Control",panelFocusing,color_configure); addButton("Temp. Scan",panelFocusing,color_process); addButton("Temp. Scan",panelFocusing,color_process); // // addButton("List History",panelFocusing,color_report); addButton("List History",panelFocusing,color_report); Loading Loading @@ -3766,6 +3768,7 @@ if (MORE_BUTTONS) { // Use rotation from head lasers // Use rotation from head lasers if (FOCUS_MEASUREMENT_PARAMETERS.useHeadLasers){ if (FOCUS_MEASUREMENT_PARAMETERS.useHeadLasers){ psi=-headPointersTilt; // "-" - correction, instead of the target tilt psi=-headPointersTilt; // "-" - correction, instead of the target tilt FOCUS_MEASUREMENT_PARAMETERS.result_PSI=psi; // Was not here, using relative to the pattern (w/o head lasers) } } double diffY=12*Math.sin(Math.PI/180.0*psi); double diffY=12*Math.sin(Math.PI/180.0*psi); Loading Loading @@ -5069,7 +5072,8 @@ if (MORE_BUTTONS) { Matcher matcher=fileNameFormat.matcher(fileList[i].getName()); Matcher matcher=fileNameFormat.matcher(fileList[i].getName()); if (matcher.find()){ if (matcher.find()){ if ((matcher.group(1)!=null) && multiLensPerSFE) lens= Integer.parseInt(matcher.group(1)); if ((matcher.group(1)!=null) && multiLensPerSFE) lens= Integer.parseInt(matcher.group(1)); if ((matcher.group(2)!=null) && stageResults && multiLensPerSFE) manState=Integer.parseInt(matcher.group(2)); // if ((matcher.group(2)!=null) && stageResults && multiLensPerSFE) manState=Integer.parseInt(matcher.group(2)); if ((matcher.group(2)!=null) && stageResults) manState=Integer.parseInt(matcher.group(2)); } else { } else { matcher=fileNameFormat0.matcher(fileList[i].getName()); matcher=fileNameFormat0.matcher(fileList[i].getName()); if (matcher.find()){ if (matcher.find()){ Loading @@ -5085,6 +5089,7 @@ if (MORE_BUTTONS) { ts=Double.parseDouble(sts); ts=Double.parseDouble(sts); } else { } else { System.out.println("Failed to find timestamp in "+fileList[i].getName()+", lens="+lens+" manState="+manState); System.out.println("Failed to find timestamp in "+fileList[i].getName()+", lens="+lens+" manState="+manState); continue; } } if (DEBUG_LEVEL>1){ if (DEBUG_LEVEL>1){ System.out.println (i+": "+fileList[i].getName()+ " lens="+lens+" manState="+manState+" timestamp="+ts); System.out.println (i+": "+fileList[i].getName()+ " lens="+lens+" manState="+manState+" timestamp="+ts); Loading Loading @@ -5187,8 +5192,8 @@ if (MORE_BUTTONS) { sb.append("\t"+IJ.d2s(sfeParameters[iSFE][iLens][iState].result_B50,3)); sb.append("\t"+IJ.d2s(sfeParameters[iSFE][iLens][iState].result_B50,3)); sb.append("\t"+IJ.d2s(sfeParameters[iSFE][iLens][iState].result_RC50,3)); sb.append("\t"+IJ.d2s(sfeParameters[iSFE][iLens][iState].result_RC50,3)); // if (iState==0) { // to visually separate different lenses // if (iState==0) { // to visually separate different lenses sb.append("\t"+IJ.d2s(sfeParameters[iSFE][iLens][iState].result_PX0-0.5*sensorDimensions[iSFE][0],3)); sb.append("\t"+IJ.d2s(sfeParameters[iSFE][iLens][iState].result_PX0-0.5*sensorDimensions[iSFE][0]-sfeParameters[iSFE][iLens][iState].centerDeltaX,3)); sb.append("\t"+IJ.d2s(sfeParameters[iSFE][iLens][iState].result_PY0-0.5*sensorDimensions[iSFE][1],3)); sb.append("\t"+IJ.d2s(sfeParameters[iSFE][iLens][iState].result_PY0-0.5*sensorDimensions[iSFE][1]-sfeParameters[iSFE][iLens][iState].centerDeltaY,3)); // } else { // } else { // sb.append("\t\t"); // sb.append("\t\t"); // } // } Loading Loading @@ -5267,6 +5272,14 @@ if (MORE_BUTTONS) { DISTORTION.loop_debug_level); DISTORTION.loop_debug_level); return; return; } } /* ======================================================================== */ //"Power Control" if (label.equals("Power Control")) { DEBUG_LEVEL=MASTER_DEBUG_LEVEL; POWER_CONTROL.setDebugLevel(DEBUG_LEVEL); POWER_CONTROL.showDialog("Configure power control", true); return; } /* ======================================================================== */ /* ======================================================================== */ if (label.equals("Temp. Scan") || label.equals("Focus Average")) { if (label.equals("Temp. Scan") || label.equals("Focus Average")) { checkSerialAndRestore(); // returns true if did not change or was restored checkSerialAndRestore(); // returns true if did not change or was restored Loading @@ -5286,16 +5299,27 @@ if (MORE_BUTTONS) { gd.addMessage("Temperature has to be varied separately."); gd.addMessage("Temperature has to be varied separately."); gd.addMessage("Use \"List History\" to see the results."); gd.addMessage("Use \"List History\" to see the results."); gd.addCheckbox("Turn lasers off to protect from overheating",true); gd.addCheckbox("Turn lasers off to protect from overheating",true); if (!POWER_CONTROL.isPowerControlEnabled()){ gd.addMessage("Power control hardware is disabled, use \"Power Control\" command to enable it before proceeding"); } } } gd.addCheckbox("Erase previous measurement history",modeAverage); gd.addCheckbox("Erase previous measurement history",modeAverage); gd.addCheckbox("Allow tilt scan when looking for the best fit",!noTiltScan); gd.addCheckbox("Allow tilt scan when looking for the best fit",!noTiltScan); gd.addCheckbox ("Use lens aberration model (if available) for focal distance and tilts", FOCUS_MEASUREMENT_PARAMETERS.useLMAMetrics); gd.addCheckbox ("Use lens aberration model (if available) for focal distance and tilts", FOCUS_MEASUREMENT_PARAMETERS.useLMAMetrics); // gd.addCheckbox("Use LMA calculations for focus/tilt",useLMA); // gd.addCheckbox("Use LMA calculations for focus/tilt",useLMA); double scanMinutes=modeAverage?2.0:30.0; double scanMinutes=modeAverage?2.0:30.0; if (modeAverage) { gd.addNumericField("Measure for ", scanMinutes , 1,5," minutes"); gd.addNumericField("Measure for ", scanMinutes , 1,5," minutes"); } else { gd.addCheckbox ("Enable power control for heater and fan", FOCUS_MEASUREMENT_PARAMETERS.powerControlEnable); gd.addNumericField("Maximal allowed temperature", FOCUS_MEASUREMENT_PARAMETERS.powerControlMaximalTemperature, 3,5,"C"); gd.addNumericField("Heater ON time", FOCUS_MEASUREMENT_PARAMETERS.powerControlHeaterOnMinutes, 1,5,"min"); gd.addNumericField("Both heater and fan OFF time", FOCUS_MEASUREMENT_PARAMETERS.powerControlNeitherOnMinutes, 1,5,"min"); gd.addNumericField("Fan ON time", FOCUS_MEASUREMENT_PARAMETERS.powerControlFanOnMinutes, 1,5,"min"); } gd.showDialog(); gd.showDialog(); if (gd.wasCanceled()) return; if (gd.wasCanceled()) return; if (!modeAverage && gd.getNextBoolean()){ if (!modeAverage && gd.getNextBoolean()){ // was only asked in thermal scan mode UV_LED_LASERS.debugLevel=DEBUG_LEVEL; UV_LED_LASERS.debugLevel=DEBUG_LEVEL; UV_LED_LASERS.lasersOff(FOCUS_MEASUREMENT_PARAMETERS); UV_LED_LASERS.lasersOff(FOCUS_MEASUREMENT_PARAMETERS); if (MASTER_DEBUG_LEVEL>0) System.out.println ("Turned laser pointers off to protect from overheating"); if (MASTER_DEBUG_LEVEL>0) System.out.println ("Turned laser pointers off to protect from overheating"); Loading @@ -5312,9 +5336,19 @@ if (MORE_BUTTONS) { FOCUSING_FIELD.setDebugLevel(DEBUG_LEVEL); FOCUSING_FIELD.setDebugLevel(DEBUG_LEVEL); } } boolean useLMA=FOCUS_MEASUREMENT_PARAMETERS.useLMAMetrics && (FOCUSING_FIELD!=null); boolean useLMA=FOCUS_MEASUREMENT_PARAMETERS.useLMAMetrics && (FOCUSING_FIELD!=null); if (modeAverage) { // int startHistPos=MOTORS.historySize(); scanMinutes=gd.getNextNumber(); scanMinutes=gd.getNextNumber(); } else { FOCUS_MEASUREMENT_PARAMETERS.powerControlEnable=gd.getNextBoolean(); FOCUS_MEASUREMENT_PARAMETERS.powerControlMaximalTemperature=gd.getNextNumber(); FOCUS_MEASUREMENT_PARAMETERS.powerControlHeaterOnMinutes=gd.getNextNumber(); FOCUS_MEASUREMENT_PARAMETERS.powerControlNeitherOnMinutes=gd.getNextNumber(); FOCUS_MEASUREMENT_PARAMETERS.powerControlFanOnMinutes=gd.getNextNumber(); scanMinutes=FOCUS_MEASUREMENT_PARAMETERS.powerControlMaximalTemperature+ FOCUS_MEASUREMENT_PARAMETERS.powerControlHeaterOnMinutes+ FOCUS_MEASUREMENT_PARAMETERS.powerControlNeitherOnMinutes+ FOCUS_MEASUREMENT_PARAMETERS.powerControlFanOnMinutes; } long startTime=System.nanoTime(); long startTime=System.nanoTime(); long endTime=startTime+(long) (6E10*scanMinutes); long endTime=startTime+(long) (6E10*scanMinutes); if (MASTER_DEBUG_LEVEL>0) System.out.println(" startTime= "+startTime+", endTime="+endTime); if (MASTER_DEBUG_LEVEL>0) System.out.println(" startTime= "+startTime+", endTime="+endTime); Loading Loading @@ -5342,6 +5376,13 @@ if (MORE_BUTTONS) { System.out.println("Optimal Ty="+FOCUSING_FIELD.qualBOptimizationResults[2]); System.out.println("Optimal Ty="+FOCUSING_FIELD.qualBOptimizationResults[2]); } } } } long stateEndTime=endTime; if (!modeAverage) { POWER_CONTROL.setPower("fan","off"); POWER_CONTROL.setPower("heater","on"); stateEndTime=startTime+(long) (6E10*FOCUS_MEASUREMENT_PARAMETERS.powerControlHeaterOnMinutes); } int scanState=(!modeAverage && FOCUS_MEASUREMENT_PARAMETERS.powerControlEnable)?1:-1; while (System.nanoTime()<endTime){ while (System.nanoTime()<endTime){ moveAndMaybeProbe( moveAndMaybeProbe( true, // just move, not probe true, // just move, not probe Loading @@ -5363,15 +5404,48 @@ if (MORE_BUTTONS) { MASTER_DEBUG_LEVEL, MASTER_DEBUG_LEVEL, DISTORTION.loop_debug_level); DISTORTION.loop_debug_level); runs++; runs++; long secondsLeft=(long) (0.000000001*(endTime-System.nanoTime())); if (secondsLeft<0) secondsLeft=0; if (MASTER_DEBUG_LEVEL>0) System.out.println(" Measured "+runs+", "+secondsLeft+" seconds left"); if (this.SYNC_COMMAND.stopRequested.get()>0) { if (this.SYNC_COMMAND.stopRequested.get()>0) { System.out.println("User requested stop"); System.out.println("User requested stop"); break; break; } } // Temperature within limits? if (FOCUS_MEASUREMENT_PARAMETERS.sensorTemperature>=FOCUS_MEASUREMENT_PARAMETERS.powerControlMaximalTemperature){ POWER_CONTROL.setPower("heater","off"); } // long secondsLeft=(long) (0.000000001*(endTime-System.nanoTime())); long secondsLeft=(long) (0.000000001*(endTime-System.nanoTime())); if (secondsLeft<0) secondsLeft=0; long secondsLeftState=(long) (0.000000001*(stateEndTime-System.nanoTime())); if (secondsLeftState<0) secondsLeftState=0; if (MASTER_DEBUG_LEVEL>0) System.out.println(" Measured "+runs+", "+secondsLeftState+" seconds left ("+secondsLeft+")"); boolean timerOver=(System.nanoTime()>=stateEndTime) || ((scanState==1) && (FOCUS_MEASUREMENT_PARAMETERS.sensorTemperature>=FOCUS_MEASUREMENT_PARAMETERS.powerControlMaximalTemperature)); if ((scanState>0) && timerOver) { scanState++; switch (scanState) { case 2: POWER_CONTROL.setPower("heater","off"); POWER_CONTROL.setPower("fan","off"); stateEndTime=System.nanoTime()+(long) (6E10*FOCUS_MEASUREMENT_PARAMETERS.powerControlNeitherOnMinutes); break; case 3: POWER_CONTROL.setPower("heater","off"); POWER_CONTROL.setPower("fan","on"); stateEndTime=System.nanoTime()+(long) (6E10*FOCUS_MEASUREMENT_PARAMETERS.powerControlFanOnMinutes); break; } } // nothing specific is needed for case 4 - it will end anyway } } if (!modeAverage) { if (DEBUG_LEVEL>0) System.out.println("Turning both heater and fan off"); POWER_CONTROL.setPower("fan","off"); POWER_CONTROL.setPower("heater","off"); } // LMA version // LMA version FocusingField ff= null; FocusingField ff= null; if (useLMA){ if (useLMA){ Loading Loading @@ -5475,7 +5549,7 @@ if (MORE_BUTTONS) { // Calculate and show average distances and tilts for measured history // Calculate and show average distances and tilts for measured history if (!modeAverage) { if (!modeAverage) { remoteNotifyComplete(); double [] lastKT=MOTORS.focusingHistory.temperatureLinearApproximation( double [] lastKT=MOTORS.focusingHistory.temperatureLinearApproximation( useLMA, useLMA, runs, // number of last samples from history to use, 0 - use all runs, // number of last samples from history to use, 0 - use all Loading Loading @@ -13820,6 +13894,7 @@ private double [][] jacobianByJacobian(double [][] jacobian, boolean [] mask) { boolean select_GONIOMETER_PARAMETERS=!select; boolean select_GONIOMETER_PARAMETERS=!select; boolean select_ABERRATIONS_PARAMETERS=!select; boolean select_ABERRATIONS_PARAMETERS=!select; boolean select_FOCUSING_FIELD=!select; boolean select_FOCUSING_FIELD=!select; boolean select_POWER_CONTROL=!select; if (select) { if (select) { GenericDialog gd = new GenericDialog("Select parameters to save"); GenericDialog gd = new GenericDialog("Select parameters to save"); gd.addMessage("===== Individual parameters ======"); gd.addMessage("===== Individual parameters ======"); Loading Loading @@ -13859,6 +13934,8 @@ private double [][] jacobianByJacobian(double [][] jacobian, boolean [] mask) { gd.addCheckbox("GONIOMETER_PARAMETERS",select_GONIOMETER_PARAMETERS); gd.addCheckbox("GONIOMETER_PARAMETERS",select_GONIOMETER_PARAMETERS); gd.addCheckbox("ABERRATIONS_PARAMETERS",select_ABERRATIONS_PARAMETERS); gd.addCheckbox("ABERRATIONS_PARAMETERS",select_ABERRATIONS_PARAMETERS); gd.addCheckbox("FOCUSING_FIELD",select_FOCUSING_FIELD); gd.addCheckbox("FOCUSING_FIELD",select_FOCUSING_FIELD); gd.addCheckbox("POWER_CONTROL",select_POWER_CONTROL); WindowTools.addScrollBars(gd); WindowTools.addScrollBars(gd); gd.showDialog(); gd.showDialog(); if (gd.wasCanceled()) return; if (gd.wasCanceled()) return; Loading Loading @@ -13898,6 +13975,7 @@ private double [][] jacobianByJacobian(double [][] jacobian, boolean [] mask) { select_GONIOMETER_PARAMETERS=gd.getNextBoolean(); select_GONIOMETER_PARAMETERS=gd.getNextBoolean(); select_ABERRATIONS_PARAMETERS=gd.getNextBoolean(); select_ABERRATIONS_PARAMETERS=gd.getNextBoolean(); select_FOCUSING_FIELD=gd.getNextBoolean(); select_FOCUSING_FIELD=gd.getNextBoolean(); select_POWER_CONTROL=gd.getNextBoolean(); } } if (select_MASTER_DEBUG_LEVEL) properties.setProperty("MASTER_DEBUG_LEVEL", MASTER_DEBUG_LEVEL+""); if (select_MASTER_DEBUG_LEVEL) properties.setProperty("MASTER_DEBUG_LEVEL", MASTER_DEBUG_LEVEL+""); Loading Loading @@ -13936,6 +14014,8 @@ private double [][] jacobianByJacobian(double [][] jacobian, boolean [] mask) { if (select_GONIOMETER_PARAMETERS) GONIOMETER_PARAMETERS.setProperties("GONIOMETER_PARAMETERS.", properties); if (select_GONIOMETER_PARAMETERS) GONIOMETER_PARAMETERS.setProperties("GONIOMETER_PARAMETERS.", properties); if (select_ABERRATIONS_PARAMETERS) ABERRATIONS_PARAMETERS.setProperties("ABERRATIONS_PARAMETERS.", properties); if (select_ABERRATIONS_PARAMETERS) ABERRATIONS_PARAMETERS.setProperties("ABERRATIONS_PARAMETERS.", properties); if ((select_FOCUSING_FIELD) && (FOCUSING_FIELD!=null)) FOCUSING_FIELD.setProperties("FOCUSING_FIELD.", properties); if ((select_FOCUSING_FIELD) && (FOCUSING_FIELD!=null)) FOCUSING_FIELD.setProperties("FOCUSING_FIELD.", properties); if (select_POWER_CONTROL) POWER_CONTROL.setProperties("POWER_CONTROL.", properties); if (select) properties.remove("selected"); if (select) properties.remove("selected"); } } /* ======================================================================== */ /* ======================================================================== */ Loading Loading @@ -13976,6 +14056,7 @@ private double [][] jacobianByJacobian(double [][] jacobian, boolean [] mask) { GONIOMETER_PARAMETERS.getProperties("GONIOMETER_PARAMETERS.", properties); GONIOMETER_PARAMETERS.getProperties("GONIOMETER_PARAMETERS.", properties); ABERRATIONS_PARAMETERS.getProperties("ABERRATIONS_PARAMETERS.", properties); ABERRATIONS_PARAMETERS.getProperties("ABERRATIONS_PARAMETERS.", properties); if (FOCUSING_FIELD!=null) FOCUSING_FIELD.getProperties("FOCUSING_FIELD.", properties,false); // false -> overwrite distortions center if (FOCUSING_FIELD!=null) FOCUSING_FIELD.getProperties("FOCUSING_FIELD.", properties,false); // false -> overwrite distortions center POWER_CONTROL.getProperties("POWER_CONTROL.", properties); } } private String selectSourceDirectory(String defaultPath) { private String selectSourceDirectory(String defaultPath) {
src/main/java/CalibrationHardwareInterface.java +91 −4 Original line number Original line Diff line number Diff line Loading @@ -1797,12 +1797,99 @@ public class CalibrationHardwareInterface { throw new RuntimeException(ie); throw new RuntimeException(ie); } } } } } public static class PowerControl{ public int debugLevel=1; private String powerIP="192.168.0.80"; private final String urlFormat="http://%s/insteon/index.php?cmd=%s&group=%s"; private final String rootElement="Document"; public boolean powerConrtolEnabled=false; public void setProperties(String prefix,Properties properties){ properties.setProperty(prefix+"powerIP",this.powerIP+""); properties.setProperty(prefix+"powerConrtolEnabled",this.powerConrtolEnabled+""); } //Integer.decode(string) public void getProperties(String prefix,Properties properties){ if (properties.getProperty(prefix+"powerIP")!=null) this.powerIP=properties.getProperty(prefix+"powerIP"); if (properties.getProperty(prefix+"powerConrtolEnabled")!=null) this.powerConrtolEnabled=Boolean.parseBoolean(properties.getProperty(prefix+"powerConrtolEnabled")); } } public boolean setPower (String group, String state){ if (!powerConrtolEnabled) { System.out.println("=== Power control is disabled ==="); return false; } String url=String.format(urlFormat,this.powerIP,state,group); if (this.debugLevel>2) System.out.println("setPower: "+url); Document dom=null; try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); dom = db.parse(url); if (!dom.getDocumentElement().getNodeName().equals(rootElement)) { System.out.println("Root element: expected \""+rootElement+"\", got \"" + dom.getDocumentElement().getNodeName()+"\""); IJ.showMessage("Error","Root element: expected \""+rootElement+"\", got \"" + dom.getDocumentElement().getNodeName()+"\""); return false; } // boolean responceError= (dom.getDocumentElement().getElementsByTagName("error").getLength()!=0); // if (responceError) { // System.out.println("ERROR: register write ("+url+") FAILED" ); // IJ.showMessage("Error","register write ("+url+") FAILED"); // return false; // } } catch(MalformedURLException e){ System.out.println("Please check the URL:" + e.toString() ); return false; } catch(IOException e1){ IJ.showStatus(""); String error = e1.getMessage(); if (error==null || error.equals("")) error = ""+e1; IJ.showMessage("setPower ERROR", ""+error); return false; }catch(ParserConfigurationException pce) { pce.printStackTrace(); return false; }catch(SAXException se) { se.printStackTrace(); return false; } return true; } public boolean showDialog(String title, boolean control) { GenericDialog gd = new GenericDialog(title); boolean heaterOn=false, fanOn=false; gd.addCheckbox("Enable power control (heater, fan) ", this.powerConrtolEnabled); gd.addStringField("IP address of the power control",this.powerIP,15); if (control){ gd.addCheckbox("Heater On", heaterOn); gd.addCheckbox("Fan On", fanOn); } WindowTools.addScrollBars(gd); if (control) gd.enableYesNoCancel("OK", "Control Power"); gd.showDialog(); if (gd.wasCanceled()) return false; this.powerConrtolEnabled=gd.getNextBoolean(); this.powerIP=gd.getNextString(); if (control){ heaterOn=gd.getNextBoolean(); fanOn=gd.getNextBoolean(); if (!gd.wasOKed()) { setPower("heater",heaterOn?"on":"off"); setPower("fan",fanOn?"on":"off"); } } return true; } public boolean isPowerControlEnabled(){ return this.powerConrtolEnabled; } public void setDebugLevel(int debugLevel){ this.debugLevel=debugLevel; } } public static class LaserPointers{ public static class LaserPointers{ public int debugLevel=1; public int debugLevel=1; Loading
src/main/java/LensAdjustment.java +56 −5 Original line number Original line Diff line number Diff line Loading @@ -330,6 +330,12 @@ public class LensAdjustment { public boolean lensDistanceShowResults=true; // show results window from foca public boolean lensDistanceShowResults=true; // show results window from foca public boolean lensDistanceMoveToGoal=true; // Move to targetMicrons public boolean lensDistanceMoveToGoal=true; // Move to targetMicrons public boolean powerControlEnable=true; public double powerControlMaximalTemperature=60.0; public double powerControlHeaterOnMinutes=10.0; public double powerControlNeitherOnMinutes=5.0; public double powerControlFanOnMinutes=15.0; public String uvLasersIP="192.168.0.236"; // IP address of the camera with UV LEDs and aiming lasers are connected public String uvLasersIP="192.168.0.236"; // IP address of the camera with UV LEDs and aiming lasers are connected public int uvLasersBus=0; // 0 if 103641 board is connected to the sensor port (through 10-359), 1 - to 10369 public int uvLasersBus=0; // 0 if 103641 board is connected to the sensor port (through 10-359), 1 - to 10369 public double [] uvLasersCurrents={40.0,40.0,40.0,40.0}; // default LED on currents (mA) public double [] uvLasersCurrents={40.0,40.0,40.0,40.0}; // default LED on currents (mA) Loading Loading @@ -546,6 +552,11 @@ public class LensAdjustment { boolean lensDistanceInteractive, // Open dialog when calibrating focal distance boolean lensDistanceInteractive, // Open dialog when calibrating focal distance boolean lensDistanceShowResults, // show results window from foca boolean lensDistanceShowResults, // show results window from foca boolean lensDistanceMoveToGoal, // Move to targetMicrons boolean lensDistanceMoveToGoal, // Move to targetMicrons boolean powerControlEnable, double powerControlMaximalTemperature, double powerControlHeaterOnMinutes, double powerControlNeitherOnMinutes, double powerControlFanOnMinutes, String uvLasersIP, // IP address of the camera with UV LEDs and aiming lasers are connected String uvLasersIP, // IP address of the camera with UV LEDs and aiming lasers are connected int uvLasersBus, // 0 if 103641 board is connected to the sensor port (through 10-359), 1 - to 10369 int uvLasersBus, // 0 if 103641 board is connected to the sensor port (through 10-359), 1 - to 10369 double [] uvLasersCurrents, // default LED on currents (mA) double [] uvLasersCurrents, // default LED on currents (mA) Loading Loading @@ -692,6 +703,11 @@ public class LensAdjustment { this.lensDistanceInteractive=lensDistanceInteractive; // Open dialog when calibrating focal distance this.lensDistanceInteractive=lensDistanceInteractive; // Open dialog when calibrating focal distance this.lensDistanceShowResults=lensDistanceShowResults; // show results window from foca this.lensDistanceShowResults=lensDistanceShowResults; // show results window from foca this.lensDistanceMoveToGoal=lensDistanceMoveToGoal; // Move to targetMicrons this.lensDistanceMoveToGoal=lensDistanceMoveToGoal; // Move to targetMicrons this.powerControlEnable=powerControlEnable; this.powerControlMaximalTemperature=powerControlMaximalTemperature; this.powerControlHeaterOnMinutes=powerControlHeaterOnMinutes; this.powerControlNeitherOnMinutes=powerControlNeitherOnMinutes; this.powerControlFanOnMinutes=powerControlFanOnMinutes; this.uvLasersIP=new String(uvLasersIP); // IP address of the camera with UV LEDs and aiming lasers are connected this.uvLasersIP=new String(uvLasersIP); // IP address of the camera with UV LEDs and aiming lasers are connected this.uvLasersBus=uvLasersBus; // 0 if 103641 board is connected to the sensor port (through 10-359), 1 - to 10369 this.uvLasersBus=uvLasersBus; // 0 if 103641 board is connected to the sensor port (through 10-359), 1 - to 10369 this.uvLasersCurrents=uvLasersCurrents.clone(); // default LED on currents (mA) this.uvLasersCurrents=uvLasersCurrents.clone(); // default LED on currents (mA) Loading Loading @@ -840,6 +856,11 @@ public class LensAdjustment { this.lensDistanceInteractive, // Open dialog when calibrating focal distance this.lensDistanceInteractive, // Open dialog when calibrating focal distance this.lensDistanceShowResults, // show results window from foca this.lensDistanceShowResults, // show results window from foca this.lensDistanceMoveToGoal, // Move to targetMicrons this.lensDistanceMoveToGoal, // Move to targetMicrons this.powerControlEnable, this.powerControlMaximalTemperature, this.powerControlHeaterOnMinutes, this.powerControlNeitherOnMinutes, this.powerControlFanOnMinutes, this.uvLasersIP, // IP address of the camera with UV LEDs and aiming lasers are connected this.uvLasersIP, // IP address of the camera with UV LEDs and aiming lasers are connected this.uvLasersBus, // 0 if 103641 board is connected to the sensor port (through 10-359), 1 - to 10369 this.uvLasersBus, // 0 if 103641 board is connected to the sensor port (through 10-359), 1 - to 10369 this.uvLasersCurrents, // default LED on currents (mA) this.uvLasersCurrents, // default LED on currents (mA) Loading Loading @@ -993,6 +1014,12 @@ public class LensAdjustment { properties.setProperty(prefix+"lensDistanceShowResults",this.lensDistanceShowResults+""); properties.setProperty(prefix+"lensDistanceShowResults",this.lensDistanceShowResults+""); properties.setProperty(prefix+"lensDistanceMoveToGoal",this.lensDistanceMoveToGoal+""); properties.setProperty(prefix+"lensDistanceMoveToGoal",this.lensDistanceMoveToGoal+""); properties.setProperty(prefix+"powerControlEnable",this.powerControlEnable+""); properties.setProperty(prefix+"powerControlMaximalTemperature",this.powerControlMaximalTemperature+""); properties.setProperty(prefix+"powerControlHeaterOnMinutes",this.powerControlHeaterOnMinutes+""); properties.setProperty(prefix+"powerControlNeitherOnMinutes",this.powerControlNeitherOnMinutes+""); properties.setProperty(prefix+"powerControlFanOnMinutes",this.powerControlFanOnMinutes+""); properties.setProperty(prefix+"uvLasersIP",this.uvLasersIP); properties.setProperty(prefix+"uvLasersIP",this.uvLasersIP); properties.setProperty(prefix+"uvLasersBus",this.uvLasersBus+""); properties.setProperty(prefix+"uvLasersBus",this.uvLasersBus+""); properties.setProperty(prefix+"uvLasersCurrents_0",this.uvLasersCurrents[0]+""); properties.setProperty(prefix+"uvLasersCurrents_0",this.uvLasersCurrents[0]+""); Loading Loading @@ -1276,6 +1303,18 @@ public class LensAdjustment { if (properties.getProperty(prefix+"lensDistanceMoveToGoal")!=null) if (properties.getProperty(prefix+"lensDistanceMoveToGoal")!=null) this.lensDistanceMoveToGoal=Boolean.parseBoolean(properties.getProperty(prefix+"lensDistanceMoveToGoal")); this.lensDistanceMoveToGoal=Boolean.parseBoolean(properties.getProperty(prefix+"lensDistanceMoveToGoal")); if (properties.getProperty(prefix+"powerControlEnable")!=null) this.powerControlEnable=Boolean.parseBoolean(properties.getProperty(prefix+"powerControlEnable")); if (properties.getProperty(prefix+"powerControlMaximalTemperature")!=null) this.powerControlMaximalTemperature=Double.parseDouble(properties.getProperty(prefix+"powerControlMaximalTemperature")); if (properties.getProperty(prefix+"powerControlHeaterOnMinutes")!=null) this.powerControlHeaterOnMinutes=Double.parseDouble(properties.getProperty(prefix+"powerControlHeaterOnMinutes")); if (properties.getProperty(prefix+"powerControlNeitherOnMinutes")!=null) this.powerControlNeitherOnMinutes=Double.parseDouble(properties.getProperty(prefix+"powerControlNeitherOnMinutes")); if (properties.getProperty(prefix+"powerControlFanOnMinutes")!=null) this.powerControlFanOnMinutes=Double.parseDouble(properties.getProperty(prefix+"powerControlFanOnMinutes")); if (properties.getProperty(prefix+"uvLasersIP")!=null) if (properties.getProperty(prefix+"uvLasersIP")!=null) this.uvLasersIP=properties.getProperty(prefix+"uvLasersIP"); this.uvLasersIP=properties.getProperty(prefix+"uvLasersIP"); if (properties.getProperty(prefix+"uvLasersBus")!=null) if (properties.getProperty(prefix+"uvLasersBus")!=null) Loading Loading @@ -1528,6 +1567,12 @@ public class LensAdjustment { gd.addCheckbox ("Show results window from focal distance calibration", this.lensDistanceShowResults); gd.addCheckbox ("Show results window from focal distance calibration", this.lensDistanceShowResults); gd.addCheckbox ("Move motors together to the requested microns from the \"best focus\"", this.lensDistanceMoveToGoal); gd.addCheckbox ("Move motors together to the requested microns from the \"best focus\"", this.lensDistanceMoveToGoal); gd.addCheckbox ("Enable power control for heater and fan", this.powerControlEnable); gd.addNumericField("Maximal allowed temperature", this.powerControlMaximalTemperature, 3,5,"C"); gd.addNumericField("Heater ON time", this.powerControlHeaterOnMinutes, 1,5,"min"); gd.addNumericField("Both heater and fan OFF time", this.powerControlNeitherOnMinutes, 1,5,"min"); gd.addNumericField("Fan ON time", this.powerControlFanOnMinutes, 1,5,"min"); gd.addStringField ("IP address of the camera with 103641 board (UV LEDs and lasers) are attached", this.uvLasersIP,40); gd.addStringField ("IP address of the camera with 103641 board (UV LEDs and lasers) are attached", this.uvLasersIP,40); gd.addNumericField("I2C bus where LED/laser board is attached (0 - through 10359, 1 - through 10369)",this.uvLasersBus, 0); gd.addNumericField("I2C bus where LED/laser board is attached (0 - through 10359, 1 - through 10369)",this.uvLasersBus, 0); gd.addNumericField("UV LED1 \"on\" current (left/near when looking from the target)", this.uvLasersCurrents[0], 3,5,"mA"); gd.addNumericField("UV LED1 \"on\" current (left/near when looking from the target)", this.uvLasersCurrents[0], 3,5,"mA"); Loading Loading @@ -1701,6 +1746,12 @@ public class LensAdjustment { this.lensDistanceShowResults= gd.getNextBoolean(); this.lensDistanceShowResults= gd.getNextBoolean(); this.lensDistanceMoveToGoal= gd.getNextBoolean(); this.lensDistanceMoveToGoal= gd.getNextBoolean(); this.powerControlEnable= gd.getNextBoolean(); this.powerControlMaximalTemperature=gd.getNextNumber(); this.powerControlHeaterOnMinutes= gd.getNextNumber(); this.powerControlNeitherOnMinutes= gd.getNextNumber(); this.powerControlFanOnMinutes= gd.getNextNumber(); this.uvLasersIP= gd.getNextString(); this.uvLasersIP= gd.getNextString(); this.uvLasersBus= (int) gd.getNextNumber(); this.uvLasersBus= (int) gd.getNextNumber(); this.uvLasersCurrents[0]= gd.getNextNumber(); this.uvLasersCurrents[0]= gd.getNextNumber(); Loading