Key Pad 를 이용해 image file 을 읽어 화면에 출력 하거나 그림을 그리고 글자를 출력한다. 한글을 사용하기 위해서는 UTF-8로 작성되어야 한다.
TODO : Touch screen
Source Code
/* Application Action Key : Test Action F1 : make Blue Screen F2 : Display VI_logo.bmp F3 : Display String.. F4 : Clear Screen ENTER : Exit App */ #include <stdio.h> #include <stdint.h> #include <string.h> /* for memset */ #include <unistd.h> /* for open/close .. */ #include <fcntl.h> /* for O_RDWR */ #include <sys/ioctl.h> /* for ioctl */ #include <sys/mman.h> /* for mmap */ #include <linux/fb.h> /* for fb_var_screeninfo, FBIOGET_VSCREENINFO */ #include <linux/input.h> #include <poll.h> #include "SDL.h" #include "SDL_ttf.h" #define DEV_LCD_BACKLIGHT "/sys/class/backlight/backlight/brightness" #define TEST_IMAGE_FILE_1 "VI_logo_320_240_R90.jpg" #define TEST_IMAGE_FILE_2 "VI_logo_320_240_R270.jpg" #define TEST_FONT_FILE "D2Coding.ttf" #define TEST_DISPLAY_STRING "밸류이노베이션" //#define TEST_DISPLAY_STRING "VI" /* #define DEBUG_LOW_LEVEL_KEY_INPUT_INFO */ int sdl_copy_surface( SDL_Surface *pDestination, int X, int Y, SDL_Surface *pSource ) { int Result; SDL_Rect Offset; /* Make a temporary rectangle to hold the offsets */ Result = -1; if ( ( pDestination != (SDL_Surface *)0 ) && ( pSource != (SDL_Surface *)0 ) ) { /* Give the offsets to the rectangle */ Offset.x = X; Offset.y = Y; /* Blit the surface */ Result = SDL_BlitSurface( pSource, NULL, pDestination, &Offset ); } return Result; } int sdl_clear_surface( SDL_Surface *pDestination ) { if ( pDestination != (SDL_Surface *)0 ) { if ( SDL_FillRect(pDestination, NULL, SDL_MapRGB(pDestination->format, 0, 0, 0)) < 0) { printf("clear surface fail! : %s\n", SDL_GetError()); } else { printf("clear surface OK\n"); SDL_Flip( pDestination ); } } } int bright_set(const uint8_t Brightness) { FILE * pDeviceFile; char pString[10] = {0}; int StringLength; pDeviceFile = fopen(DEV_LCD_BACKLIGHT, "w+"); if ( pDeviceFile == (FILE *)0 ) { printf("failed to open back light device : %s\n", DEV_LCD_BACKLIGHT); return -1; } sprintf(pString, "%d", Brightness); StringLength = (int)strlen(pString); if ( fwrite(pString, StringLength, 1, pDeviceFile) < 0 ) { return -1; } fclose(pDeviceFile); return 0; } int bright_get(uint8_t *pBrightness) { FILE * pDeviceFile; char pCommand[128] = {0}; char pString[10] = {0}; char buf[10] = {0}; int level = 0; if ( pBrightness == (uint8_t *)0 ) { printf("bright_get : Input Parameter error\n"); return -1; } sprintf(pCommand, "cat %s", DEV_LCD_BACKLIGHT); pDeviceFile = popen(pCommand, "r"); if ( pDeviceFile == (FILE *)0 ) { return -1; } while( fgets(pString, 10, pDeviceFile) ); *pBrightness = (uint8_t)strtoul(pString, NULL, 10); fclose(pDeviceFile); return 0; } int main() { SDL_Surface * pScreen; SDL_Event Event; char * pGetENV; #if 1 pGetENV = SDL_getenv("SDL_VIDEODRIVER"); if( pGetENV == (char *)0 ) { printf("No ENV!\n"); SDL_putenv("SDL_VIDEODRIVER=directfb"); } // else // { printf("SDL_VIDEODRIVER=%s\n",SDL_getenv("SDL_VIDEODRIVER")); // } #endif if ( SDL_Init(SDL_INIT_VIDEO) < 0) { printf("SDL initialized Fail! : %s\n", SDL_GetError()); return -1; } else { printf("SDL initialized OK!\n"); } pScreen = SDL_SetVideoMode(240, 320, 32, SDL_SWSURFACE); if( pScreen == (SDL_Surface *)0 ) { printf("Fail to SetVideoMode !\n"); } else { SDL_KeyboardEvent * pKeyEvent; int IsInLoop; uint8_t Brightness; printf("Screen SDL SetVideoMode OK\n"); printf("SDL Surface Address = 0x%X(%d)\n", (uint32_t)pScreen, (uint32_t)pScreen); printf(" flags : 0x%08X\n", pScreen->flags); // SDL_PixelFormat *format; /**< Read-only */ printf(" w : %d\n", pScreen->w); printf(" h : %d\n", pScreen->h); printf(" pitch : %d\n", pScreen->pitch); printf(" *pixels : 0x%X(%d)\n", (uint32_t)pScreen->pixels, (uint32_t)pScreen->pixels); printf(" offset : 0x%X(%d)\n", (uint32_t)pScreen->offset, (uint32_t)pScreen->offset); // struct private_hwdata *hwdata; /** Hardware-specific surface info */ /** clipping information */ // SDL_Rect clip_rect; /**< Read-only */ /** Allow recursive locks */ printf(" locked : 0x%X(%d)\n", (uint32_t)pScreen->locked, (uint32_t)pScreen->locked); Uint32 locked; /**< Private */ /** info for fast blit mapping to other surfaces */ // struct SDL_BlitMap *map; /**< Private */ /** format version, bumped at every change to invalidate blit maps */ printf(" format_version : 0x%X(%d)\n", (uint32_t)pScreen->format_version, (uint32_t)pScreen->format_version); /** Reference count -- used when freeing surface */ printf(" refcount : 0x%X(%d)\n", (uint32_t)pScreen->refcount, (uint32_t)pScreen->refcount); SDL_ShowCursor(SDL_DISABLE/* SDL_ENABLE or SDL_DISABLE */); /* Must be clear action before doing other actions.. */ sdl_clear_surface( pScreen ); // SDL_Delay(1000/*ms*/); // sdl_clear_surface( pScreen ); IsInLoop = 1; /* Start event loop */ while (IsInLoop) { if ( SDL_PollEvent( &Event ) == 0) /* While there's an event to handle */ { continue; } if ( ( Event.type == SDL_KEYDOWN ) || ( Event.type == SDL_KEYUP ) ) { /* Keys pressed or reased */ pKeyEvent = (SDL_KeyboardEvent *)&Event; switch ( pKeyEvent->keysym.sym ) { case SDLK_BACKSPACE: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - BACKSPACE\n"); } else { printf("SDL Event Keys release! - BACKSPACE\n"); } break; case SDLK_RETURN: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - RETURN\n"); } else { printf("SDL Event Keys release! - RETURN\n"); IsInLoop = 0; } break; case SDLK_0: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - 0\n"); } else { printf("SDL Event Keys release! - 0\n"); } break; case SDLK_1: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - 1\n"); } else { printf("SDL Event Keys release! - 1\n"); } break; case SDLK_2: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - 2\n"); } else { printf("SDL Event Keys release! - 2\n"); } break; case SDLK_3: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - 3\n"); } else { printf("SDL Event Keys release! - 3\n"); } break; case SDLK_4: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - 4\n"); } else { printf("SDL Event Keys release! - 4\n"); } break; case SDLK_5: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - 5\n"); } else { printf("SDL Event Keys release! - 5\n"); } break; case SDLK_6: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - 6\n"); } else { printf("SDL Event Keys release! - 6\n"); } break; case SDLK_7: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - 7\n"); } else { printf("SDL Event Keys release! - 7\n"); } break; case SDLK_8: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - 8\n"); } else { printf("SDL Event Keys release! - 8\n"); } break; case SDLK_9: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - 9\n"); } else { printf("SDL Event Keys release! - 9\n"); } break; case SDLK_F1: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - F1\n"); } else { printf("SDL Event Keys release! - F1\n"); if ( SDL_FillRect(pScreen, NULL, SDL_MapRGB(pScreen->format, 255/*B*/, 0/*G*/, 0/*R*/)) < 0) { printf("SDL_FillRect Fail! : %s\n", SDL_GetError()); } else { printf("SDL_FillRect OK\n"); SDL_Flip( pScreen ); } } break; case SDLK_F2: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - F2\n"); } else { SDL_Surface * pBMP; printf("SDL Event Keys release! - F2\n"); pBMP = SDL_LoadBMP("logo.bmp"); if( pBMP == (SDL_Surface *)0 ) { printf("Fail to SDL_LoadBMP !\n"); } else { printf("BMP SDL LoadBMP OK\n"); printf("BMP Surface Address = 0x%X(%d)\n", (uint32_t)pBMP, (uint32_t)pBMP); printf(" flags : 0x%08X\n", pBMP->flags); // SDL_PixelFormat *format; /**< Read-only */ printf(" w : %d\n", pBMP->w); printf(" h : %d\n", pBMP->h); printf(" pitch : %d\n", pBMP->pitch); printf(" *pixels : 0x%X(%d)\n", (uint32_t)pBMP->pixels, (uint32_t)pBMP->pixels); printf(" offset : 0x%X(%d)\n", (uint32_t)pBMP->offset, (uint32_t)pBMP->offset); // struct private_hwdata *hwdata; /** Hardware-specific surface info */ /** clipping information */ // SDL_Rect clip_rect; /**< Read-only */ /** Allow recursive locks */ printf(" locked : 0x%X(%d)\n", (uint32_t)pBMP->locked, (uint32_t)pBMP->locked); Uint32 locked; /**< Private */ /** info for fast blit mapping to other surfaces */ // struct SDL_BlitMap *map; /**< Private */ /** format version, bumped at every change to invalidate blit maps */ printf(" format_version : 0x%X(%d)\n", (uint32_t)pBMP->format_version, (uint32_t)pBMP->format_version); /** Reference count -- used when freeing surface */ printf(" refcount : 0x%X(%d)\n", (uint32_t)pBMP->refcount, (uint32_t)pBMP->refcount); // SDL_BlitSurface( pBMP, NULL, pScreen, NULL ); sdl_copy_surface( pScreen, 0/*X*/, 0/*Y*/, pBMP ); // 화면을 갱신 SDL_Flip( pScreen ); SDL_FreeSurface( pBMP ); } } break; case SDLK_F3: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - F3\n"); } else { SDL_Surface * pText; TTF_Font * pFont; SDL_Color pTextColor = { 255, 255, 255 }; /* The color of the font */ printf("SDL Event Keys release! - F3\n"); if( TTF_Init() < 0 ) { printf("Fail to TTF_Init !\n"); } else { printf("OK to TTF_Init !\n"); /* Open the font */ pFont = TTF_OpenFont( TEST_FONT_FILE, 28 ); /* If there was an error in loading the font */ if( pFont == (TTF_Font *)0 ) { printf("Fail to TTF_OpenFont !\n"); } else { printf("OK to TTF_OpenFont !\n"); /* 한글 출력을 위해 TTF_RenderUTF8_Solid 사용 */ /* For display HanGul using TTF_RenderUTF8_Solid */ pText = TTF_RenderUTF8_Solid( pFont, TEST_DISPLAY_STRING, pTextColor ); /* Render the text */ /* TTF_RenderText_Solid Draw LATIN1 text in solid mode TTF_RenderUTF8_Solid Draw UTF8 text in solid mode TTF_RenderUNICODE_Solid Draw UNICODE text in solid mode TTF_RenderGlyph_Solid Draw a UNICODE glyph in solid mode */ /* If there was an error in rendering the text */ if( pText == (SDL_Surface *)0 ) { printf("Fail to TTF_RenderText_Solid !\n"); } else { printf("OK to TTF_RenderText_Solid !\n"); /* Apply the images to the screen */ sdl_copy_surface( pScreen, 0/*X*/, 150/*Y*/, pText ); /* Update the screen */ SDL_Flip( pScreen ); /* Free the text surface */ SDL_FreeSurface( pText ); } /* Close the font that was used */ TTF_CloseFont( pFont ); } /* Quit SDL_ttf */ TTF_Quit(); } } break; case SDLK_F4: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - F4\n"); } else { printf("SDL Event Keys release! - F4\n"); if ( sdl_clear_surface( pScreen ) != 0 ) { printf("clar scrren fail\n"); } else { printf("clar scrren OK\n"); } } break; case SDLK_F5: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - F5\n"); } else { printf("SDL Event Keys release! - F5\n"); } break; case SDLK_F6: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - F6\n"); } else { printf("SDL Event Keys release! - F6\n"); if( Brightness != 7 ) { Brightness ++; if( bright_set(Brightness) != 0 ) { printf("Fail to bright_set\n"); } printf("bright -\n"); } } break; case SDLK_F7: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - F7\n"); } else { printf("SDL Event Keys release! - F7\n"); if( Brightness != 0 ) { Brightness --; if( bright_set(Brightness) != 0 ) { printf("Fail to bright_set\n"); } printf("bright +\n"); } } break; default: if ( Event.type == SDL_KEYDOWN ) { printf("SDL Event Keys pressed! - ??\n"); } else { printf("SDL Event Keys release! - ??\n"); } break; } #ifdef DEBUG_LOW_LEVEL_KEY_INPUT_INFO printf(" The keyboard device index = %d\n", pKeyEvent->which); printf(" The SDL_PRESSED or SDL_RELEASED = %d\n", pKeyEvent->state); printf(" hardware specific scancode = %d\n", pKeyEvent->keysym.scancode); printf(" SDL virtual keysym = %d\n", pKeyEvent->keysym.sym); printf(" current key modifiers = %d\n", pKeyEvent->keysym.mod); printf(" translated character = %d\n", pKeyEvent->keysym.unicode); #endif } else { switch (Event.type) { case SDL_ACTIVEEVENT: /**< Application loses/gains visibility */ printf("SDL Event Application loses/gains visibility!\n"); break; case SDL_KEYDOWN: /**< Keys pressed */ printf("SDL Event Keys pressed!\n"); break; case SDL_KEYUP: /**< Keys released */ printf("SDL Event Keys released!\n"); break; case SDL_MOUSEMOTION: /**< Mouse moved */ printf("SDL Event Mouse moved!\n"); break; case SDL_MOUSEBUTTONDOWN:/**< Mouse button pressed */ printf("SDL Event Mouse button pressed!\n"); break; case SDL_MOUSEBUTTONUP: /**< Mouse button released */ printf("SDL Event Mouse button released!\n"); break; case SDL_JOYAXISMOTION: /**< Joystick axis motion */ printf("SDL Event Joystick axis motion!\n"); break; case SDL_JOYBALLMOTION: /**< Joystick trackball motion */ printf("SDL Event Joystick trackball motion!\n"); break; case SDL_JOYHATMOTION: /**< Joystick hat position change */ printf("SDL Event Joystick hat position change!\n"); break; case SDL_JOYBUTTONDOWN: /**< Joystick button pressed */ printf("SDL Event Joystick button pressed!\n"); break; case SDL_JOYBUTTONUP: /**< Joystick button released */ printf("SDL Event Joystick button released!\n"); break; case SDL_QUIT: /**< User-requested quit */ printf("SDL Event User-requested quit!\n"); break; case SDL_SYSWMEVENT: /**< System specific event */ printf("SDL Event System specific!\n"); break; case SDL_EVENT_RESERVEDA:/**< Reserved for future use.. */ printf("SDL Event reserved!\n"); break; case SDL_EVENT_RESERVEDB:/**< Reserved for future use.. */ printf("SDL Event reserved!\n"); break; case SDL_VIDEORESIZE: /**< User resized video mode */ printf("SDL Event User resized video mode!\n"); break; case SDL_VIDEOEXPOSE: /**< Screen needs to be redrawn */ printf("SDL Event Screen needs to be redrawn!\n"); break; case SDL_EVENT_RESERVED2:/**< Reserved for future use.. */ case SDL_EVENT_RESERVED3:/**< Reserved for future use.. */ case SDL_EVENT_RESERVED4:/**< Reserved for future use.. */ case SDL_EVENT_RESERVED5:/**< Reserved for future use.. */ case SDL_EVENT_RESERVED6:/**< Reserved for future use.. */ case SDL_EVENT_RESERVED7:/**< Reserved for future use.. */ printf("SDL Event reserved!\n"); break; case SDL_USEREVENT: printf("SDL Event user!\n"); break; default: printf("SDL Event unknown!\n"); break; } } } SDL_FreeSurface( pScreen ); } SDL_Quit(); return 0; }
make