[Update] Added feature to truncate history after sync
This commit is contained in:
parent
b4a27d4a6d
commit
dbb3a7c93e
|
@ -118,6 +118,30 @@
|
|||
$f = null;
|
||||
|
||||
|
||||
|
||||
/* [6] Remove history entries
|
||||
=========================================================*/
|
||||
/* (1) Check history entries count */
|
||||
if( !isset($arr_r['saved']) || !is_array($arr_r['saved']) )
|
||||
return 127;
|
||||
|
||||
/* (2) Check history count */
|
||||
if( !isset($arr_r['saved']['history']) || !is_numeric($arr_r['saved']['history']) )
|
||||
return 127;
|
||||
|
||||
/* (3) Fetch number of entries */
|
||||
$saved = intval($arr_r['saved']['history']);
|
||||
$saved = $saved < 0 ? 0 : $saved; // prevent negative
|
||||
|
||||
/* (4) Truncate the log file */
|
||||
$saved++; // because need to be excluded
|
||||
$truncated = syscall(SOURCE_DIR."/lib/file/truncate mfrc522 {$saved}");
|
||||
|
||||
/* (5) Manage error */
|
||||
if( $truncated === false )
|
||||
return 127;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,102 @@
|
|||
#!/usr/bin/php
|
||||
|
||||
<?php
|
||||
|
||||
require_once __DIR__.'/../../include/php/const';
|
||||
|
||||
|
||||
function globalstate_set($p_id_chip, $p_state){
|
||||
|
||||
$g_pins = null;
|
||||
$g_state = null;
|
||||
|
||||
|
||||
|
||||
/* [1] Cache chips
|
||||
=========================================================*/
|
||||
/* (1) Get file handler */
|
||||
$f_chips = new SplFileObject(CHIPS_CONF, 'r');
|
||||
|
||||
/* (2) Parse line by line */
|
||||
while( !$f_chips->eof() ){
|
||||
|
||||
// {1} Try to parse current line //
|
||||
$parsed = json_decode($f_chips->fgets(), true);
|
||||
|
||||
// {2} If cannot parse, go to next //
|
||||
if( is_null($parsed) )
|
||||
continue;
|
||||
|
||||
// {3} Check if choosen pin //
|
||||
if( $parsed[0] == $p_id_chip ){
|
||||
|
||||
// store pin list
|
||||
$g_pins = $parsed[1];
|
||||
|
||||
/* (3) Check if choosen state */
|
||||
foreach($parsed[2] as $state=>$pinValues){
|
||||
|
||||
if( "$state" === "$p_state" ){
|
||||
|
||||
// store state values
|
||||
$g_state = $pinValues;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* (3) If chip not found -> abort */
|
||||
if( is_null($g_pins) || is_null($g_state) ){
|
||||
slog("Chip $p_id_chip not found", 'global-state:set');
|
||||
return 127;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* [2] Set chip to choosen state
|
||||
=========================================================*/
|
||||
/* (1) Activate pin + set OUT mode */
|
||||
foreach($g_pins as $pinNumber)
|
||||
|
||||
// if failed -> propagate error
|
||||
if( syscall(SOURCE_DIR."/lib/gpio/out {$pinNumber}") == false ){
|
||||
slog("Chip $p_id_chip cannot be set to OUT mode", 'global-state:set');
|
||||
return 127;
|
||||
}
|
||||
|
||||
/* (2) For each pin, set the associated value */
|
||||
foreach($g_state as $pinIndex=>$pinValue){
|
||||
|
||||
// set value to HIGH if not 0 //
|
||||
if( $pinValue !== 0 )
|
||||
syscall(SOURCE_DIR."/lib/gpio/high ".$g_pins[$pinIndex]);
|
||||
else
|
||||
syscall(SOURCE_DIR."/lib/gpio/low ".$g_pins[$pinIndex]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* [1] Check argument (chip position, chip state)
|
||||
=========================================================*/
|
||||
if( $argc < 3 || !preg_match('@^\d+$@', $argv[1]) || !preg_match('@^[A-Za-z0-9]{1}$@', $argv[2]) ){
|
||||
echo 127;
|
||||
die(127);
|
||||
}
|
||||
|
||||
/* [2] Launch main script
|
||||
=========================================================*/
|
||||
$exec = globalstate_set($argv[1], $argv[2]);
|
||||
|
||||
echo $exec;
|
||||
die($exec);
|
||||
?>
|
||||
|
|
@ -0,0 +1,140 @@
|
|||
#!/usr/bin/php
|
||||
|
||||
<?php
|
||||
|
||||
require_once __DIR__.'/../../include/php/const';
|
||||
|
||||
|
||||
function globalstate_update(){
|
||||
|
||||
|
||||
/* [1] Fetch global state
|
||||
=========================================================*/
|
||||
$GLOBAL_STATE = [];
|
||||
|
||||
/* (1) Fetch from file */
|
||||
$f_gstate = @file_get_contents(STATE_CONF);
|
||||
|
||||
/* (2) Manage errors */
|
||||
if( $f_gstate === false ){
|
||||
slog('Cannot access GLOBAL STATE file', 'global-state:update');
|
||||
return 127;
|
||||
}
|
||||
|
||||
/* (3) Remove surrounding spaces */
|
||||
$f_gstate = preg_replace('@^\s+@', '', $f_gstate);
|
||||
$f_gstate = preg_replace('@\s+$@', '', $f_gstate);
|
||||
|
||||
/* (4) Extract */
|
||||
$GLOBAL_STATE = $f_gstate;
|
||||
|
||||
|
||||
/* [2] Cache global state to chip states
|
||||
=========================================================*/
|
||||
$CHIP_STATE = null;
|
||||
|
||||
/* (1) Fetch from file */
|
||||
$f_cstates = new SplFileObject(STATES_CONF, 'r');
|
||||
|
||||
/* (2) Section Title */
|
||||
if( $f_cstates === false ){
|
||||
slog('Cannot access GLOBAL/CHIP STATES file', 'global-state:update');
|
||||
return 127;
|
||||
}
|
||||
|
||||
/* (3) Parse line by line */
|
||||
while( !$f_cstates->eof() ){
|
||||
|
||||
// {1} Try to parse current line //
|
||||
$parsed = json_decode($f_cstates->fgets(), true);
|
||||
|
||||
// {2} If cannot parse, go to next //
|
||||
if( is_null($parsed) )
|
||||
continue;
|
||||
|
||||
// {3} Check if GLOBAL STATE matches CURRENT state //
|
||||
$failed = false;
|
||||
|
||||
for( $c = 0 ; $c < strlen($GLOBAL_STATE) || $c < strlen($parsed[0]) ; $c++ ){
|
||||
// {3.1} If 'X' -> whatever state //
|
||||
if( $parsed[0][$c] == 'X' )
|
||||
continue;
|
||||
|
||||
// {3.2} Else, if different -> fail //
|
||||
else if( $parsed[0][$c] != $GLOBAL_STATE[$c] ){
|
||||
$failed = true;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// {4} If not failed -> state to keep //
|
||||
if( !$failed ){
|
||||
slog("Current state '$GLOBAL_STATE' matches '{$parsed[0]}'", 'global-state:update');
|
||||
$CHIP_STATE = $parsed[1];
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* (4) If no CHIP_STATE set -> abort */
|
||||
if( is_null($CHIP_STATE) ){
|
||||
slog("Cannot find a chip_state for the current global state '{$GLOBAL_STATE}'", 'global-state');
|
||||
return 127;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* [2] Update chips
|
||||
=========================================================*/
|
||||
/* (1) Get file handler */
|
||||
$f_chips = new SplFileObject(CHIPS_CONF, 'r');
|
||||
|
||||
/* (2) Parse line by line */
|
||||
while( !$f_chips->eof() ){
|
||||
|
||||
// {1} Try to parse current line //
|
||||
$parsed = json_decode($f_chips->fgets(), true);
|
||||
|
||||
// {2} If cannot parse, go to next //
|
||||
if( is_null($parsed) )
|
||||
continue;
|
||||
|
||||
// {3} Check if position available in GLOBAL_STATE //
|
||||
if( isset($CHIP_STATE[$parsed[0]]) ){
|
||||
|
||||
/* (1) If CHIP STATE value is 'x' -> do nothing */
|
||||
if( $CHIP_STATE[$parsed[0]] == 'x' )
|
||||
continue;
|
||||
|
||||
/* (2) If state does not exist -> go to next chip */
|
||||
if( !isset($parsed[2][$CHIP_STATE[$parsed[0]]]) )
|
||||
continue;
|
||||
|
||||
/* (3) Use variables to be more human-readable */
|
||||
$position = $parsed[0];
|
||||
$state = $CHIP_STATE[$parsed[0]];
|
||||
|
||||
/* (3) Set state */
|
||||
$updated = syscall(SOURCE_DIR."/lib/global-state/set {$position} {$state}");
|
||||
|
||||
/* (4) If error */
|
||||
if( $updated === false )
|
||||
slog("Cannot set ${position} chip to state {$state}", 'global-state:update');
|
||||
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* [3] Launch main script
|
||||
=========================================================*/
|
||||
$exec = globalstate_update();
|
||||
|
||||
echo $exec;
|
||||
die($exec);
|
||||
?>
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
#!/bin/bash
|
||||
|
||||
__DIR__=$(dirname $(realpath $0));
|
||||
|
||||
source $__DIR__/../../lib/include/bash/const;
|
||||
source $__DIR__/../../lib/include/bash/func;
|
||||
|
||||
|
||||
# [1] Check arguments
|
||||
#========================================================#
|
||||
|
||||
# (1) If argument missing #
|
||||
if [ $# -lt 2 ]; then
|
||||
echo 127;
|
||||
exit 127;
|
||||
fi;
|
||||
|
||||
# (2) Check argument #1 #
|
||||
if [ ! -e "$DATA_DIR/$1" ]; then
|
||||
echo 127;
|
||||
exit 127;
|
||||
fi;
|
||||
|
||||
# (3) Check number of lines to truncate #
|
||||
if [ $2 -gt $(wc -l "$DATA_DIR/$1" | awk '{print $1}') ]; then
|
||||
echo 127;
|
||||
exit 127;
|
||||
fi;
|
||||
|
||||
|
||||
# [2] Truncate file
|
||||
#========================================================#
|
||||
# (1) Increment by 1 (because exlusive) #
|
||||
incr=$(expr $2 + 1);
|
||||
|
||||
# (2) Truncate file #
|
||||
tail -n +$incr "$DATA_DIR/$1" | tee "$DATA_DIR/$1" > /dev/null;
|
||||
|
||||
|
||||
echo 0;
|
||||
exit 0;
|
Loading…
Reference in New Issue