88package org .epics .pva .client ;
99
1010import java .util .ArrayList ;
11+ import java .util .Arrays ;
1112import java .util .Iterator ;
1213import java .util .List ;
1314import java .util .concurrent .CountDownLatch ;
1718import java .util .logging .Level ;
1819import java .util .logging .LogManager ;
1920import java .util .logging .Logger ;
21+ import java .util .stream .Collectors ;
2022
2123import org .epics .pva .PVASettings ;
2224import org .epics .pva .data .PVAData ;
25+ import org .epics .pva .data .PVAStructure ;
2326
2427/** Command line tool for PVA client
2528 *
@@ -37,9 +40,17 @@ public class PVAClientMain
3740 private static boolean completion = false ;
3841 private static String request = "" ;
3942
43+ /** Commands */
44+ private static enum Cmd
45+ {
46+ info , get , monitor , put , call , beacons
47+ }
48+
4049 private static void help ()
4150 {
42- System .out .println ("USAGE: pvaclient info|get|monitor|put|beacons [options] <PV name>..." );
51+ System .out .println ("USAGE: pvaclient " +
52+ Arrays .stream (Cmd .values ()).map (Object ::toString ).collect (Collectors .joining ("|" )) +
53+ " [options] <PV name>..." );
4354 System .out .println ();
4455 System .out .println ("Options:" );
4556 System .out .println (" -h Help" );
@@ -54,6 +65,7 @@ private static void help()
5465 System .out .println ("get <PV name> Read PV's value" );
5566 System .out .println ("monitor <PV name> Subscribe to PV's value changes" );
5667 System .out .println ("put <PV name> <value> Write value to PV" );
68+ System .out .println ("call <PV name> Call RPC PV (no request params)" );
5769 System .out .println ("beacons Display received beacons" );
5870 }
5971
@@ -240,6 +252,36 @@ private static void put(final String name, final String value) throws Exception
240252 }
241253 }
242254
255+ private static void call (final String name , final PVAStructure request ) throws Exception
256+ {
257+ try (final PVAClient pva = new PVAClient ())
258+ {
259+ final CountDownLatch connected = new CountDownLatch (1 );
260+ final PVAChannel pv = pva .getChannel (name , (ch , state ) ->
261+ {
262+ if (state == ClientChannelState .CONNECTED )
263+ connected .countDown ();
264+ });
265+ final long timeout_ms = Math .round (seconds *1000 );
266+ if (! connected .await (timeout_ms , TimeUnit .MILLISECONDS ))
267+ {
268+ System .err .println ("Timeout waiting for " + name );
269+ return ;
270+ }
271+
272+ try
273+ {
274+ PVAStructure result = pv .invoke (request ).get (timeout_ms , TimeUnit .MILLISECONDS );
275+ System .out .println (result );
276+ }
277+ catch (TimeoutException ex )
278+ {
279+ System .err .println ("Call timed out" );
280+ }
281+ pv .close ();
282+ }
283+ }
284+
243285 /** Watch received beacons
244286 * @throws Exception on error
245287 */
@@ -336,21 +378,27 @@ else if (arg.startsWith("-"))
336378
337379 final String command = names .remove (0 );
338380
339- if (command .equals (" beacons" ) && names .size () == 0 )
381+ if (command .equals (Cmd . beacons . name () ) && names .size () == 0 )
340382 beacons ();
341- else if (command .equals (" info" ) && names .size () > 0 )
383+ else if (command .equals (Cmd . info . name () ) && names .size () > 0 )
342384 info (names );
343- else if (command .equals (" get" ) && names .size () > 0 )
385+ else if (command .equals (Cmd . get . name () ) && names .size () > 0 )
344386 get (names );
345- else if (command .equals (" monitor" ) && names .size () > 0 )
387+ else if (command .equals (Cmd . monitor . name () ) && names .size () > 0 )
346388 monitor (names );
347- else if (command .equals (" put" ) && names .size () == 2 )
389+ else if (command .equals (Cmd . put . name () ) && names .size () == 2 )
348390 {
349391 // By default, write to the 'value' element data structure
350392 if (request .isEmpty ())
351393 request = "value" ;
352394 put (names .get (0 ), names .get (1 ));
353395 }
396+ else if (command .equals (Cmd .call .name ()) && names .size () > 0 )
397+ {
398+ // For now not supporting any request detail from cmdline
399+ PVAStructure request = new PVAStructure ("" , "" );
400+ call (names .get (0 ), request );
401+ }
354402 else
355403 help ();
356404 }
0 commit comments