Motheure-simple 1st implementation
This commit is contained in:
parent
a5115fe37d
commit
cb4a0e5921
|
@ -0,0 +1,3 @@
|
|||
#!/bin/bash
|
||||
|
||||
sudo -u sats /usr/bin/env php $(realpath $(dirname $0))/source/loop.php;
|
|
@ -0,0 +1,194 @@
|
|||
#!/usr/bin/php
|
||||
<?php
|
||||
|
||||
require_once __DIR__.'/../../../lib/include/php/const';
|
||||
|
||||
$f_data;
|
||||
$start_ts;
|
||||
|
||||
$FEATURE = basename(dirname(__DIR__));
|
||||
|
||||
$MOTOR_PIN = 29;
|
||||
|
||||
$LOOP_FREQ = 100; // check frequency in ms
|
||||
$THRESHOLD = 4; // maximum number of reads to wait for motor to be active back
|
||||
|
||||
|
||||
|
||||
|
||||
/* READ MOTOR STATE
|
||||
*
|
||||
*/
|
||||
function motheure_read(){
|
||||
|
||||
/* [1] Export global caches + variables
|
||||
=========================================================*/
|
||||
/* (1) Motor pin */
|
||||
global $MOTOR_PIN;
|
||||
|
||||
/* [2] Try to read motor state
|
||||
=========================================================*/
|
||||
/* (1) Get its state */
|
||||
$STATE = syscall( SOURCE_DIR."/lib/gpio/in $MOTOR_PIN" );
|
||||
|
||||
/* (2) If invalid */
|
||||
if( is_bool($STATE) )
|
||||
return false;
|
||||
|
||||
/* (3) If inactive, pass */
|
||||
if( $STATE == 0 )
|
||||
return false;
|
||||
|
||||
/* (4) Return TRUE means motor active */
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* MAIN LOOP
|
||||
*
|
||||
*/
|
||||
function motheure_loop(){
|
||||
|
||||
/* [1] Export global caches + variables
|
||||
=========================================================*/
|
||||
/* (1) Log history file descriptor */
|
||||
global $f_data;
|
||||
|
||||
/* (2) Motor pin */
|
||||
global $MOTOR_PIN;
|
||||
|
||||
/* (3) Loop data */
|
||||
global $start_ts;
|
||||
global $LOOP_FREQ;
|
||||
global $THRESHOLD;
|
||||
|
||||
|
||||
|
||||
/* [2] Try to read motor state
|
||||
=========================================================*/
|
||||
/* (1) Read motor pin */
|
||||
if( !motheure_read() ) // if not active -> continue watching
|
||||
return false;
|
||||
|
||||
slog('Motor active detected', 'motheure-simple:loop', 'motheure');
|
||||
|
||||
/* [3] Wait for machine to stop
|
||||
=========================================================*/
|
||||
/* (0) Userful variables */
|
||||
$offset = 0; // offset (number of 0 reads)
|
||||
$loop_ts = 0; // loop start time
|
||||
$stop_ts = microtime(true); // last active time for now
|
||||
|
||||
while( $offset <= $THRESHOLD ){ // exit when motor active for $threshold cycles
|
||||
|
||||
/* (1) Start loop timer */
|
||||
$loop_ts = microtime(true);
|
||||
|
||||
/* (2) If stopped -> increment offset */
|
||||
if( !motheure_read() ){
|
||||
$offset++;
|
||||
|
||||
/* (3) If not stopped */
|
||||
}else{
|
||||
$offset = 0;
|
||||
$stop_ts = microtime(true); // last active time for now
|
||||
}
|
||||
|
||||
/* (4) Wait for loop to last @LOOP_FREQ seconds (if not already elapsed) */
|
||||
while( microtime(true) - $loop_ts < ($LOOP_FREQ/1000) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* [2] Main loop
|
||||
=========================================================*/
|
||||
/* (1) Log action to default log file */
|
||||
$f_data->fwrite( json_encode([
|
||||
$stop_ts - $start_ts
|
||||
]).PHP_EOL );
|
||||
|
||||
/* (2) Return status */
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
function motheure_setup(){
|
||||
|
||||
/* [0] Initialize global variables
|
||||
=========================================================*/
|
||||
/* (1) File descriptiors */
|
||||
global $f_data;
|
||||
|
||||
/* (3) Useful data */
|
||||
global $FEATURE;
|
||||
global $MOTOR_PIN;
|
||||
|
||||
/* [1] Open file descriptors on useful files
|
||||
=========================================================*/
|
||||
/* (1) Append accesses (logs) */
|
||||
if( !file_exists(DATA_DIR."/$FEATURE") )
|
||||
file_put_contents(DATA_DIR."/$FEATURE", '');
|
||||
|
||||
$f_data = new SplFileObject(DATA_DIR."/$FEATURE", 'a');
|
||||
|
||||
|
||||
/* [2] Set up GPIO pin
|
||||
=========================================================*/
|
||||
/* (1) Set as input */
|
||||
if( !syscall(SOURCE_DIR."/lib/gpio/in $MOTOR_PIN") ){
|
||||
slog('Cannot set up motor pin as INPUT', 'motheure-simple:setup');
|
||||
return 127;
|
||||
}
|
||||
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* [1] Set up daemon
|
||||
=========================================================*/
|
||||
/* (1) Set up */
|
||||
$exec = motheure_setup();
|
||||
|
||||
/* (2) Manage error */
|
||||
if( $exec != 0 ){
|
||||
slog('cannot set up the daemon', 'motheure-simple:loop');
|
||||
die($exec);
|
||||
}
|
||||
|
||||
/* (3) Success message */
|
||||
slog('daemon started (loop)', 'motheure-simple:loop');
|
||||
|
||||
|
||||
|
||||
|
||||
/* [2] Daemon loop
|
||||
=========================================================*/
|
||||
while( true ){
|
||||
|
||||
/* (1) Store time */
|
||||
$start_ts = microtime(true);
|
||||
|
||||
/* (2) Execute loop code */
|
||||
motheure_loop();
|
||||
|
||||
}
|
||||
?>
|
||||
|
10
lib/gpio/in
10
lib/gpio/in
|
@ -30,14 +30,16 @@ test -d /sys/class/gpio/gpio$1 || echo $1 > /sys/class/gpio/export;
|
|||
|
||||
|
||||
|
||||
# [4] Set mode to OUT
|
||||
# [4] Set mode to IN
|
||||
#========================================================#
|
||||
cat /sys/class/gpio/gpio$1/direction | grep -v "in" && echo "in" > /sys/class/gpio/gpio$1/direction;
|
||||
|
||||
|
||||
|
||||
|
||||
# [5] EXIT_CODE
|
||||
# [5] RETURN VALUE
|
||||
#========================================================#
|
||||
echo 0;
|
||||
exit 0;
|
||||
VALUE="`cat /sys/class/gpio/gpio$1/value`";
|
||||
|
||||
echo $VALUE;
|
||||
exit $VALUE;
|
||||
|
|
|
@ -19,8 +19,12 @@
|
|||
$out = preg_replace('/\s+$/', '', $out);
|
||||
|
||||
/* (4) Manage result */
|
||||
if( is_numeric($out) ) return ("$out"==="0");
|
||||
else return $out;
|
||||
if( is_numeric($out) && $out === "0" )
|
||||
return false;
|
||||
elseif( is_numeric($out) && $out === "127" )
|
||||
return true;
|
||||
else
|
||||
return $out;
|
||||
}
|
||||
|
||||
/* [2] Log management
|
||||
|
|
Loading…
Reference in New Issue