00001
00005 package DisplayGUI;
00006 import java.util.*;
00007 import java.io.*;
00008 import java.util.regex.Pattern;
00009 import java.util.regex.Matcher;
00010 import java.awt.Color;
00011
00012
00013 public class ColorScaleManager implements TestDataInfo {
00014 private static ColorScaleManager instance = new ColorScaleManager();
00015
00016 private Map defaultMap;
00017 private Map nonDefaultMap;
00018 private Set persistedSet;
00019 private final String IS_MONITOR_TITLE="Number of published objects";
00020 private final String MODULE_GROUP_SELECTION_TITLE = "Selected module grouping";
00021 private final String SCTDB_COMPARISON_TITLE = "Comparison with SCTDAQ Reference";
00022 private final String IVSCAN_TITLE="Sensor Current (microAmps)";
00023
00024 private ColorScaleManager() {
00025 Refresh();
00026 }
00027
00028 public static ColorScaleManager getInstance() {
00029 return instance;
00030 }
00031 public void Refresh() {
00032 persistedSet = new HashSet();
00033 initialiseDefaults();
00034 readPersistedScales();
00035 }
00036 public ColorScale getColorScale(int display, int testIndex, int parameterIndex, int mouseOption, int displayOption) {
00037
00038
00039 String scaleTitle;
00040 if((scaleTitle=getTitleString(display,testIndex,parameterIndex,mouseOption,displayOption))==null) {
00041
00042 return null;
00043 }
00044 if(nonDefaultMap.containsKey(scaleTitle)) return (ColorScale)nonDefaultMap.get(scaleTitle);
00045 if(defaultMap.containsKey(scaleTitle)) return (ColorScale)defaultMap.get(scaleTitle);
00046 System.err.println("SctGUI::ColorScaleManager: No scale defined for title '"+scaleTitle+"'");
00047 return null;
00048 }
00049
00050 public void updateScale(ColorScale colorScale, boolean persist) {
00051 boolean isDefault=false;
00052 ColorScale defaultScale = new ColorScale((ColorScale)defaultMap.get(colorScale.getTitle()));
00053 if(colorScale.equals(defaultScale)) {
00054 nonDefaultMap.remove(colorScale.getTitle());
00055 isDefault=true;
00056 }
00057 else nonDefaultMap.put(colorScale.getTitle(),colorScale);
00058
00059 if(persist) {
00060 if(!isDefault) persistedSet.add(colorScale.getTitle());
00061 persistScales();
00062 }
00063 }
00064
00065 public ColorScale getDefaultColorScale(String scaleTitle) {
00066 ColorScale cs = (ColorScale)defaultMap.get(scaleTitle);
00067 return cs;
00068 }
00069 public void clearAll() {
00070 System.out.println("SctGUI: Clearing "+nonDefaultMap.size()+" color scales...");
00071 persistedSet.clear();
00072 nonDefaultMap.clear();
00073 persistScales();
00074 }
00075
00076
00077 public boolean isDefault(ColorScale colorScale) {
00078 return (!nonDefaultMap.containsKey(colorScale.getTitle()));
00079 }
00080
00081 public void readPersistedScales() {
00082 ColorScale thisScale = null;
00083 Pattern scalePattern = Pattern.compile("%COLORSCALE TITLE=(.*)LOG=(\\d+)GRAD=(\\d+)");
00084 Pattern pointPattern = Pattern.compile("VALUE=([\\d\\.-]+)LABEL=(.*)RED=(\\d+)GREEN=(\\d+)BLUE=(\\d+)");
00085 nonDefaultMap = new java.util.HashMap();
00086 int scaleCount=0;
00087 try {
00088 File prefFile = Preferences.PreferencesInterface.getInstance().getPrefsFile();
00089 if(!prefFile.exists()) return;
00090 BufferedReader in = new BufferedReader(new FileReader(prefFile));
00091 String line;
00092 while((line=in.readLine())!=null) {
00093 Matcher matcher = scalePattern.matcher(line);
00094 if(matcher.matches()) {
00095 if(thisScale!=null) {
00096
00097 if(thisScale.getNoPoints()>=2) {
00098 nonDefaultMap.put(thisScale.getTitle(),thisScale);
00099 persistedSet.add(thisScale.getTitle());
00100 scaleCount++;
00101 }
00102 else System.err.println("SctGUI::ColorScaleManager: <2 scale points!!!");
00103 }
00104 String title = line.substring(matcher.start(1),matcher.end(1));
00105 boolean isLog = line.substring(matcher.start(2),matcher.end(2)).equals("1");
00106 boolean isGrad = line.substring(matcher.start(3),matcher.end(3)).equals("1");
00107 thisScale = new ColorScale(title,isLog,isGrad);
00108 continue;
00109 }
00110 matcher = pointPattern.matcher(line);
00111 if(matcher.matches()) {
00112 if(thisScale==null) {
00113 System.err.println("SctGUI::ColorScaleManager: Null scale point for line "+line);
00114 continue;
00115 }
00116 String value = line.substring(matcher.start(1),matcher.end(1));
00117 String label = line.substring(matcher.start(2),matcher.end(2));
00118 String red = line.substring(matcher.start(3),matcher.end(3));
00119 String green = line.substring(matcher.start(4),matcher.end(4));
00120 String blue = line.substring(matcher.start(5),matcher.end(5));
00121 thisScale.add(Double.parseDouble(value),new Color(Integer.parseInt(red),Integer.parseInt(green),Integer.parseInt(blue)),label);
00122 }
00123
00124 }
00125 if(thisScale!=null) {
00126
00127 if(thisScale.getNoPoints()>=2) {
00128 nonDefaultMap.put(thisScale.getTitle(),thisScale);
00129 persistedSet.add(thisScale.getTitle());
00130 scaleCount++;
00131 }
00132 else System.err.println("SctGUI::ColorScaleManager: <2 scale points!!!");
00133 }
00134 in.close();
00135
00136 }catch(Exception io) {System.err.println("SctGUI::ColorScaleManager: Failed to read persisted color scales: "+io.toString());}
00137 if(scaleCount>0) System.out.println("SctGUI::ColorScaleManager: Imported "+scaleCount+" color scales");
00138 }
00139
00140 public void persistScales() {
00141 List contents = new ArrayList();
00142 try {
00143 File prefFile = Preferences.PreferencesInterface.getInstance().getPrefsFile();
00144 if(prefFile.exists()) {
00145 BufferedReader in = new BufferedReader(new FileReader(prefFile));
00146 String line;
00147 while((line=in.readLine())!=null) {
00148 if(line.startsWith("%COLORSCALE")) break;
00149 contents.add(line);
00150 }
00151 in.close();
00152 }
00153 BufferedWriter out = new BufferedWriter(new FileWriter(prefFile));
00154 for(int i=0;i<contents.size();i++) {
00155 out.write((String)contents.get(i));
00156 out.newLine();
00157 }
00158 for (Iterator i=nonDefaultMap.values().iterator(); i.hasNext(); ) {
00159 ColorScale thisColorScale = (ColorScale) i.next();
00160 String title = thisColorScale.getTitle();
00161 if(!persistedSet.contains(title)) continue;
00162 String isLog = thisColorScale.isLogScale() ? "1" : "0";
00163 String isGrad = thisColorScale.isGradientPaint() ? "1" : "0";
00164 out.write("%COLORSCALE TITLE="+title+"LOG="+isLog+"GRAD="+isGrad);
00165 out.newLine();
00166 List scalePoints = thisColorScale.getScalePoints();
00167 for(int y=0;y<scalePoints.size();y++) {
00168 ColorScalePoint scalePoint = (ColorScalePoint)scalePoints.get(y);
00169 Color color = scalePoint.getColor();
00170 out.write("VALUE="+scalePoint.getValue()+"LABEL="+scalePoint.getLabel()+"RED="+color.getRed()+"GREEN="+color.getGreen()+"BLUE="+color.getBlue());
00171 out.newLine();
00172 }
00173 }
00174 out.close();
00175 }catch(Exception io) {System.err.println("SctGUI::ColorScaleManager: Failed to persist color scales: "+io.toString());}
00176 }
00177
00178
00179 public void initialiseDefaults() {
00180
00181 defaultMap = new java.util.HashMap();
00182 ColorScale colorScale;
00183
00184 colorScale = new ColorScale(0.0, java.awt.Color.red, "0");
00185 colorScale.add(1.0, java.awt.Color.green, "1");
00186 defaultMap.put(colorScale.setTitle(IS_MONITOR_TITLE),colorScale);
00187
00188 colorScale = new ColorScale(-1.0,java.awt.Color.white, "None");
00189 colorScale.add(0.0, java.awt.Color.orange, "0");
00190 colorScale.add(1.0, java.awt.Color.cyan,"1");
00191 colorScale.add(2.0, java.awt.Color.blue,"2");
00192 colorScale.add(3.0, java.awt.Color.pink,"3");
00193 colorScale.add(4.0, java.awt.Color.green,"4");
00194 colorScale.add(5.0, java.awt.Color.magenta,"5");
00195 colorScale.add(6.0, java.awt.Color.yellow,"6");
00196 colorScale.add(7.0, java.awt.Color.lightGray,"7");
00197 defaultMap.put(colorScale.setTitle(MODULE_GROUP_SELECTION_TITLE),colorScale);
00198
00199 colorScale = new ColorScale(-1.0,java.awt.Color.white, "No Data");
00200 colorScale.add(1.0, java.awt.Color.green,"Good");
00201 colorScale.add(2.0, java.awt.Color.red,"Poor");
00202 defaultMap.put(colorScale.setTitle(SCTDB_COMPARISON_TITLE),colorScale);
00203
00204 colorScale = new ColorScale(0.0, java.awt.Color.green, "Pass");
00205 colorScale.add(1.0,java.awt.Color.orange, "Problem");
00206 colorScale.add(2.0,java.awt.Color.red, "Fail");
00207 defaultMap.put(colorScale.setTitle("Result Status"),colorScale);
00208
00209 colorScale = new ColorScale(0.0, java.awt.Color.green, "0",15.0,java.awt.Color.red,"15");
00210 defaultMap.put(colorScale.setTitle("Defect Count"),colorScale);
00211
00212 colorScale = new ColorScale(0.0, java.awt.Color.green, "0",15.0,java.awt.Color.red,"15");
00213 defaultMap.put(colorScale.setTitle("#Bad Chans"),colorScale);
00214
00215 colorScale = new ColorScale(0.0, java.awt.Color.orange, "0",5.0,java.awt.Color.green,"5.0");
00216 defaultMap.put(colorScale.setTitle("Token"),colorScale);
00217
00218 colorScale = new ColorScale(0.0, java.awt.Color.orange, "0",5.0,java.awt.Color.green,"5.0");
00219 defaultMap.put(colorScale.setTitle("RToken"),colorScale);
00220
00221 colorScale = new ColorScale(0.0, java.awt.Color.orange,"Not Tested");
00222 colorScale.add(1.0, java.awt.Color.green, "Minimal Tested");
00223 defaultMap.put(colorScale.setTitle("Token Comment"),colorScale);
00224
00225 colorScale = new ColorScale(0.0, java.awt.Color.orange,"Not Tested");
00226 colorScale.add(1.0, java.awt.Color.green, "Minimal Tested");
00227 defaultMap.put(colorScale.setTitle("RToken Comment"),colorScale);
00228
00229 colorScale = new ColorScale(0., java.awt.Color.green, "0");
00230 colorScale.add(1.0,java.awt.Color.red,">0");
00231 defaultMap.put(colorScale.setTitle("Defective pipelines"),colorScale);
00232
00233 colorScale = new ColorScale(0.0, java.awt.Color.red, "0",20.0,java.awt.Color.red,"20");
00234 colorScale.add(10.0,java.awt.Color.green,"10");
00235 colorScale.add(15.0,java.awt.Color.green,"15");
00236 defaultMap.put(colorScale.setTitle("Strobe Delay"),colorScale);
00237
00238 colorScale = new ColorScale(0.0, java.awt.Color.red, "0",300.0,java.awt.Color.red,"300.");
00239 colorScale.add(100.0,java.awt.Color.green,"100.");
00240 colorScale.add(200.0,java.awt.Color.green,"200.");
00241 defaultMap.put(colorScale.setTitle("VT50(mV)"),colorScale);
00242
00243 colorScale = new ColorScale(0.0, java.awt.Color.blue, "0",10.0,java.awt.Color.red,"10.");
00244 colorScale.add(1.0,java.awt.Color.green,"1.");
00245 colorScale.add(5.0,java.awt.Color.green,"5.");
00246 defaultMap.put(colorScale.setTitle("VT50(mV) RMS"),colorScale);
00247
00248 colorScale = new ColorScale(30.0, java.awt.Color.red, "30",70.0,java.awt.Color.red,"70");
00249 colorScale.add(40.0,java.awt.Color.green,"40");
00250 colorScale.add(60.0,java.awt.Color.green,"60");
00251 defaultMap.put(colorScale.setTitle("Gain (mV/fC)"),colorScale);
00252
00253 colorScale = new ColorScale(0.0, java.awt.Color.blue, "0",10.0,java.awt.Color.red,"10.");
00254 colorScale.add(1.0,java.awt.Color.green,"1.");
00255 colorScale.add(5.0,java.awt.Color.green,"5.");
00256 defaultMap.put(colorScale.setTitle("Gain RMS"),colorScale);
00257
00258 colorScale = new ColorScale(0.0, java.awt.Color.red, "0.",100.0,java.awt.Color.red,"100.");
00259 colorScale.add(10.0,java.awt.Color.green,"10");
00260 colorScale.add(90.0,java.awt.Color.green,"90");
00261 defaultMap.put(colorScale.setTitle("Offset (mV)"),colorScale);
00262
00263 colorScale = new ColorScale(0.0, java.awt.Color.blue, "0",10.0,java.awt.Color.red,"10.");
00264 colorScale.add(1.0,java.awt.Color.green,"1.");
00265 colorScale.add(5.0,java.awt.Color.green,"5.");
00266 defaultMap.put(colorScale.setTitle("Offset RMS"),colorScale);
00267
00268 colorScale = new ColorScale(10.0, java.awt.Color.blue, "10.",16.0,java.awt.Color.red,"16.");
00269 colorScale.add(12.0,java.awt.Color.green,"12.");
00270 colorScale.add(14.0,java.awt.Color.green,"14.");
00271 defaultMap.put(colorScale.setTitle("Output Noise (mV)"),colorScale);
00272
00273 colorScale = new ColorScale(1000.0, java.awt.Color.blue, "1000",2000.0,java.awt.Color.red,"2000");
00274 colorScale.add(1300.0,java.awt.Color.green,"1300");
00275 colorScale.add(1600.0,java.awt.Color.green,"1600");
00276 defaultMap.put(colorScale.setTitle("Input Noise (enc)"),colorScale);
00277
00278 colorScale = new ColorScale(0.0, java.awt.Color.blue, "0.",100.0,java.awt.Color.red,"100");
00279 colorScale.add(30.0,java.awt.Color.green,"30.");
00280 colorScale.add(80.0,java.awt.Color.green,"80.");
00281 defaultMap.put(colorScale.setTitle("Noise RMS (enc)"),colorScale);
00282
00283 colorScale = new ColorScale(0.0000001, java.awt.Color.blue, "1E-7",0.0001,java.awt.Color.red,"1E-4");
00284 colorScale.add(0.000001,java.awt.Color.green,"1E-6");
00285 colorScale.add(0.00001,java.awt.Color.green,"1E-5");
00286 colorScale.setLogScale(true);
00287 defaultMap.put(colorScale.setTitle("Occupancy"),colorScale);
00288
00289 colorScale = new ColorScale(0.0000001, java.awt.Color.blue, "1E-7",0.0001,java.awt.Color.red,"1E-4");
00290 colorScale.add(0.000001,java.awt.Color.green,"1E-6");
00291 colorScale.add(0.00001,java.awt.Color.green,"1E-5");
00292 colorScale.setLogScale(true);
00293 defaultMap.put(colorScale.setTitle("RMS Occupancy"),colorScale);
00294
00295 colorScale = new ColorScale(0, java.awt.Color.blue, "0");
00296 colorScale.add(1,java.awt.Color.green,"1");
00297 colorScale.add(2,java.awt.Color.red,"2");
00298 colorScale.add(3,java.awt.Color.yellow,"3");
00299 defaultMap.put(colorScale.setTitle("Trim Range"),colorScale);
00300
00301 colorScale = new ColorScale(0.0, java.awt.Color.blue, "0.",250.0,java.awt.Color.red,"250");
00302 colorScale.add(50.0,java.awt.Color.green,"50.");
00303 colorScale.add(200.0,java.awt.Color.green,"200.");
00304 defaultMap.put(colorScale.setTitle("Target"),colorScale);
00305
00306 colorScale = new ColorScale(0., java.awt.Color.green, "0");
00307 colorScale.add(1.0,java.awt.Color.red,">0");
00308 defaultMap.put(colorScale.setTitle("N(untrimmed)"),colorScale);
00309
00310 colorScale = new ColorScale(0.0, java.awt.Color.blue, "0",20.0,java.awt.Color.green,"20.");
00311 defaultMap.put(colorScale.setTitle("Step size (mV)"),colorScale);
00312
00313 colorScale = new ColorScale(0.0, java.awt.Color.blue, "0",1.0,java.awt.Color.green,"1.");
00314 defaultMap.put(colorScale.setTitle("Step Size RMS"),colorScale);
00315
00316 colorScale = new ColorScale(0.0, java.awt.Color.red, "0",10.0,java.awt.Color.green,"10");
00317 colorScale.add(12.0,java.awt.Color.green,"12");
00318 colorScale.add(20.0,java.awt.Color.red,"20");
00319 defaultMap.put(colorScale.setTitle("TimeWalk(ns)"),colorScale);
00320
00321 colorScale = new ColorScale(0.0, java.awt.Color.red, "0",20.0,java.awt.Color.red,"20");
00322 colorScale.add(10.0,java.awt.Color.green,"10");
00323 colorScale.add(15.0,java.awt.Color.green,"15");
00324 defaultMap.put(colorScale.setTitle("TimeWalk(ns)"),colorScale);
00325
00326 colorScale = new ColorScale(0.0, java.awt.Color.red, "0",40.0,java.awt.Color.red,"40");
00327 colorScale.add(20.0,java.awt.Color.green,"20");
00328 colorScale.add(30.0,java.awt.Color.green,"30");
00329 defaultMap.put(colorScale.setTitle("TCal"),colorScale);
00330
00331 colorScale = new ColorScale(0.0, java.awt.Color.blue, "0",500.0,java.awt.Color.red,"500");
00332 colorScale.add(200.0,java.awt.Color.green,"200");
00333 colorScale.add(400.0,java.awt.Color.green,"400");
00334 defaultMap.put(colorScale.setTitle("Sensor HV(Volts)"),colorScale);
00335
00336 colorScale = new ColorScale(0.0, java.awt.Color.blue, "0",2.0,java.awt.Color.red,"2.0");
00337 colorScale.add(0.5,java.awt.Color.green,"0.5");
00338 colorScale.add(1.0,java.awt.Color.green,"1.0");
00339 defaultMap.put(colorScale.setTitle("Sensor Current(uA)"),colorScale);
00340
00341 colorScale = new ColorScale(0.0, java.awt.Color.blue, "0",35.0,java.awt.Color.red,"35.0");
00342 colorScale.add(20.0,java.awt.Color.green,"20.0");
00343 colorScale.add(30.0,java.awt.Color.green,"30.0");
00344 defaultMap.put(colorScale.setTitle("Hybrid T0(degC)"),colorScale);
00345
00346 colorScale = new ColorScale(0.0, java.awt.Color.blue, "0",35.0,java.awt.Color.red,"35.0");
00347 colorScale.add(20.0,java.awt.Color.green,"20.0");
00348 colorScale.add(30.0,java.awt.Color.green,"30.0");
00349 defaultMap.put(colorScale.setTitle("Hybrid T1(degC)"),colorScale);
00350
00351 colorScale = new ColorScale(3.0, java.awt.Color.blue, "3.0",4.0,java.awt.Color.red,"4.0");
00352 colorScale.add(3.5,java.awt.Color.green,"3.5");
00353 defaultMap.put(colorScale.setTitle("Chip VCC (Volts)"),colorScale);
00354
00355 colorScale = new ColorScale(800.0, java.awt.Color.blue, "800",1200.0,java.awt.Color.red,"1200");
00356 colorScale.add(1000.0,java.awt.Color.green,"1000");
00357 defaultMap.put(colorScale.setTitle("Chip ICC (mA)"),colorScale);
00358
00359 colorScale = new ColorScale(3.5, java.awt.Color.blue, "3.5",4.5,java.awt.Color.red,"4.5");
00360 colorScale.add(4.0,java.awt.Color.green,"4.0");
00361 defaultMap.put(colorScale.setTitle("Chip VDD (Volts)"),colorScale);
00362
00363 colorScale = new ColorScale(450.0, java.awt.Color.blue, "450",550.0,java.awt.Color.red,"550");
00364 colorScale.add(500.0,java.awt.Color.green,"500");
00365 defaultMap.put(colorScale.setTitle("Chip IDD (mA)"),colorScale);
00366
00367 colorScale = new ColorScale(0.0, java.awt.Color.green, "0.",4.0,java.awt.Color.red,"4.");
00368 defaultMap.put(colorScale.setTitle("TDiff (degC)"),colorScale);
00369
00370 colorScale = new ColorScale(0.0, java.awt.Color.blue, "0.",10.0,java.awt.Color.red,"10.");
00371 colorScale.add(5.0,java.awt.Color.green,"5.0");
00372 defaultMap.put(colorScale.setTitle("Module Power (W)"),colorScale);
00373
00374 colorScale = new ColorScale(0.0, java.awt.Color.blue, "0.0",24.0,java.awt.Color.yellow,"24.0");
00375 defaultMap.put(colorScale.setTitle("Rx Delay"),colorScale);
00376
00377 colorScale = new ColorScale(80.0, java.awt.Color.blue, "80.0",120.0,java.awt.Color.yellow,"120.0");
00378 defaultMap.put(colorScale.setTitle("Rx Threshold"),colorScale);
00379
00380 colorScale = new ColorScale(0.0, java.awt.Color.blue, "0.0",2.0,java.awt.Color.red,"2.0");
00381 colorScale.add(0.5,java.awt.Color.green,"0.5");
00382 colorScale.add(1.5,java.awt.Color.green,"1.5");
00383 defaultMap.put(colorScale.setTitle(IVSCAN_TITLE),colorScale);
00384
00385 }
00386
00387 private String getTitleString(int display, int testIndex, int parameterIndex, int mouseOption, int displayOption) {
00388
00389
00390 switch(display) {
00391 case DisplayStatus.IS_MONITOR:
00392 return IS_MONITOR_TITLE;
00393 case DisplayStatus.MODULE_GROUP_SELECTION:
00394 return MODULE_GROUP_SELECTION_TITLE;
00395 case DisplayStatus.IV_DATA:
00396 switch(parameterIndex) {
00397 case 0:
00398 return "Result Status";
00399 case 1:
00400 return IVSCAN_TITLE;
00401 case 2:
00402 if(mouseOption==-1) return null;
00403 return dcsOptions[mouseOption];
00404 default:
00405 }
00406 case DisplayStatus.TEST_DATA:
00407 if(parameterIndex==3) {
00408 if(mouseOption==-1) return null;
00409 return dcsOptions[mouseOption];
00410 }
00411
00412 switch(displayOption) {
00413 case 0:
00414 case 1:
00415 if(testIndex==-1 || parameterIndex==-1) return null;
00416 return testParameters[testIndex][parameterIndex];
00417 default:
00418 return SCTDB_COMPARISON_TITLE;
00419 }
00420 case DisplayStatus.SCTDB_DATA:
00421 case DisplayStatus.SCTDB_RODDAQ_DATA:
00422 if(testIndex==-1 || parameterIndex==-1) return null;
00423 switch(parameterIndex) {
00424 case 3:
00425 return dcsOptions[mouseOption];
00426 default:
00427 return testParameters[testIndex][parameterIndex];
00428 }
00429 case DisplayStatus.DCS_DATA:
00430 return dcsOptions[parameterIndex];
00431 default:
00432 }
00433 return null;
00434 }
00435
00436
00437
00438 }