Comment controler sa tv ou un ecran lcd en php sur raspberry

Ou sinon vous pouvez

De Askim
Aller à : navigation, rechercher

Un internaute nommé Duchnoun, a réalisé ce script.

Il explique pour cela qu'il faut accéder à la mémoire vidéo de l'écran Tft.

Pour celà il à crée un script qui s'execute en php.

Les vidéos :



Voici le code utilisé :


<?php
//script prevu pour du 16 bit RGB 565

exec ('echo 0 > /sys/class/graphics/fbcon/cursor_blink');

$fp = fopen('/dev/fb1','r+b');

$sizex=480 ;
$sizey=320 ;
$bpp = 16 ;
//  fbset -fb /dev/fb1 -i

$ibpp = $bpp / 8 ;

fwrite($fp,str_repeat(chr(0),$sizex*$sizey*$ibpp)) ;
fseek($fp,0);

/*
for ($x = 0 ;  $x < $sizex ; $x++)
{
        for ($y = 0 ; $y < $sizey ; $y++)
        {
                pixel($x,$y,127,127,cos($x) * sin($y)* $y ) ;
        }
}


while(true)
{
        pixel(rand(0,$sizex) , rand(0,$sizey) , rand(0,255) , rand(0,255) , rand(0,255) ) ;
}
*/


// fill_box(50,50,100,100,255,0,0);

 drawline(0,0,$sizex,$sizey,135,0,0);
 drawline($sizex,0,0,$sizey,255,0,255);
 box(0,0,$sizex,$sizey,255,0,0);
 circle($sizex/2,$sizey/2,100,255,128,0) ;
// drawchar('M',50,50,255,0,0) ;
drawtext("MEGANE JE T'AIME",150,30,255,255,0);

fill_color($sizex/2+5,$sizey/2,255,0,0) ;


var_dump(get_pixel(0,0)) ;

$lastx = null ;
$lasty = null ;
$fp2 = fopen('/dev/input/event2','r+b');
while(true)
{

$data = fread($fp2,16) ;

// $info = unpack('lTps/lTps2/CType/nCode/sValue',$data);
// $info = unpack('VTps/VTps2/CType/nCode/nValue',$data);
$info = unpack('VTps/VTps2/vType/vCode/VValue',$data);
if ((int) $info['Type'] == 3)
{

        if ( ((int) $info['Code'] == 0 ) || ((int) $info['Code'] == 1 ) )
        {




                if ( (int) $info['Code'] == 0 )
                        $lastx =  ( $info['Value'] / 8 );

                if ( (int) $info['Code'] == 1 )
                {
                        $lasty = $sizey - ( $info['Value'] / 12 ) ;

$lastx = (int) $lastx;
$lasty = (int) $lasty ;

// echo $lastx."/".$lasty . "\n" ;

//                      pixel($lastx,$lasty,0,255,0) ;
drawtext("<3",$lastx,$lasty,255,255,0);



                }


        }


}

}


function get_pixel($x,$y)
{

        $return = array();



        return get_pixelRGB565($x,$y);


}

function fill_color($x,$y,$r,$g,$b)
{


// default pixel => 0

}

function drawtext($text,$x0,$y0,$r,$g,$b)
{


$posx = 0 ;

for ($i = 0 ; $i < strlen($text) ; $i++)
{
        drawchar(substr($text,$i,1),$x0+$posx,$y0,$r,$g,$b) ;
        $posx += 10 ;

}

}

function drawchar($char,$x0,$y0,$r,$g,$b)
{

$im = imagecreatetruecolor(8,8);

$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 7, 7, $black);

$text = $char ;
$font = '/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf';

imagettftext($im, 8, 0, 0, 8, $white, $font, $text);


$bitmap = array();

for ($x = 0 ; $x < 8 ; $x++)
{

        $line = array();
        for ($y = 0 ; $y < 8 ; $y++)
        {


                if (imagecolorat($im,$x,$y) == 0)
                $v = 0 ;
                else
                $v = 1 ;


                $line[] = $v ;
        }

        $bitmap[] = $line ;


}

imagedestroy($im);



for ($x = 0 ; $x < 8 ; $x++)
{

        for ($y = 0 ; $y < 8 ; $y++)
        {
                if ($bitmap[$x][$y] > 0)
                pixel($x+$x0,$y+$y0,$r,$g,$b);

        }


}




}



function circle($x0,$y0,$s, $r,$g,$b)
{

$lastx = NULL ;
$lasty = NULL ;
$startx = NULL ;
$starty = NULL ;

        for ($i = 0 ; $i < 3.14 * 2 ; $i = $i + 0.05)
        {
                $x = (cos($i) * $s) ;
                $y = (sin($i) * $s) ;

                $posx = $x0 + $x ;
                $posx = (int) $posx ;

                $posy = $y0 + $y ;
                $posy = (int) $posy ;

                if ($startx == NULL)
                {
                        $startx = $posx ;
                        $starty = $posy ;
                }

                if ($lastx != NULL)
                        drawline($lastx,$lasty,$posx,$posy,$r,$g,$b) ;
                pixel($posx , $posy , $r , $g , $b) ;

                $lastx = $posx ;
                $lasty = $posy ;


        }

        drawline($lastx,$lasty,$startx,$starty,$r,$g,$b);

}


function box($x0,$y0,$x1,$y1,$r,$g,$b)
{

 drawline($x0,$y0,$x1,0,$r,$g,$b) ;
drawline($x0,$y0,0,$y1,$r,$g,$b) ;

drawline($x0,$y1-2,$x1,$y1-2,$r,$g,$b) ;
drawline($x1-1,$y0,$x1-1,$y1,$r,$g,$b);


}

function drawline($x0,$y0,$x1,$y1,$r,$g,$b) {


    $xDist = abs($x1-$x0) ;
    $yDist = - (abs($y1-$y0)) ;
if ($x0 < $x1) $xStep = 1 ; else $xStep = -1 ;
if ($y0 < $y1) $yStep = 1 ; else $yStep = -1 ;
$error = $xDist + $yDist ;

pixel($x0,$y0,$r,$g,$b);

    while ($x0 != $x1 || $y0 != $y1) {
        if (2*$error - $yDist > $xDist - 2*$error) {
            // horizontal step
            $error += $yDist;
            $x0 += $xStep;
        } else {
            // vertical step
            $error += $xDist;
            $y0 += $yStep;
        }

pixel($x0,$y0,$r,$g,$b);



    }


}

function pixel($x,$y,$r,$g,$b)
{

pixelRGB565($x,$y,$r,$g,$b) ;


}

function pixelRGB565($x,$y,$r,$g,$b)
{

       global $fp , $sizex , $sizey , $ibpp  ;

       $c = (($r / 8) << 11) + (($g / 4) << 5) + ($b / 8);
       $bytes = array();

       $bytes[0] =  ( ( $c >> 8 ) & 255 )  ;
       $bytes[1] =   ($c & 255 ) ;

        pixelO($x*$ibpp,$y,$bytes[1]);
        pixelO(($x*$ibpp)+1,$y,$bytes[0]);


}


function get_pixelRGB565($x,$y)
{

       global $fp , $sizex , $sizey , $ibpp  ;

       $bytes = array();

       $bytes[] = pixelR($x*$ibpp,$y);
       $bytes[] =  pixelR(($x*$ibpp)+1,$y);

        

        

        return array('r' => 0 , 'g' => 0 , 'b' => 0 ) ;
}

function pixelO($x,$y,$c)
{

        global $fp , $sizex , $sizey , $ibpp  ;


fseek ($fp , $x + ($y * $sizex*$ibpp)    ) ;


        fwrite($fp , chr($c) ) ;



}

function pixelR($x,$y)
{

        global $fp , $sizex , $sizey , $ibpp  ;


        fseek ($fp , $x + ($y * $sizex*$ibpp)    ) ;


        return fread($fp , 1 ) ;



}


        if ($y1 > $y0)
        {
                for ($y = $y0 ; $y < $y1 ; $y++)
                {
                        drawline($x0,$y, $x1 , $y , $r , $g , $b) ;
                }

        }
        else
        {

                for ($y = $y1 ; $y > $y0 ; $y--)
                {
                        drawline($x0,$y, $x1 , $y , $r , $g , $b) ;
                }


        }


        box($x0,$y0,$x1,$y1,$r,$g,$b);


}


Des appels systèmes sont présents afin d'enlever le curseur qui clignote (visible sur la première vidéo) et régler la résolution sur sa tv.

La logique est plutôt simple. Il faut ouvrir le fichier /dev/fbX (0 pour sa tv, 1 pour son écran lcd)

Une fois fait il faut écrire dans ce fichier (qui est en fait la mémoire vidéo du framebuffer) afin de "dessiner".

Il pousse la démo en montrant qu'on peux aussi lire les entrée d'un écran tactile.

L’intérêt de sa démo est de montrer qu'on peut faire des interface graphique en php sur raspberry.

N'hésitez pas à partager cet article, en effet, le code étant open source il pourrait servir à vos amis ;-)

De plus il précise bien que le code n'est pas très "propre". On a affaire à un POC.

Récupérée de « http://www.askim.info/w/index.php?title=Comment_controler_sa_tv_ou_un_ecran_lcd_en_php_sur_raspberry&oldid=27057 »