/*##############################################################*/ /* */ /* File : examples.c */ /* */ /* Project : TFT for Raspberry Pi Revision 2 */ /* */ /* Date : 2014-08-14 last update: 2014-08-14 */ /* */ /* Author : Hagen Ploog */ /* Timo Pfander */ /* */ /* IDE : Geany 1.22 */ /* Compiler : gcc (Debian 4.6.3-14+rpi1) 4.6.3 */ /* */ /* Copyright (C) 2013 admatec GmbH */ /* */ /* */ /* Description : */ /* Exmples.c includes the following functions to demonstrate */ /* some opportunities: */ /* - depict one BMP file on the TFT */ /* - depict basic drawings which were created with the */ /* RAIO graphic controller */ /* - write some text on the TFT */ /* - draw functions like sine, cosine, parabola, ... */ /* */ /* */ /* License: */ /* */ /* This program is free software; you can redistribute it */ /* and/or modify it under the terms of the GNU General */ /* Public License as published by the Free Software */ /* Foundation; either version 3 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will */ /* be useful, but WITHOUT ANY WARRANTY; without even the */ /* implied warranty of MERCHANTABILITY or */ /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General */ /* Public License for more details. */ /* */ /* You should have received a copy of the GNU General */ /* Public License along with this program; if not, */ /* see . */ /* */ /* */ /* Revision History: */ /* */ /* Version 1.0 - Initial release */ /* */ /* */ /* */ /*##############################################################*/ #include #include #include #include "RAIO8870.h" #include "bmp.h" #include "examples.h" // load and depict a BMP file // --------------------------------------------- void example_DepictBMP( char const *file_name ) { uint16_t picture[1][ PICTURE_PIXELS ]; RAIO_set_cursor( 0, 0 ); Read_bmp2memory ( file_name, &picture[0][ PICTURE_PIXELS-1 ] ); RAIO_Write_Picture ( &picture[0][0], PICTURE_PIXELS ); } // draw with RAIO // --------------------------------------------- void example_DrawWithRAIO( void ) { // clear display with black color Text_Background_Color ( COLOR_BLACK ); RAIO_clear_screen(); // rectangle Text_Foreground_Color ( COLOR_BLUE ); Draw_Square (210, 150, 260, 200); RAIO_StartDrawing ( SQUARE_FILL ); // line Text_Foreground_Color ( COLOR_GREEN ); Draw_Line ( 10, 230, 310, 10 ); RAIO_StartDrawing ( LINE ); // circle Text_Foreground_Color ( COLOR_RED ); Draw_Circle ( 90, 65, 25 ); RAIO_StartDrawing ( CIRCLE_FILL ); } // write text // --------------------------------------------- void example_WriteText( unsigned char *text ) { // clear display with black color Text_Background_Color ( COLOR_BLACK ); RAIO_clear_screen(); // write text in different size and colors RAIO_SetFontSizeFactor ( 0 ); RAIO_print_text ( 10, 10, text, COLOR_BLACK , COLOR_WHITE ); RAIO_SetFontSizeFactor ( 5 ); RAIO_print_text( 30, 30, text, COLOR_BLACK, COLOR_RED ); RAIO_SetFontSizeFactor ( 10 ); RAIO_print_text ( 60, 70, text, COLOR_BLACK, COLOR_BLUE ); RAIO_SetFontSizeFactor ( 15 ); RAIO_print_text ( 80, 120, text, COLOR_BLACK, COLOR_GREEN ); } // draw sinus // --------------------------------------------- // defines the x-intercept and y-intercept on the TFT #define window_left -M_PI #define window_right M_PI #define window_up 2 #define window_down -2 // windows_up // // ↑ // _ _ _ _ _|_ _ _ _ _ // | | | // | | | // | | | // windows_left --|---------|---------|--→ windows_right // | | | // | | | // |_ _ _ _ _|_ _ _ _ _| // | // // windows_down void example_DrawFunction( int16_t function ) { float_t x_real, y_real; int16_t count; // clear display with black color Text_Background_Color ( COLOR_BLACK ); RAIO_clear_screen(); // draw x-axis draw_coords_line( window_left, 0, window_right, 0 ); for( count = (int16_t)window_left; count < (int16_t)window_right; count++ ) { Draw_Line ( scale_x( count ), scale_y( window_up*0.01 ), scale_x( count ), scale_y( window_down*0.01 ) ); Text_Foreground_Color ( COLOR_WHITE ); RAIO_StartDrawing ( LINE ); } // draw y-axis draw_coords_line( 0, window_up, 0, window_down ); for( count = (int16_t)window_down; count < (int16_t)window_up; count++ ) { Draw_Line ( scale_x( window_left*0.01 ), scale_y( count ), scale_x( window_right*0.01 ), scale_y( count ) ); Text_Foreground_Color ( COLOR_WHITE ); RAIO_StartDrawing ( LINE ); } // draw function for( x_real = window_left; x_real < window_right; x_real=x_real+0.02 ) { switch (function) // -> see FUNCTIONS { case SIN: y_real = sin( x_real ); break; case COS: y_real = cos( x_real ); break; case TAN: y_real = tan( x_real ); break; case PARABOLA: y_real = x_real * x_real; break; case EXPONENT: y_real = exp( x_real ); break; case LOGN : y_real = log( x_real ); break; default: break; }; set_point( x_real, y_real); } } // transform real world data in TFT data // --------------------------------------------- // transform x-value uint16_t scale_x( float_t x ) { return ( (uint16_t) (( x - window_left ) * ( DISPLAY_WIDTH / (window_right-window_left))) ); } // transform y-value uint16_t scale_y( float_t y ) { uint16_t temp_y; temp_y = DISPLAY_HEIGHT - (uint16_t) (( y - window_down) * (DISPLAY_HEIGHT / (window_up-window_down))); if( temp_y > 239 ) { temp_y--; } return ( temp_y ); } // draw coordinate system and function points // --------------------------------------------- // draw coordinate system void draw_coords_line (float_t x1, float_t y1, float_t x2, float_t y2) { Text_Foreground_Color( COLOR_WHITE ); Draw_Line( scale_x( x1 ), scale_y( y1 ), scale_x( x2 ), scale_y( y2 ) ); RAIO_StartDrawing( LINE ); } // draw function point void set_point ( float_t x_real, float_t y_real ) { if ((x_real> window_left) & (x_real < window_right) & (y_real > window_down) & (y_real 90) && (my_touch.touch_x < 115) && (my_touch.touch_y > 86) && (my_touch.touch_y < 106) ) { // draw exit button Text_Foreground_Color ( COLOR_YELLOW ); Draw_Square( (DISPLAY_WIDTH/2)-25, (DISPLAY_HEIGHT/2)-15, (DISPLAY_WIDTH/2)+25, (DISPLAY_HEIGHT/2)+15 ); RAIO_StartDrawing ( SQUARE_FILL ); RAIO_print_text( (DISPLAY_WIDTH/2)-16, (DISPLAY_HEIGHT/2)-9, "EXIT", COLOR_YELLOW, COLOR_BLACK ); // wait for leaving the touch panel while((my_touch.state == pressed)) { bcm2835_delayMicroseconds( 5000 ); rt = RAIO_gettouch(); } // exit while loop break; } else if ( ((my_touch.state == pressed) || (my_touch.state == down) || (my_touch.state == up)) && (btn_old_state != my_touch.state) ) { // safe old touch state btn_old_state = my_touch.state; if( my_touch.touch_x > 25 && my_touch.touch_x < 102 ) { // button 1 is active if( my_touch.touch_y > 21 && my_touch.touch_y < 96 ) { Text_Foreground_Color ( COLOR_GREEN ); Draw_Square( 6, 6, (DISPLAY_WIDTH/2)-3, (DISPLAY_HEIGHT/2)-3 ); RAIO_StartDrawing ( SQUARE_FILL ); RAIO_print_text( (DISPLAY_WIDTH/4)-45, (DISPLAY_HEIGHT/4)-20, "Button 1 is", COLOR_GREEN, COLOR_BLACK ); switch (my_touch.state) { case down : RAIO_print_text( (DISPLAY_WIDTH/4)-16, (DISPLAY_HEIGHT/4), "down", COLOR_GREEN, COLOR_BLACK ); break; case up : RAIO_print_text( (DISPLAY_WIDTH/4)-9, (DISPLAY_HEIGHT/4), "up", COLOR_GREEN, COLOR_BLACK ); break; case pressed: RAIO_print_text( (DISPLAY_WIDTH/4)-30, (DISPLAY_HEIGHT/4), "pressed", COLOR_GREEN, COLOR_BLACK ); break; default : break; } } // button 3 is active if( my_touch.touch_y > 101 && my_touch.touch_y < 178 ) { Text_Foreground_Color ( COLOR_GREEN ); Draw_Square( 6, (DISPLAY_HEIGHT/2)+4, (DISPLAY_WIDTH/2)-3, DISPLAY_HEIGHT-6 ); RAIO_StartDrawing ( SQUARE_FILL ); RAIO_print_text( (DISPLAY_WIDTH/4)-45, (DISPLAY_HEIGHT/4)*3-20, "Button 3 is", COLOR_GREEN, COLOR_BLACK ); switch (my_touch.state) { case down : RAIO_print_text( (DISPLAY_WIDTH/4)-16, (DISPLAY_HEIGHT/4)*3, "down", COLOR_GREEN, COLOR_BLACK ); break; case up : RAIO_print_text( (DISPLAY_WIDTH/4)-9, (DISPLAY_HEIGHT/4)*3, "up", COLOR_GREEN, COLOR_BLACK ); break; case pressed: RAIO_print_text( (DISPLAY_WIDTH/4)-30, (DISPLAY_HEIGHT/4)*3, "pressed", COLOR_GREEN, COLOR_BLACK ); break; default : break; } } } if( my_touch.touch_x > 107 && my_touch.touch_x < 182 ) { // button 2 is active if( my_touch.touch_y > 21 && my_touch.touch_y < 96 ) { Text_Foreground_Color ( COLOR_GREEN ); Draw_Square( (DISPLAY_WIDTH/2)+4, 6, DISPLAY_WIDTH-6, (DISPLAY_HEIGHT/2)-3 ); RAIO_StartDrawing ( SQUARE_FILL ); RAIO_print_text( (DISPLAY_WIDTH/4)*3-45, (DISPLAY_HEIGHT/4)-20, "Button 2 is", COLOR_GREEN, COLOR_BLACK ); switch (my_touch.state) { case down : RAIO_print_text( (DISPLAY_WIDTH/4)*3-16, (DISPLAY_HEIGHT/4), "down", COLOR_GREEN, COLOR_BLACK ); break; case up : RAIO_print_text( (DISPLAY_WIDTH/4)*3-9, (DISPLAY_HEIGHT/4), "up", COLOR_GREEN, COLOR_BLACK ); break; case pressed: RAIO_print_text( (DISPLAY_WIDTH/4)*3-30, (DISPLAY_HEIGHT/4), "pressed", COLOR_GREEN, COLOR_BLACK ); break; default : break; } } // button 4 is active if( my_touch.touch_y > 101 && my_touch.touch_y < 178 ) { Text_Foreground_Color ( COLOR_GREEN ); Draw_Square( (DISPLAY_WIDTH/2)+4, (DISPLAY_HEIGHT/2)+4, DISPLAY_WIDTH-6, DISPLAY_HEIGHT-6 ); RAIO_StartDrawing ( SQUARE_FILL ); RAIO_print_text( (DISPLAY_WIDTH/4)*3-45, (DISPLAY_HEIGHT/4)*3-20, "Button 4 is", COLOR_GREEN, COLOR_BLACK ); switch (my_touch.state) { case down : RAIO_print_text( (DISPLAY_WIDTH/4)*3-16, (DISPLAY_HEIGHT/4)*3, "down", COLOR_GREEN, COLOR_BLACK ); break; case up : RAIO_print_text( (DISPLAY_WIDTH/4)*3-9, (DISPLAY_HEIGHT/4)*3, "up", COLOR_GREEN, COLOR_BLACK ); break; case pressed: RAIO_print_text( (DISPLAY_WIDTH/4)*3-30, (DISPLAY_HEIGHT/4)*3, "pressed", COLOR_GREEN, COLOR_BLACK ); break; default : break; } } } } else if ( (btn_old_state != my_touch.state) ) { // safe old touch state btn_old_state = my_touch.state; switch (my_touch.state) { case no_touch : btn_set_all_open(); break; default : break; } } // time of minimum 15000µs is required bcm2835_delayMicroseconds( 100000 ); } } // set all soft-buttons to open // --------------------------------------------- void btn_set_all_open() { // draw button dimensions Text_Foreground_Color( COLOR_BLACK ); Draw_Square( 5, 5, (DISPLAY_WIDTH/2)-2, (DISPLAY_HEIGHT/2)-2 ); Draw_Square( (DISPLAY_WIDTH/2)+3, 5, DISPLAY_WIDTH-5, (DISPLAY_HEIGHT/2)-2 ); Draw_Square( 5, (DISPLAY_HEIGHT/2)+3, (DISPLAY_WIDTH/2)-2, DISPLAY_HEIGHT-5 ); Draw_Square( (DISPLAY_WIDTH/2)+3, (DISPLAY_HEIGHT/2)+3, DISPLAY_WIDTH-5, DISPLAY_HEIGHT-5 ); // set text and color for each open buttons Text_Foreground_Color ( COLOR_RED ); Draw_Square( 6, 6, (DISPLAY_WIDTH/2)-3, (DISPLAY_HEIGHT/2)-3 ); RAIO_StartDrawing ( SQUARE_FILL ); RAIO_print_text( (DISPLAY_WIDTH/4)-45, (DISPLAY_HEIGHT/4)-20, "Button 1 is", COLOR_RED, COLOR_BLACK ); RAIO_print_text( (DISPLAY_WIDTH/4)-16, (DISPLAY_HEIGHT/4) , "open", COLOR_RED, COLOR_BLACK ); Text_Foreground_Color ( COLOR_RED ); Draw_Square( (DISPLAY_WIDTH/2)+4, 6, DISPLAY_WIDTH-6, (DISPLAY_HEIGHT/2)-3 ); RAIO_StartDrawing ( SQUARE_FILL ); RAIO_print_text( (DISPLAY_WIDTH/4)*3-45, (DISPLAY_HEIGHT/4)-20, "Button 2 is", COLOR_RED, COLOR_BLACK ); RAIO_print_text( (DISPLAY_WIDTH/4)*3-16, (DISPLAY_HEIGHT/4) , "open", COLOR_RED, COLOR_BLACK ); Text_Foreground_Color ( COLOR_RED ); Draw_Square( 6, (DISPLAY_HEIGHT/2)+4, (DISPLAY_WIDTH/2)-3, DISPLAY_HEIGHT-6 ); RAIO_StartDrawing ( SQUARE_FILL ); RAIO_print_text( (DISPLAY_WIDTH/4)-45, (DISPLAY_HEIGHT/4)*3-20, "Button 3 is", COLOR_RED, COLOR_BLACK ); RAIO_print_text( (DISPLAY_WIDTH/4)-16, (DISPLAY_HEIGHT/4)*3 , "open", COLOR_RED, COLOR_BLACK ); Text_Foreground_Color ( COLOR_RED ); Draw_Square( (DISPLAY_WIDTH/2)+4, (DISPLAY_HEIGHT/2)+4, DISPLAY_WIDTH-6, DISPLAY_HEIGHT-6 ); RAIO_StartDrawing ( SQUARE_FILL ); RAIO_print_text( (DISPLAY_WIDTH/4)*3-45, (DISPLAY_HEIGHT/4)*3-20, "Button 4 is", COLOR_RED, COLOR_BLACK ); RAIO_print_text( (DISPLAY_WIDTH/4)*3-16, (DISPLAY_HEIGHT/4)*3 , "open", COLOR_RED, COLOR_BLACK ); // draw exit button Text_Foreground_Color ( COLOR_BLUE ); Draw_Square( (DISPLAY_WIDTH/2)-25, (DISPLAY_HEIGHT/2)-15, (DISPLAY_WIDTH/2)+25, (DISPLAY_HEIGHT/2)+15 ); RAIO_StartDrawing ( SQUARE_FILL ); RAIO_print_text( (DISPLAY_WIDTH/2)-16, (DISPLAY_HEIGHT/2)-9, "EXIT", COLOR_BLUE, COLOR_WHITE ); }