SATS/lib/global-state/source/update.php

142 lines
3.3 KiB
PHP
Executable File

#!/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;
slog("Starting with state '{$GLOBAL_STATE}'", 'global-state:update');
/* [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);
?>