]> jspc29.x-matter.uni-frankfurt.de Git - hadesdaq.git/commitdiff
added RICH HV tools
authorhadaq@CountingHouse <hadaq@CountingHouse>
Tue, 14 May 2013 15:29:30 +0000 (17:29 +0200)
committerhadaq@CountingHouse <hadaq@CountingHouse>
Tue, 14 May 2013 15:29:30 +0000 (17:29 +0200)
richhv/Perl2Epics.pm [new file with mode: 0644]
richhv/addrow.txt [new file with mode: 0644]
richhv/caput.pl [new file with mode: 0755]
richhv/formfind [new file with mode: 0755]
richhv/rich_tripwatch.pl [new file with mode: 0755]
richhv/rich_tripwatch_jf.pl [new file with mode: 0755]

diff --git a/richhv/Perl2Epics.pm b/richhv/Perl2Epics.pm
new file mode 100644 (file)
index 0000000..15e6018
--- /dev/null
@@ -0,0 +1,186 @@
+package Perl2Epics;
+use warnings;
+use strict;
+use Data::Dumper;
+# use Hmon;
+
+use lib '/home/scs/EPICS/gcc-4.4/EPICS-3.14.12.2_linux-x86_64/base/' . '/lib/perl';
+use CA;
+
+$ENV{EPICS_CA_AUTO_ADDR_LIST} = 'YES';
+$ENV{EPICS_CA_ADDR_LIST} = "192.168.100.11 192.168.100.12 192.168.100.13 192.168.100.14 192.168.100.15 localhost";
+
+
+my $EpicsValues = {};
+my $EpicsStore = {};
+my @EpicsChans = ();
+my  $EpicsNames = {};
+my $errcnt = {};
+
+sub callback {
+    my ($chan, $status, $data) = @_;
+    #print Dumper $data;
+    if ($status) {
+       printf "%-30s %s\n", $chan->name, $status;
+    } 
+    else {
+#       print $chan->name . ": $data->{value}\n";
+#       print scalar @{$EpicsStore->{$chan->name}->{tme}}."\n";
+       if(scalar @{$EpicsStore->{$chan->name}->{tme}} > 10) {
+           shift @{$EpicsStore->{$chan->name}->{tme}};
+           shift @{$EpicsStore->{$chan->name}->{val}};
+        }
+       push(@{$EpicsStore->{$chan->name}->{tme}}, $data->{stamp});
+       push(@{$EpicsStore->{$chan->name}->{val}},  $data->{value});
+       $EpicsValues->{$chan->name}->{tme} = $data->{stamp};
+       $EpicsValues->{$chan->name}->{val}  = $data->{value};
+    }
+}
+
+
+sub Connect {
+    my ($title, $varname, $type, $wait) =  @_;
+    #   push(@EpicsChans,CA->new($name));
+    #   $EpicsChans[-1]->create_subscription('v', \&callback, 'DBR_TIME_DOUBLE');
+    ## print $varname."\n";
+    $type = 'DBR_TIME_DOUBLE' unless defined $type;
+    $EpicsStore->{$varname}->{tme} = [];
+    $EpicsStore->{$varname}->{val} = [];
+    $EpicsNames->{$title} = $varname;
+    $errcnt->{$varname} = 0;
+    my $success;
+    eval {
+       my $c = CA->new($varname);
+       CA->pend_io($wait || 0.05);
+       $c->create_subscription('v', \&callback, $type);
+#     $c->get_callback(\&callback, $type, 1);
+       $EpicsStore->{$varname}->{ca} = $c;
+       $success = $c->is_connected();
+    };
+    #print Dumper $EpicsValues;
+    return ($success);
+}
+
+sub Update {
+    CA->pend_event($_[0]);
+}
+
+
+sub GetAll {
+    my $store = {};
+    my $time;
+    my $val;
+    
+    Update(0.001);
+    
+    foreach my $el (keys %{$EpicsNames}) {
+       my $varname = $EpicsNames->{$el};
+       my $ca = $EpicsStore->{$varname}->{ca};
+       my $r = $ca->is_connected() if(defined $ca);
+       my $success = 1;
+       if(!$r && (!defined $errcnt->{$el} || $errcnt->{$el} < 20)) {
+           $success = Connect($el, $varname);
+           $errcnt->{$el}++;
+       }
+
+       if(!$success) {
+           $time = -1;
+           $val  = 0;
+       } elsif (scalar @{$EpicsStore->{$varname}->{tme}} > 0) {
+           $time = (@{$EpicsStore->{$varname}->{tme}})[-1];
+           $val  = (@{$EpicsStore->{$varname}->{val}})[-1];
+       } else {
+           $time = $EpicsStore->{$varname}->{lasttime};
+           $val  = $EpicsStore->{$varname}->{lastval};
+       }
+       $store->{$el}->{tme} = $time;
+       $store->{$el}->{val}  = $val;
+       $EpicsStore->{$varname}->{lasttime} = $time;
+       $EpicsStore->{$varname}->{lastval}  = $val;
+    }
+    
+    return $store;
+}
+
+sub Get {
+    my ($title,$latest) = @_;
+    my $varname = $EpicsNames->{$title};
+    my $time;
+    my $val;
+#   print $varname;
+
+    my $c = $EpicsStore->{$varname}->{ca};
+    my $r = $c->is_connected() if(defined $c);
+
+    my $success = 1;
+    if(!$r) {
+       $success = Connect($title, $varname);
+    }
+
+    if(!$success) {
+       return (-1, 0);
+    }
+
+    Update(0.00001);
+
+    if (scalar @{$EpicsStore->{$varname}->{tme}} > 0) {
+       if(defined $latest && $latest == 1) {
+           $time = (@{$EpicsStore->{$varname}->{tme}})[-1];
+           $val  = (@{$EpicsStore->{$varname}->{val}})[-1];
+       }
+       else {  #if (scalar @{$EpicsStore->{$varname}->{tme}} > 1)
+           $time = shift  (@{$EpicsStore->{$varname}->{tme}});
+           $val  = shift  (@{$EpicsStore->{$varname}->{val}});
+       }
+    }
+    else {
+       $time = $EpicsStore->{$varname}->{lasttime};
+       $val  = $EpicsStore->{$varname}->{lastval};
+    }
+    $EpicsStore->{$varname}->{lasttime} = $time;
+    $EpicsStore->{$varname}->{lastval}  = $val;
+    $time = $time || -1;
+    $val  = $val || 0;
+    return ($time,$val);
+}
+
+sub Put {
+    my ($title, $value) =  @_;
+    my $varname = $EpicsNames->{$title};
+    if (!defined $varname) {
+       return -1;
+    }
+    
+    my $c = $EpicsStore->{$varname}->{ca};
+    my $r = $c->is_connected() if(defined $c);
+    
+    my $success = 1;
+    if(!$r) {
+       $success = Connect($title, $varname);
+    }
+    
+    if(!$success) {
+       return -2;
+    }
+            
+    if (($c->element_count()) != 1) {
+       print "5\n";
+       return -3;
+    }
+    
+    my $type = $c->field_type;
+    my @values;
+    if ($type !~ m/ ^DBR_STRING$ | ^DBR_ENUM$ /x) {
+       # Make @ARGV strings numeric
+       push (@values, (map { +$_; } $value));
+    } else {
+       # Use strings
+       push (@values, $value);
+    }
+    $c->put(@values);
+    
+    return 0;
+}
+
+1;
+__END__
diff --git a/richhv/addrow.txt b/richhv/addrow.txt
new file mode 100644 (file)
index 0000000..1199cb8
--- /dev/null
@@ -0,0 +1,187 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<title>  Apr7 &lt; RICH &lt; Hades Wiki</title>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<meta name="google-site-verification" content="dbjLrVX1_-lOC8CzUtYiv_Nu0ZDCkceGTM2DjWqtM2A" />
+
+<link rel="alternate" type="application/rss+xml" title="RSS Feed" href="http://hades-wiki.gsi.de/cgi-bin/view/RICH/WebRss?skin=rss&amp;contenttype=text/xml" />
+<base href="http://hades-wiki.gsi.de/cgi-bin/view/RICH/Apr7" />
+<style type="text/css" media="all">
+       /* Default TWiki layout */
+       @import url("http://hades-wiki.gsi.de/pub/TWiki/PatternSkin/layout.css");
+       /* Default TWiki style */
+       @import url("http://hades-wiki.gsi.de/pub/TWiki/PatternSkin/style.css");
+       /* Custom overriding layout per web or per topic */
+       @import url("");
+       /* Custom overriding style per web or per topic */
+       @import url("");
+       @import url("http://hades-wiki.gsi.de/pub/TWiki/JSCalendarContrib/calendar-system.css");
+       .twikiToc li {
+               list-style-image:url(http://hades-wiki.gsi.de/pub/TWiki/PatternSkin/i_arrow_down.gif);
+       }               
+       .twikiWebIndicator {
+               background-color:#7FDFFF;
+       }
+</style>
+<style type="text/css" media="all"></style>
+<script type="text/javascript">
+<!-- HIDE
+
+       function initPage() { }
+-->
+</script>
+<script type="text/javascript" src="http://hades-wiki.gsi.de/pub/TWiki/JSCalendarContrib/calendar.js"></script>
+<!-- Language to use in calendars. The following languages are usually available from the JSCalendarContrib module: af br ca cs da de du el en es fi fr hr hr hu it jp ko ko lt lt nl no pl pl-utf8 pt ro ru si sk sp sv tr zh -->
+<script type="text/javascript" src="http://hades-wiki.gsi.de/pub/TWiki/JSCalendarContrib/lang/calendar-de.js"></script>
+
+</head>
+<body class="twikiViewPage" onload="initPage()"><a name="PageTop"></a>
+<div class="twikiHidden"><a href="?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b#Content">Skip to topic</a> | <a href="?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b#PageBottom">Skip to bottom</a><hr /></div><div class="twikiTopBar"><div class="twikiTopBarContents"><form name="top" action="/cgi-bin/view/RICH/Apr7">
+<input type="hidden" name="CGISESSID" value="001ebab3a3dda66197b9b2232214db2b" />
+<input type="hidden" name="CGISESSID" value="001ebab3a3dda66197b9b2232214db2b" /> <div class="twikiLeft">
+<a href="http://www-hades.gsi.de" rel="nofollow"><img src="http://hades-wiki.gsi.de/pub/Collaboration/HadesLogos/hades_wiki_logo_pattern_skin.gif" border="0" alt="Home"/></a>
+</div>
+<div class="twikiRight twikiSearchBox">
+<table border="0" cellpadding="0" cellspacing="0">
+<tr>
+<td><label for="go">Jump: </label><input type="text" id="go" name="topic" size="16" /></td>
+</tr>
+</table>
+</div>
+</form></div></div><div class="twikiMiddleContainer"><div class="twikiLeftBar"><div class="twikiWebIndicator"><b>RICH</b></div>
+<div class="twikiLeftBarContents"><form name="main" action="/cgi-bin/view/RICH/Apr7">
+<input type="hidden" name="CGISESSID" value="001ebab3a3dda66197b9b2232214db2b" />
+<input type="hidden" name="CGISESSID" value="001ebab3a3dda66197b9b2232214db2b" /> 
+<div class="twikiLeftBarPersonal" style="margin-top:0;">
+Hello <a class="twikiLink" href="/cgi-bin/view/Main/LudwigMaier?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">LudwigMaier</a> !
+<div id="twikiLeftBarPersonalContent">
+<a href="/cgi-bin/edit/Homepages/LeftBarLudwigMaier?templatetopic=TWiki.WebLeftBarPersonalTemplate&amp;topicparent=Main.LudwigMaier&amp;CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Create</a> personal sidebar
+</div>
+</div>
+<br />
+<p />
+<strong>RICH Web</strong> <br />
+<a class="twikiLink" href="/cgi-bin/view/RICH/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Web Home</a> <span class="twikiSeparator">|</span> <a class="twikiLink" href="/cgi-bin/view/RICH/WebSearch?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Search</a> <br />
+<a class="twikiLink" href="/cgi-bin/view/RICH/WebTopicList?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Topics List</a> <span class="twikiSeparator">|</span> <a class="twikiLink" href="/cgi-bin/view/RICH/WebIndex?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Index</a> <br />
+<a class="twikiLink" href="/cgi-bin/view/RICH/WebChanges?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Changes</a> <span class="twikiSeparator">|</span> <a class="twikiLink" href="/cgi-bin/view/RICH/WebNotify?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Notifications</a> <br />
+<p />
+<p />
+<hr />
+<p />
+<strong>Hades Wiki Webs</strong>
+<ul>
+<li> <a class="twikiLink" href="/cgi-bin/view/BeamDetectors/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">BeamDetectors</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Collaboration/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Collaboration</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Computing/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Computing</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/DaqSlowControl/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">DaqSlowControl</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Homepages/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Homepages</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/KnowledgeBase/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">KnowledgeBase</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/MDC/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">MDC</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Magnet/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Magnet</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Main/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Main</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Meetings/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Meetings</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Physics/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Physics</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Public/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Public</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/RICH/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">RICH</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/RPC/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">RPC</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Sandbox/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Sandbox</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Shower/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Shower</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/SimAna/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">SimAna</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/TOF/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">TOF</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/TWiki/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">TWiki</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/TechBoard/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">TechBoard</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/TechnicalIssues/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">TechnicalIssues</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Trigger/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Trigger</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Wall/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Wall</a>
+</li>
+</ul>
+<p />
+<hr />
+<p />
+<div class="twikiSmall"><a href="http://hades-wiki.gsi.de/cgi-bin/edit/TWiki/WebLeftBar?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b" target="_top">edit WebLeftBar</a></div>
+<p />
+</form></div></div><div class="twikiMain"><div class="twikiToolBar"><div>
+<ul>
+<li> <a href="/cgi-bin/edit/RICH/Apr7?t=1333835507&amp;CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b"><b>Edit</b></a>
+</li>
+<li> <a href="/cgi-bin/attach/RICH/Apr7?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Attach</a>
+</li>
+<li> <a href="/cgi-bin/view/RICH/Apr7?skin=print.pattern&amp;CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Printable</a>
+</li>
+</ul>
+</div><div class="twikiRevInfo"><span class="twikiGrayText"><a class="twikiToolbarElem" href="/cgi-bin/view/RICH/Apr7?rev=1.7&amp;CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b" title="Permanent link to this topic revision">RICH.Apr7</a><span class="twikiToolbarElem">r1.7 - 07 Apr 2012 - 22:43 - <a class="twikiLink" href="/cgi-bin/view/Main/JohannesSiebenson?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">JohannesSiebenson</a></span><span class="twikiToolbarElem"><a href="?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b#TopicEnd">topic&nbsp;end</a></span></span></div></div>
+<div class="twikiHidden"><hr /></div><a name="Content"> </a><div class="twikiHidden">Start of topic | <a href="?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b#Actions">Skip to actions</a><hr /></div>
+<div class="twikiTopic">
+<h1><a name="7_Apr_Trips"> </a> 7 Apr Trips </h1>
+<p />
+<a name="edittable1"></a>
+<form name="edittable1" action="http://hades-wiki.gsi.de/cgi-bin/viewauth/RICH/Apr7#edittable1" method="post">
+<input type="hidden" name="ettablenr" value="1" />
+<input type="hidden" name="etedit" value="on" />
+<table border="1" cellspacing="1" cellpadding="0">
+<tr><th class="twikiFirstCol" bgcolor="#99CCCC"> <strong>entry #</strong> </th><td bgcolor="#FFFFCC"> day_month_time </td><td bgcolor="#FFFFCC"> S1 </td><td bgcolor="#FFFFCC"> S2 </td><td bgcolor="#FFFFCC"> S3 </td><td bgcolor="#FFFFCC"> S4 </td><td bgcolor="#FFFFCC"> S5 </td><td bgcolor="#FFFFCC"> S6 </td><td bgcolor="#FFFFCC"> Comment </td><td bgcolor="#FFFFCC"> Sign </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFFF"> 1 </td><td bgcolor="#FFFFFF"> 07 Apr 00:00 </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2300 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> nom. voltages </td><td bgcolor="#FFFFFF"> JF </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFCC"> 2 </td><td bgcolor="#FFFFCC"> 07 Apr 02:42 </td><td bgcolor="#FFFFCC"> 2000 V </td><td bgcolor="#FFFFCC"> 2000 V </td><td bgcolor="#FFFFCC"> 2000 V </td><td bgcolor="#FFFFCC"> 2000 V </td><td bgcolor="#FFFFCC"> 2000 V </td><td bgcolor="#FFFFCC"> 2000 V </td><td bgcolor="#FFFFCC"> safe voltages <br/> no beam till at least 12 pm, <br/> end shift now </td><td bgcolor="#FFFFCC"> LM </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFFF"> 3 </td><td bgcolor="#FFFFFF"> 07 Apr 08:58 </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2300 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> nom voltages <br/> conditioning in longer beam breaks </td><td bgcolor="#FFFFFF"> JF </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFCC"> 4 </td><td bgcolor="#FFFFCC"> 07 Apr 14:12 </td><td bgcolor="#FFFFCC"> &nbsp; </td><td bgcolor="#FFFFCC"> &nbsp; </td><td bgcolor="#FFFFCC"> &nbsp; </td><td bgcolor="#FFFFCC"> 2400 V </td><td bgcolor="#FFFFCC"> &nbsp; </td><td bgcolor="#FFFFCC"> &nbsp; </td><td bgcolor="#FFFFCC"> condit. </td><td bgcolor="#FFFFCC"> LM </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFFF"> 5 </td><td bgcolor="#FFFFFF"> 07 Apr 14:30 </td><td bgcolor="#FFFFFF"> &nbsp; </td><td bgcolor="#FFFFFF"> &nbsp; </td><td bgcolor="#FFFFFF"> &nbsp; </td><td bgcolor="#FFFFFF"> 2450 V </td><td bgcolor="#FFFFFF"> &nbsp; </td><td bgcolor="#FFFFFF"> &nbsp; </td><td bgcolor="#FFFFFF"> condit. </td><td bgcolor="#FFFFFF"> LM </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFCC"> 6 </td><td bgcolor="#FFFFCC"> 07 Apr 14:35 </td><td bgcolor="#FFFFCC"> &nbsp; </td><td bgcolor="#FFFFCC"> &nbsp; </td><td bgcolor="#FFFFCC"> 2450 V </td><td bgcolor="#FFFFCC"> &nbsp; </td><td bgcolor="#FFFFCC"> &nbsp; </td><td bgcolor="#FFFFCC"> &nbsp; </td><td bgcolor="#FFFFCC"> condit. </td><td bgcolor="#FFFFCC"> LM </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFFF"> 7 </td><td bgcolor="#FFFFFF"> 07 Apr 19:37 </td><td bgcolor="#FFFFFF"> 1900 V </td><td bgcolor="#FFFFFF"> 1900 V </td><td bgcolor="#FFFFFF"> 1900 V </td><td bgcolor="#FFFFFF"> 1900 V </td><td bgcolor="#FFFFFF"> 1900 V </td><td bgcolor="#FFFFFF"> 1900 V </td><td bgcolor="#FFFFFF"> Beam is back, first be careful </td><td bgcolor="#FFFFFF"> LM </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFCC"> 8 </td><td bgcolor="#FFFFCC"> 07 Apr 19:49 </td><td bgcolor="#FFFFCC"> 2200 V </td><td bgcolor="#FFFFCC"> 2200 V </td><td bgcolor="#FFFFCC"> 2200 V </td><td bgcolor="#FFFFCC"> 2200 V </td><td bgcolor="#FFFFCC"> 2200 V </td><td bgcolor="#FFFFCC"> 2200 V </td><td bgcolor="#FFFFCC"> &nbsp; </td><td bgcolor="#FFFFCC"> LM </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFFF"> 9 </td><td bgcolor="#FFFFFF"> 07 Apr 19:54 </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2250 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> &nbsp; </td><td bgcolor="#FFFFFF"> LM </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFCC"> 10 </td><td bgcolor="#FFFFCC"> 07 Apr 22:38 </td><td bgcolor="#FFFFCC"> &nbsp; </td><td bgcolor="#FFFFCC"> &nbsp; </td><td bgcolor="#FFFFCC"> &nbsp; </td><td bgcolor="#FFFFCC"> <img src="http://hades-wiki.gsi.de/pub/TWiki/SmiliesPlugin/frown.gif" alt="frown" title="frown" border="0" /> <img src="http://hades-wiki.gsi.de/pub/TWiki/SmiliesPlugin/frown.gif" alt="frown" title="frown" border="0" /> ... </td><td bgcolor="#FFFFCC"> &nbsp; </td><td bgcolor="#FFFFCC"> &nbsp; </td><td bgcolor="#FFFFCC"> since 9pm seven trips in S4 </td><td bgcolor="#FFFFCC"> JS </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFFF"> 11 </td><td bgcolor="#FFFFFF"> 07 Apr 23:12 </td><td bgcolor="#FFFFFF"> &nbsp; </td><td bgcolor="#FFFFFF"> &nbsp; </td><td bgcolor="#FFFFFF"> &nbsp; </td><td bgcolor="#FFFFFF"> <img src="http://hades-wiki.gsi.de/pub/TWiki/SmiliesPlugin/frown.gif" alt="frown" title="frown" border="0" /> </td><td bgcolor="#FFFFFF"> &nbsp; </td><td bgcolor="#FFFFFF"> &nbsp; </td><td bgcolor="#FFFFFF"> &nbsp; </td><td bgcolor="#FFFFFF"> &nbsp; </td></tr>
+</table>
+<input type="hidden" name="etrows"   value="12" />
+<input type="image" src="http://hades-wiki.gsi.de/pub/TWiki/EditTablePlugin/edittable.gif" alt="Edit this table" /></form>
+<p />
+-- <a class="twikiLink" href="/cgi-bin/view/Main/JuergenFriese?CGISESSID=001ebab3a3dda66197b9b2232214db2b">JuergenFriese</a> - 02 Apr 2012
+<br class="twikiClear" />
+<a name="TopicEnd"></a>
+<span class="twikiRight twikiPageNav twikiGrayText"><a href="?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b#PageTop">to&nbsp;top</a></span><br class="twikiClear" />
+</div><div class="twikiHidden"><hr />End of topic<br /><a href="?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b#Actions">Skip to action links</a> | <a href="?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b#PageTop">Back&nbsp;to&nbsp;top</a><hr /></div>
+<!---->
+<!---->
+<a name="Actions"> </a><span class="twikiHidden"><br /></span><div class="twikiTopicAction">
+<a href="/cgi-bin/edit/RICH/Apr7?t=1333835507&amp;CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b"><b>Edit</b></a> 
+<span class="twikiSeparator">|</span> <a href="/cgi-bin/attach/RICH/Apr7?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Attach image or document</a> 
+<span class="twikiSeparator">|</span> <a href="/cgi-bin/view/RICH/Apr7?skin=print.pattern&amp;CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Printable version</a> 
+[<a href="/cgi-bin/genpdf/RICH/Apr7?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">PDF</a>]
+<span class="twikiSeparator">|</span> <a href="/cgi-bin/view/RICH/Apr7?raw=on&amp;CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Raw text</a> 
+<span class="twikiSeparator">|</span> <a href="/cgi-bin/oops/RICH/Apr7?template=oopsmore&amp;param1=1.7&amp;param2=1.7&amp;CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">More topic actions</a>
+<br />Revisions:  | r1.7 | <a href="/cgi-bin/rdiff/RICH/Apr7?rev1=1.7&amp;rev2=1.6&amp;CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">&gt;</a> | <a href="/cgi-bin/view/RICH/Apr7?rev=1.6&amp;CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">r1.6</a> | <a href="/cgi-bin/rdiff/RICH/Apr7?rev1=1.6&amp;rev2=1.5&amp;CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">&gt;</a> | <a href="/cgi-bin/view/RICH/Apr7?rev=1.5&amp;CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">r1.5</a> 
+<span class="twikiSeparator">|</span> <a href="/cgi-bin/rdiff/RICH/Apr7?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Total page history</a> 
+<span class="twikiSeparator">|</span> <a href="/cgi-bin/search/RICH/SearchResult?scope=text&amp;regex=on&amp;excludetopic=Apr7&amp;search=Apr%20*7%5B%5EA-Za-z0-9%5D&amp;CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Backlinks</a>
+<span class="twikiSeparator">|</span> <a target="wikigraph" onClick="open('/cgi-bin/view/RICH/Apr7?skin=tglaunch', 'wikigraph', 'titlebar=0,width=600,height=600,resizable,scrollbars'); return false" href="/cgi-bin/view/RICH/Apr7?skin=tglaunch title=&amp;CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b"The topology of the topics in this web (java applet)">Graph</a> 
+</div>
+<div class="twikiTopicInfo twikiRevInfo twikiGrayText twikiMoved"></div>
+<div class="twikiTopicFooter"><span class="twikiLeft"><span class="twikiHomePath">You are here: <a class="twikiLink" href="/cgi-bin/view/RICH/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">RICH</a>  <span class='twikiSeparator'>&gt;</span> <a class="twikiLink" href="/cgi-bin/view/RICH/Apr12HighVoltageTrips?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Apr12HighVoltageTrips</a> <span class='twikiSeparator'>&gt;</span> Apr7 </span></span><span class="twikiHidden"><br /><br /></span><span class="twikiRight twikiPageNav twikiGrayText"><a href="?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b#PageTop">to&nbsp;top</a></span><br class="twikiClear" /><span class="twikiHidden"><br /></span></div>
+<a name="PageBottom"></a> </div></div><div class="twikiBottomBar"><div class="twikiBottomBarContents"><span class="twikiGrayText">Copyright &copy; 1999-2012 by the contributing authors. 
+All material on this collaboration platform is the property of the contributing authors. <br /> 
+Ideas, requests, problems regarding Hades Wiki? <a href="mailto:wiki-admin@gsi.de?subject=Hades Wiki&#32;Feedback&#32;on&#32;TWiki.WebBottomBar">Send feedback</a>
+</span></div></div>
+</body></html>
\ No newline at end of file
diff --git a/richhv/caput.pl b/richhv/caput.pl
new file mode 100755 (executable)
index 0000000..514fe17
--- /dev/null
@@ -0,0 +1,188 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+use Data::Dumper;
+# use Hmon;
+
+use lib '/home/scs/EPICS/gcc-4.4/EPICS-3.14.12.2_linux-x86_64/base/' . '/lib/perl';
+
+use Getopt::Std;
+use CA;
+$ENV{EPICS_CA_AUTO_ADDR_LIST} = 'YES';
+$ENV{EPICS_CA_ADDR_LIST} = "192.168.100.11 192.168.100.12 192.168.100.13 192.168.100.14 192.168.100.15 localhost";
+
+our ($opt_0, $opt_c, $opt_e, $opt_f, $opt_g, $opt_h, $opt_l,
+    $opt_n, $opt_s, $opt_t);
+our $opt_w = 1;
+
+$Getopt::Std::OUTPUT_HELP_VERSION = 1;
+
+HELP_MESSAGE() unless getopts('achlnstw:');
+HELP_MESSAGE() if $opt_h;
+
+die "No pv name specified. ('caput -h' gives help.)\n"
+    unless @ARGV;
+my $pv = shift;
+
+die "No value specified. ('caput -h' gives help.)\n"
+    unless @ARGV;
+
+my $chan = CA->new($pv);
+eval {
+    CA->pend_io($opt_w);
+};
+if ($@) {
+    if ($@ =~ m/^ECA_TIMEOUT/) {
+        print "Channel connect timed out: '$pv' not found.\n";
+        exit 2;
+    } else {
+        die $@;
+    }
+}
+
+die "Write access denied for '$pv'.\n" unless $chan->write_access;
+
+my $n = $chan->element_count();
+die "Too many values given, '$pv' limit is $n\n"
+    unless $n >= @ARGV;
+
+my $type = $chan->field_type;
+$type = 'DBR_STRING'
+    if $opt_s && $type =~ m/ ^DBR_ENUM$ | ^DBR_FLOAT$ | ^DBR_DOUBLE$ /x;
+$type = 'DBR_LONG'
+    if $opt_n && $type eq 'DBR_ENUM';
+$type =~ s/^DBR_/DBR_TIME_/
+    if $opt_l;
+
+my @values;
+if ($type !~ m/ ^DBR_STRING$ | ^DBR_ENUM$ /x) {
+    # Make @ARGV strings numeric
+    @values = map { +$_; } @ARGV;
+} else {
+    # Use strings
+    @values = @ARGV;
+}
+
+my $done = 0;
+if ($opt_t) {
+    do_put();
+} else {
+    $chan->get_callback(\&old_callback, $type);
+}
+CA->pend_event(0.1) until $done;
+
+
+sub old_callback {
+    my ($chan, $status, $data) = @_;
+    die $status if $status;
+    display($chan, $type, $data, 'Old');
+    do_put();
+}
+
+sub do_put {
+    if ($opt_c) {
+        $chan->put_callback(\&put_callback, @values);
+    } else {
+        $chan->put(@values);
+        $chan->get_callback(\&new_callback, $type);
+    }
+}
+
+sub put_callback {
+    my ($chan, $status) = @_;
+    die $status if $status;
+    $chan->get_callback(\&new_callback, $type);
+}
+
+sub new_callback {
+    my ($chan, $status, $data) = @_;
+    die $status if $status;
+    display($chan, $type, $data, 'New');
+    $done = 1;
+}
+
+sub format_number {
+    my ($data, $type) = @_;
+    if ($type =~ m/_DOUBLE$/) {
+        return sprintf "%.${opt_e}e", $data if $opt_e;
+        return sprintf "%.${opt_f}f", $data if $opt_f;
+        return sprintf "%.${opt_g}g", $data if $opt_g;
+    }
+    if ($type =~ m/_LONG$/) {
+        return sprintf "%lx", $data if $opt_0 eq 'x';
+        return sprintf "%lo", $data if $opt_0 eq 'o';
+        if ($opt_0 eq 'b') {
+            my $bin = unpack "B*", pack "l", $data;
+            $bin =~ s/^0*//;
+            return $bin;
+        }
+    }
+    return $data;
+}
+
+sub display {
+    my ($chan, $type, $data, $prefix) = @_;
+    if (ref $data eq 'ARRAY') {
+        display($chan, $type, join(' ', @{$data}), $prefix);
+    } elsif (ref $data eq 'HASH') {
+        $type = $data->{TYPE};  # Can differ from request
+        my $value = $data->{value};
+        if (ref $value eq 'ARRAY') {
+            $value = join(' ', map { format_number($_, $type); } @{$value});
+        } else {
+            $value = format_number($value, $type);
+        }
+        my $stamp;
+        if (exists $data->{stamp}) {
+            my @t = localtime $data->{stamp};
+            splice @t, 6;
+            $t[5] += 1900;
+            $t[0] += $data->{stamp_fraction};
+            $stamp = sprintf "%4d-%02d-%02d %02d:%02d:%09.6f", reverse @t;
+        }
+        printf "%-30s %s %s %s %s\n", $chan->name,
+            $stamp, $value, $data->{status}, $data->{severity};
+    } else {
+        my $value = format_number($data, $type);
+        if ($opt_t) {
+            print "$value\n";
+        } else {
+            printf "$prefix : %-30s %s\n", $chan->name, $value;
+        }
+    }
+}
+
+sub HELP_MESSAGE {
+    print STDERR "\nUsage: caput [options] <PV name> <PV value> ...\n",
+        "\n",
+        "  -h: Help: Print this message\n",
+        "Channel Access options:\n",
+        "  -w <sec>:  Wait time, specifies longer CA timeout, default is $opt_w second\n",
+        "  -c: Use put_callback to wait for completion\n",
+        "Format options:\n",
+        "  -t: Terse mode - print only sucessfully written value, without name\n",
+        "  -l: Long mode \"name timestamp value stat sevr\" (read PVs as DBR_TIME_xxx)\n",
+        "Enum format:\n",
+        "  Default: Auto - try value as ENUM string, then as index number\n",
+        "  -n: Force interpretation of values as numbers\n",
+        "  -s: Force interpretation of values as strings\n",
+        "Floating point type format:\n",
+        "  Default: Use %g format\n",
+        "  -e <nr>: Use %e format, with a precision of <nr> digits\n",
+        "  -f <nr>: Use %f format, with a precision of <nr> digits\n",
+        "  -g <nr>: Use %g format, with a precision of <nr> digits\n",
+        "  -s:      Get value as string (may honour server-side precision)\n",
+        "Integer number format:\n",
+        "  Default: Print as decimal number\n",
+        "  -0x: Print as hex number\n",
+        "  -0o: Print as octal number\n",
+        "  -0b: Print as binary number\n",
+        "\n",
+        "Examples:\n",
+        "    caput my_channel 1.2\n",
+        "    caput my_waveform 1.2 2.4 3.6 4.8 6.0\n",
+        "\n";
+    exit 1;
+}
+
diff --git a/richhv/formfind b/richhv/formfind
new file mode 100755 (executable)
index 0000000..3ca8ea4
--- /dev/null
@@ -0,0 +1,193 @@
+#!/usr/bin/env perl
+#
+# formfind.pl
+#
+# This script gets a HTML page on stdin and presents form information on
+# stdout.
+#
+# Author: Daniel Stenberg <daniel@haxx.se>
+# Version: 0.2 Nov 18, 2002
+#
+# HISTORY
+#
+# 0.1 - Nov 12 1998 - Created now!
+# 0.2 - Nov 18 2002 - Enhanced. Removed URL support, use only stdin.
+#
+
+$in="";
+
+if($ARGV[0] eq "-h") {
+    print  "Usage: $0 < HTML\n";
+    exit;
+}
+
+sub namevalue {
+    my ($tag)=@_;
+    my $name=$tag;
+    if($name =~ /name *=/i) {
+        if($name =~ /name *= *([^\"\']([^ \">]*))/i) {
+            $name = $1;
+        }
+        elsif($name =~ /name *= *(\"|\')([^\"\']*)(\"|\')/i) {
+            $name=$2;
+        }
+        else {
+            # there is a tag but we didn't find the contents
+            $name="[weird]";
+        }
+
+    }
+    else {
+        # no name given
+        $name="";
+    }
+    # get value tag
+    my $value= $tag;
+    if($value =~ /[^\.a-zA-Z0-9]value *=/i) {
+        if($value =~ /[^\.a-zA-Z0-9]value *= *([^\"\']([^ \">]*))/i) {
+            $value = $1;
+        }
+        elsif($value =~ /[^\.a-zA-Z0-9]value *= *(\"|\')([^\"\']*)(\"|\')/i) {
+            $value=$2;
+        }
+        else {
+            # there is a tag but we didn't find the contents
+            $value="[weird]";
+        }
+    }
+    else {
+        $value="";
+    }
+    return ($name, $value);
+}
+
+
+while(<STDIN>) {
+    $line = $_;
+    push @indoc, $line;
+    $line=~ s/\n//g;
+    $line=~ s/\r//g;
+    $in=$in.$line;
+}
+
+while($in =~ /[^<]*(<[^>]+>)/g ) {
+    # we have a tag in $1
+    $tag = $1;
+
+    if($tag =~ /^<!--/) {
+        # this is a comment tag, ignore it
+    }
+    else {
+        if(!$form &&
+           ($tag =~ /^< *form/i )) {
+            $method= $tag;
+            if($method =~ /method *=/i) {
+                $method=~ s/.*method *= *(\"|)([^ \">]*).*/$2/gi;
+            }
+            else {
+                $method="get"; # default method
+            }
+            $action= $tag;
+            $action=~ s/.*action *= *(\'|\"|)([^ \"\'>]*).*/$2/gi;
+
+            $method=uc($method);
+
+            $enctype=$tag;
+            if ($enctype =~ /enctype *=/) {
+                $enctype=~ s/.*enctype *= *(\'|\"|)([^ \"\'>]*).*/$2/gi;
+
+                if($enctype eq "multipart/form-data") {
+                    $enctype="multipart form upload [use -F]"
+                }
+                $enctype = "\n--- type: $enctype";
+            }
+            else {
+                $enctype="";
+            }
+
+            print "--- FORM report. Uses $method to URL \"$action\"$enctype\n";
+            $form=1;
+        }
+        elsif($form &&
+              ($tag =~ /< *\/form/i )) {
+
+            print "--- end of FORM\n";
+            $form=0;
+            if( 0 ) {
+                print "*** Fill in all or any of these: (default assigns may be shown)\n";
+                for(@vars) {
+                    $var = $_;
+                    $def = $value{$var};
+                    print "$var=$def\n";
+                }
+                print "*** Pick one of these:\n";
+                for(@alts) {
+                    print "$_\n";
+                }
+            }
+            undef @vars;
+            undef @alts;
+        }
+        elsif($form &&
+              ($tag =~ /^< *(input|select)/i)) {
+            $mtag = $1;
+
+            ($name, $value)=namevalue($tag);
+
+            if($mtag =~ /select/i) {
+                print "Select: NAME=\"$name\"\n";
+                push @vars, "$name";
+                $select = 1;
+            }
+            else {
+                $type=$tag;
+                if($type =~ /type *=/i) {
+                    $type =~ s/.*type *= *(\'|\"|)([^ \"\'>]*).*/$2/gi;
+                }
+                else {
+                    $type="text"; # default type
+                }
+                $type=uc($type);
+                if(lc($type) eq "reset") {
+                    # reset types are for UI only, ignore.
+                }
+                elsif($name eq "") {
+                    # let's read the value parameter
+
+                    print "Button: \"$value\" ($type)\n";
+                    push @alts, "$value";
+                }
+                else {
+                    print "Input: NAME=\"$name\"";
+                    if($value ne "") {
+                        print " VALUE=\"$value\"";
+                    }
+                    print " ($type)\n";
+                    push @vars, "$name";
+                    # store default value:
+                    $value{$name}=$value;
+                }
+            }
+        }
+        elsif($form &&
+              ($tag =~ /^< *textarea/i)) {
+            my ($name, $value)=namevalue($tag);
+
+            print "Textarea: NAME=\"$name\"\n";
+        }
+        elsif($select) {
+            if($tag =~ /^< *\/ *select/i) {
+                print "[end of select]\n";
+                $select = 0;
+            }
+            elsif($tag =~ /[^\/] *option/i ) {
+                my ($name, $value)=namevalue($tag);
+                my $s;
+                if($tag =~ /selected/i) {
+                    $s= " (SELECTED)";
+                }
+                print "  Option VALUE=\"$value\"$s\n";
+            }
+        }
+    }
+}
diff --git a/richhv/rich_tripwatch.pl b/richhv/rich_tripwatch.pl
new file mode 100755 (executable)
index 0000000..a2aaf41
--- /dev/null
@@ -0,0 +1,127 @@
+#!/usr/bin/perl -w
+
+use warnings;
+use strict;
+use Time::HiRes qw( gettimeofday usleep time );
+use feature qw/switch/;
+use Data::Dumper;
+use Perl2Epics;
+
+#Trip-States
+use constant {
+    IDLE => 1,
+    WAIT_HV_DOWN => 2,
+    WAIT => 3,
+    HV_ON => 4,
+    RESET => 5
+};
+my $tripState = IDLE;
+my $tripCtr = 0;
+my $tripTime = 0;
+
+my $caput = "/home/scs/epics/base-3.14.10/bin/linux-x86/caput";
+my $button_4 = "HAD:RICH:HV:PS:C3:pwonoff";
+
+#For Read
+Perl2Epics::Connect("VMON_4", "HAD:RICH:HV:PS:C3:vmon");
+Perl2Epics::Connect("IMON_4", "HAD:RICH:HV:PS:C3:imon");
+Perl2Epics::Connect("TRIPS_4", "HAD:RICH:HV:PS:TRIPCOUNT_C3");
+Perl2Epics::Connect("VMON_SET_4", "HAD:RICH:HV:PS:C3:v0set:fbk");
+Perl2Epics::Connect("STATUS_4", "HAD:RICH:HV:PS:C3:status", "DBR_TIME_ENUM");
+# For write
+Perl2Epics::Connect("HV_BUTTON", "HAD:RICH:HV:PS:C3:pwonoff", "DBR_TIME_ENUM");
+
+my $numVariables = 6;
+my $aliveCtr = 0;
+my %lastValue;
+
+while (1) {
+    sleep(1);
+    $tripTime++ unless ($tripCtr == 0);
+    my $value = Perl2Epics::GetAll();
+    #print Dumper $value;
+    if (keys %$value != $numVariables) {
+       print STDERR "Incomplete Epics List\n";
+       next;
+    }
+    
+    my @changed;
+    foreach my $key (keys %$value) {
+       if (defined $value->{$key} && defined $lastValue{$key}) {  
+           if ($value->{$key}->{'tme'} != $lastValue{$key}->{'tme'}) {
+               push(@changed, $key); 
+               #print "$key:  V: $value->{$key}->{'val'}" .   
+               #    "  T: $value->{$key}->{'tme'} \n";
+           }
+        }
+    }
+    
+    %lastValue = %$value;    
+#    print Dumper @changed;
+    
+    given ($tripState) {
+       when (IDLE) {   
+            # Wait for a new Trip:
+           if (($value->{'STATUS_4'}->{'val'} =~ "Internal Trip") && 
+               ($value->{'TRIPS_4'}->{'val'} >= 5 )) {
+               $tripState = WAIT_HV_DOWN;
+               $tripCtr++;
+               print "Trip #$tripCtr detected on Sector #4 @ ".
+                   localtime."\n";
+               if (($tripTime < 180) && ($tripCtr > 1)) {
+                   die "giving up, Time since last Trip: $tripTime below 3min";
+               }
+               $tripTime = 0;
+           } else {
+               $aliveCtr++;
+               if ($aliveCtr > 30) {
+                   $aliveCtr = 0;
+                   print "Status O.K., ".localtime.
+                       " TripCtr: $tripCtr  Time since last ramp up: $tripTime\n";
+               }
+           }
+       }
+       
+       when (WAIT_HV_DOWN) {
+           if (($value->{'STATUS_4'}->{'val'} =~ "Internal Trip") && 
+               ($value->{'TRIPS_4'}->{'val'} >= 5 )) {
+               if (($value->{'VMON_4'}->{'val'} < 10) && 
+                   ($value->{'IMON_4'}->{'val'} < 0.01)) {
+                   $tripState = WAIT;
+                   print "HV is down\n";
+               } else {
+                   print "Waiting for HV Down: ".
+                       "VMON_4: ".$value->{'VMON_4'}->{'val'}.
+                       " IMON_4: ".$value->{'IMON_4'}->{'val'}.
+                       "\n";
+               }
+           } else {
+               # Status changed, abort TripMachine
+               $tripState = IDLE;
+               print "State changed, aborting, go to IDLE again\n";
+           }
+       }
+       
+       when (WAIT) {
+           print "Wait another 240 seconds\n";
+           sleep(240);
+           $tripState = HV_ON;
+       }
+       
+       when (HV_ON) {
+           print "Turn HV on again\n";
+           Perl2Epics::Put("HV_BUTTON", "On");
+           $tripState = RESET; 
+       }
+       
+       when (RESET) {
+            sleep(10);
+           print "Done, waiting for next trip #".($tripCtr + 1)."\n\n";
+           $tripState = IDLE;
+       }
+       
+       default {
+           die "Invalid TripState, aborting process";
+       }
+    } 
+}
diff --git a/richhv/rich_tripwatch_jf.pl b/richhv/rich_tripwatch_jf.pl
new file mode 100755 (executable)
index 0000000..db492ce
--- /dev/null
@@ -0,0 +1,141 @@
+#!/usr/bin/perl -w
+
+use warnings;
+use strict;
+use Time::HiRes qw( gettimeofday usleep time );
+use feature qw/switch/;
+use Data::Dumper;
+use Perl2Epics;
+
+#Trip-States
+use constant {
+    IDLE => 1,
+    WAIT_HV_DOWN => 2,
+    WAIT => 3,
+    HV_OFF => 4,
+    HV_ON => 5,
+    RESET => 6
+};
+my $tripState = IDLE;
+my $tripCtr = 0;
+my $tripTime = 0;
+
+my $caput = "/home/scs/epics/base-3.14.10/bin/linux-x86/caput";
+my $button_4 = "HAD:RICH:HV:PS:C3:pwonoff";
+
+#For Read
+Perl2Epics::Connect("VMON_4", "HAD:RICH:HV:PS:C3:vmon");
+Perl2Epics::Connect("IMON_4", "HAD:RICH:HV:PS:C3:imon");
+Perl2Epics::Connect("TRIPS_4", "HAD:RICH:HV:PS:TRIPCOUNT_C3");
+Perl2Epics::Connect("VMON_SET_4", "HAD:RICH:HV:PS:C3:v0set:fbk");
+Perl2Epics::Connect("STATUS_4", "HAD:RICH:HV:PS:C3:status", "DBR_TIME_ENUM");
+# For write
+Perl2Epics::Connect("HV_BUTTON", "HAD:RICH:HV:PS:C3:pwonoff", "DBR_TIME_ENUM");
+
+my $numVariables = 6;
+my $aliveCtr = 0;
+my %lastValue;
+
+while (1) {
+    sleep(1);
+    $tripTime++ unless ($tripCtr == 0);
+    my $value = Perl2Epics::GetAll();
+    #print Dumper $value;
+    if (keys %$value != $numVariables) {
+       print STDERR "Incomplete Epics List\n";
+       next;
+    }
+    
+    my @changed;
+    foreach my $key (keys %$value) {
+       if (defined $value->{$key} && defined $lastValue{$key}) {  
+           if ($value->{$key}->{'tme'} != $lastValue{$key}->{'tme'}) {
+               push(@changed, $key); 
+               #print "$key:  V: $value->{$key}->{'val'}" .   
+               #    "  T: $value->{$key}->{'tme'} \n";
+           }
+        }
+    }
+    
+    %lastValue = %$value;    
+#    print Dumper @changed;
+    
+    given ($tripState) {
+       when (IDLE) {   
+            # Wait for a new Trip:
+           if (($value->{'STATUS_4'}->{'val'} =~ "Internal Trip") 
+#               && 
+#               ($value->{'TRIPS_4'}->{'val'} >= 5 )) ||
+               ) {
+               $tripState = WAIT_HV_DOWN;
+               $tripCtr++;
+               print "Trip #$tripCtr detected on Sector #4 @ ".
+                   localtime."\n";
+#              if (($tripTime < 180) && ($tripCtr > 1)) {
+#                  die "giving up, Time since last Trip: $tripTime below 3min";
+#              }
+               $tripTime = 0;
+           } else {
+               $aliveCtr++;
+               if ($aliveCtr > 30) {
+                   $aliveCtr = 0;
+                   print "Status O.K., ".localtime.
+                       " TripCtr: $tripCtr  Time since last ramp up: $tripTime\n";
+               }
+           }
+       }
+       
+       when (WAIT_HV_DOWN) {
+
+           if (($value->{'VMON_4'}->{'val'} > 10) || 
+              ($value->{'IMON_4'}->{'val'} > 0.1)) {
+               $tripState = HV_OFF;
+               print "Waiting for switching HV off: ".
+                 "VMON_4: ".$value->{'VMON_4'}->{'val'}.
+                 "IMON_4: ".$value->{'IMON_4'}->{'val'}.
+                 "\n";
+           } else {
+               $tripState = WAIT;
+               print "HV is down\n";
+#                  print "Waiting for HV Down: ".
+#                      "VMON_4: ".$value->{'VMON_4'}->{'val'}.
+#                      " IMON_4: ".$value->{'IMON_4'}->{'val'}.
+#                      "\n";
+           }
+#
+#          } else {
+#              # Status changed, abort TripMachine
+#              $tripState = IDLE;
+#              print "State changed, aborting, go to IDLE again\n";
+#          }
+       }
+       
+       when (WAIT) {
+           print "Wait another 240 seconds\n";
+           sleep(240);
+           $tripState = HV_ON;
+       }
+
+       when (HV_OFF) {
+           print "Force HV off\n";
+           Perl2Epics::Put("HV_BUTTON", "Off");
+           $tripState = WAIT_HV_DOWN;
+       }
+       
+       when (HV_ON) {
+           print "Turn HV on again\n";
+           Perl2Epics::Put("HV_BUTTON", "On");
+           $tripState = RESET; 
+       }
+       
+       when (RESET) {
+            sleep(10);
+           print "Done, waiting for next trip #".($tripCtr + 1)."\n\n";
+           $tripState = IDLE;
+       }
+       
+       default {
+           die "Invalid TripState, aborting process";
+       }
+    } 
+}