. * * * api.php * * Fun with Binary * Web Server * * Diogo Peralta Cordeiro * up201705417@fc.up.pt * * Generates the chalenges and controls the arduino */ header('Access-Control-Allow-Origin: *'); class game { /* * ==Warning== * You must add www-data to dialout group * for serial port communication to work! */ // Arduino related protected $comPort = "/dev/ttyACM0"; protected $arduino_available = true; // Storage related public $correct_answer_path = "/var/www/answer.txt"; public $current_answer_path = "/var/www/current_binary_digit.txt"; /** * Prepares everything for a new game */ public function reset() { // Reset current binary digit for a potential new game $fp = fopen($this->current_answer_path, "w"); fwrite($fp, "000000"); // Sends reset command to Arduino if ($this->arduino_available) { $fp = fopen($this->comPort, "wb"); fwrite($fp, 9); // 9 is the Reset Byte } } /** * Starts game */ public function start() { // Generates a 6-bit random number $number = rand(0, 63); // Memorizes the correct binary answer $fp = fopen($this->correct_answer_path, "w"); fwrite($fp, sprintf("%06d", decbin($number))); return $number; } /** * Turn current answer bits accordingly */ public function change_state($led_id) { // Update and memorize the new current answer $current_binary_digit = file_get_contents($this->current_answer_path); $current_binary_digit[(int)$led_id] = ($current_binary_digit[(int)$led_id] == 1) ? 0 : 1; $fp = fopen($this->current_answer_path, "w"); fwrite($fp, $current_binary_digit); // Updates Arduino output if ($this->arduino_available) { $fp = fopen($this->comPort, "wb"); fwrite($fp, (int)$led_id); } } /** * Compares the given answer with the right answer and tells the result * Returns true if won, false otherwise */ public function end($given_answer, $correct_answer) { if ($given_answer == $correct_answer) { // Won // Sends Won command to Arduino if ($this->arduino_available) { $fp = fopen($this->comPort, "wb"); fwrite($fp, 7); // 7 is the Won Byte } return true; } else { // Lost // Sends Lost command to Arduino if ($this->arduino_available) { $fp = fopen($this->comPort, "wb"); fwrite($fp, 8); // 8 is the Lost Byte } return false; } } } /** * API Handler */ $game = new game(); if (isset($_GET["start"])) { $game->reset(); $number = $game->start(); // Print out the number and let the games begin echo $number; } elseif (isset($_GET["change_state"])) { $led_id = $_GET["change_state"]; $game->change_state($led_id); } elseif (isset($_GET["end"])) { // Game Over $given_answer = file_get_contents($game->current_answer_path); $correct_answer = file_get_contents($game->correct_answer_path); if ($game->end($given_answer, $correct_answer)) { echo "That's right!"; } else { echo "Oops, the answer was: ".$correct_answer; } }