diff --git a/lib/mfrc522/source/.loop.php.swp b/lib/mfrc522/source/.loop.php.swp new file mode 100644 index 0000000..8bdfea5 Binary files /dev/null and b/lib/mfrc522/source/.loop.php.swp differ diff --git a/lib/mfrc522/source/loop.php b/lib/mfrc522/source/loop.php index 74315ed..4e5320f 100755 --- a/lib/mfrc522/source/loop.php +++ b/lib/mfrc522/source/loop.php @@ -4,28 +4,173 @@ require_once __DIR__.'/../../include/php/const'; - $f_authlist; + $f_auth; $f_accesslog; + $f_states; + $f_actions; + + $state = []; + + $actions = []; + $states = []; + + $last_user = null; + $timeout = 1; + + + + + + + + /* RETURNS THE PERMISSIONS FOR A SPECIFIC CODE AND AN ACTION + * + * @code Some RFID code + * + * @return user User info if found ; else NULL + * + */ + function auth($code){ + + global $f_auth; + + + /* (1) Goto first line */ + $f_auth->seek(0); + + /* (2) Parse each line */ + while( $f_auth->eof() ){ + + /* (3) Try to parse line */ + $parsed = json_decode($f_auth->fgets(), true); + + /* (3) Ignore if parse error */ + if( is_null($parsed) ) + continue; + + /* (4) If wrong code -> go to next */ + if( $parsed[0] != $code ) + continue; + + /* (5) return user info */ + return [ + 'id' => $parsed[1], + 'can' => $parsed[2] + ]; + + } + + /* (6) Return FALSE if not found */ + return null; + + } + + + + + + + + + + + + + - $last_card; - $times; function mfrc522_setup(){ + /* [0] Initialize global variables + =========================================================*/ + /* (1) File descriptiors */ + global $f_auth, $f_accesslog; + + /* (2) Caches */ + global $actions, $states, $state; + + + /* [1] Open file descriptors on useful files =========================================================*/ - $f_authlist = new SplFileObject(AUTH_LIST, 'r'); + /* (1) Read accesses */ + $f_auth = new SplFileObject(AUTH_LIST, 'r'); + $f_states = new SplFileObject(STATES_CONF, 'r'); + $f_actions = new SplFileObject(ACTIONS_CONF, 'r'); + $f_gstate = @file_get_contents(STATE_CONF); + + /* (2) Append accesses (logs) */ $f_accesslog = new SplFileObject(ACCESS_LOG, 'a'); - /* [2] Parse @authlist to cache [action]=>[rfid1, rfid2, ..] - =========================================================*/ - - /* [3] Initialize global variables + + /* [2] Parse ACTIONS and cache them =========================================================*/ - $last_card = null; - $times = 0; + /* (1) Parse each line */ + while( $f_actions->eof() ){ + + /* (2) Try to parse line */ + $parsed = json_decode($f_actions->fgets(), true); + + /* (2) Ignore if parse error */ + if( is_null($parsed) ) + continue; + + /* (3) Add key (timeout) to cache */ + if( !isset($actions[$parsed[0]] ) + $actions[$parsed[0]] = []; + + /* (4) Add entry to cache */ + $actions[$parsed[0]][] = [ + 'id' => $parsed[1], + 'prev' => $parsed[2], + 'next' => $parsed[3], + ]; + + } + + /* (5) Free file descriptor */ + $f_actions = null; + + + + /* [3] Parse STATES and cache them + =========================================================*/ + /* (1) Parse each line */ + while( $f_states->eof() ){ + + /* (2) Try to parse line */ + $parsed = json_decode($f_states->fgets(), true); + + /* (2) Ignore if parse error */ + if( is_null($parsed) ) + continue; + + /* (3) Add entry to cache */ + $states[] = $parsed; + + } + + /* (4) Free file descriptor */ + $f_states = null; + + + + /* [4] Cache global state + =========================================================*/ + /* (1) Check file */ + if( $f_gstate === false ) + return; + + /* (2) Remove external spaces */ + $f_gstate = preg_replace('@^\s+@', '', $f_gstate); + $f_gstate = preg_replace('@\s+$@', '', $f_gstate); + + /* (3) For each character create an entry */ + for( $c = 0 ; $c < strlen($f_gstate) ; $c++ ) + $state[] = $c; + } @@ -35,6 +180,11 @@ function mfrc522_loop(){ + /* [1] Load global variables + =========================================================*/ + global $last_user; + global $timeout; + /* [1] Wait for rfid card =========================================================*/ while( ($code=syscall(SOURCE_DIR.'/lib/mfrc522/read')) === false ); @@ -48,10 +198,32 @@ /* [2] Check for user in auth list =========================================================*/ + /* (0) CHECK FOR USER INFO IN AUTH LIST + ---------------------------------------------------------*/ + $user = auth($code); + + + /* (1) UNKNOWN USER -> reset count + ---------------------------------------------------------*/ + if( is_null($user) ){ + + $last_user = null; + $timeout = 1; + + + /* (2) KNOWN USER -> Manage timeout + ---------------------------------------------------------*/ + }else{ + + /* (1) If same as last -> increment @timeout */ + if( $last_user == $user['id'] ) + $timeout++; + + + + } - /* [3] Manage action (states) - =========================================================*/ /* [n] Wait for 0.5 s before reading again