--- /dev/null
+use strict;
+use warnings;
+
+use lib "./include/";
+
+use Cts;
+use JSON::PP;
+
+sub connectToCTS {
+ my $mode = shift;
+ my $endpoint = shift;
+
+ my $trb;
+ if ($mode eq 'sim') {
+ eval {require "TrbSim.pm"};
+ $trb = TrbSim->new($endpoint);
+ my $fp;
+ open $fp, "<memory.dump";
+ $trb->loadDump($fp);
+ close $fp;
+
+ } else{
+ eval {require "TrbNet.pm"};
+ $trb = TrbNet->new($endpoint);
+ }
+
+ return Cts->new($trb);
+}
+my $cts = connectToCTS 'trb', 0xf3c0;
+
+my $query = $ENV{'QUERY_STRING'};
+
+if ($query eq "init") {
+ print JSON::PP->new->allow_blessed->convert_blessed->encode({
+ 'registers' => $cts->getRegisters,
+ 'properties' => $cts->getProperties
+ });
+} elsif ($query =~ /^(format|read),([\w\d_,]+)$/) {
+ my $op = $1;
+ my @keys = split /,/, $2;
+ my %result = ();
+
+ foreach my $key (@keys) {
+ my $reg = $cts->getRegisters->{$key};
+ next unless defined $reg;
+
+ $result{$key} = $op eq "read" ? $reg->read() : $reg->format();
+ }
+
+ print JSON::PP->new->allow_blessed->convert_blessed->encode(\%result);
+} elsif ($query =~ /^write,([\w\d_,\.]+)$/) {
+ my @values = split /,/, $1;
+ my $regs = {};
+
+ while (my $key = shift @values) {
+ if ($key =~ /^(.*)\.(.*)$/) {
+ $regs->{$1} = {} unless ref $regs->{$1};
+ $regs->{$1}{$2} = shift @values;
+ } else {
+ $regs->{$key} = shift @values;
+ }
+ }
+
+ foreach my $key (keys $regs) {
+ my $reg = $cts->getRegisters->{$key};
+ next unless defined $reg;
+ $reg->write($regs->{$key});
+ }
+
+ print "1";
+}
+
+1;
--- /dev/null
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Central Trigger System</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <link href="layout/base.css" rel="Stylesheet" type="text/css" />
+ <script src="scripts/mootools-core-1.4.5.js" type="text/javascript"></script>
+ <script src="scripts/base.js" type="text/javascript"></script>
+ </head>
+
+ <body lang="en">
+ <div id="header">
+ <div class="content">
+ <div id="data-update">Update</div>
+ <h1>Central Trigger System</h1>
+ </div>
+ </div>
+
+ <div id="content-area">
+ <div class="expandable expanded" id="itc-overview">
+ <div class="header"><span class="indicator"></span> Status overview</div>
+
+ <div class="content">
+ <img src="monitor.png" id="rate-plot" />
+ <table id="overview-tab">
+ <tr>
+ <th class="label">Counter</th>
+ <th class="value">Counts</th>
+ <th class="rate">Rate</th>
+ </tr>
+
+ <tr>
+ <td class="label">Trigger asserted</td>
+ <td class="value autorate autoratevalue" slice="cts_cnt_trg_asserted.value" suffix=" clks.">n/a</td>
+ <td class="rate autorate" slice="cts_cnt_trg_asserted.value" suffix=" s<sup>-1</sup>">n/a</td>
+ <tr>
+
+ <tr>
+ <td class="label">Trigger rising edges</td>
+ <td class="value autorate autoratevalue" slice="cts_cnt_trg_edges.value" suffix=" edges">n/a</td>
+ <td class="rate autorate" slice="cts_cnt_trg_edges.value" suffix=" Hz">n/a</td>
+ <tr>
+
+ <tr>
+ <td class="label">Trigger accepted</td>
+ <td class="value autorate autoratevalue" slice="cts_cnt_trg_accepted.value" suffix=" events">n/a</td>
+ <td class="rate autorate" slice="cts_cnt_trg_accepted.value" suffix=" Hz">n/a</td>
+ <tr>
+
+ <tr>
+ <td colspan="3"> </td>
+ </tr>
+
+ <tr>
+ <td class="label">Last Idle Time</td>
+ <td class="value autoupdate" slice="cts_cnt_idle_time.value" format="countToTime" suffix=" ns">n/a</td>
+ <td class="rate "></td>
+ <tr>
+
+ <tr>
+ <td class="label">Last Dead Time</td>
+ <td class="value autoupdate" slice="cts_cnt_dead_time.value" format="countToTime" suffix=" ns">n/a</td>
+ <td class="rate autoupdate" slice="cts_cnt_dead_time.value" format="countToFreq">n/a</td>
+ <tr>
+ </table>
+ </div>
+ </div>
+
+ <div class="expandable expanded" id="itc-expander">
+ <div class="header"><span class="indicator"></span> Trigger Channels</div>
+
+ <div class="content">
+ <table id="itc-tab0" class="itc">
+ <tr>
+ <th class="channel">#</th>
+ <th class="enable">Ena</th>
+ <th class="assign">Assignment</th>
+ <th class="type">Trigger Type</th>
+ <th class="rate">Current Rate</th>
+ </tr>
+ </table>
+
+ <table id="itc-tab1" class="itc">
+ <tr>
+ <th class="channel">#</th>
+ <th class="enable">Ena</th>
+ <th class="assign">Assignment</th>
+ <th class="type">Trigger Type</th>
+ <th class="rate">Current Rate</th>
+ </tr>
+ </table>
+ </div>
+ </div>
+
+ <div class="expandable expanded" id="inputs-expander">
+ <div class="header"><span class="indicator"></span> Trigger Input Configuration</div>
+
+ <div class="content">
+ <table id="inputs-tab">
+ <tr>
+ <th class="num">#</th>
+ <th class="invert">Invert</th>
+ <th class="delay">Delay</th>
+ <th class="spike">Spike Rejection</th>
+ <th class="override">Override</th>
+ <th class="rate">Current Rate</th>
+ </tr>
+ </table>
+ </div>
+ </div>
+
+ <div class="expandable expanded" id="coin-expander">
+ <div class="header"><span class="indicator"></span> Coincidence Detectors and Regular Pulsers</div>
+
+ <div class="content">
+ <div class="left">
+ <h3>Coincidence Detectors</h3>
+ <table id="coin-tab">
+ <tr>
+ <th class="num">#</th>
+ <th class="window">Window</th>
+ <th class="coin">Coin Mask</th>
+ <th class="inhibit">Inhibit Mask</th>
+ </tr>
+ </table>
+ </div>
+
+ <div class="right">
+ <h3>Periodical Pulser</h3>
+ <table id="pulser-tab">
+ <tr>
+ <th class="num">#</th>
+ <th class="period">Low-Period</th>
+ <th class="freq">Frequency</th>
+ </tr>
+ </table>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="expandable expanded" id="cts-expander">
+ <div class="header"><span class="indicator"></span> CTS Details</div>
+
+ <div class="content">
+ <div class="left">
+ <table class="">
+ <tr>
+ <td class="label">Readout config:</td>
+ <td class="value"><input type="checkbox" class="autoupdate autocommit" slice="cts_readout_config.input_cnt" /> Trigger Input Counter</td>
+ </tr>
+
+ <tr class="alt">
+ <td> </td>
+ <td class="value"><input type="checkbox" class="autoupdate autocommit" slice="cts_readout_config.channel_cnt" /> Trigger Channel Counter</td>
+ </tr>
+
+ <tr>
+ <td> </td>
+ <td class="value"><input type="checkbox" class="autoupdate autocommit" slice="cts_readout_config.idle_dead_cnt" /> Idle/Dead Counter</td>
+ </tr>
+
+ <tr class="alt">
+ <td> </td>
+ <td class="value"><input type="checkbox" class="autoupdate autocommit" slice="cts_readout_config.trg_cnt" /> Trigger statistics</td>
+ </tr>
+
+ <tr>
+ <td> </td>
+ <td class="value"><input type="checkbox" class="autoupdate autocommit" slice="cts_readout_config.wasa" /> WASA data</td>
+ </tr>
+
+ <tr class="alt">
+ <td class="label">TD FSM Limit:</td>
+ <td class="value">
+ <input class="autocommit autoupdate text" slice="cts_fsm_limits.td"
+ format="var f=function(x){return parseInt(x)==0xffff ? 'disabled' : (parseInt(x) ? x + ' events' : 'active')}; f"
+ interpret="var f=function(x){return (x.trim() == '' || x.match(/disabled|off/)) ? 0xffff : (isNaN(parseInt(x))?0:parseInt(x))}; f" />
+ </td>
+ </tr>
+
+ <tr>
+ <td class="label">RO FSM Limit:</td>
+ <td class="value">
+ <input class="autocommit autoupdate text" slice="cts_fsm_limits.ro"
+ format="var f=function(x){return parseInt(x)==0xffff ? 'disabled' : (parseInt(x) ? x + ' events' : 'active')}; f"
+ interpret="var f=function(x){return (x.trim() == '' || x.match(/disabled|off/)) ? 0xffff : (isNaN(parseInt(x))?0:parseInt(x))}; f" />
+ </td>
+ </tr>
+ </table>
+ </div>
+
+ <div class="right">
+ <table>
+ <tr>
+ <td class="label">Endpoint</td>
+ <td class="value" id="trb_endpoint">n/a</td>
+ </tr>
+
+ <tr class="alt">
+ <td class="label">Design compiled</td>
+ <td class="value" id="trb_compiletime">n/a</td>
+ </tr>
+
+ <tr>
+ <td class="label">TD FSM State</td>
+ <td class="value autoupdate" slice="cts_td_fsm_state.state">n/a</td>
+ </tr>
+
+ <tr class="alt">
+ <td class="label">RO FSM State</td>
+ <td class="value autoupdate" slice="cts_ro_fsm_state.state">n/a</td>
+ </tr>
+
+ <tr>
+ <td class="label">RO Queue</td>
+ <td class="value autoupdate" slice="cts_ro_queue" format="var x=function(x,data){return data.f.state + ', words enqueued: ' + data.v.count}; x">n/a</td>
+ </tr>
+
+ <tr class="alt">
+ <td class="label">Current Trigger (15:0)</td>
+ <td class="value autoupdate" slice="cts_cur_trg_state" format="var x=function(x,data){return '<pre>'+ data.f.mask + '</pre>' + (data.v.asserted?', Asserted, Type '+data.f.type:', Not asserted')}; x">n/a</td>
+ </tr>
+
+ <tr>
+ <td class="label">Buffered Trigger (15:0)</td>
+ <td class="value autoupdate" slice="cts_buf_trg_state" format="var x=function(x,data){return '<pre>'+ data.f.mask + '</pre>, Type: '+data.f.type}; x">n/a</td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+ </body>
+</html>
\ No newline at end of file