Main Page | Class Hierarchy | Class List | File List | Class Members | Related Pages

DaqToRbnb.java

00001 00011 package org.nees.rbnb; 00012 00013 import org.nees.daq.*; 00014 00015 import java.io.IOException; 00016 import java.net.UnknownHostException; 00017 import java.net.Socket; 00018 import java.util.Hashtable; 00019 import java.util.Calendar; 00020 import java.util.GregorianCalendar; 00021 import com.rbnb.sapi.*; 00022 00023 import com.rbnb.utility.ArgHandler; //for argument parsing 00024 //import COM.Creare.Utility.ArgHandler; //for argument parsing 00025 00035 public class DaqToRbnb extends RBNBBase 00036 { 00037 00038 private ControlPort controlPort = null; 00039 private DataThread dataThread = null; 00040 private ChannelEntry[] channels = new ChannelEntry[0]; 00041 00042 private static final String DEFAULT_DAQ_SERVER_NAME = "DAQServer"; 00043 private static final String DEFAULT_DAQ_SERVER = "localhost"; 00044 private static final String DEFAULT_DAQ_CONTROL_PORT_NAME = "DAQControlPort"; 00045 private static final int DEFAULT_DAQ_CONTROL_PORT = 55055; 00046 private static final String DEFAULT_DAQ_DATA_PORT_NAME = "DAQDataPort"; 00047 private static final int DEFAULT_DAQ_DATA_PORT = 55056; 00048 private static final String DEFAULT_RBNB_SOURCE_NAME_NAME = "SourceName"; 00049 private static final String DEFAULT_RBNB_SOURCE_NAME = "FromDAQ"; 00050 private static final String CACHE_SIZE_NAME = "CacheSize"; 00051 private static final int DEFAULT_CACHE_SIZE=100; 00052 00053 private String daqServerName = DEFAULT_DAQ_SERVER; 00054 private int daqControlPort = DEFAULT_DAQ_CONTROL_PORT; 00055 private int daqDataPort = DEFAULT_DAQ_DATA_PORT; 00056 00057 private String rbnbSourceName = DEFAULT_RBNB_SOURCE_NAME; 00058 00059 private int cacheSize = DEFAULT_CACHE_SIZE; 00060 00061 private Socket controlSocket = null; 00062 private Socket dataSocket = null; 00063 00064 private Source source; 00065 boolean connected = false; 00066 00067 Thread mainThread; 00068 00069 private String[] parameterNameArray; 00070 private String[] parameterTypeArray; 00071 private Object[] parameterDefaultArray; 00072 00073 private double timeOffset = 0.0; // in seconds 00074 00095 public static void main(String[] args) { 00096 // start from command line 00097 DaqToRbnb control = new DaqToRbnb(); 00098 if (control.setArgs(args)) 00099 { 00100 control.startThread(); 00101 } 00102 } 00103 00105 public void printUsage() { 00106 System.out.println("DaqToRbnb: usage is..."); 00107 System.out.println("DaqToRbnb "); 00108 super.printUsage(); // uses h, s, p 00109 System.out.println("[-q DAQ Server *" + DEFAULT_DAQ_SERVER + "] "); 00110 System.out.println("[-c DAQ Control Port *" + DEFAULT_DAQ_CONTROL_PORT + "] "); 00111 System.out.println("[-d DAQ Data Port *" + DEFAULT_DAQ_DATA_PORT + "] "); 00112 System.out.println("[-n RBNB Source Name *" + DEFAULT_RBNB_SOURCE_NAME + "] "); 00113 System.out.println("[-z cache size *" + DEFAULT_CACHE_SIZE + "]"); 00114 double hours = timeOffset/(60.0*60.0); 00115 System.out.println("[-o time offset, floating point, hours to GMT *"+ hours +"]"); 00116 System.out.println("[-D flag (t/f) to debug print data time stamps *f]"); 00117 System.out.println(); 00118 } 00119 00124 protected boolean setInstanceArgs(String[] args) throws IllegalArgumentException 00125 { 00126 String a; 00127 //parse args 00128 try { 00129 ArgHandler ah=new ArgHandler(args); 00130 if (ah.checkFlag('q')) { 00131 a=ah.getOption('q'); 00132 if (a!=null) daqServerName=a; 00133 } 00134 if (ah.checkFlag('c')) { 00135 a=ah.getOption('c'); 00136 if (a!=null) daqControlPort=Integer.parseInt(a); 00137 } 00138 if (ah.checkFlag('d')) { 00139 a=ah.getOption('d'); 00140 if (a!=null) daqDataPort=Integer.parseInt(a); 00141 } 00142 if (ah.checkFlag('n')) { 00143 a=ah.getOption('n'); 00144 if (a!=null) rbnbSourceName=a; 00145 } 00146 if (ah.checkFlag('z')) { 00147 a=ah.getOption('z'); 00148 if (a!=null) 00149 try 00150 { 00151 Integer i = new Integer(a); 00152 int value = i.intValue(); 00153 cacheSize = value; 00154 } 00155 catch (Exception ignore) {} 00156 } 00157 if (ah.checkFlag('o')) { 00158 a=ah.getOption('o'); 00159 if (a!=null) 00160 try 00161 { 00162 double value = Double.parseDouble(a); // in hours 00163 timeOffset = (long)(value*60.0*60.0); // in seconds 00164 } 00165 catch (Exception ignore) {} 00166 } 00167 if (ah.checkFlag('D')){ 00168 a=ah.getOption('D'); 00169 if (a!=null) 00170 { 00171 if (a.equals("t")) ISOtoRbnbTime.DEBUG = true; 00172 } 00173 } 00174 } catch (Exception e) { 00175 throw new IllegalArgumentException("DaqToRbnb argument exception "+e.getMessage()); 00176 } 00177 System.out.println("Starting DaqToRbnb with"); 00178 System.out.println(" DAQ: server = " + daqServerName + 00179 "; control port = "+ daqControlPort + "; data port = " + daqDataPort ); 00180 System.out.println(" RBNB: server = " + getServer() 00181 + "; source name = " + rbnbSourceName ); 00182 System.out.println(" Time offset (in seconds) = " + timeOffset 00183 + ", which is " + timeOffset/(60.0*60.0) + " hours"); 00184 System.out.println(" Use DaqToRbnb -h to see optional parameters"); 00185 return true; 00186 } 00187 00192 public DaqToRbnb() { 00193 computeDefaultTimeOffset(); 00194 setParamterArrays(); 00195 initialize(); 00196 } 00197 00201 protected void setParamterArrays() { 00202 String [] pNameArray = super.getBaseParameterNameArray(); 00203 String [] pTypeArray = super.getBaseParameterTypeArray(); 00204 Object [] pDefaultArray = super.getBaseParameterDefaultArray(); 00205 00206 int base = pNameArray.length; 00207 int numberOfparameters = 5; 00208 parameterNameArray = new String[base + numberOfparameters]; 00209 parameterTypeArray = new String[base + numberOfparameters]; 00210 parameterDefaultArray = new Object[base + numberOfparameters]; 00211 00212 for (int i = 0; i < base; i++) 00213 { 00214 parameterNameArray[i] = pNameArray[i]; 00215 parameterTypeArray[i] = pTypeArray[i]; 00216 parameterDefaultArray[i] = pDefaultArray[i]; 00217 } 00218 00219 parameterNameArray[base + 0] = DEFAULT_DAQ_SERVER_NAME; 00220 parameterTypeArray[base + 0] = RBNBBaseParameterHolder.STRING_TYPE; 00221 parameterDefaultArray[base + 0] = new String(DEFAULT_DAQ_SERVER); 00222 00223 parameterNameArray[base + 1] = DEFAULT_DAQ_CONTROL_PORT_NAME; 00224 parameterTypeArray[base + 1] = RBNBBaseParameterHolder.INTEGER_TYPE; 00225 parameterDefaultArray[base + 1] = new Integer(DEFAULT_DAQ_CONTROL_PORT); 00226 00227 parameterNameArray[base + 2] = DEFAULT_DAQ_DATA_PORT_NAME; 00228 parameterTypeArray[base + 2] = RBNBBaseParameterHolder.INTEGER_TYPE; 00229 parameterDefaultArray[base + 2] = new Integer(DEFAULT_DAQ_DATA_PORT); 00230 00231 parameterNameArray[base + 3] = DEFAULT_RBNB_SOURCE_NAME_NAME; 00232 parameterTypeArray[base + 3] = RBNBBaseParameterHolder.STRING_TYPE; 00233 parameterDefaultArray[base + 3] = new String(DEFAULT_RBNB_SOURCE_NAME); 00234 00235 parameterNameArray[base + 4] = CACHE_SIZE_NAME; 00236 parameterTypeArray[base + 4] = RBNBBaseParameterHolder.INTEGER_TYPE; 00237 parameterDefaultArray[base + 4] = new Integer(DEFAULT_CACHE_SIZE); 00238 00239 } 00240 00241 /* (non-Javadoc) 00242 * @see org.nees.rbnb.RBNBBase#setVariablesFromParameters() 00243 */ 00244 public void setVariablesFromParameters() { 00245 super.setBaseVarialbesFromParametes(); 00246 00247 daqServerName = DEFAULT_DAQ_SERVER; 00248 try{ 00249 Object obj = getValueWithDefault( 00250 DEFAULT_DAQ_SERVER_NAME, DEFAULT_DAQ_SERVER); 00251 daqServerName = (String)obj; 00252 } catch (Throwable ignore){} 00253 00254 daqControlPort = DEFAULT_DAQ_CONTROL_PORT; 00255 try{ 00256 Integer i = new Integer(DEFAULT_DAQ_CONTROL_PORT); 00257 Object obj = getValueWithDefault(DEFAULT_DAQ_CONTROL_PORT_NAME, i); 00258 daqControlPort = ((Integer)obj).intValue(); 00259 } catch (Throwable ignore){} 00260 00261 daqDataPort = DEFAULT_DAQ_DATA_PORT; 00262 try{ 00263 Integer i = new Integer(DEFAULT_DAQ_DATA_PORT); 00264 Object obj = getValueWithDefault(DEFAULT_DAQ_DATA_PORT_NAME, i); 00265 daqDataPort = ((Integer)obj).intValue(); 00266 } catch (Throwable ignore){} 00267 00268 rbnbSourceName = DEFAULT_RBNB_SOURCE_NAME; 00269 try{ 00270 Object obj = getValueWithDefault( 00271 DEFAULT_RBNB_SOURCE_NAME_NAME, DEFAULT_RBNB_SOURCE_NAME); 00272 rbnbSourceName = (String)obj; 00273 } catch (Throwable ignore){} 00274 00275 cacheSize = DEFAULT_CACHE_SIZE; 00276 try{ 00277 Integer i = new Integer(DEFAULT_CACHE_SIZE); 00278 Object obj = getValueWithDefault(CACHE_SIZE_NAME, i); 00279 cacheSize = ((Integer)obj).intValue(); 00280 } catch (Throwable ignore){} 00281 00282 } 00283 00286 private void computeDefaultTimeOffset() { 00287 Calendar calendar = new GregorianCalendar(); 00288 long tz = calendar.get(Calendar.ZONE_OFFSET); 00289 long dt = calendar.get(Calendar.DST_OFFSET); 00290 System.out.println("Default time: Time Zone offset: " 00291 + (-((double)(tz/1000))/(60.0*60.0))); // in hours 00292 System.out.println("Defalut time: Daylight Savings Time offest (in hours): " 00293 + (-((double)(dt/1000))/(60.0*60.0))); // in hours 00294 // Time zone offset 00295 timeOffset = - (double)((tz + dt)/1000); // in seconds 00296 } 00297 00298 private void connect() 00299 { 00300 // Note: do this inside the main thread because of long delays 00301 // in the connection times! 00302 try 00303 { 00304 startDaqConnections(); // note both connects must be made first 00305 connectToDaqControl(); 00306 connected = true; 00307 } 00308 catch (Throwable t) { t.printStackTrace(); } 00309 } 00310 00315 private void startDaqConnections() 00316 throws UnknownHostException, IOException 00317 { 00319 controlSocket = new Socket(daqServerName,daqControlPort); 00320 00324 try 00325 { 00326 Thread.sleep(1000); 00327 } catch (Exception ignore) {} 00328 System.out.println("...Continued"); 00329 00330 dataSocket = new Socket(daqServerName,daqDataPort); 00331 } 00332 00336 private void connectToDaqControl() 00337 throws UnknownHostException, IOException 00338 { 00339 controlPort = null; 00340 00341 ControlPort port = null; 00342 00343 // use a local vaiable in case there is an exception 00344 port = new ControlPort(controlSocket); 00345 00346 System.out.println("Pause for one sec after ControlPort..."); 00347 try 00348 { 00349 Thread.sleep(1000); 00350 } catch (Exception ignore) {} 00351 System.out.println("...Continued"); 00352 00353 controlPort = port; 00354 } 00355 00356 private void disconnect() 00357 { 00358 try { 00359 // unsubscribe to all channels 00360 for (int i = 0; i < channels.length; i ++) 00361 { 00362 channels[i].unsubscribe(); 00363 } 00364 controlSocket.close(); 00365 dataSocket.close(); 00366 source.CloseRBNBConnection(); 00367 } catch (IOException e) { 00368 e.printStackTrace(); 00369 } 00370 } 00371 00376 private void buildChannels() 00377 throws IOException, SAPIException 00378 { 00379 if (controlPort == null) return; 00380 00382 dataThread = new DataThread(dataSocket); 00383 00384 source=new Source(cacheSize, "none", 0); 00385 source.OpenRBNBConnection(getServer(), rbnbSourceName); 00386 00387 String[] channelList = controlPort.getChannels(); 00388 00389 channels = new ChannelEntry[channelList.length]; 00390 00392 for (int i = 0; i < channelList.length; i++) 00393 { 00394 String name = channelList[i]; 00395 channels[i] = new ChannelEntry(name); 00396 dataThread.addListener(name, channels[i]); 00397 } 00398 } 00399 00404 private void exec() throws IOException 00405 { 00406 if (controlPort == null) return; 00407 00408 if (dataThread == null) return; 00409 00410 for (int i = 0; i < channels.length; i++) 00411 { 00412 channels[i].subscribe(); 00413 } 00414 00415 dataThread.start(); 00416 00417 } 00418 00426 private class ChannelEntry implements DaqListener 00427 { 00428 00429 String name; 00430 ChannelMap map; 00431 boolean subscribed = false; 00432 int index; 00433 00438 ChannelEntry(String name) throws SAPIException 00439 { 00440 this.name = name; 00441 map = new ChannelMap(); 00442 index = map.Add(name); 00443 source.Register(map); 00444 System.out.println("RBNB: Connection made to server = " 00445 + getServer() + 00446 " as source = " + rbnbSourceName + 00447 " with channel = " + name + "."); 00448 } 00449 00451 void subscribe() throws IOException 00452 { 00453 controlPort.subscribe(name); 00454 subscribed = true; 00455 } 00456 00458 void unsubscribe() throws IOException 00459 { 00460 controlPort.unsubscribe(name); 00461 subscribed = false; 00462 } 00463 00464 /* 00465 @brief Put DAQ data into turbine 00466 00467 Implements the data listener; data arrives from DAQ and is put on RBNB. 00468 00469 @param name Channel name 00470 @param time timestamp, RBNB format, in seconds 00471 @param data DAQ datum 00472 @see DaqListener#postData 00473 @bug the timeOffset was added when it was discovered that the DAQ controller 00474 did not know about time zones and was using the system time from the machine 00475 of origin as THE TIME. 00476 */ 00477 public void postData(String name, double time, double data) 00478 throws SAPIException 00479 { 00480 if (!name.equals(this.name)) return; 00481 00482 map.PutTime(time + timeOffset, 0.0); // in seconds 00483 00484 //map.PutTimeAuto("timeofday"); 00485 double dataArray[] = new double[1]; 00486 dataArray[0] = data; 00487 map.PutDataAsFloat64(index,dataArray); 00488 // System.out.println("Put Data, " + name + ": " + data); 00489 source.Flush(map); 00490 } 00491 } // ChannelListener 00492 00493 public void startThread() 00494 { 00495 // Use this inner class to hide the public run method 00496 Runnable r = new Runnable() { 00497 public void run() { 00498 runWork(); 00499 } 00500 }; 00501 mainThread = new Thread(r, "DaqToRbnb"); 00502 mainThread.start(); 00503 System.out.println("DaqToRbnb: Started main thread."); 00504 } 00505 00506 public void stopThread() 00507 { 00508 if (!connected) return; 00509 mainThread.interrupt(); 00510 System.out.println("DaqToRbnb: Stopped thread."); 00511 } 00512 00516 private void runWork() 00517 { 00518 while(true) 00519 { 00520 connect(); 00521 if (connected) 00522 { 00523 try 00524 { 00525 buildChannels(); 00526 exec(); 00527 while (isRunning()) 00528 { // check every 5 seconds 00529 try {Thread.sleep(5*1000);} catch (Exception ignore){} 00530 } 00531 } 00532 catch (Throwable t) 00533 { 00534 } 00535 disconnect(); 00536 if (dataThread.isRunning()) 00537 { 00538 try{ 00539 dataThread.stop(); 00540 } 00541 catch (Throwable ignore){} 00542 } 00543 dataThread = null; 00544 } 00545 // retry every 30 seconds 00546 try {Thread.sleep(30*1000);} catch (Exception ignore){} 00547 } // retry 00548 } 00549 00550 public boolean isRunning() 00551 { 00552 return (connected && dataThread.isRunning()); 00553 } 00554 00555 /* (non-Javadoc) 00556 * @see org.nees.rbnb.RBNBBase#getParameterNameArray() 00557 */ 00558 public String[] getParameterNameArray() { 00559 return parameterNameArray; 00560 } 00561 00562 /* (non-Javadoc) 00563 * @see org.nees.rbnb.RBNBBase#getParameterTypeArray() 00564 */ 00565 public String[] getParameterTypeArray() { 00566 return parameterTypeArray; 00567 } 00568 00569 /* (non-Javadoc) 00570 * @see org.nees.rbnb.RBNBBase#getParameterDefaultsArray() 00571 */ 00572 public Object[] getParameterDefaultArray() { 00573 return parameterDefaultArray; 00574 } 00575 00576 /* (non-Javadoc) 00577 * @see org.nees.rbnb.RBNBBase#start() 00578 */ 00579 public boolean start() { 00580 if (isRunning()) return false; 00581 if (connected) disconnect(); 00582 setVariablesFromParameters(); 00583 startThread(); 00584 return true; 00585 } 00586 00587 /* (non-Javadoc) 00588 * @see org.nees.rbnb.RBNBBase#stop() 00589 */ 00590 public boolean stop() { 00591 if (!isRunning()) return false; 00592 stopThread(); 00593 disconnect(); 00594 return true; 00595 } 00596 }

Generated on Tue Aug 24 11:12:25 2004 for Data turbine for NEESGrid by doxygen 1.3.7