From 69513e13b8a2bf8d57450b1a8884462e611d4e31 Mon Sep 17 00:00:00 2001 From: "www@jspc55" Date: Tue, 21 Jan 2014 19:11:51 +0100 Subject: [PATCH] fixed alphabetical sorting in dropdown menus, began work on plotting system --- tools/HPlot.pm | 1 + tools/PlotScheduler.pm | 122 +++++++++++++++++++++++++++++++++++++++++ tools/Widgets.pm | 2 +- tools/adcmon.pl | 39 +++++++++++++ tools/plotService.pl | 66 ++++++++++++++++++++++ 5 files changed, 229 insertions(+), 1 deletion(-) create mode 120000 tools/HPlot.pm create mode 100644 tools/PlotScheduler.pm create mode 100755 tools/adcmon.pl create mode 100755 tools/plotService.pl diff --git a/tools/HPlot.pm b/tools/HPlot.pm new file mode 120000 index 0000000..7a86abf --- /dev/null +++ b/tools/HPlot.pm @@ -0,0 +1 @@ +../../daqtools/web/htdocs/commands/HPlot.pm \ No newline at end of file diff --git a/tools/PlotScheduler.pm b/tools/PlotScheduler.pm new file mode 100644 index 0000000..09dacd5 --- /dev/null +++ b/tools/PlotScheduler.pm @@ -0,0 +1,122 @@ +package PlotScheduler; + + +use strict; +use warnings; +use POSIX; + +use Storable qw(lock_store lock_retrieve); +use Data::Dumper; + +use Time::HiRes; + +require Common; + + +use FindBin; +use lib "$FindBin::Bin/.."; + +sub new { + my $class = shift; + my %options = @_; + my $self = { + shm => '/dev/null', + timeout => 10, + requests => {}, + maxRepeats => 5, + %options + }; + bless($self, $class); +} + + +sub addRequest { + my $self = shift; + my %param = @_; + my $FPGA = $param{FPGA}; + my $CB = $param{CB}; + my $chip = $param{chip}; + my $channel = $param{channel}; + $self->{requests}->{"$FPGA-$CB-$chip-$channel"} = time(); +} + +sub enforceTimeout { + my $self = shift; + my $now = time(); + for my $request (keys $self->{requests}) { + my $timestamp = $self->{requests}->{$request}; + if ( ($now - $timestamp) > $self->{timeout} ) { + delete $self->{requests}->{$request}; + } + } +} + +sub retrieveRequests { + my $self = shift; + if ( -e $self->{shm} ){ + # load shared memory + for( my $i = 0 ; $i < $self->{maxRepeats}; $i++){ + $self->{requests} = lock_retrieve($self->{shm}); + if( defined ($self->{requests})) { + last; + } else { + Time::HiRes::sleep(rand()/10*$i/$self->{maxRepeats}); # if you don't get it step back + } + } + } +} + +sub storeRequests { + my $self = shift; + if ( -e $self->{shm} ){ + for( my $i = 0 ; $i < $self->{maxRepeats}; $i++){ + if( lock_store($self->{requests},$self->{shm}) ) { + last; + } else { + Time::HiRes::sleep(rand()/10*$i/$self->{maxRepeats}); # if you don't get it step back + } + } + } +} + +sub requestCount { + my $self=shift; + return scalar(keys %{$self->{requests}}); +} + +sub submitRequests { + # loads old requests, + # overwrites identical requests with new ones + # writes all requests back to shm + my $self = shift; + my $oldStoreRef = {}; + if ( -e $self->{shm} ){ + # load shared memory + $oldStoreRef = lock_retrieve($self->{shm}); + } + + my $newStoreRef = { %$oldStoreRef,%{$self->{requests}} }; + lock_store($newStoreRef,$self->{shm}); +} + +sub listRequests { + my $self = shift; + print Dumper $self->{requests}; +} + +sub deleteShm { + my $self = shift; + unlink $self->{shm}; +} + +sub plotServiceRunning { + my $self = shift; + return (-e $self->{shm}); +} + +sub createShm { + my $self = shift; + lock_store({},$self->{shm}); +}; + +1; \ No newline at end of file diff --git a/tools/Widgets.pm b/tools/Widgets.pm index 9efe195..8821b73 100644 --- a/tools/Widgets.pm +++ b/tools/Widgets.pm @@ -81,7 +81,7 @@ sub print_html { # print ""; - for my $item ( sort @{$self->{items}} ) { + for my $item ( sort { lc($a->{value}) cmp lc($b->{value})} @{$self->{items}} ) { print q%