summaryrefslogtreecommitdiff
path: root/lib/MIMOSA.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/MIMOSA.pm')
-rw-r--r--lib/MIMOSA.pm177
1 files changed, 177 insertions, 0 deletions
diff --git a/lib/MIMOSA.pm b/lib/MIMOSA.pm
new file mode 100644
index 0000000..54a5e15
--- /dev/null
+++ b/lib/MIMOSA.pm
@@ -0,0 +1,177 @@
+package MIMOSA;
+
+use strict;
+use warnings;
+use 5.020;
+
+use Carp;
+use Carp::Assert::More;
+use File::Slurp qw(read_dir);
+use IPC::Run qw(harness);
+use List::Util qw(max);
+
+our $VERSION = '0.00';
+
+sub new {
+ my ( $class, %opt ) = @_;
+
+ my $self = \%opt;
+
+ bless( $self, $class );
+
+ return $self;
+}
+
+sub start {
+ my ($self) = @_;
+ my $buf;
+
+ my $mim_daemon = harness(
+ [ 'MimosaCMD', '--start' ],
+ '<' => \undef,
+ '>&' => \$buf
+ );
+ my $mim_p1 = harness(
+ [ 'MimosaCMD', '--parameter', 'offset', $self->{mimosa_offset} ],
+ '<' => \undef,
+ '>&' => \$buf
+ );
+ my $mim_p2 = harness(
+ [ 'MimosaCMD', '--parameter', 'shunt', $self->{mimosa_shunt} ],
+ '<' => \undef,
+ '>&' => \$buf
+ );
+ my $mim_p3 = harness(
+ [ 'MimosaCMD', '--parameter', 'voltage', $self->{mimosa_voltage} ],
+ '<' => \undef,
+ '>&' => \$buf
+ );
+ my $mim_p4 = harness(
+ [ 'MimosaCMD', '--parameter', 'directory', 'src/apps/DriverEval' ],
+ '<' => \undef,
+ '>&' => \$buf
+ );
+ my $mim_start = harness(
+ [ 'MimosaCMD', '--mimosa-start' ],
+ '<' => \undef,
+ '>&' => \$buf
+ );
+
+ if ( $self->is_running ) {
+ croak("MIMOSA daemon is already running");
+ }
+
+ $mim_daemon->run or croak();
+ $mim_p1->run or croak();
+ $mim_p2->run or croak();
+ $mim_p3->run or croak();
+ $mim_start->run or croak();
+}
+
+sub is_running {
+ my ($self) = @_;
+
+ my $buf;
+
+ my $mim_check = harness(
+ [ 'pidof', 'MimosaCMD' ],
+ '<' => \undef,
+ '>&' => \$buf
+ );
+
+ return $mim_check->run;
+}
+
+sub stop {
+ my ($self) = @_;
+ my $buf;
+
+ my $mim_stop = harness(
+ [ 'MimosaCMD', '--mimosa-stop' ],
+ '<' => \undef,
+ '>&' => \$buf
+ );
+ my $mim_kill = harness(
+ [ 'MimosaCMD', '--stop' ],
+ '<' => \undef,
+ '>&' => \$buf
+ );
+
+ # make sure MIMOSA has all teh data
+ sleep(5);
+
+ $mim_stop->run or croak();
+
+ $self->wait_for_save;
+
+ $mim_kill->run or croak();
+
+ while ( $self->is_running ) {
+ sleep(1);
+ }
+}
+
+sub wait_for_save {
+ my ($self) = @_;
+
+ my $mtime = 0;
+ my $mtime_changed = 1;
+
+ while ($mtime_changed) {
+ sleep(3);
+ my @mim_files = grep { m{ \. mim $ }x } read_dir('.');
+ my @mtimes = map { ( stat($_) )[9] } @mim_files;
+ my $new_mtime = max @mtimes;
+ if ( $new_mtime != $mtime ) {
+ $mtime = $new_mtime;
+ }
+ else {
+ $mtime_changed = 0;
+ }
+ }
+
+ return $self;
+}
+
+sub kill {
+ my ($self) = @_;
+ my $buf;
+
+ my $mim_kill = harness(
+ [ 'MimosaCMD', '--stop' ],
+ '<' => \undef,
+ '>&' => \$buf
+ );
+
+ $mim_kill->run or croak();
+}
+
+sub calibrate {
+ my ($self) = @_;
+
+ $self->mimosactl('disconnect');
+ sleep(2);
+ $self->mimosactl('1k'); # actually 987 Ohm
+ sleep(2);
+ $self->mimosactl('100k'); # actually 99.3 kOhm
+ sleep(2);
+ $self->mimosactl('connect');
+}
+
+sub mimosactl {
+ my ( $self, $arg ) = @_;
+ my $buf;
+
+ my $mimosactl = harness(
+ [ 'mimosactl', $arg ],
+ '<' => \undef,
+ '>&' => \$buf
+ );
+
+ $mimosactl->run
+ or croak( "mimosactl $arg returned " . $mimosactl->full_result );
+
+ return $self;
+}
+
+1;