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;
00024
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;
00074
00095 public static void main(String[] args) {
00096
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();
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
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);
00163 timeOffset = (
long)(value*60.0*60.0);
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
00242
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)));
00292 System.out.println(
"Defalut time: Daylight Savings Time offest (in hours): "
00293 + (-((
double)(dt/1000))/(60.0*60.0)));
00294
00295 timeOffset = - (
double)((tz + dt)/1000);
00296 }
00297
00298
private void connect()
00299 {
00300
00301
00302
try
00303 {
00304 startDaqConnections();
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
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
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
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
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);
00483
00484
00485
double dataArray[] =
new double[1];
00486 dataArray[0] = data;
00487 map.PutDataAsFloat64(index,dataArray);
00488
00489 source.Flush(map);
00490 }
00491 }
00492
00493
public void startThread()
00494 {
00495
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 {
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
00546
try {Thread.sleep(30*1000);}
catch (Exception ignore){}
00547 }
00548 }
00549
00550 public boolean isRunning()
00551 {
00552
return (connected && dataThread.
isRunning());
00553 }
00554
00555
00556
00557
00558 public String[]
getParameterNameArray() {
00559
return parameterNameArray;
00560 }
00561
00562
00563
00564
00565 public String[]
getParameterTypeArray() {
00566
return parameterTypeArray;
00567 }
00568
00569
00570
00571
00572 public Object[]
getParameterDefaultArray() {
00573
return parameterDefaultArray;
00574 }
00575
00576
00577
00578
00579 public boolean start() {
00580
if (isRunning())
return false;
00581
if (connected) disconnect();
00582 setVariablesFromParameters();
00583 startThread();
00584
return true;
00585 }
00586
00587
00588
00589
00590 public boolean stop() {
00591
if (!isRunning())
return false;
00592 stopThread();
00593 disconnect();
00594
return true;
00595 }
00596 }