Site Tools


Hotfix release available: 2024-02-06a "Kaos". upgrade now! [55.1] (what's this?)
New release available: 2024-02-06 "Kaos". upgrade now! [55] (what's this?)
Hotfix release available: 2023-04-04a "Jack Jackrum". upgrade now! [54.1] (what's this?)
New release available: 2023-04-04 "Jack Jackrum". upgrade now! [54] (what's this?)
Hotfix release available: 2022-07-31b "Igor". upgrade now! [53.1] (what's this?)
Hotfix release available: 2022-07-31a "Igor". upgrade now! [53] (what's this?)
New release available: 2022-07-31 "Igor". upgrade now! [52.2] (what's this?)
New release candidate 2 available: rc2022-06-26 "Igor". upgrade now! [52.1] (what's this?)
New release candidate available: 2022-06-26 "Igor". upgrade now! [52] (what's this?)
Hotfix release available: 2020-07-29a "Hogfather". upgrade now! [51.4] (what's this?)
New release available: 2020-07-29 "Hogfather". upgrade now! [51.3] (what's this?)
New release candidate 3 available: 2020-06-09 "Hogfather". upgrade now! [51.2] (what's this?)
New release candidate 2 available: 2020-06-01 "Hogfather". upgrade now! [51.1] (what's this?)
New release candidate available: 2020-06-01 "Hogfather". upgrade now! [51] (what's this?)
Hotfix release available: 2018-04-22c "Greebo". upgrade now! [50.3] (what's this?)
Hotfix release available: 2018-04-22b "Greebo". upgrade now! [50.2] (what's this?)
Hotfix release available: 2018-04-22a "Greebo". upgrade now! [50.1] (what's this?)
New release available: 2018-04-22 "Greebo". upgrade now! [50] (what's this?)
Hotfix release available: 2017-02-19g "Frusterick Manners". upgrade now! [49.7] (what's this?)
Hotfix release available: 2017-02-19f "Frusterick Manners". upgrade now! [49.6] (what's this?)
Hotfix release available: 2017-02-19e "Frusterick Manners". upgrade now! [49.5] (what's this?)
Hotfix release available fixing CVE-2017-12979 and CVE-2017-12980: 2017-02-19d "Frusterick Manners". upgrade now! [49.4] (what's this?)
Hotfix release available fixing CVE-2017-12583: 2017-02-19c "Frusterick Manners". upgrade now! [49.3] (what's this?)
ui_api

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
ui_api [2017/10/31 13:38]
1.241.172.144
ui_api [2017/10/31 13:41] (current)
1.241.172.144
Line 2: Line 2:
  
 <​code>​ <​code>​
 +#​include <​stdio.h>​ /​* printf */
 +#​include <​stdint.h>​ /​* uint??_t */
 +#​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 <​sys/​fcntl.h>​ /​* for O_RDWR */
 +
 +#​include "​directfb/​directfb.h"​ /​* 항상 UI.h 와 함께 UI.h 보다 먼저 */
 +#​include "​UI.h"​ /​* direct fb */
 +
 +#​include "​MMD1100.h"​ /​* MSR */
 +#​include "​Buzzer.h"​
 +#​include "​LED.h"​
 +#​include "​KeyBackLight.h"​
 +#​include "​ThermalPrinter.h"​
 +
 +#​include <​termios.h>​ /​* struct termios */
 +
 +
 +/*
 +DirectFB support still image type
 + jpg
 + png
 + gif
 +
 +*/
 +
 +/​* Application Action
 +Key : Test Action
 +-------------------------------------------------------------------------------------
 +F1 : Display VI_logo_320_240_R90.jpg
 +F2 : Display VI_logo_320_240_R270.jpg
 +F3 : Draw Blue Box
 +F4 : Clear Screen
 +F5 : Display String..
 +F6 (*) : LCD Back light -, Read Thermal Printer Info
 +F7 (#) : LCD Back light +
 +F8 (Up) : Key Backlight On
 +F9 (Down) : Key Backlight Off
 +F10 (Scan) : -
 +ESC : - Printer Pattern
 +BACKSPACE : - Throw Printer paper
 +ENTER : Exit App
 +1 : LED On  - DEVICE_LED_B14 = HANDY_READY ​   or PRINTER_BUSY ​    or AP_STATUS
 + : Beep 도
 +2 : LED Off - DEVICE_LED_B14 = HANDY_READY ​   or PRINTER_BUSY ​    or AP_STATUS
 + : Beep 레
 +3 : LED On  - DEVICE_LED_A25 = HANDY_PROCESS ​ or PRINTER_READY
 + : Beep 미
 +4 : LED Off - DEVICE_LED_A25 = HANDY_PROCESS ​ or PRINTER_READY
 + : Beep 파
 +5 : LED On  - DEVICE_LED_C21 = HANDY_COLPLETE or 
 + : Beep 솔
 +6 : LED Off - DEVICE_LED_C21 = HANDY_COLPLETE or 
 + : Beep 라
 +7 : LED On  - DEVICE_LED_B15 = HANDY_ERROR ​   or PRINTER_NO_PAPER or AP_ERROR
 + : Beep 시
 +8 : LED Off - DEVICE_LED_B15 = HANDY_ERROR ​   or PRINTER_NO_PAPER or AP_ERROR
 + : Beep 옥타브 내림
 +9 : Beep 옥타브 올림
 +0 : Read MMD1100 version
 +*/
 +
 +//#​define TEST_LTE_MODEM
 +
 +//#​define TEST_THERMAL_PRINTER
 +
 +/​***************************************************************************/​
 +/* For directfb
 +*/
 +/​***************************************************************************/​
 +#​ifdef TEST_LTE_MODEM
 +#​define LTE_INITIAL_IMAGE_FILE "​320x480.jpg"​
 +#endif /* TEST_LTE_MODEM */
 +
 +#​define TEST_IMAGE_FILE_1 "​VI_logo_320_240_R90.jpg"​
 +#​define TEST_IMAGE_FILE_2 "​VI_logo_320_240_R270.jpg"​
 +
 +#​define TEST_DISPLAY_STRING "​밸류이노베이션 VI"
 +
 +/​***************************************************************************/​
 +/* For Test LCD BackLight
 +*/
 +/​***************************************************************************/​
 +#​define DEVICE_LCD_BACKLIGHT "/​sys/​class/​backlight/​backlight/​brightness"​
 +
 +
 +#​ifdef TEST_LTE_MODEM
 +
 +#​define DEVICE_LTE_TEST_LED_SW "/​sys/​class/​leds/​lte_sw/​brightness"​
 +#​define DEVICE_LTE_TEST_LED_KEY "/​sys/​class/​leds/​lte_key/​brightness"​
 +//#​define DEVICE_LTE_TEST_LED_AP "/​sys/​class/​leds/​lte_ap_ready/​brightness"​
 +//#​define DEVICE_LTE_TEST_LED_USB_ON "/​sys/​class/​leds/​lte_usb_on/​brightness"​
 +//#​define DEVICE_LTE_TEST_LED_DTR "/​sys/​class/​leds/​lte_dtr/​brightness"​
 +
 +int lte_on_off_switch(bool Switch/​*true=on,​ false=Off*/​)
 +{
 + FILE * pDeviceFile;​
 + char pString[2] = { 0, 0 };
 + int StringLength;​
 +
 + pDeviceFile = fopen ( DEVICE_LTE_TEST_LED_SW,​ "​w+"​);​
 + if ( pDeviceFile == (FILE *)0 )
 + {
 + return -2;​
 + }
 +
 + if ( Switch == true )
 + {
 + pString[0] = '​1';​
 + }
 + else
 + {
 + pString[0] = '​0';​
 + }
 + StringLength = (int)strlen(pString);​
 + if ( fwrite ( pString, StringLength,​ 1, pDeviceFile ) < 0 )
 + {
 + return -3;​
 + }
 +
 + fclose ( pDeviceFile );
 +
 + return 0;
 +}
 +
 +int lte_power_key(bool Pressed/​*true=on,​ false=Off*/​)
 +{
 + FILE * pDeviceFile;​
 + char pString[2] = { 0, 0 };
 + int StringLength;​
 +
 + pDeviceFile = fopen ( DEVICE_LTE_TEST_LED_KEY,​ "​w+"​);​
 + if ( pDeviceFile == (FILE *)0 )
 + {
 + return -2;​
 + }
 +
 + if ( Pressed == true )
 + {
 + pString[0] = '​1';​
 + }
 + else
 + {
 + pString[0] = '​0';​
 + }
 + StringLength = (int)strlen(pString);​
 + if ( fwrite ( pString, StringLength,​ 1, pDeviceFile ) < 0 )
 + {
 + return -3;​
 + }
 +
 + fclose ( pDeviceFile );
 +
 + return 0;
 +}
 +
 +#if 0
 +
 +#​define DEVICE_LTE "/​dev/​ttyS4"​
 +#​define DEVICE_LTE_DEFAULT_BAUDRATE 115200
 +
 +struct termios BackupTerminalInfo;​
 +
 +int lte_open(int *pDeviceFileDescriptor)
 +{
 + struct termios TerminalInfo;​
 +
 + if ( pDeviceFileDescriptor == (int *)0 )
 + {
 + return -2;​
 + }
 +
 + /* 화일을 연다. */
 + *pDeviceFileDescriptor = open( DEVICE_LTE, (O_RDWR | O_NOCTTY) );
 + if ( *pDeviceFileDescriptor < 0 )
 + {
 + *pDeviceFileDescriptor = -1;
 + return -1;​
 + }
 + /* 현재 설정을 BackupTerminalInfo에 저장 */
 + tcgetattr( *pDeviceFileDescriptor,​ &​BackupTerminalInfo );
 + memset( &​TerminalInfo,​ 0, sizeof(TerminalInfo) );
 + switch( DEVICE_LTE_DEFAULT_BAUDRATE )
 + {
 + case 19200:​
 + TerminalInfo.c_cflag = B19200 | CS8 | CSTOPB | CLOCAL | CREAD ; 
 + break;
 + case 38400:​
 + TerminalInfo.c_cflag = B38400 | CS8 | CSTOPB | CLOCAL | CREAD ; 
 + break;
 + case 57600:​
 + TerminalInfo.c_cflag = B57600 | CS8 | CSTOPB | CLOCAL | CREAD ; 
 + break;
 + case 115200:​
 + TerminalInfo.c_cflag = B115200 | CS8 | CSTOPB | CLOCAL | CREAD ; 
 + break;
 + case 9600:
 + default:
 + TerminalInfo.c_cflag = B9600 | CS8 | CSTOPB | CLOCAL | CREAD ; 
 + break;
 + }
 + TerminalInfo.c_iflag = 0; /* IGNPAR? */
 + TerminalInfo.c_oflag = 0;
 + //set input mode (non-canonical,​ no echo,.....)
 + TerminalInfo.c_lflag = 0;
 + TerminalInfo.c_cc[VTIME] = 100; /* time-out 값으로 사용된다. time-out 값은 TIME*0.1초 이다. */
 + TerminalInfo.c_cc[VMIN] ​ = 0; /* MIN은 read가 리턴되기 위한 최소한의 문자 개수 */
 +
 + tcflush( *pDeviceFileDescriptor,​ TCIFLUSH );
 + tcsetattr( *pDeviceFileDescriptor,​ TCSANOW, &​TerminalInfo );
 + // raw mode
 + fcntl( *pDeviceFileDescriptor,​ F_SETFL, O_NONBLOCK );
 +
 + return 0;
 +}
 +
 +int lte_close(int DeviceFileDescriptor)
 +{
 +
 + if ( DeviceFileDescriptor < 0 )
 + {
 + return -1;​
 + }
 +
 + /* 이전 상태로 되돌린다. */
 + tcsetattr( DeviceFileDescriptor,​ TCSANOW, &​BackupTerminalInfo );
 +
 + close( DeviceFileDescriptor );
 +
 + return 0;
 +}
 +
 +int lte_serial_polling(int DeviceFileDescriptor)
 +{
 + struct pollfd PollFileDescriptor;​
 + uint32_t Temp;​
 + int Result;​
 + uint8_t ReceivedByte;​
 +
 + memset( &​PollFileDescriptor,​ 0, sizeof(struct pollfd) );
 + PollFileDescriptor.fd = DeviceFileDescriptor;​
 + PollFileDescriptor.events = POLLIN;
 + PollFileDescriptor.revents = 0;
 +
 + Result = poll( (struct pollfd *)&​PollFileDescriptor,​ 1, 300);​ //​ 300 msec
 +
 + if ( (Result == 1) && ((PollFileDescriptor.revents & POLLIN) != 0) )
 + {
 + if ( read( DeviceFileDescriptor,​ &​ReceivedByte,​ 1 ) == 1 )
 + {
 + printf( "Input %c\n", ReceivedByte );
 + }
 + }
 + return 0;
 +}
 +
 +#endif
 +
 +#endif /* TEST_LTE_MODEM */
 +
 +
 +/​***************************************************************************/​
 +/* For Test LCD BackLight
 +*/
 +/​***************************************************************************/​
 +int bright_set(const uint8_t Brightness)
 +{
 + FILE * pDeviceFile;​
 + char pString[10] = {0};
 + int StringLength;​
 +
 + pDeviceFile = fopen(DEVICE_LCD_BACKLIGHT,​ "​w+"​);​
 + if ( pDeviceFile == (FILE *)0 )
 + {
 + printf("​failed to open back light device : %s\n", DEVICE_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", DEVICE_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;
 +}
 +
 +void print_hex_dump(uint8_t *pBuffer, uint32_t ByteLengthForDump)
 +{
 + uint32_t Address;​
 +
 + printf( "​--------------------------------------------------------------------------------------------\n"​ );
 + printf( "​Address ​   | 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F\n"​ );
 + printf( "​--------------------------------------------------------------------------------------------"​ );
 +for( Address = 0; Address < ByteLengthForDump;​ Address++ )
 +{
 + if (( Address & 0x0000000F ) == 0 )
 + {
 + printf( "​\n0x%08X :", Address );
 + }
 + printf ( " 0x%02X",​ pBuffer[Address] );
 +}
 + printf( "​\n--------------------------------------------------------------------------------------------\n"​ );
 +}
 +
 +static char *pFontList[8] =
 +{
 + "​D2Coding.ttf",​
 + "​NanumSquareR.ttf",​
 + "​NanumGothic.ttf",​
 + "​NanumGothicCoding.ttf",​
 + "​NanumMyeongjo.ttf",​
 + "​NanumBarunGothic.ttf",​
 + "​NanumBrush.ttf",​
 + "​NanumPen.ttf"​
 +};
 +
 +
 +int main()
 +{
 + void * pUI;
 +
 + uint32_t KeyCode;​
 + bool IsReleased;​
 +
 +#​ifdef TEST_THERMAL_PRINTER
 + int ThermalPrinter;​
 + uint32_t ThermalPrinterDotsInLine;​
 + int ThermalPrinterImageSize;​
 + char pThermapPrinterTestString[100];​
 +#endif /* TEST_THERMAL_PRINTER */
 +
 + int IsInLoop;​
 + uint32_t Octave;​
 + uint8_t Brightness;​
 +
 + int DeviceFileDescriptorForMSR;​
 + MSRTrack_t MSRTrack;​
 + MMD1100Response_t MSRResponse;​
 + uint32_t IsNotTrack;​
 + uint8_t pVersion[1024];​
 + int ReadByteLength;​
 + uint8_t pImageBuffer[10000];​
 +
 +#​ifdef TEST_LTE_MODEM
 + int DeviceLTE;​
 +#endif /* TEST_LTE_MODEM */
 +
 +#​ifdef TEST_THERMAL_PRINTER
 + thermal_printer_open( &​ThermalPrinter );
 +#endif /* TEST_THERMAL_PRINTER */
 +
 + if ( ui_initialize( &pUI, 0 ) != 0 )
 + {
 + printf( "​ui_initialize() Fail!\n"​);​
 + return -1;​
 + }
 +
 +#​ifdef TEST_THERMAL_PRINTER
 + if ( thermal_printer_get_dots_in_line( ThermalPrinter,​ &​ThermalPrinterDotsInLine ) < 0 )
 + {
 + printf( "Fail to get Termal Printer Dots In Line\n"​ );
 + ui_release( pUI );
 + return -1;​
 + }
 + printf( "​Termal Printer Dots In Line = %d\n", ThermalPrinterDotsInLine );
 +
 + if ( ui_printer_create_surface( pUI, ThermalPrinterDotsInLine/​*SurfaceWidth*/,​ ThermalPrinterDotsInLine/​*SurfaceHeight*/​) < 0 )
 + {
 + printf( "Fail to ui_printer_create_surface()\n"​ );
 + ui_release( pUI );
 + return -1;​
 + }
 +#endif /* TEST_THERMAL_PRINTER */
 +
 + if ( ui_clear_screen( pUI ) != 0 )
 + {
 + printf( "​ui_clear_screen() Fail!\n"​);​
 + ui_release( pUI );
 + return -1;​
 + }
 + printf( "​FillRectangle to clear surface OK!\n"​);​
 +
 + if ( bright_get(&​Brightness) != 0 )
 + {
 + printf("​Fail to bright_get()\n"​);​
 + }
 + else
 + {
 + printf("​Brightness == %d\n", Brightness);​
 + }
 + Brightness = 8; /* */
 + if( bright_set(Brightness) != 0 )
 + {
 + printf("​Fail to bright_set(0)\n"​);​
 + }
 +
 + if ( buzzer_open() < 0 )
 + {
 + printf("​Fail to buzzer_open\n"​);​
 + }
 +
 + if ( mmd1100_open( &​DeviceFileDescriptorForMSR ) != 0 )
 + {
 + printf( "Fail to mmd1100_open\n"​ );
 + }
 + else
 + {
 + printf( "OK to mmd1100_open\n"​ );
 + }
 +
 +#​ifdef TEST_LTE_MODEM
 + ui_draw_image( pUI, LTE_INITIAL_IMAGE_FILE,​ 0, 0 );
 +#endif /* TEST_LTE_MODEM */
 +
 +#​ifdef TEST_LTE_MODEM
 + usleep( 100000 ); /* 100ms */
 + lte_on_off_switch( true/​*true=on,​ false=Off*/ );
 + usleep( 50000 ); /* >=30ms */
 + lte_power_key( true/​*true=on,​ false=Off*/ );
 + usleep( 200000 ); /* >=100ms */
 + lte_power_key( false/​*true=on,​ false=Off*/ );
 +#endif /* TEST_LTE_MODEM */
 +
 +#if 0
 + if ( lte_open( &​DeviceLTE ) != 0 )
 + {
 + printf( "Fail to ttyS4\n"​ );
 + }
 + else
 + {
 + printf( "OK to ttyS4\n"​ );
 + }
 +//​int lte_close(int DeviceFileDescriptor)
 + for ( KeyCode = 0; KeyCode < 10; KeyCode++ )
 + {
 + int waitcounter;​
 + if ( write( DeviceLTE, "​AT+GMI",​ 6 ) != 0 )
 + {
 + printf( "Fail to w ttyS4\n"​ );
 + }
 + else
 + {
 + printf( "OK to W ttyS4\n"​ );
 + }
 + for ( waitcounter = 0; waitcounter < 10; waitcounter++ )
 + {
 + lte_serial_polling( DeviceLTE );
 + }
 + usleep( 1000000 ); /* 1 s */
 + }
 +
 +#endif /* TEST_LTE_MODEM */
 +
 + Octave = 4;
 + IsInLoop = 1;
 + /* Start event loop */  ​
 + while ( IsInLoop )
 + {
 + if ( ui_key_is_inputed( pUI, 100/*100ms MiliSecondWaitTimeout*/​) == 0 )
 + {
 + uint8_t ReceivedByte;​
 +
 +#if 1
 + if ( mmd1100_receive( &​MSRTrack,​ &​MSRResponse,​ &​IsNotTrack,​ 10000/*10ms ResponseTimeout*/​) == 0 )
 + {
 + printf("​MSR IN\n"​);​
 + if ( IsNotTrack == 1 )
 + {
 + switch ( MSRResponse.Command )
 + {
 + case MMD1100_COMMAND_GET_VERSION:​
 + if ( MSRResponse.ErrorCode == 0 )
 + {
 + printf(" ​  ​MMD1100_COMMAND_GET_VERSION : %s\n", MSRResponse.pData );
 + }
 + else
 + {
 + printf(" ​  ​MMD1100_COMMAND_GET_VERSION : Error = 0x%02X\n",​ MSRResponse.ErrorCode );
 + }
 + break;​
 + case MMD1100_COMMAND_LOAD_USER_PARAMETERS:​
 + break;​
 + case MMD1100_COMMAND_UART_CALIBRATION:​
 + break;​
 + case MMD1100_COMMAND_OTP_WRITE:​
 + break;​
 + case MMD1100_COMMAND_GET_STATUS:​
 + break;​
 + case MMD1100_COMMAND_READ_DATA_RETRY:​
 + break;​
 + case MMD1100_COMMAND_SOFTWARE_RESET:​
 + break;​
 + default:​
 + break;​
 + }
 + }
 + else
 + {
 + int i;
 + if ( MSRTrack.ErrorCodeForTrack1 == 0 )
 + {
 + printf( " ​  Track 1 : " );
 + for ( i = 0; i < MSRTrack.LengthOfTrack1;​ i++ )
 + {
 + printf( "​%c",​ MSRTrack.pTrack1[i] );
 + }
 + printf( "​\n"​ );
 + if ( ( (MSRTrack.LengthOfTrack1 * 8) % 7 ) == 0 )
 + {
 + printf( " Length OK \n" );
 + }
 + }
 + else
 + {
 + printf(" ​  Track 1 : ErrorCode = 0x%02X\n",​ MSRTrack.ErrorCodeForTrack1 );
 + }
 + if ( MSRTrack.ErrorCodeForTrack2 == 0 )
 + {
 + printf( " ​  Track 2 Raw Data : (Length = %d)\n    ", MSRTrack.LengthOfRaw2 );
 + for ( i = 0; i < MSRTrack.LengthOfRaw2;​ i++ )
 + {
 + printf( "%02X ", MSRTrack.pRaw2[i] );
 + }
 + printf( "​\n"​ );
 + printf( " ​  Track 2 : (Length = %d)\n    ", MSRTrack.LengthOfTrack2 );
 + for ( i = 0; i < MSRTrack.LengthOfTrack2;​ i++ )
 + {
 + printf( "​%c",​ MSRTrack.pTrack2[i] );
 + }
 + printf( "​\n"​ );
 + }
 + else
 + {
 + printf(" ​  Track 2 : ErrorCode = 0x%02X\n",​ MSRTrack.ErrorCodeForTrack2 );
 + }
 + if ( MSRTrack.ErrorCodeForTrack3 == 0 )
 + {
 + printf( " ​  Track 3 Raw Data : (Length = %d)\n    ", MSRTrack.LengthOfRaw3 );
 + for ( i = 0; i < MSRTrack.LengthOfRaw3;​ i++ )
 + {
 + printf( "%02X ", MSRTrack.pRaw3[i] );
 + }
 + printf( "​\n"​ );
 + printf( " ​  Track 3 : (Length = %d)\n    ", MSRTrack.LengthOfTrack3 );
 + for ( i = 0; i < MSRTrack.LengthOfTrack3;​ i++ )
 + {
 + printf( "​%c",​ MSRTrack.pTrack3[i] );
 + }
 + printf( "​\n"​ );
 + }
 + else
 + {
 + printf(" ​  Track 3 : ErrorCode = 0x%02X\n",​ MSRTrack.ErrorCodeForTrack3 );
 + }
 + }
 + }
 +#endif
 +
 + continue;​
 + }
 +
 + while ( ui_key_get_code( pUI, &​KeyCode,​ &​IsReleased ) == 0 )
 + {
 + switch ( KeyCode )
 + {
 + case KEY_ESC:​ /​*Repeated input 3 times... TODO:​check!!!*/​
 + printf("​Key Code : KEY_ESC (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + { /* Key Released */
 + ;
 + }
 + else
 + {
 + ;
 + }
 + break;
 + case KEY_1:​
 + printf("​Key code : KEY_1 (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + { /* Key Released */
 + led_switch(DEVICE_LED_B14,​ true/*On*/ );
 + buzzer_off();​
 + }
 + else
 + {
 + buzzer_on_code( MUSIC_FREQUENCY_CODE_C,​ Octave ); /* C(도) ​ */
 + }
 + break;
 + case KEY_2:​
 + printf("​Key code : KEY_2 (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + { /* Key Released */
 + led_switch(DEVICE_LED_B14,​ false/​*Off*/​ );
 + buzzer_off();​
 + }
 + else
 + {
 + buzzer_on_code( MUSIC_FREQUENCY_CODE_D,​ Octave ); /* D(레) ​ */
 + }
 + break;
 + case KEY_3:​
 + printf("​Key code : KEY_3 (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + { /* Key Released */
 + led_switch(DEVICE_LED_A25,​ true/*On*/ );
 + buzzer_off();​
 + }
 + else
 + {
 + buzzer_on_code( MUSIC_FREQUENCY_CODE_E,​ Octave ); /* E(미) ​ */
 + }
 + break;
 + case KEY_4:​
 + printf("​Key code : KEY_4 (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + { /* Key Released */
 + led_switch(DEVICE_LED_A25,​ false/​*Off*/​ );
 + buzzer_off();​
 + }
 + else
 + {
 + buzzer_on_code( MUSIC_FREQUENCY_CODE_F,​ Octave ); /* F(파) ​ */
 + }
 + break;
 + case KEY_5:​
 + printf("​Key code : KEY_5 (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + { /* Key Released */
 + led_switch(DEVICE_LED_C21,​ true/*On*/ );
 + buzzer_off();​
 + }
 + else
 + {
 + buzzer_on_code( MUSIC_FREQUENCY_CODE_G,​ Octave ); /* G(솔) ​ */
 + }
 + break;
 + case KEY_6:​
 + printf("​Key code : KEY_6 (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + { /* Key Released */
 + led_switch(DEVICE_LED_C21,​ false/​*Off*/​ );
 + buzzer_off();​
 + }
 + else
 + {
 + buzzer_on_code( MUSIC_FREQUENCY_CODE_A,​ Octave ); /* A(라) ​ */
 + }
 + break;
 + case KEY_7:​
 + printf("​Key code : KEY_7 (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + { /* Key Released */
 + led_switch(DEVICE_LED_B15,​ true/*On*/ );
 + buzzer_off();​
 + }
 + else
 + {
 + buzzer_on_code( MUSIC_FREQUENCY_CODE_B,​ Octave ); /* B(시) ​ */
 + }
 + break;
 + case KEY_8:​
 + printf("​Key code : KEY_8 (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + { /* Key Released */
 + led_switch(DEVICE_LED_B15,​ false/​*Off*/​ );
 + buzzer_off();​
 + }
 + else
 + {
 + buzzer_on_code( MUSIC_FREQUENCY_CODE_C,​ (Octave + 1) ); /* C(도) ​ */
 + }
 + break;
 + case KEY_9:​
 + printf("​Key code : KEY_9 (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + { /* Key Released */
 +#​ifdef TEST_THERMAL_PRINTER
 + uint32_t Uint32Value;​
 + bool BoolValue;​
 +
 + if ( thermal_printer_get_dots_in_line( ThermalPrinter,​ &​Uint32Value ) < 0 )
 + {
 + printf( " Thermal Printer : Dots In Line Get Fail\n"​ );
 + }
 + else
 + {
 + printf( " Thermal Printer : Dots In Line = %d\n", Uint32Value );
 + }
 + if ( thermal_printer_get_heater_temperature( ThermalPrinter,​ &​Uint32Value ) < 0 )
 + {
 + printf( " Thermal Printer : Heater Temperature Get Fail\n"​ );
 + }
 + else
 + {
 + printf( " Thermal Printer : Heater Temperature = %d\n", Uint32Value );
 + }
 + if ( thermal_printer_get_heater_adc_raw_value( ThermalPrinter,​ &​Uint32Value ) < 0 )
 + {
 + printf( " Thermal Printer : Heater Temperature ADC raw data Get Fail\n"​ );
 + }
 + else
 + {
 + printf( " Thermal Printer : Heater Temperature ADC raw data = %d\n", Uint32Value );
 + }
 + if ( thermal_printer_get_heater_power_state( ThermalPrinter,​ &​BoolValue ) < 0 )
 + {
 + printf( " Thermal Printer : Heater Power State Get Fail\n"​ );
 + }
 + else
 + {
 + if ( BoolValue == true )
 + {
 + printf( " Thermal Printer : Heater Power State true\n"​ );
 + }
 + else
 + {
 + printf( " Thermal Printer : Heater Power State false\n"​ );
 + }
 + }
 + if ( thermal_printer_get_heater_overheat_state( ThermalPrinter,​ &​BoolValue ) < 0 )
 + {
 + printf( " Thermal Printer : Heater overheat State Get Fail\n"​ );
 + }
 + else
 + {
 + if ( BoolValue == true )
 + {
 + printf( " Thermal Printer : Heater overheat State true\n"​ );
 + }
 + else
 + {
 + printf( " Thermal Printer : Heater overheat State false\n"​ );
 + }
 + }
 + if ( thermal_printer_get_paper_state( ThermalPrinter,​ &​BoolValue ) < 0 )
 + {
 + printf( " Thermal Printer : paper State Get Fail\n"​ );
 + }
 + else
 + {
 + if ( BoolValue == true )
 + {
 + printf( " Thermal Printer : paper State true\n"​ );
 + }
 + else
 + {
 + printf( " Thermal Printer : paper State false\n"​ );
 + }
 + }
 + if ( thermal_printer_get_cover_state( ThermalPrinter,​ &​BoolValue ) < 0 )
 + {
 + printf( " Thermal Printer : cover State Get Fail\n"​ );
 + }
 + else
 + {
 + if ( BoolValue == true )
 + {
 + printf( " Thermal Printer : cover State true\n"​ );
 + }
 + else
 + {
 + printf( " Thermal Printer : cover State false\n"​ );
 + }
 + }
 +#endif /* TEST_THERMAL_PRINTER */
 + }
 + else
 + {
 + ;
 + }
 + break;
 + case KEY_0:​
 + if ( IsReleased == true )
 + { /* Key Released */
 + uint32_t MakedPacketByteLength;​
 +
 + if ( mmd1100_make_packet(pVersion,​
 + &​MakedPacketByteLength,​
 + MMD1100_COMMAND_GET_VERSION,​
 + (uint8_t *)0 ) != 0 )
 + {
 + printf( "Fail to mmd1100_make_packet\n"​ );
 + }
 + else
 + {
 + if ( mmd1100_send(pVersion,​ MakedPacketByteLength) > 0 )
 + {
 + printf( "OK to mmd1100_send\n"​ );
 + }
 + else
 + {
 + printf( "Fail to mmd1100_send\n"​ );
 + }
 + }
 + }
 + printf("​Key code : KEY_0 (0x%X)\n",​ KeyCode);
 + break;
 + case KEY_BACKSPACE:​
 + if ( IsReleased == true )
 + { /* Key Released */
 +#​ifdef TEST_THERMAL_PRINTER
 + thermal_printer_paper_throw( ThermalPrinter,​ 120/*Line*/ );
 + printf( "​thermal_printer_paper_throw 120 lines\n"​ );
 +#endif /* TEST_THERMAL_PRINTER */
 + }
 + printf("​Key code : KEY_BACKSPACE (0x%X)\n",​ KeyCode);
 + break;
 + case KEY_ENTER:​
 + printf("​Key code : KEY_ENTER (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + { /* Key Released */
 +#​ifdef TEST_THERMAL_PRINTER
 + thermal_printer_print_test_pattern( ThermalPrinter,​ DEVICE_THERMAL_PRINTER_TEST_PATTERN_1 );
 +usleep(100000);​
 + thermal_printer_paper_throw( ThermalPrinter,​ 100/*Line*/ );
 +usleep(100000);​
 + thermal_printer_print_test_pattern( ThermalPrinter,​ DEVICE_THERMAL_PRINTER_TEST_PATTERN_2 );
 +usleep(100000);​
 + thermal_printer_paper_throw( ThermalPrinter,​ 100/*Line*/ );
 +usleep(100000);​
 + thermal_printer_print_test_pattern( ThermalPrinter,​ DEVICE_THERMAL_PRINTER_TEST_PATTERN_3 );
 +usleep(100000);​
 + thermal_printer_paper_throw( ThermalPrinter,​ 100/*Line*/ );
 +usleep(100000);​
 + thermal_printer_print_test_pattern( ThermalPrinter,​ DEVICE_THERMAL_PRINTER_TEST_PATTERN_4 );
 +usleep(100000);​
 + thermal_printer_paper_throw( ThermalPrinter,​ 150/*Line*/ );
 +#else /* TEST_THERMAL_PRINTER */
 + IsInLoop = 0; /* Exit */
 +#endif /* TEST_THERMAL_PRINTER */
 + }
 + break;
 + case KEY_F1:​
 + printf("​Key code : KEY_F1 (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + {
 + ui_draw_image( pUI, TEST_IMAGE_FILE_1,​ 0, 0 );
 + }
 + break;
 + case KEY_F2:​
 + printf("​Key code : KEY_F2 (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + {
 + ui_draw_image( pUI, TEST_IMAGE_FILE_2,​ 0, 0 );
 + }
 + break;
 + case KEY_F3:​
 + printf("​Key code : KEY_F3 (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + { /* Key Released */
 + UIcolor_t Color;
 + Color.B = 0xFF;
 + Color.G = 0x00;
 + Color.R = 0xFF;
 + Color.Alpha = 0xFF;
 + ui_fill_rectangle( pUI, Color, 100, 100, 40, 80 );
 + }
 + break;
 + case KEY_F4:​
 + printf("​Key code : KEY_F4 (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + { /* Key Released */
 + ui_clear_screen( pUI );
 + }
 + break;
 + case KEY_F5:​
 + printf("​Key code : KEY_F5 (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + {
 + UIcolor_t Color;
 + Color.B = 0xFF;
 + Color.G = 0x00;
 + Color.R = 0xFF;
 + Color.Alpha = 0xFF;
 +#​ifdef TEST_THERMAL_PRINTER
 + ui_draw_string( pUI, Color, 20, 40, 280, 400, TEST_DISPLAY_STRING,​ UI_TEXT_LAYOUT_TOP_LEFT );
 + ui_draw_string( pUI, Color, 20, 40, 280, 400, TEST_DISPLAY_STRING,​ UI_TEXT_LAYOUT_MIDDLE_CENTER );
 + ui_draw_string( pUI, Color, 20, 40, 280, 400, TEST_DISPLAY_STRING,​ UI_TEXT_LAYOUT_BOTTOM_RIGHT );
 + ui_draw_rectangle( pUI, Color, 20, 40, 280, 400 );
 +#else /* TEST_THERMAL_PRINTER */
 + ui_draw_string( pUI, Color, 20, 40, 200, 240, TEST_DISPLAY_STRING,​ UI_TEXT_LAYOUT_TOP_LEFT );
 + ui_change_font( pUI, "​NanumBrush.ttf",​ 28);
 + ui_draw_string( pUI, Color, 20, 40, 200, 240, TEST_DISPLAY_STRING,​ UI_TEXT_LAYOUT_MIDDLE_CENTER );
 + ui_change_font( pUI, "​NanumPen.ttf",​ 28);
 + ui_draw_string( pUI, Color, 20, 40, 200, 240, TEST_DISPLAY_STRING,​ UI_TEXT_LAYOUT_BOTTOM_RIGHT );
 +
 + ui_change_font( pUI, "​NanumGothic.ttf",​ 22);
 + ui_draw_string( pUI, Color, 20, 80, 200, 160, TEST_DISPLAY_STRING,​ UI_TEXT_LAYOUT_TOP_LEFT );
 + ui_change_font( pUI,"​NanumMyeongjo.ttf",​ 22);
 + ui_draw_string( pUI, Color, 20, 80, 200, 160, TEST_DISPLAY_STRING,​ UI_TEXT_LAYOUT_BOTTOM_RIGHT );
 +
 + ui_change_font( pUI, "​D2Coding.ttf",​ 22);
 + ui_draw_rectangle( pUI, Color, 20, 40, 200, 240 );
 +#endif /* TEST_THERMAL_PRINTER */
 + }
 + break;
 + case KEY_F6:​ /​* '​*'​ or '​00'​ */
 + if ( IsReleased == true )
 + { /* Key Released */
 +#​ifdef TEST_THERMAL_PRINTER
 + ReadByteLength = thermal_printer_read(ThermalPrinter,​ pVersion, 100);
 + printf( "​ThermalPrinter read [%d : %s]\n",​ ReadByteLength,​ pVersion );
 +#else /* TEST_THERMAL_PRINTER */
 + if( Brightness != 8 )
 + {
 + Brightness ++;
 + if( bright_set(Brightness) != 0 )
 + {
 + printf("​Fail to bright_set\n"​);​
 + }
 + printf("​bright -\n");
 + }
 +#endif /* TEST_THERMAL_PRINTER */
 + }
 + printf("​Key code : KEY_F6 (0x%X)\n",​ KeyCode);
 + break;
 + case KEY_F7:​ /​* '#'​ or '​000'​ */
 + if ( IsReleased == true )
 + { /* Key Released */
 +#​ifdef TEST_THERMAL_PRINTER
 + uint32_t LineHeight;​
 + uint32_t PrinterFontSize;​
 + uint32_t FontFileIndex;​
 +
 + for ( FontFileIndex = 0; FontFileIndex < 8; FontFileIndex++ )
 + {
 + for ( PrinterFontSize = 16; PrinterFontSize <= 32; PrinterFontSize += 2 )
 + {
 + memset( pThermapPrinterTestString,​ 0, 100 );
 + sprintf ( pThermapPrinterTestString,​ "%s %d", TEST_DISPLAY_STRING,​ PrinterFontSize );
 + printf( "​Thermal Printer Test String = %s\n", pThermapPrinterTestString );
 +
 + thermal_printer_get_dots_in_line( ThermalPrinter,​ &​ThermalPrinterDotsInLine );
 + printf( "​Termal Printer Dots In Line = %d\n", ThermalPrinterDotsInLine );
 +
 +/​* ui_printer_font_set( pUI, "​D2Coding.ttf",​ PrinterFontSize );*/
 + ui_printer_font_set( pUI, pFontList[FontFileIndex],​ PrinterFontSize );
 +
 + if ( ui_printer_font_get_line_height( pUI, &​LineHeight ) < 0 )
 + {
 + printf( "Fail to Get Termal Printer Line Height\n"​ );
 + }
 + else
 + {
 + printf( "​Termal Printer Line Height = %d\n", LineHeight );
 +
 + memset( pImageBuffer,​ 0, ((LineHeight * ThermalPrinterDotsInLine) / 8 ) );
 + ThermalPrinterImageSize = ui_printer_string( pUI,
 + pFontList[FontFileIndex],​
 + UI_TEXT_LAYOUT_TOP_LEFT,​
 + pImageBuffer,​
 + (ThermalPrinterDotsInLine / 8),
 + LineHeight);​
 + if ( ThermalPrinterImageSize > 0 )
 + {
 + printf( "​Termal Printer Image Size = %d Byte\n",​ ThermalPrinterImageSize );
 +//​ print_hex_dump( pImageBuffer,​ ThermalPrinterImageSize );
 + if ( thermal_printer_print( ThermalPrinter,​ pImageBuffer,​ ThermalPrinterImageSize ) < 0 )
 + {
 + printf( "Fail to Print Image Size = %d Byte\n",​ ThermalPrinterImageSize );
 + }
 + printf( "Print Termal Printer Image Size = %d Byte\n",​ ThermalPrinterImageSize );
 + }
 +
 + /* clear Line area.. if it needed */
 + memset( pImageBuffer,​ 0, ((LineHeight * ThermalPrinterDotsInLine) / 8 ) );
 + ThermalPrinterImageSize = ui_printer_string( pUI,
 +/​* TEST_DISPLAY_STRING,​*/​
 + pThermapPrinterTestString,​
 + UI_TEXT_LAYOUT_TOP_LEFT,​
 + pImageBuffer,​
 + (ThermalPrinterDotsInLine / 8),
 + LineHeight);​
 + if ( ThermalPrinterImageSize > 0 )
 + {
 + printf( "​Termal Printer Image Size = %d Byte\n",​ ThermalPrinterImageSize );
 + //​ print_hex_dump( pImageBuffer,​ ThermalPrinterImageSize );
 + if ( thermal_printer_print( ThermalPrinter,​ pImageBuffer,​ ThermalPrinterImageSize ) < 0 )
 + {
 + printf( "Fail to Print Image Size = %d Byte\n",​ ThermalPrinterImageSize );
 + }
 + printf( "Print Termal Printer Image Size = %d Byte\n",​ ThermalPrinterImageSize );
 + }
 + }
 + }
 + }
 +
 + thermal_printer_paper_throw( ThermalPrinter,​ 150/*Line*/ );
 +#else /* TEST_THERMAL_PRINTER */
 + if( Brightness != 0 )
 + {
 + Brightness --;
 + if( bright_set(Brightness) != 0 )
 + {
 + printf("​Fail to bright_set\n"​);​
 + }
 + printf("​bright +\n");
 + }
 +#endif /* TEST_THERMAL_PRINTER */
 + }
 + printf("​Key code : KEY_F7 (0x%X)\n",​ KeyCode);
 + break;
 + case KEY_F8:​
 + printf("​Key code : KEY_F8 - Side Key Up or Feed (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + { /* Key Released */
 + key_back_light( true/*On*/ );
 + }
 + break;
 + case KEY_F9:​
 + printf("​Key code : KEY_F9 - Side Key Down or Select (0x%X)\n",​ KeyCode);
 + if ( IsReleased == true )
 + { /* Key Released */
 + key_back_light( false/​*Off*/​ );
 + }
 + break;
 + case KEY_F10:​
 + printf("​Key code : KEY_F10 - Scan Key or SetUp (0x%X)\n",​ KeyCode);
 + break;
 + default:
 +//​ printf("​Key code : (0x%X)\n",​ KeyCode);
 + break;
 + }
 + }
 +
 + if ( IsInLoop == 0 )
 + {
 + printf( "Exit Main Loop\n"​ );
 + }
 + } /* while (IsInLoop)*/​
 +
 +#​ifdef TEST_LTE_MODEM
 + lte_on_off_switch( false/​*true=on,​ false=Off*/ );
 +#endif /* TEST_LTE_MODEM */
 +
 + printf( "Close opend system\n"​ );
 + if ( mmd1100_close() != 0 )
 + {
 + printf("​Fail to mmd1100_close\n"​);​
 + }
 + else
 + {
 + printf("​OK to mmd1100_close\n"​);​
 + }
 + if ( buzzer_close() < 0 )
 + {
 + printf("​Fail to buzzer_close\n"​);​
 + }
 + /* clean up */
 + ui_release( pUI );
 +#​ifdef TEST_THERMAL_PRINTER
 + thermal_printer_close( ThermalPrinter );
 +#endif /* TEST_THERMAL_PRINTER */
 +
 + return 0;
 +}
 </​code>​ </​code>​
  
Line 7: Line 1104:
  
 <​code>​ <​code>​
 +#​ifndef __UI_H__
 +#​define __UI_H__
 +
 +#​include <​stdint.h>​ /​* uint??_t */
 +//#​include <​stdbool.h>​ /​* Bool */
 +#​include "​directfb/​directfb.h"​ /​* 항상 UI.h 와 함께 UI.h 보다 먼저 */
 +
 +
 +typedef struct
 +{
 + uint8_t R;
 + uint8_t G;
 + uint8_t B;
 + uint8_t Alpha;​
 +} UIcolor_t;
 +
 +typedef enum
 +{
 + UI_TEXT_LAYOUT_NONE = 0,
 + UI_TEXT_LAYOUT_TOP_LEFT,​
 + UI_TEXT_LAYOUT_TOP_CENTER,​
 + UI_TEXT_LAYOUT_TOP_RIGHT,​
 + UI_TEXT_LAYOUT_BOTTOM_LEFT,​
 + UI_TEXT_LAYOUT_BOTTOM_CENTER,​
 + UI_TEXT_LAYOUT_BOTTOM_RIGHT,​
 + UI_TEXT_LAYOUT_MIDDLE_LEFT,​
 + UI_TEXT_LAYOUT_MIDDLE_CENTER,​
 + UI_TEXT_LAYOUT_MIDDLE_RIGHT,​
 + UI_TEXT_LAYOUT_OUTLINE_TOP_LEFT,​
 + UI_TEXT_LAYOUT_OUTLINE_TOP_CENTER,​
 + UI_TEXT_LAYOUT_OUTLINE_TOP_RIGHT,​
 + UI_TEXT_LAYOUT_OUTLINE_BOTTOM_LEFT,​
 + UI_TEXT_LAYOUT_OUTLINE_BOTTOM_CENTER,​
 + UI_TEXT_LAYOUT_OUTLINE_BOTTOM_RIGHT,​
 + UI_TEXT_LAYOUT_OUTLINE_MIDDLE_LEFT,​
 + UI_TEXT_LAYOUT_OUTLINE_MIDDLE_CENTER,​
 + UI_TEXT_LAYOUT_OUTLINE_MIDDLE_RIGHT,​
 +} UItextLayout_t;​
 +
 +
 +#​define UI_DRIVER_MESSAGE_ERROR //​ Must be Defined
 +//#​define UI_DRIVER_MESSAGE_DEBUG
 +//#​define UI_DRIVER_MESSAGE_INFO
 +//#​define UI_DRIVER_MESSAGE_KEY_EVENT_INFO
 +
 +
 +extern int ui_initialize(void **pUI, uint32_t Rotate);
 +extern int ui_release(void *pUI);
 +extern int ui_change_font(void *pUI, char *pFontFile, int FontSize);
 +
 +/*
 +//​ 아래와 같은 형태로 Layout이 나타난다.
 +//​ -----------------------------------------
 +//​ |UI_TEXT_LAYOUT_TOP_LEFT ​               |
 +// |                                       |
 +// |     ​UI_TEXT_LAYOUT_MIDDLE_CENTER ​     |
 +// |                                       |
 +// |            UI_TEXT_LAYOUT_BOTTOM_RIGHT|
 +//​ -----------------------------------------
 +*/
 +extern int ui_draw_string(void *pUI, UIcolor_t Color,
 + uint32_t X, uint32_t Y, uint32_t W, uint32_t H,
 + char *pString,
 + UItextLayout_t UItextLayout);​
 +
 +extern int ui_draw_line(void *pUI, UIcolor_t Color,
 + uint32_t X1, uint32_t Y1, uint32_t X2, uint32_t Y2);
 +
 +extern int ui_draw_rectangle(void *pUI, UIcolor_t Color,
 + uint32_t X, uint32_t Y, uint32_t W, uint32_t H);
 +
 +extern int ui_fill_rectangle(void *pUI, UIcolor_t Color,
 + uint32_t X, uint32_t Y, uint32_t W, uint32_t H);
 +
 +extern int ui_clear_screen(void *pUI);
 +
 +/*
 + jpg
 + png
 + gif
 +*/
 +extern int ui_draw_image(void *pUI, char *pImageFile,​ uint32_t X, uint32_t Y);
 +
 +/*
 + 0: No key input or Parameter Error
 + 1: Key is inputed
 +*/
 +extern int ui_key_is_inputed(void *pUI, uint32_t MiliSecondWaitTimeout);​
 +
 +/*
 + 0: OK
 + -1: Error
 +*/
 +extern int ui_key_get_code(void *pUI, uint32_t *pKeyCode, bool *pIsReleased);​
 +
 +
 +extern int ui_printer_create_surface(void *pUI, uint32_t SurfaceWidth,​ uint32_t SurfaceHeight);​
 +extern int ui_printer_font_set(void *pUI, char *pFontFile, int FontSize);
 +extern int ui_printer_font_get_line_height(void *pUI, uint32_t *pLineHeight);​
 +extern int ui_printer_string(void *pUI,
 + char *pString,
 + UItextLayout_t UItextLayout,​
 + uint8_t *pImageBuffer,​
 + uint32_t ByteSizeOfImageBufferWidth,​
 + uint32_t ByteSizeOfImageBufferHeight);​
 +
 +
 +#endif /* __UI_H__ */
 </​code>​ </​code>​
  
Line 12: Line 1217:
  
 <​code>​ <​code>​
 +#​include <​stdio.h>​
 +#​include <​stdint.h>​ /​* uint??_t */
 +#​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 <​sys/​fcntl.h>​ /​* for O_RDWR */
 +
 +#​include <​unistd.h>​ /​* sleep */
 +
 +#​include "​directfb/​directfb.h"​
 +#​include "​UI.h"​
 +/*
 +Surface는 이미지의 픽셀데이터가 특정 픽셀 형식으로 저장되는 메모리의 예약 영역임.
 +
 +*/
 +
 +#​ifdef UI_DRIVER_MESSAGE_DEBUG
 + #​define UI_DEBUG(fmt,​ args ...) printf("​DEBUG:​%s(%d):​ " fmt, __FUNCTION__,​__LINE__,​ ## args)
 +#else
 + #​define UI_DEBUG(fmt,​ args ...) {}
 +#endif /* UI_DRIVER_MESSAGE_DEBUG */
 +
 +#​ifdef UI_DRIVER_MESSAGE_ERROR
 + #​define UI_ERROR(fmt,​ args ...) printf("​ERROR:​%s(%d):​ " fmt, __FUNCTION__,​__LINE__,​ ## args)
 +#else
 + #​define UI_ERROR(fmt,​ args ...) {}
 +#endif /* UI_DRIVER_DEBUG_MESSAGE */
 +
 +#​ifdef UI_DRIVER_MESSAGE_INFO
 + #​define UI_INFO(fmt,​ args ...) printf("​INFOs:​%s(%d):​ " fmt, __FUNCTION__,​__LINE__,​ ## args)
 +#else
 + #​define UI_INFO(fmt,​ args ...) {}
 +#endif /* UI_DRIVER_DEBUG_MESSAGE */
 +
 +#​define DEFAULT_FONT_FILE "​D2Coding.ttf"​
 +#​define DEFAULT_FONT_SIZE 22
 +
 +typedef struct
 +{
 + uint32_t X;​
 + uint32_t Y;​
 +} UIposition_t;​
 +
 +typedef struct
 +{
 + uint32_t MagicNumber;​
 +
 + IDirectFB * pDirectFb;​
 +
 + IDirectFBInputDevice * pInputDevice;​
 + IDirectFBEventBuffer * pEventBuffer;​
 +
 + IDirectFBSurface * pPrimarySurface;​ /​* primary surface - Base Screen */
 +
 + int ScreenWidth;​
 + int ScreenHeight;​
 +
 + IDirectFBFont * pFont;
 + char * pFontFile;​
 + int FontSize;​
 +
 + uint32_t Rotate;​
 + uint32_t UserScreenWidth;​
 + uint32_t UserScreenHeight;​
 +
 +
 + IDirectFBSurface * pPrinterSurface;​ /​* Printer surface */
 + uint32_t PrinterSurfaceWidth;​
 + uint32_t PrinterSurfaceHeight;​
 +
 + IDirectFBFont * pPrinterFont;​
 + char * pPrinterFontFile;​
 + int PrinterFontSize;​
 +//​ uint32_t PrintedImageWidth;​
 + uint32_t PrintedLineHeight;​
 +} UIcontext_t;​
 +
 +static UIcontext_t UIcontext = {0};
 +static UIcontext_t * pUIcontext = (UIcontext_t *)0;
 +
 +int ui_initialize(void **pUI, uint32_t Rotate)
 +{
 + DFBSurfaceDescription SurfaceDescription;​
 + DFBFontDescription FontDescription;​
 +
 + if ( ( pUI == (void **)0 ) || ( ( Rotate % 90 ) != 0 ) )
 + {
 + UI_ERROR( "Error in Input Paramter\n"​ );
 + return -1;​
 + }
 + Rotate %= 360;
 +
 + if ( pUIcontext != (UIcontext_t *)0 )
 + {
 + UI_DEBUG( "​Already initialized\n"​ );
 + *pUI = (void *)pUIcontext;​
 + return 0;
 + }
 +
 + UI_INFO( "​Initialize Direct FB\n" );
 + if ( DirectFBInit( 0, 0 ) != DFB_OK )
 + {
 + UI_ERROR( "Error in DirectFBInit()\n"​ );
 + goto UI_INITIALIZE_ERROR_IN_INIT_DIRECT_FB;​
 + }
 +
 + UI_INFO( "​Create Super Interface\n"​ );
 + if ( DirectFBCreate( &​UIcontext.pDirectFb ) != DFB_OK )
 + {
 + UI_ERROR( "Error in DirectFBCreate()\n"​ );
 + goto UI_INITIALIZE_ERROR_IN_CREATE_FB;​
 + }
 +
 + UI_INFO( "​Create Input Device\n"​ );
 + if ( UIcontext.pDirectFb->​GetInputDevice( UIcontext.pDirectFb,​ DIDID_KEYBOARD,​ &​UIcontext.pInputDevice ) != DFB_OK )
 + {
 + UI_ERROR( "Error in GetInputDevice()\n"​ );
 + goto UI_INITIALIZE_ERROR_IN_CREATE_INPUT_DEVICE;​
 + }
 +
 + UI_INFO( "​Create Event Buffer\n"​ );
 + if ( UIcontext.pInputDevice->​CreateEventBuffer( UIcontext.pInputDevice,​ &​UIcontext.pEventBuffer ) != DFB_OK )
 + {
 + UI_ERROR( "Error in CreateEventBuffer()\n"​ );
 + goto UI_INITIALIZE_ERROR_IN_CREATE_EVENT_BUFFER;​
 + }
 +
 + UI_INFO( "Set Cooperative Level - to full screen\n"​ );
 + if ( UIcontext.pDirectFb->​SetCooperativeLevel( UIcontext.pDirectFb,​ DFSCL_FULLSCREEN ) != DFB_OK )
 + {
 + UI_ERROR( "Error in SetCooperativeLevel()\n ");
 + goto UI_INITIALIZE_ERROR_IN_SET_COOPERATIVE_LEVEL;​
 + }
 +
 + /* set flags */
 + SurfaceDescription.flags = DSDESC_CAPS;​
 + SurfaceDescription.caps = DSCAPS_PRIMARY | DSCAPS_FLIPPING;​
 + UI_INFO( "​Create Surface - Prime\n"​ );
 + if ( UIcontext.pDirectFb->​CreateSurface( UIcontext.pDirectFb,​ &​SurfaceDescription,​ &​UIcontext.pPrimarySurface ) != DFB_OK )
 + {
 + UI_ERROR( "Error in CreateSurface()\n"​ );
 + goto UI_INITIALIZE_ERROR_IN_CREATE_PRIME_SURFACE;​
 + }
 +
 + UI_INFO( "Get Surface Size\n"​ );
 + if ( UIcontext.pPrimarySurface->​GetSize( UIcontext.pPrimarySurface,​ &​UIcontext.ScreenWidth,​ &​UIcontext.ScreenHeight ) != DFB_OK )
 + {
 + UI_ERROR( "Error in GetSize()\n"​);​
 + goto UI_INITIALIZE_ERROR_IN_GET_PRIME_SURFACE_SIZE;​
 + }
 + UI_INFO( " ​ Prime Surface : Physical Width = %d, Physical Height= %d\n", UIcontext.ScreenWidth,​ UIcontext.ScreenHeight );
 +
 + UI_INFO( "Clear Surface\n"​ );
 + if ( UIcontext.pPrimarySurface->​FillRectangle( UIcontext.pPrimarySurface,​ 0, 0, UIcontext.ScreenWidth,​ UIcontext.ScreenHeight ) != DFB_OK )
 + {
 + UI_ERROR( "Error in FillRectangle() to clear prime surface\n"​);​
 + goto UI_INITIALIZE_ERROR_IN_CLEAR_SURFACE;​
 + }
 + if ( UIcontext.pPrimarySurface->​Flip( UIcontext.pPrimarySurface,​ NULL, 0 ) != DFB_OK )
 + {
 + UI_ERROR( "Error in Flip() to clear prime surface\n"​);​
 + goto UI_INITIALIZE_ERROR_IN_FLIP_TO_CLEAR_SURFACE;​
 + }
 +
 + UIcontext.FontSize = DEFAULT_FONT_SIZE;​
 + UIcontext.pFontFile = DEFAULT_FONT_FILE;​
 +
 + UI_INFO( "​Create Font\n"​ );
 + FontDescription.flags ​     = DFDESC_HEIGHT | DFDESC_ATTRIBUTES;​
 + FontDescription.height ​    = UIcontext.FontSize;​
 + FontDescription.attributes = DFFA_MONOCHROME;​ //​ DFFA_NONE
 + if ( UIcontext.pDirectFb->​CreateFont( UIcontext.pDirectFb,​ UIcontext.pFontFile,​ &​FontDescription,​ &​UIcontext.pFont ) != DFB_OK )
 + {
 + UI_ERROR( "Error in CreateFont()\n"​);​
 + goto UI_INITIALIZE_ERROR_IN_CREATE_FONT;​
 + }
 +
 + UIcontext.MagicNumber = 0x1828128;
 + UIcontext.Rotate = Rotate;
 + if ( ( UIcontext.Rotate == 90) || ( UIcontext.Rotate == 270) )
 + {
 + UIcontext.UserScreenWidth ​ = UIcontext.ScreenHeight;​
 + UIcontext.UserScreenHeight = UIcontext.ScreenWidth;​
 + }
 + else
 + {
 + UIcontext.UserScreenWidth ​ = UIcontext.ScreenWidth;​
 + UIcontext.UserScreenHeight = UIcontext.ScreenHeight;​
 + }
 + pUIcontext = &​UIcontext;​
 + *pUI = (void *)pUIcontext;​
 +
 + UIcontext.pPrinterSurface = (IDirectFBSurface *)0;
 + UIcontext.pPrinterFont = (IDirectFBFont *)0;
 +
 + UI_INFO( "​Initialized\n"​ );
 +
 + return 0;
 +
 +UI_INITIALIZE_ERROR_IN_CREATE_FONT:​
 +UI_INITIALIZE_ERROR_IN_FLIP_TO_CLEAR_SURFACE:​
 +UI_INITIALIZE_ERROR_IN_CLEAR_SURFACE:​
 +UI_INITIALIZE_ERROR_IN_GET_PRIME_SURFACE_SIZE:​
 + UIcontext.pPrimarySurface->​Release( UIcontext.pPrimarySurface );
 +
 +UI_INITIALIZE_ERROR_IN_CREATE_PRIME_SURFACE:​
 +UI_INITIALIZE_ERROR_IN_SET_COOPERATIVE_LEVEL:​
 + UIcontext.pEventBuffer->​Release( UIcontext.pEventBuffer );
 +
 +UI_INITIALIZE_ERROR_IN_CREATE_EVENT_BUFFER:​
 + UIcontext.pInputDevice->​Release( UIcontext.pInputDevice );
 +
 +UI_INITIALIZE_ERROR_IN_CREATE_INPUT_DEVICE:​
 + UIcontext.pDirectFb->​Release( UIcontext.pDirectFb );
 +
 +UI_INITIALIZE_ERROR_IN_CREATE_FB:​
 +UI_INITIALIZE_ERROR_IN_INIT_DIRECT_FB:​
 +
 + return -2;
 +}
 +
 +
 +int ui_release(void *pUI)
 +{
 + if ( ( pUI == (void *)0 ) || ( pUI != (void *)pUIcontext ) )
 + {
 + return -1;​
 + }
 +
 + if ( UIcontext.MagicNumber != 0x1828128 )
 + {
 + return -1;​
 + }
 +
 + UIcontext.MagicNumber = 0;
 +
 + if ( UIcontext.pPrinterSurface != (IDirectFBSurface *)0 )
 + {
 +printf ( "​Printer Surface Release\n"​ );
 + UIcontext.pPrinterSurface->​Release( UIcontext.pPrinterSurface );
 + }
 + if ( UIcontext.pPrinterFont != (IDirectFBFont *)0 )
 + {
 +printf ( "​Printer Font Release\n"​ );
 + UIcontext.pPrinterFont->​Release( UIcontext.pPrinterFont );
 + }
 +
 + UIcontext.pFont->​Release( UIcontext.pFont );
 + UIcontext.pPrimarySurface->​Release( UIcontext.pPrimarySurface );
 + UIcontext.pEventBuffer->​Release( UIcontext.pEventBuffer );
 + UIcontext.pInputDevice->​Release( UIcontext.pInputDevice );
 + UIcontext.pDirectFb->​Release( UIcontext.pDirectFb );
 +
 + pUIcontext = (UIcontext_t *)0;
 + memset( &​UIcontext,​ 0, sizeof(UIcontext_t) );
 +
 + return 0;
 +}
 +
 +int ui_change_font(void *pUI, char *pFontFile, int FontSize)
 +{
 + DFBFontDescription FontDescription;​
 + IDirectFBFont * pNewFont;​
 +
 + if ( ( pUI == (void *)0 ) || ( pUI != (void *)pUIcontext ) )
 + {
 + return -1;​
 + }
 +
 + if ( UIcontext.MagicNumber != 0x1828128 )
 + {
 + return -1;​
 + }
 +
 + FontDescription.flags ​     = DFDESC_HEIGHT | DFDESC_ATTRIBUTES;​
 + FontDescription.height ​    = FontSize;
 + FontDescription.attributes = DFFA_MONOCHROME;​ //​ DFFA_NONE
 + if ( UIcontext.pDirectFb->​CreateFont( UIcontext.pDirectFb,​ pFontFile, &​FontDescription,​ &​pNewFont ) != DFB_OK )
 + {
 + UI_ERROR( "Error in CreateFont()\n"​);​
 + return -1;​
 + }
 +
 + if ( UIcontext.pFont->​Release( UIcontext.pFont ) != DFB_OK )
 + {
 + UI_DEBUG( "Error in Release() for release old font.. using old font\n"​);​
 + pNewFont->​Release( pNewFont );
 + return -2;​
 + }
 +
 + UIcontext.pFont = pNewFont;
 + UIcontext.FontSize = FontSize;
 + UIcontext.pFontFile = pFontFile;
 +
 + return 0;
 +}
 +
 +uint32_t ui_make_text_flag(UItextLayout_t UItextLayout)
 +{
 + uint32_t Flag;​
 +
 + Flag = DSTF_NONE;
 + switch ( UItextLayout )
 + {
 + case UI_TEXT_LAYOUT_TOP_LEFT:​
 + Flag += DSTF_TOP;
 + Flag += DSTF_LEFT;
 + break;
 + case UI_TEXT_LAYOUT_TOP_CENTER:​
 + Flag += DSTF_TOP;
 + Flag += DSTF_CENTER;​
 + break;
 + case UI_TEXT_LAYOUT_TOP_RIGHT:​
 + Flag += DSTF_TOP;
 + Flag += DSTF_RIGHT;
 + break;
 + case UI_TEXT_LAYOUT_BOTTOM_LEFT:​
 + Flag += DSTF_BOTTOM;​
 + Flag += DSTF_LEFT;
 + break;
 + case UI_TEXT_LAYOUT_BOTTOM_CENTER:​
 + Flag += DSTF_BOTTOM;​
 + Flag += DSTF_CENTER;​
 + break;
 + case UI_TEXT_LAYOUT_BOTTOM_RIGHT:​
 + Flag += DSTF_BOTTOM;​
 + Flag += DSTF_RIGHT;
 + break;
 + case UI_TEXT_LAYOUT_MIDDLE_LEFT:​
 + Flag += DSTF_LEFT;
 + break;
 + case UI_TEXT_LAYOUT_MIDDLE_CENTER:​
 + Flag += DSTF_CENTER;​
 + break;
 + case UI_TEXT_LAYOUT_MIDDLE_RIGHT:​
 + Flag += DSTF_RIGHT;
 + break;
 + case UI_TEXT_LAYOUT_OUTLINE_TOP_LEFT:​
 + Flag += DSTF_OUTLINE;​
 + Flag += DSTF_TOP;
 + Flag += DSTF_LEFT;
 + break;
 + case UI_TEXT_LAYOUT_OUTLINE_TOP_CENTER:​
 + Flag += DSTF_OUTLINE;​
 + Flag += DSTF_TOP;
 + Flag += DSTF_CENTER;​
 + break;
 + case UI_TEXT_LAYOUT_OUTLINE_TOP_RIGHT:​
 + Flag += DSTF_TOP;
 + Flag += DSTF_RIGHT;
 + Flag += DSTF_OUTLINE;​
 + break;
 + case UI_TEXT_LAYOUT_OUTLINE_BOTTOM_LEFT:​
 + Flag += DSTF_OUTLINE;​
 + Flag += DSTF_BOTTOM;​
 + Flag += DSTF_LEFT;
 + break;
 + case UI_TEXT_LAYOUT_OUTLINE_BOTTOM_CENTER:​
 + Flag += DSTF_OUTLINE;​
 + Flag += DSTF_BOTTOM;​
 + Flag += DSTF_CENTER;​
 + break;
 + case UI_TEXT_LAYOUT_OUTLINE_BOTTOM_RIGHT:​
 + Flag += DSTF_OUTLINE;​
 + Flag += DSTF_BOTTOM;​
 + Flag += DSTF_RIGHT;
 + break;
 + case UI_TEXT_LAYOUT_OUTLINE_MIDDLE_LEFT:​
 + Flag += DSTF_OUTLINE;​
 + Flag += DSTF_LEFT;
 + break;
 + case UI_TEXT_LAYOUT_OUTLINE_MIDDLE_CENTER:​
 + Flag += DSTF_OUTLINE;​
 + Flag += DSTF_CENTER;​
 + break;
 + case UI_TEXT_LAYOUT_OUTLINE_MIDDLE_RIGHT:​
 + Flag += DSTF_OUTLINE;​
 + Flag += DSTF_RIGHT;
 + break;
 + case UI_TEXT_LAYOUT_NONE:​
 + default:
 + break;
 + }
 +
 + return Flag;​
 +}
 +
 +UIposition_t ui_make_text_draw_position(UItextLayout_t UItextLayout,​
 + uint32_t X,
 + uint32_t Y,
 + uint32_t W,
 + uint32_t H,
 + uint32_t Rotate)
 +{
 + UIposition_t Position;​
 + uint32_t Temp;​
 +
 + switch ( UItextLayout )
 + {
 + case UI_TEXT_LAYOUT_TOP_LEFT:​
 + case UI_TEXT_LAYOUT_OUTLINE_TOP_LEFT:​
 + Position.X = X;
 + Position.Y = Y;
 + break;
 + case UI_TEXT_LAYOUT_OUTLINE_TOP_CENTER:​
 + case UI_TEXT_LAYOUT_TOP_CENTER:​
 + Position.X = X + ( W >> 1 );
 + Position.Y = Y;
 + break;
 + case UI_TEXT_LAYOUT_OUTLINE_TOP_RIGHT:​
 + case UI_TEXT_LAYOUT_TOP_RIGHT:​
 + Position.X = X + W;
 + Position.Y = Y;
 + break;
 + case UI_TEXT_LAYOUT_OUTLINE_BOTTOM_LEFT:​
 + case UI_TEXT_LAYOUT_BOTTOM_LEFT:​
 + Position.X = X;
 + Position.Y = Y + H;
 + break;
 + case UI_TEXT_LAYOUT_OUTLINE_BOTTOM_CENTER:​
 + case UI_TEXT_LAYOUT_BOTTOM_CENTER:​
 + Position.X = X + ( W >> 1 );
 + Position.Y = Y + H;
 + break;
 + case UI_TEXT_LAYOUT_OUTLINE_BOTTOM_RIGHT:​
 + case UI_TEXT_LAYOUT_BOTTOM_RIGHT:​
 + Position.X = X + W;
 + Position.Y = Y + H;
 + break;
 +
 + case UI_TEXT_LAYOUT_OUTLINE_MIDDLE_CENTER:​
 + case UI_TEXT_LAYOUT_MIDDLE_CENTER:​
 + Position.X = X + ( W >> 1 );
 + Position.Y = Y + ( H >> 1 );
 + break;
 + case UI_TEXT_LAYOUT_OUTLINE_MIDDLE_RIGHT:​
 + case UI_TEXT_LAYOUT_MIDDLE_RIGHT:​
 + Position.X = X + W;
 + Position.Y = Y + ( H >> 1 );
 + break;
 +
 + case UI_TEXT_LAYOUT_OUTLINE_MIDDLE_LEFT:​
 + case UI_TEXT_LAYOUT_MIDDLE_LEFT:​
 + case UI_TEXT_LAYOUT_NONE:​
 + default:
 + Position.X = X;
 + Position.Y = Y + ( H >> 1 );
 + break;
 + }
 + if ( ( Rotate == 90 ) || ( Rotate == 270 ) )
 + {
 + Temp = Position.X;
 + Position.X = Position.Y;
 + Position.Y = Temp;
 + }
 +
 + return Position;​
 +}
 +
 +static int ui_draw_update(IDirectFBSurface *pPrimarySurface,​ uint32_t Rotate)
 +{
 + /* update surface */
 + if ( Rotate == 90 )
 + {
 + if ( pPrimarySurface->​SetBlittingFlags( pPrimarySurface,​ DSBLIT_ROTATE90 ) != DFB_OK )
 + {
 + return -3;​
 + }
 + }
 + else if ( Rotate == 180 )
 + {
 + if ( pPrimarySurface->​SetBlittingFlags( pPrimarySurface,​ DSBLIT_ROTATE180 ) != DFB_OK )
 + {
 + return -3;​
 + }
 + }
 + else if ( Rotate == 270 )
 + {
 + if ( pPrimarySurface->​SetBlittingFlags( pPrimarySurface,​ DSBLIT_ROTATE270 ) != DFB_OK )
 + {
 + return -3;​
 + }
 + }
 +
 + if ( pPrimarySurface->​Flip( pPrimarySurface,​ NULL, 0) != DFB_OK )
 + {
 + return -3;​
 + }
 +
 + if ( Rotate != 0 )
 + {
 + if ( pPrimarySurface->​SetBlittingFlags( pPrimarySurface,​ DSBLIT_NOFX ) != DFB_OK )
 + {
 + return -3;​
 + }
 + }
 +
 + return 0;
 +}
 +
 +int ui_draw_string(void *pUI,
 + UIcolor_t Color,
 + uint32_t X,
 + uint32_t Y,
 + uint32_t W,
 + uint32_t H,
 + char *pString,
 + UItextLayout_t UItextLayout)
 +{
 + int DisplayWidth;​
 + int DisplayHeight;​
 + UIposition_t Position;​
 +
 + if ( ( pUI == (void *)0 ) || ( pUI != (void *)pUIcontext ) || ( pString == (char *)0 ) )
 + {
 + UI_ERROR( "Input Parameter\n"​ );
 + return -1;​
 + }
 +
 + if ( UIcontext.MagicNumber != 0x1828128 )
 + {
 + UI_ERROR( "Magic Number\n"​ );
 + return -1;​
 + }
 +
 + if ( UIcontext.pFont->​GetStringWidth( UIcontext.pFont,​ pString, -1/​*bytes*/,​ &​DisplayWidth) != DFB_OK )
 + {
 + UI_ERROR( "Get String Width\n"​ );
 + return -3;​
 + }
 + UI_INFO( "​String Width = %d\n", DisplayWidth );
 +
 + if ( UIcontext.pFont->​GetHeight( UIcontext.pFont,​ &​DisplayHeight ) != DFB_OK )
 + {
 + UI_ERROR( "Get String Height\n"​ );
 + return -3;​
 + }
 + UI_INFO( "​String Height = %d\n", DisplayHeight );
 +
 + if ( ( DisplayWidth > W ) || ( DisplayHeight > H ) )
 + {
 + UI_ERROR( "​DisplayWidth(%d) > W(%d) or DisplayHeight(%d) > H(%d)\n",​ DisplayWidth,​ W, DisplayHeight,​ H );
 + return -1;​
 + }
 + if ( ( UIcontext.UserScreenWidth < ( W + X ) ) || ( UIcontext.UserScreenHeight < ( H + Y ) ) )
 + {
 + UI_ERROR( "​UserScreenWidth(%d) < (W + X)(%d) or UIcontext.UserScreenHeight(%d) < ( H + Y )(%d)\n",​
 + UIcontext.UserScreenWidth,​
 + ( W + X ),
 + UIcontext.UserScreenHeight,​
 + ( H + Y ) );
 + return -1;​
 + }
 +
 + if ( UIcontext.pPrimarySurface->​SetFont( UIcontext.pPrimarySurface,​ UIcontext.pFont ) != DFB_OK )
 + {
 + UI_ERROR( "Set Font\n"​ );
 + return -3;​
 + }
 + UI_INFO( "Set Font OK\n" );
 +
 + if ( UIcontext.pPrimarySurface->​SetColor( UIcontext.pPrimarySurface,​ Color.B, Color.G, Color.R, Color.Alpha ) != DFB_OK )
 + {
 + UI_ERROR( "Set Color\n"​ );
 + return -3;​
 + }
 + UI_INFO( "Set Color OK\n" );
 +
 + Position = ui_make_text_draw_position( UItextLayout,​ X, Y, W, H, UIcontext.Rotate );
 + UI_INFO( "​Position : X = %d, Y= %d\n", Position.X, Position.Y );
 + if ( UIcontext.pPrimarySurface->​DrawString( UIcontext.pPrimarySurface,​ pString, -1/​*Bytes*/,​ Position.X, Position.Y, ui_make_text_flag( UItextLayout )/*Flasg*/ ) != DFB_OK )
 + {
 + UI_ERROR( "​Draw\n"​ );
 + return -3;​
 + }
 + UI_INFO( "Draw OK\n" );
 +
 + /* update surface */
 + return ui_draw_update( UIcontext.pPrimarySurface,​ UIcontext.Rotate);​
 +}
 +
 +int ui_draw_line(void *pUI,
 + UIcolor_t Color,
 + uint32_t X1,
 + uint32_t Y1,
 + uint32_t X2,
 + uint32_t Y2)
 +{
 + if ( ( pUI == (void *)0 ) || ( pUI != (void *)pUIcontext ) )
 + {
 + return -1;​
 + }
 +
 + if ( UIcontext.MagicNumber != 0x1828128 )
 + {
 + return -1;​
 + }
 +
 + if ( ( UIcontext.UserScreenWidth <= X1 ) || ( UIcontext.UserScreenHeight <= Y1 )
 + || ( UIcontext.UserScreenWidth <= X2 ) || ( UIcontext.UserScreenHeight <= Y2 ) )
 + {
 + return -2;​
 + }
 +
 + if ( UIcontext.pPrimarySurface->​SetColor( UIcontext.pPrimarySurface,​ Color.B, Color.G, Color.R, Color.Alpha ) != DFB_OK )
 + {
 + return -3;​
 + }
 +
 + if ( UIcontext.pPrimarySurface->​DrawLine( UIcontext.pPrimarySurface,​ X1, Y1, X2, Y2 ) != DFB_OK )
 + {
 + return -3;​
 + }
 +
 + /* update surface */
 + return ui_draw_update( UIcontext.pPrimarySurface,​ UIcontext.Rotate);​
 +}
 +
 +
 +int ui_draw_rectangle(void *pUI,
 + UIcolor_t Color,
 + uint32_t X,
 + uint32_t Y,
 + uint32_t W,
 + uint32_t H)
 +{
 + if ( ( pUI == (void *)0 ) || ( pUI != (void *)pUIcontext ) )
 + {
 + return -1;​
 + }
 +
 + if ( UIcontext.MagicNumber != 0x1828128 )
 + {
 + return -1;​
 + }
 +
 + if ( ( UIcontext.UserScreenWidth <= ( W + X ) ) || ( UIcontext.UserScreenHeight <= ( H + Y ) ) )
 + {
 + return -2;​
 + }
 +
 + if ( UIcontext.pPrimarySurface->​SetColor( UIcontext.pPrimarySurface,​ Color.B, Color.G, Color.R, Color.Alpha ) != DFB_OK )
 + {
 + return -3;​
 + }
 +
 + if ( UIcontext.pPrimarySurface->​DrawRectangle( UIcontext.pPrimarySurface,​ X, Y, W, H ) != DFB_OK )
 + {
 + return -3;​
 + }
 +
 + /* update surface */
 + return ui_draw_update( UIcontext.pPrimarySurface,​ UIcontext.Rotate);​
 +}
 +
 +
 +int ui_fill_rectangle(void *pUI,
 + UIcolor_t Color,
 + uint32_t X,
 + uint32_t Y,
 + uint32_t W,
 + uint32_t H)
 +{
 + if ( ( pUI == (void *)0 ) || ( pUI != (void *)pUIcontext ) )
 + {
 + return -1;​
 + }
 +
 + if ( UIcontext.MagicNumber != 0x1828128 )
 + {
 + return -1;​
 + }
 +
 + if ( ( UIcontext.UserScreenWidth <= ( W + X ) ) || ( UIcontext.UserScreenHeight <= ( H + Y ) ) )
 + {
 + return -2;​
 + }
 +
 + if ( UIcontext.pPrimarySurface->​SetColor( UIcontext.pPrimarySurface,​ Color.B, Color.G, Color.R, Color.Alpha ) != DFB_OK )
 + {
 + return -3;​
 + }
 +
 + if ( UIcontext.pPrimarySurface->​FillRectangle( UIcontext.pPrimarySurface,​ X, Y, W, H ) != DFB_OK )
 + {
 + return -3;​
 + }
 +
 + /* update surface */
 + return ui_draw_update( UIcontext.pPrimarySurface,​ UIcontext.Rotate);​
 +}
 +
 +int ui_clear_screen(void *pUI)
 +{
 + if ( ( pUI == (void *)0 ) || ( pUI != (void *)pUIcontext ) )
 + {
 + return -1;​
 + }
 +
 + if ( UIcontext.MagicNumber != 0x1828128 )
 + {
 + return -1;​
 + }
 +
 + if ( UIcontext.pPrimarySurface->​SetColor( UIcontext.pPrimarySurface,​ 0, 0, 0, 0xFF ) != DFB_OK )
 + {
 + return -3;​
 + }
 +
 + if ( UIcontext.pPrimarySurface->​FillRectangle( UIcontext.pPrimarySurface,​ 0, 0, UIcontext.ScreenWidth,​ UIcontext.ScreenHeight ) != DFB_OK )
 + {
 + return -3;​
 + }
 +
 + /* update surface */
 + return ui_draw_update( UIcontext.pPrimarySurface,​ UIcontext.Rotate);​
 +}
 +
 +/*
 + jpg
 + png
 + gif
 +*/
 +int ui_draw_image(void *pUI,
 + char *pImageFile,​
 + uint32_t X,
 + uint32_t Y)
 +{
 + IDirectFBSurface * pImageSurface;​ /​* Image surface */
 + IDirectFBImageProvider *pImageProvider;​ /​* */
 + DFBSurfaceDescription SurfaceDescription;​
 +
 + if ( ( pUI == (void *)0 ) || ( pUI != (void *)pUIcontext ) )
 + {
 + return -1;​
 + }
 +
 + if ( UIcontext.MagicNumber != 0x1828128 )
 + {
 + return -1;​
 + }
 +
 + /* Create image provider */
 + if ( UIcontext.pDirectFb->​CreateImageProvider( UIcontext.pDirectFb,​ pImageFile, &​pImageProvider ) != DFB_OK )
 + {
 + goto UI_DRAW_IMAGE_ERROR_IN_CREATE_IMAGE_PROVIDER;​
 + }
 +
 + if ( pImageProvider->​GetSurfaceDescription( pImageProvider,​ &​SurfaceDescription ) != DFB_OK )
 + {
 + goto UI_DRAW_IMAGE_ERROR_IN_GET_SURFACE_DESCRIPTION;​
 + }
 +
 + if ( UIcontext.pDirectFb->​CreateSurface( UIcontext.pDirectFb,​ &​SurfaceDescription,​ &​pImageSurface) != DFB_OK )
 + {
 + goto UI_DRAW_IMAGE_ERROR_IN_CREATE_SURFACE;​
 + }
 +
 + if ( pImageProvider->​RenderTo( pImageProvider,​ pImageSurface,​ NULL) != DFB_OK )
 + {
 + goto UI_DRAW_IMAGE_ERROR_IN_RANDER;​
 + }
 +
 + if ( UIcontext.pPrimarySurface->​Blit( UIcontext.pPrimarySurface,​ pImageSurface,​ NULL, X, Y) != DFB_OK )
 + {
 + goto UI_DRAW_IMAGE_ERROR_IN_BLIT;​
 + }
 +
 + /* update surface */
 + if ( ui_draw_update( UIcontext.pPrimarySurface,​ UIcontext.Rotate ) != 0 )
 + {
 + goto UI_DRAW_IMAGE_ERROR_IN_UPDATE;​
 + }
 +
 +UI_DRAW_IMAGE_ERROR_IN_UPDATE:​
 +UI_DRAW_IMAGE_ERROR_IN_BLIT:​
 +UI_DRAW_IMAGE_ERROR_IN_RANDER:​
 +
 + pImageSurface->​Release( pImageSurface );
 +
 +UI_DRAW_IMAGE_ERROR_IN_CREATE_SURFACE:​
 +UI_DRAW_IMAGE_ERROR_IN_GET_SURFACE_DESCRIPTION:​
 +
 + pImageProvider->​Release( pImageProvider );
 +
 +UI_DRAW_IMAGE_ERROR_IN_CREATE_IMAGE_PROVIDER:​
 +
 + return -2;
 +}
 +
 +
 +/*
 + 0: No key input or Parameter Error
 + 1: Key is inputed
 +*/
 +int ui_key_is_inputed(void *pUI, uint32_t MiliSecondWaitTimeout)
 +{
 + if ( ( pUI == (void *)0 ) || ( pUI != (void *)pUIcontext ) )
 + {
 + return -1;​
 + }
 +
 + if ( UIcontext.MagicNumber != 0x1828128 )
 + {
 + return -1;​
 + }
 +
 +
 + if ( /*( UIcontext.pEventBuffer == (IDirectFBEventBuffer *)0 ) ||*/ ( MiliSecondWaitTimeout == 0 ) )
 + {
 + return -1;​
 + }
 +
 + if ( UIcontext.pEventBuffer->​WaitForEventWithTimeout( UIcontext.pEventBuffer,​ 0, MiliSecondWaitTimeout ) == DFB_TIMEOUT )
 + {
 + return 0;
 + }
 +
 + return 1;
 +}
 +
 +/*
 + 0: OK
 + -1: Error
 +*/
 +int ui_key_get_code(void *pUI, uint32_t *pKeyCode, bool *pIsReleased)
 +{
 + if ( ( pUI == (void *)0 ) || ( pUI != (void *)pUIcontext ) )
 + {
 + return -1;​
 + }
 +
 + if ( UIcontext.MagicNumber != 0x1828128 )
 + {
 + return -1;​
 + }
 +
 +
 + DFBInputEvent InputEvent;​
 +
 + if ( /*( UIcontext.pEventBuffer == (IDirectFBEventBuffer *)0 )
 + || */( pKeyCode == (uint32_t *)0 ) 
 + || ( pIsReleased == (bool *)0 ) )
 + {
 + return -1;​
 + }
 +
 + if ( UIcontext.pEventBuffer->​GetEvent ( UIcontext.pEventBuffer,​ DFB_EVENT( &​InputEvent ) ) != DFB_OK )
 + {
 + return -2;​
 + }
 +
 +#​ifdef UI_DRIVER_MESSAGE_KEY_EVENT_INFO
 + UI_INFO("​Input Event : Type = %d, Key ID = %d\n", InputEvent.type,​ InputEvent.key_id);​
 +
 + UI_INFO(" ​     clazz = %d  clazz of event\n",​ InputEvent.clazz);​
 + switch (InputEvent.clazz)
 + {
 + case DFEC_NONE:​
 + UI_INFO(" ​         none of these\n"​);​
 + break;
 + case DFEC_INPUT:​
 + UI_INFO(" ​         raw input event\n"​);​
 + break;
 + case DFEC_WINDOW:​
 + UI_INFO(" ​         windowing event\n"​);​
 + break;
 + case DFEC_USER:​
 + UI_INFO(" ​         custom event for the user of this library\n"​);​
 + break;
 + case DFEC_UNIVERSAL:​
 + UI_INFO(" ​         universal event for custom usage with variable size\n"​);​
 + break;
 + case DFEC_VIDEOPROVIDER:​
 + UI_INFO(" ​         video provider event\n"​);​
 + break;
 + case DFEC_SURFACE:​
 + UI_INFO(" ​         surface event\n"​);​
 + break;
 + default:
 + UI_INFO(" ​         unknown\n"​);​
 + break;
 + }
 +
 + UI_INFO(" ​     type = %d  type of event\n",​ InputEvent.type);​
 + switch (InputEvent.type)
 + {
 + case DIET_UNKNOWN:​
 + UI_INFO(" ​         unknown event\n"​);​
 + break;
 + case DIET_KEYPRESS:​
 + UI_INFO(" ​         a key is been pressed\n"​);​
 + break;
 + case DIET_KEYRELEASE:​
 + UI_INFO(" ​         a key is been released\n"​);​
 + break;
 + case DIET_BUTTONPRESS:​
 + UI_INFO(" ​         a (mouse) button is been pressed\n"​);​
 + break;
 + case DIET_BUTTONRELEASE:​
 + UI_INFO(" ​         a (mouse) button is been released\n"​);​
 + break;
 + case DIET_AXISMOTION:​
 + UI_INFO(" ​         mouse/​joystick movement\n"​);​
 + break;
 + default:
 + UI_INFO(" ​         unknown\n"​);​
 + break;
 + }
 +
 + UI_INFO(" ​     device_id = %d  source of event\n",​ InputEvent.device_id);​
 +
 + UI_INFO(" ​     flags = %d  which optional fields are valid\n",​ InputEvent.flags);​
 + if ( InputEvent.flags == DIEF_NONE)
 + {
 + UI_INFO(" ​         no additional fields\n"​);​
 + }
 + if ( (InputEvent.flags & DIEF_TIMESTAMP) == DIEF_TIMESTAMP)
 + {
 + UI_INFO(" ​         timestamp is valid\n"​);​
 + }
 + if ( (InputEvent.flags & DIEF_AXISABS) == DIEF_AXISABS)
 + {
 + UI_INFO(" ​         axis and axisabs are valid\n"​);​
 + }
 + if ( (InputEvent.flags & DIEF_AXISREL) == DIEF_AXISREL)
 + {
 + UI_INFO(" ​         axis and axisrel are valid\n"​);​
 + }
 + if ( (InputEvent.flags & DIEF_KEYCODE) == DIEF_KEYCODE)
 + {
 + UI_INFO(" ​         DIEF_KEYCODE used internally by the input core, always set at application level\n"​);​
 + }
 + if ( (InputEvent.flags & DIEF_KEYID) == DIEF_KEYID)
 + {
 + UI_INFO(" ​         DIEF_KEYID used internally by the input core, always set at application level\n"​);​
 + }
 + if ( (InputEvent.flags & DIEF_KEYSYMBOL) == DIEF_KEYSYMBOL)
 + {
 + UI_INFO(" ​         DIEF_KEYSYMBOL used internally by the input core, always set at application level\n"​);​
 + }
 + if ( (InputEvent.flags & DIEF_MODIFIERS) == DIEF_MODIFIERS)
 + {
 + UI_INFO(" ​         DIEF_MODIFIERS used internally by the input core, always set at application level\n"​);​
 + }
 + if ( (InputEvent.flags & DIEF_LOCKS) == DIEF_LOCKS)
 + {
 + UI_INFO(" ​         DIEF_LOCKS used internally by the input core, always set at application level\n"​);​
 + }
 + if ( (InputEvent.flags & DIEF_BUTTONS) == DIEF_BUTTONS)
 + {
 + UI_INFO(" ​         DIEF_BUTTONS used internally by the input core, always set at application level\n"​);​
 + }
 + if ( (InputEvent.flags & DIEF_GLOBAL) == DIEF_GLOBAL)
 + {
 + UI_INFO(" ​         Only for event buffers creates by IDirectFB::​CreateInputEventBuffer() with global events enabled\n"​);​
 + /* Indicates that the event would have been filtered if the buffer hadn't been global. */
 + }
 + if ( (InputEvent.flags & DIEF_REPEAT) == DIEF_REPEAT)
 + {
 + UI_INFO(" ​         repeated event, e.g. key or button press\n"​);​
 + }
 + if ( (InputEvent.flags & DIEF_FOLLOW) == DIEF_FOLLOW)
 + {
 + UI_INFO(" ​         another event will follow immediately,​ e.g. x/y axis\n"​);​
 + }
 + if ( (InputEvent.flags & DIEF_MIN) == DIEF_MIN)
 + {
 + UI_INFO(" ​         minimum value is set, e.g. for absolute axis motion\n"​);​
 + }
 + if ( (InputEvent.flags & DIEF_MAX) == DIEF_MAX)
 + {
 + UI_INFO(" ​         maximum value is set, e.g. for absolute axis motion\n"​);​
 + }
 +
 + UI_INFO(" ​  ​additionally (check flags)\n"​);​
 +// struct timeval ​                 timestamp; ​ /* time of event creation */
 + UI_INFO(" ​  ​DIET_KEYPRESS,​ DIET_KEYRELEASE\n"​);​
 + UI_INFO(" ​     key_code = %d  hardware keycode, no mapping, -1 if device doesn'​t differentiate between several keys\n",​ InputEvent.key_code);​
 +//​ DFBInputDeviceKeyIdentifier ​    ​key_id; ​    /* basic mapping, modifier independent */
 +//​ DFBInputDeviceKeySymbol ​        ​key_symbol;​ /* advanced mapping, unicode compatible, modifier dependent */
 + UI_INFO(" ​  ​additionally (check flags)\n"​);​
 + UI_INFO(" ​     modifiers = 0x%X  pressed modifiers (optional)\n",​ InputEvent.modifiers);​
 +#if 0
 +DIMM_SHIFT ​    = (1 << DIMKI_SHIFT), ​   /* Shift key is pressed */
 +DIMM_CONTROL ​  = (1 << DIMKI_CONTROL), ​ /* Control key is pressed */
 +DIMM_ALT ​      = (1 << DIMKI_ALT), ​     /* Alt key is pressed */
 +DIMM_ALTGR ​    = (1 << DIMKI_ALTGR), ​   /* AltGr key is pressed */
 +DIMM_META ​     = (1 << DIMKI_META), ​    /* Meta key is pressed */
 +DIMM_SUPER ​    = (1 << DIMKI_SUPER), ​   /* Super key is pressed */
 +DIMM_HYPER ​    = (1 << DIMKI_HYPER) ​    /* Hyper key is pressed */
 +#endif
 +//​ DFBInputDeviceLockState ​        ​locks; ​     /* active locks (optional) */
 + UI_INFO(" ​  ​DIET_BUTTONPRESS,​ DIET_BUTTONRELEASE\n"​);​
 + UI_INFO(" ​     button = %d  in case of a button event Left=0, Right=1, Middle=2\n",​ InputEvent.button);​
 + UI_INFO(" ​     buttons = %d  mask of currently pressed buttons Left=1, Right=2, Middle=4\n",​ InputEvent.buttons);​
 + UI_INFO(" ​  ​DIET_AXISMOTION\n"​);​
 + UI_INFO(" ​     axis = %d  in case of an axis event X=0, Y=1, Z=2\n",​ InputEvent.axis);​
 + UI_INFO(" ​  one of these two (check flags) : mouse/​joystick\n"​);​
 + UI_INFO(" ​     axisabs = %d  absolute mouse/​joystick coordinate\n",​ InputEvent.axisabs);​
 + UI_INFO(" ​     axisrel = %d  relative mouse/​joystick movement\n",​ InputEvent.axisrel);​
 + UI_INFO(" ​  ​general information\n"​);​
 + UI_INFO(" ​     min = %d\n", InputEvent.min);​
 + UI_INFO(" ​     max = %d\n", InputEvent.max);​
 +
 +#endif /* UI_DRIVER_MESSAGE_KEY_EVENT_INFO */
 +
 + if ( (InputEvent.flags & DIEF_KEYCODE) == DIEF_KEYCODE )
 + {
 + if ( ( InputEvent.type == DIET_KEYPRESS ) || ( InputEvent.type == DIET_KEYRELEASE ) )
 + {
 + *pKeyCode = InputEvent.key_code;​
 + if ( InputEvent.type == DIET_KEYPRESS )
 + {
 + *pIsReleased = 0;
 + }
 + else /*if ( InputEvent.type == DIET_KEYRELEASE )*/
 + {
 + *pIsReleased = 1;
 + }
 + return 0;​
 + }
 + }
 +
 + return -3;
 +}
 +
 +
 +int ui_printer_create_surface(void *pUI, uint32_t SurfaceWidth,​ uint32_t SurfaceHeight)
 +{
 + DFBSurfaceDescription SurfaceDescription;​
 +
 + if ( ( pUI == (void *)0 ) || ( pUI != (void *)pUIcontext ) || ( SurfaceWidth == 0 ) || ( SurfaceHeight == 0 ) )
 + {
 + UI_ERROR( "Input parameter\n"​ );
 + return -1;​
 + }
 +
 + if ( UIcontext.MagicNumber != 0x1828128 )
 + {
 + UI_ERROR( "Not Initiailized UI\n" );
 + return -1;​
 + }
 +
 + if ( UIcontext.pPrinterSurface != (IDirectFBSurface *)0 )
 + {
 + UI_ERROR( "​Arleady created printer surface\n"​ );
 + return -2;​
 + }
 +
 + UI_INFO( "​Create Surface - Printer\n"​ );
 + SurfaceDescription.flags = DSDESC_CAPS|DSDESC_PIXELFORMAT|DSDESC_WIDTH|DSDESC_HEIGHT;​
 + SurfaceDescription.caps = DSCAPS_FLIPPING;​
 + SurfaceDescription.pixelformat = DSPF_A8;
 + SurfaceDescription.width = SurfaceWidth;​
 + SurfaceDescription.height = SurfaceHeight;​
 + if ( UIcontext.pDirectFb->​CreateSurface( UIcontext.pDirectFb,​ &​SurfaceDescription,​ &​UIcontext.pPrinterSurface ) != DFB_OK )
 + {
 + UI_ERROR( "Error in CreateSurface()\n"​ );
 + return -2;​
 + }
 +
 + UIcontext.PrinterSurfaceWidth = SurfaceWidth;​
 + UIcontext.PrinterSurfaceHeight = SurfaceHeight;​
 +
 + return 0;
 +}
 +
 +int ui_printer_font_set(void *pUI, char *pFontFile, int FontSize)
 +{
 + IDirectFBFont * pNewFont;​
 + DFBFontDescription FontDescription;​
 + int PrintedLineHeight;​
 +
 + if ( ( pUI == (void *)0 ) || ( pUI != (void *)pUIcontext ) || ( pFontFile == (char *)0 ) )
 + {
 + return -1;​
 + }
 +
 + if ( UIcontext.MagicNumber != 0x1828128 )
 + {
 + return -1;​
 + }
 +
 + UI_INFO( "​Create Font - Printer\n"​ );
 + FontDescription.flags ​     = DFDESC_HEIGHT | DFDESC_ATTRIBUTES;​
 + FontDescription.height ​    = FontSize;
 + FontDescription.attributes = DFFA_MONOCHROME;​ //​ DFFA_NONE
 + if ( UIcontext.pDirectFb->​CreateFont( UIcontext.pDirectFb,​ pFontFile, &​FontDescription,​ &​pNewFont ) != DFB_OK )
 + {
 + UI_ERROR( "Error in CreateFont()\n"​);​
 + return -2;​
 + }
 + if ( pNewFont->​GetHeight( pNewFont, &​PrintedLineHeight ) != DFB_OK )
 + {
 + UI_ERROR( "Get Font Height\n"​ );
 + pNewFont->​Release( pNewFont );
 + return -2;​
 + }
 + PrintedLineHeight += 2; /*Line Space*/
 + UI_INFO( " Printer Line Height = %d\n", PrintedLineHeight );
 +
 + if ( UIcontext.pPrinterFont != (IDirectFBFont *)0 )
 + {
 + UI_INFO( " Need old printer font relase\n"​ );
 + if ( UIcontext.pPrinterFont->​Release( UIcontext.pPrinterFont ) != DFB_OK )
 + {
 + UI_ERROR( "Error in old printer font release\n"​ );
 + }
 + else
 + {
 + UI_INFO( " OK in old printer font relase\n"​ );
 + }
 + }
 +
 + UIcontext.pPrinterFont = pNewFont;
 + UIcontext.pPrinterFontFile = pFontFile;
 + UIcontext.PrinterFontSize = FontSize;
 + UIcontext.PrintedLineHeight = PrintedLineHeight;​
 +
 + return 0;
 +}
 +
 +int ui_printer_font_get_line_height(void *pUI, uint32_t *pLineHeight)
 +{
 + IDirectFBFont * pNewFont;​
 + IDirectFBSurface * pNewSurface;​
 + DFBFontDescription FontDescription;​
 + DFBSurfaceDescription SurfaceDescription;​
 + int PrintedImageHeight;​
 +
 + if ( ( pUI == (void *)0 ) || ( pUI != (void *)pUIcontext ) || ( pLineHeight == (uint32_t *)0 ) )
 + {
 + return -1;​
 + }
 +
 + if ( UIcontext.MagicNumber != 0x1828128 )
 + {
 + return -1;​
 + }
 +
 + *pLineHeight = UIcontext.PrintedLineHeight;​
 +
 + return 0;
 +}
 +
 +void ui_printer_mapping_surface_to_image_buffer(uint8_t *pSurface,
 + uint8_t *pImageBuffer,​
 + uint32_t ByteSizeOfImageBufferWidth,​
 + uint32_t ByteSizeOfImageBufferHeight,​
 + uint32_t SurfaceWidth,​
 + bool LSBFirst,
 + bool LRswitching)
 +{
 + uint32_t IndexForY;​
 + uint32_t IndexForX;​
 + uint32_t SurfaceLineIndex;​
 + uint32_t SurfaceOffset;​
 + uint32_t ImageLineIndex;​
 + uint32_t ImageOffset;​
 +
 + for ( IndexForY = 0; IndexForY < ByteSizeOfImageBufferHeight;​ IndexForY++ )
 + {
 + for ( IndexForX = 0; IndexForX < ( ByteSizeOfImageBufferWidth * 8 ); IndexForX++ )
 + {
 + SurfaceLineIndex = IndexForY * SurfaceWidth;​
 + /* 여기에서 좌우바뀜 수정 */
 + if( LRswitching == true )
 + {
 + SurfaceOffset = ( ByteSizeOfImageBufferWidth * 8 ) - IndexForX - 1;
 + }
 + else
 + {
 + SurfaceOffset = IndexForX;
 + }
 + ImageLineIndex = IndexForY * ByteSizeOfImageBufferWidth;​
 + ImageOffset = IndexForX / 8;
 + if ( pSurface[SurfaceLineIndex + SurfaceOffset] != 0 )
 + {
 + if ( LSBFirst == true )
 + {
 + pImageBuffer[ImageLineIndex + ImageOffset] |= (0x01 << (IndexForX & 0x00000007/​* =IndexForX%8 */));
 + }
 + else
 + {
 + pImageBuffer[ImageLineIndex + ImageOffset] |= (0x80 >> (IndexForX & 0x00000007/​* =IndexForX%8 */));
 + }
 + }
 + }
 + }
 +}
 +
 +int ui_printer_string(void *pUI,
 + char *pString,
 + UItextLayout_t UItextLayout,​
 + uint8_t *pImageBuffer,​
 + uint32_t ByteSizeOfImageBufferWidth,​
 + uint32_t ByteSizeOfImageBufferHeight)
 +{
 + DFBResult Result;​
 + int PrintedWidth;​
 + int PrintedHeight;​
 + UIposition_t Position;​
 + uint32_t PhysicalAddress;​
 + int Pitch;​
 + void * pVoid;
 +
 + if ( ( pUI == (void *)0 )
 + || ( pUI != (void *)pUIcontext )
 + || ( pString == (char *)0 )
 + || ( pImageBuffer == (uint8_t *)0 )
 + || ( ByteSizeOfImageBufferWidth == 0 )
 + || ( ByteSizeOfImageBufferHeight == 0 ) )
 + {
 + UI_ERROR( "Input Parameter\n"​ );
 + return -1;​
 + }
 +
 + if ( UIcontext.MagicNumber != 0x1828128 )
 + {
 + UI_ERROR( "Magic Number\n"​ );
 + return -1;​
 + }
 +
 + if ( ( ( ByteSizeOfImageBufferWidth * 8 ) > UIcontext.PrinterSurfaceWidth ) || ( ByteSizeOfImageBufferHeight > UIcontext.PrinterSurfaceHeight ) )
 + {
 + UI_ERROR( "Image Buffer Width(%d) > Surface W(%d) or Image Buffer Height(%d) > Surface H(%d)\n",​ ByteSizeOfImageBufferWidth,​ ( UIcontext.PrinterSurfaceWidth / 8 ), ByteSizeOfImageBufferHeight,​ UIcontext.PrinterSurfaceHeight );
 + return -1;​
 + }
 +
 + if ( UIcontext.pPrinterSurface->​SetFont( UIcontext.pPrinterSurface,​ UIcontext.pPrinterFont ) != DFB_OK )
 + {
 + UI_ERROR( "Error in SetFont()\n"​ );
 + return -2;​
 + }
 + UI_INFO( "OK in SetFont()\n"​ );
 +
 + UIcontext.pPrinterSurface->​SetColor( UIcontext.pPrinterSurface,​ 0xFF, 0xFF, 0xFF, 0xFF );
 + UIcontext.pPrinterSurface->​Clear( UIcontext.pPrinterSurface,​ 0, 0, 0, 0 );
 +
 + if ( UIcontext.pPrinterFont->​GetStringWidth( UIcontext.pPrinterFont,​ pString, -1/​*bytes*/,​ &​PrintedWidth ) != DFB_OK )
 + {
 + UI_ERROR( "Get String Width\n"​ );
 + return -3;​
 + }
 + UI_INFO( "​String Width = %d\n", PrintedWidth );
 +
 + if ( UIcontext.pPrinterFont->​GetHeight( UIcontext.pPrinterFont,​ &​PrintedHeight ) != DFB_OK )
 + {
 + UI_ERROR( "Get String Height\n"​ );
 + return -3;​
 + }
 + UI_INFO( "​String Height = %d\n", PrintedHeight );
 +
 + if ( ( PrintedWidth > UIcontext.PrinterSurfaceWidth ) || ( PrintedHeight > UIcontext.PrinterSurfaceHeight ) )
 + {
 + UI_ERROR( "​PrintedWidth(%d) > Surface W(%d) or PrintedHeight(%d) > Surface H(%d)\n",​ PrintedWidth,​ UIcontext.PrinterSurfaceWidth,​ PrintedHeight,​ UIcontext.PrinterSurfaceHeight );
 + return -1;​
 + }
 +
 + if ( ( (PrintedWidth / 8) > ByteSizeOfImageBufferWidth ) || ( PrintedHeight > ByteSizeOfImageBufferHeight ) )
 + {
 + UI_ERROR( "​PrintedWidth Byte(%d) > Image Buffer W(%d) or PrintedHeight Byte(%d) > Image Buffer H(%d)\n",​ (PrintedWidth / 8), UIcontext.PrinterSurfaceWidth,​ PrintedHeight,​ ByteSizeOfImageBufferHeight );
 + return -1;​
 + }
 +
 + Position = ui_make_text_draw_position( UItextLayout,​ 0, 0, ( ByteSizeOfImageBufferWidth * 8 ), ByteSizeOfImageBufferHeight,​ 0 );
 + UI_INFO( "​Position : X = %d, Y= %d\n", Position.X, Position.Y );
 + if ( UIcontext.pPrinterSurface->​DrawString( UIcontext.pPrinterSurface,​ pString, -1/​*Bytes*/,​ Position.X, Position.Y, ui_make_text_flag( UItextLayout )/*Flasg*/ ) != DFB_OK )
 + {
 + UI_ERROR( "​Draw\n"​ );
 + return -3;​
 + }
 + UI_INFO( "Draw OK\n" );
 +
 + if ( UIcontext.pPrinterSurface->​Flip( UIcontext.pPrinterSurface,​ NULL, 0 ) != DFB_OK )
 + {
 + UI_ERROR( "​Flip\n"​ );
 + return -3;​
 + }
 + UI_INFO( "Flip OK\n" );
 +
 + Result = UIcontext.pPrinterSurface->​Lock( UIcontext.pPrinterSurface,​ DSLF_READ, &pVoid, &Pitch );
 + if ( Result != DFB_OK )
 + {
 + UI_INFO( "Lock Fail\n"​ );
 + DirectFBError ( "Lock Fail", Result );
 + }
 + else
 + {
 + UI_INFO( "Lock On : Address = 0x%08X, Pitch = %d\n", pVoid, Pitch );
 +
 + ui_printer_mapping_surface_to_image_buffer( (uint8_t *)pVoid,
 + pImageBuffer,​
 + ByteSizeOfImageBufferWidth,​
 + ByteSizeOfImageBufferHeight,​
 + UIcontext.PrinterSurfaceWidth,​
 + false/​*LSBFirst*/​
 + false/​*LR switching*/​);​
 + }
 +
 + if ( UIcontext.pPrinterSurface->​Unlock( UIcontext.pPrinterSurface ) != DFB_OK )
 + {
 + UI_INFO( "​Unlock Fail\n"​ );
 + }
 +
 + usleep( 1000 ); /* Must be need for completed move data */
 +
 + return ( ByteSizeOfImageBufferWidth * ByteSizeOfImageBufferHeight );
 +}
 </​code>​ </​code>​
  
ui_api.1509424725.txt.gz · Last modified: 2017/10/31 13:38 by 1.241.172.144