File source

<?php
/** registers set of screens
    switches between them
    handles touch actions - sends coordinates to Screen instances
    sends screen image to device
*/
class ScreenManager{
  
// Port instance to send data to
  
protected $port;
  
// timeout of I/O
  
protected $timeout;
  
// list of registered screens
  
protected $screens = Array();
  
// instance of active screen
  
protected $active;

  function 
__construct(Port $port){
    
$this->port $port;
  }

  function 
register(Screen $screen){
    
$id $screen->id();
    
$this->screens[$id] = $screen;
  }

  
/* activates screen */
  
function activate($idOrScreen$params=false){
    if(
$idOrScreen instanceof Screen){
      
$this->active $idOrScreen;
    }else{
      
$this->active $this->screens[$idOrScreen];
    }
    if(!
$this->active) throw new Exception("No screen! $idOrScreen");
    
$this->active->activate($params);
  }

  
/* main work function */
  
function work(){
    if(!
$this->active){
      throw new 
Exception("no screen selected");
    }
    
// let active screen do it work
    
$r $this->active->work();
    
// handle actions
    
switch($r["action"]){
      case 
"image":
        
$img $r["image"];
        
$this->sendImage($img);
        
imagepng($img"out.png");
        if(
$r["destroy"]) imagedestroy($img);
      break;
      case 
"screen":
        
$this->activate($r["id"], $r["params"]);
        
$this->work();
        return;
      break;
      case 
"nothing":

      break;
      default:
      break;
    }
    
// set port timeout to screen timeout
    
$this->port->setTimeout($this->active->timeout());
    while(
true){
      
$r $this->port->read(1);
      if(
$r !== false && strlen($r) > 0){
         switch (
$r) {
            
// incoming touch
            
case 'T':
              
$x ord($this->port->read(1));
              
$y ord($this->port->read(1));
              
// rotate to landscape !
              
$this->active->touch(160 $y,$x);
            break;
            
// incoming refresh request
            
case 'R':
              
clearBuf();
            break;
         }
         
// shorten timeout and repeat
         // to get rid of all waiting events from device
         
$this->port->setTimeout(100);
      }else{
        break;
      }
    }
  }

  
/** sends GD image $img to device */
  
function sendImage($img){
    
sendImg($img$this->port);
  }
}