Mbed Client sample for GR-LYCHEE where ZXing is incorporated.

Dependencies:   DisplayApp AsciiFont

Fork of GR-PEACH_mbed-os-client-ZXingSample by Renesas

Overview

This sample program shows how to use mbed Client together with ZXing which is an open-source, multi-format 1D/2D barcode image processing library. For more info on ZXing, please refer to https://github.com/zxing/zxing.

Required hardware

Application setup

  1. Select the connection type. For details, please refer to the following wiki:
    https://os.mbed.com/users/1050186/code/GR-LYCHEE_mbed-os-client-ZXingSample/wiki/Connection-type.
  2. Set the client credentials. For details, please refer to the following wiki:
    https://os.mbed.com/users/1050186/code/GR-LYCHEE_mbed-os-client-ZXingSample/wiki/Client-credentials.
  3. Change Wifi settings. For details, please refer to the following wiki:
    https://os.mbed.com/users/1050186/code/GR-LYCHEE_mbed-os-client-ZXingSample/wiki/Wifi-settings.

Building the example

To build this example:

  1. Import this example onto mbed Compiler.
  2. Configure the example in accordance with Application setup.
  3. Compile the example on mbed Compiler and download the resultant binary file.
  4. Plug the micro-USB cable into the OpenSDA port which lies on the next to the RESET button.
  5. Copy the binary previously downloaded to your PC to GR-LYCHEE to flash this example. When the copy is successfully completed, the board is ready to work.
  6. Press the RESET button on the board to run the example.
  7. For verification, please refer to the following wiki:
    https://os.mbed.com/users/1050186/code/GR-LYCHEE_mbed-os-client-ZXingSample/wiki/Monitoring-the-application.

Application resources

This example exposes four resources listed below:

  1. 3202/0/5700. Decode result of barcode data input from camera (GET).
  2. 3201/0/5850. Blink function, blinks LED when executed (POST).
  3. 3201/0/5853. Blink pattern, used by the blink function to determine how to blink. In the format of 1000:500:1000:500:1000:500 (PUT).
  4. 3201/0/5855. Blink color, used by the blink function. Any of green, yellow, orange and red is acceptable (PUT).
Committer:
<>
Date:
Thu Oct 06 18:00:30 2016 +0900
Revision:
0:eb73febb2bba
Child:
2:6ec5c1c1d41c
Initial Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 0:eb73febb2bba 1
<> 0:eb73febb2bba 2 #include <vector>
<> 0:eb73febb2bba 3
<> 0:eb73febb2bba 4 #include "mbed.h"
<> 0:eb73febb2bba 5 #include "rtos.h"
<> 0:eb73febb2bba 6 #include "DisplayBace.h"
<> 0:eb73febb2bba 7 #include "ImageReaderSource.h"
<> 0:eb73febb2bba 8 #include "DisplayApp.h"
<> 0:eb73febb2bba 9 #include "AsciiFont.h"
<> 0:eb73febb2bba 10
<> 0:eb73febb2bba 11 #define VIDEO_CVBS (0) /* Analog Video Signal */
<> 0:eb73febb2bba 12 #define VIDEO_CMOS_CAMERA (1) /* Digital Video Signal */
<> 0:eb73febb2bba 13 #define VIDEO_RGB888 (1)
<> 0:eb73febb2bba 14
<> 0:eb73febb2bba 15 /**** User Selection *********/
<> 0:eb73febb2bba 16 /** Camera setting **/
<> 0:eb73febb2bba 17 #define VIDEO_INPUT_METHOD (VIDEO_CMOS_CAMERA) /* Select VIDEO_CVBS or VIDEO_CMOS_CAMERA */
<> 0:eb73febb2bba 18 #define VIDEO_INPUT_FORMAT (VIDEO_RGB888) /* Select VIDEO_RGB888 */
<> 0:eb73febb2bba 19 #define USE_VIDEO_CH (0) /* Select 0 or 1 If selecting VIDEO_CMOS_CAMERA, should be 0.) */
<> 0:eb73febb2bba 20 #define VIDEO_PAL (0) /* Select 0(NTSC) or 1(PAL) If selecting VIDEO_CVBS, this parameter is not referenced.) */
<> 0:eb73febb2bba 21 /** LCD setting **/
<> 0:eb73febb2bba 22 #define LCD_ONOFF (1) /* Select 0(without LCD) or 1(with LCD) */
<> 0:eb73febb2bba 23 #if LCD_ONOFF
<> 0:eb73febb2bba 24 #define LCD_TYPE (0) /* Select 0(4.3inch) or 1(7.1inch) */
<> 0:eb73febb2bba 25 #endif
<> 0:eb73febb2bba 26 /*****************************/
<> 0:eb73febb2bba 27
<> 0:eb73febb2bba 28 #if LCD_ONOFF
<> 0:eb73febb2bba 29 /** LCD shield config **/
<> 0:eb73febb2bba 30 #if (LCD_TYPE == 0)
<> 0:eb73febb2bba 31 #include "LCD_shield_config_4_3inch.h"
<> 0:eb73febb2bba 32 #else
<> 0:eb73febb2bba 33 #include "LCD_shield_config_7_1inch.h"
<> 0:eb73febb2bba 34 #endif
<> 0:eb73febb2bba 35 #endif
<> 0:eb73febb2bba 36
<> 0:eb73febb2bba 37 /** Video and Grapics (GRAPHICS_LAYER_0) parameter **/
<> 0:eb73febb2bba 38 /* video input */
<> 0:eb73febb2bba 39 #if USE_VIDEO_CH == (0)
<> 0:eb73febb2bba 40 #define VIDEO_INPUT_CH (DisplayBase::VIDEO_INPUT_CHANNEL_0)
<> 0:eb73febb2bba 41 #define VIDEO_INT_TYPE (DisplayBase::INT_TYPE_S0_VFIELD)
<> 0:eb73febb2bba 42 #else
<> 0:eb73febb2bba 43 #define VIDEO_INPUT_CH (DisplayBase::VIDEO_INPUT_CHANNEL_1)
<> 0:eb73febb2bba 44 #define VIDEO_INT_TYPE (DisplayBase::INT_TYPE_S1_VFIELD)
<> 0:eb73febb2bba 45 #endif
<> 0:eb73febb2bba 46
<> 0:eb73febb2bba 47 /* NTSC or PAL */
<> 0:eb73febb2bba 48 #if VIDEO_PAL == 0
<> 0:eb73febb2bba 49 #define COL_SYS (DisplayBase::COL_SYS_NTSC_358)
<> 0:eb73febb2bba 50 #else
<> 0:eb73febb2bba 51 #define COL_SYS (DisplayBase::COL_SYS_PAL_443)
<> 0:eb73febb2bba 52 #endif
<> 0:eb73febb2bba 53
<> 0:eb73febb2bba 54 /* Video input */
<> 0:eb73febb2bba 55 #define VIDEO_FORMAT (DisplayBase::VIDEO_FORMAT_RGB888)
<> 0:eb73febb2bba 56 #define GRAPHICS_FORMAT (DisplayBase::GRAPHICS_FORMAT_RGB888)
<> 0:eb73febb2bba 57 #define WR_RD_WRSWA (DisplayBase::WR_RD_WRSWA_32BIT)
<> 0:eb73febb2bba 58
<> 0:eb73febb2bba 59 /* The size of the video input */
<> 0:eb73febb2bba 60 #if ((LCD_ONOFF) && (LCD_TYPE == 0))
<> 0:eb73febb2bba 61 #define VIDEO_PIXEL_HW LCD_PIXEL_WIDTH
<> 0:eb73febb2bba 62 #define VIDEO_PIXEL_VW LCD_PIXEL_HEIGHT
<> 0:eb73febb2bba 63 #else
<> 0:eb73febb2bba 64 #define VIDEO_PIXEL_HW (640) /* VGA */
<> 0:eb73febb2bba 65 #define VIDEO_PIXEL_VW (480) /* VGA */
<> 0:eb73febb2bba 66 #endif
<> 0:eb73febb2bba 67
<> 0:eb73febb2bba 68 /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128
<> 0:eb73febb2bba 69 in accordance with the frame buffer burst transfer mode. */
<> 0:eb73febb2bba 70 /* FRAME BUFFER Parameter GRAPHICS_LAYER_0 */
<> 0:eb73febb2bba 71 #define FRAME_BUFFER_NUM (2u)
<> 0:eb73febb2bba 72 #define FRAME_BUFFER_BYTE_PER_PIXEL (4u)
<> 0:eb73febb2bba 73 #define FRAME_BUFFER_STRIDE (((VIDEO_PIXEL_HW * FRAME_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
<> 0:eb73febb2bba 74
<> 0:eb73febb2bba 75 #if LCD_ONOFF
<> 0:eb73febb2bba 76 #define VIDEO_PIXEL_HW_STR (VIDEO_PIXEL_HW - 64)
<> 0:eb73febb2bba 77 #define VIDEO_PIXEL_VW_STR (VIDEO_PIXEL_VW - 64)
<> 0:eb73febb2bba 78 #define FRAME_BUFFER_BYTE_PER_PIXEL_STR (2u)
<> 0:eb73febb2bba 79 #define FRAME_BUFFER_STRIDE_STR (((VIDEO_PIXEL_HW_STR * FRAME_BUFFER_BYTE_PER_PIXEL_STR) + 31u) & ~31u)
<> 0:eb73febb2bba 80 #endif
<> 0:eb73febb2bba 81
<> 0:eb73febb2bba 82 static DisplayBase Display;
<> 0:eb73febb2bba 83 static DisplayApp display_app;
<> 0:eb73febb2bba 84 static Timer decode_timer;
<> 0:eb73febb2bba 85 #if LCD_ONOFF
<> 0:eb73febb2bba 86 static DigitalOut lcd_pwon(P7_15);
<> 0:eb73febb2bba 87 static DigitalOut lcd_blon(P8_1);
<> 0:eb73febb2bba 88 static PwmOut lcd_cntrst(P8_15);
<> 0:eb73febb2bba 89 #endif
<> 0:eb73febb2bba 90
<> 0:eb73febb2bba 91 /* 32 bytes aligned */
<> 0:eb73febb2bba 92 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * VIDEO_PIXEL_VW]__attribute((aligned(32)));
<> 0:eb73febb2bba 93 static uint8_t user_frame_buffer1[FRAME_BUFFER_STRIDE * VIDEO_PIXEL_VW]__attribute((aligned(32)));
<> 0:eb73febb2bba 94 #if LCD_ONOFF
<> 0:eb73febb2bba 95 static uint8_t user_frame_buffer_string[FRAME_BUFFER_STRIDE_STR * VIDEO_PIXEL_VW_STR]__attribute((aligned(32)));
<> 0:eb73febb2bba 96 static AsciiFont ascii_font(user_frame_buffer_string, VIDEO_PIXEL_HW_STR, VIDEO_PIXEL_VW_STR, FRAME_BUFFER_STRIDE_STR, FRAME_BUFFER_BYTE_PER_PIXEL_STR);
<> 0:eb73febb2bba 97 static bool string_draw;
<> 0:eb73febb2bba 98 #endif
<> 0:eb73febb2bba 99 static uint8_t * decode_buffer = user_frame_buffer0;
<> 0:eb73febb2bba 100 static uint8_t * FrameBufferTbl[FRAME_BUFFER_NUM] = {user_frame_buffer0, user_frame_buffer1};
<> 0:eb73febb2bba 101 static volatile int32_t vfield_count = 0;
<> 0:eb73febb2bba 102 static int write_buff_num = 0;
<> 0:eb73febb2bba 103 static bool graphics_init_end = false;
<> 0:eb73febb2bba 104 static int decode_wait_time = 0;
<> 0:eb73febb2bba 105 static void (*p_callback_func)(char * addr, int size);
<> 0:eb73febb2bba 106
<> 0:eb73febb2bba 107 /****** cache control ******/
<> 0:eb73febb2bba 108 static void dcache_clean(void * p_buf, uint32_t size) {
<> 0:eb73febb2bba 109 uint32_t start_addr = (uint32_t)p_buf & 0xFFFFFFE0;
<> 0:eb73febb2bba 110 uint32_t end_addr = (uint32_t)p_buf + size;
<> 0:eb73febb2bba 111 uint32_t addr;
<> 0:eb73febb2bba 112
<> 0:eb73febb2bba 113 /* Data cache clean */
<> 0:eb73febb2bba 114 for (addr = start_addr; addr < end_addr; addr += 0x20) {
<> 0:eb73febb2bba 115 __v7_clean_dcache_mva((void *)addr);
<> 0:eb73febb2bba 116 }
<> 0:eb73febb2bba 117 }
<> 0:eb73febb2bba 118
<> 0:eb73febb2bba 119 static void dcache_invalid(void * p_buf, uint32_t size){
<> 0:eb73febb2bba 120 uint32_t start_addr = (uint32_t)p_buf & 0xFFFFFFE0;
<> 0:eb73febb2bba 121 uint32_t end_addr = (uint32_t)p_buf + size;
<> 0:eb73febb2bba 122 uint32_t addr;
<> 0:eb73febb2bba 123
<> 0:eb73febb2bba 124 /* Data cache invalid */
<> 0:eb73febb2bba 125 for (addr = start_addr; addr < end_addr; addr += 0x20) {
<> 0:eb73febb2bba 126 __v7_inv_dcache_mva((void *)addr);
<> 0:eb73febb2bba 127 }
<> 0:eb73febb2bba 128 }
<> 0:eb73febb2bba 129
<> 0:eb73febb2bba 130 #if LCD_ONOFF
<> 0:eb73febb2bba 131 /****** LCD ******/
<> 0:eb73febb2bba 132 static void Init_LCD_Display(void) {
<> 0:eb73febb2bba 133 DisplayBase::graphics_error_t error;
<> 0:eb73febb2bba 134 DisplayBase::lcd_config_t lcd_config;
<> 0:eb73febb2bba 135 PinName lvds_pin[8] = {
<> 0:eb73febb2bba 136 /* data pin */
<> 0:eb73febb2bba 137 P5_7, P5_6, P5_5, P5_4, P5_3, P5_2, P5_1, P5_0
<> 0:eb73febb2bba 138 };
<> 0:eb73febb2bba 139
<> 0:eb73febb2bba 140 lcd_pwon = 0;
<> 0:eb73febb2bba 141 lcd_blon = 0;
<> 0:eb73febb2bba 142 Thread::wait(100);
<> 0:eb73febb2bba 143 lcd_pwon = 1;
<> 0:eb73febb2bba 144 lcd_blon = 1;
<> 0:eb73febb2bba 145
<> 0:eb73febb2bba 146 Display.Graphics_Lvds_Port_Init(lvds_pin, 8);
<> 0:eb73febb2bba 147
<> 0:eb73febb2bba 148 /* Graphics initialization process */
<> 0:eb73febb2bba 149 lcd_config = LcdCfgTbl_LCD_shield;
<> 0:eb73febb2bba 150 error = Display.Graphics_init(&lcd_config);
<> 0:eb73febb2bba 151 if (error != DisplayBase::GRAPHICS_OK) {
<> 0:eb73febb2bba 152 printf("Line %d, error %d\n", __LINE__, error);
<> 0:eb73febb2bba 153 mbed_die();
<> 0:eb73febb2bba 154 }
<> 0:eb73febb2bba 155 graphics_init_end = true;
<> 0:eb73febb2bba 156 }
<> 0:eb73febb2bba 157
<> 0:eb73febb2bba 158 static void Start_LCD_Display(uint8_t * p_buf) {
<> 0:eb73febb2bba 159 DisplayBase::rect_t rect;
<> 0:eb73febb2bba 160
<> 0:eb73febb2bba 161 rect.vs = 0;
<> 0:eb73febb2bba 162 rect.vw = VIDEO_PIXEL_VW;
<> 0:eb73febb2bba 163 rect.hs = 0;
<> 0:eb73febb2bba 164 rect.hw = VIDEO_PIXEL_HW;
<> 0:eb73febb2bba 165 Display.Graphics_Read_Setting(
<> 0:eb73febb2bba 166 DisplayBase::GRAPHICS_LAYER_0,
<> 0:eb73febb2bba 167 (void *)p_buf,
<> 0:eb73febb2bba 168 FRAME_BUFFER_STRIDE,
<> 0:eb73febb2bba 169 GRAPHICS_FORMAT,
<> 0:eb73febb2bba 170 WR_RD_WRSWA,
<> 0:eb73febb2bba 171 &rect
<> 0:eb73febb2bba 172 );
<> 0:eb73febb2bba 173 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
<> 0:eb73febb2bba 174 }
<> 0:eb73febb2bba 175 #endif
<> 0:eb73febb2bba 176
<> 0:eb73febb2bba 177 /****** Video ******/
<> 0:eb73febb2bba 178 static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type) {
<> 0:eb73febb2bba 179 /* Interrupt callback function for Vfield interruption */
<> 0:eb73febb2bba 180 if (vfield_count > 0) {
<> 0:eb73febb2bba 181 vfield_count--;
<> 0:eb73febb2bba 182 }
<> 0:eb73febb2bba 183 }
<> 0:eb73febb2bba 184
<> 0:eb73febb2bba 185 static void Wait_Vfield(const int32_t wait_count) {
<> 0:eb73febb2bba 186 /* Wait for the specified number of times Vsync occurs */
<> 0:eb73febb2bba 187 vfield_count = wait_count;
<> 0:eb73febb2bba 188 while (vfield_count > 0) {
<> 0:eb73febb2bba 189 Thread::wait(1);
<> 0:eb73febb2bba 190 }
<> 0:eb73febb2bba 191 }
<> 0:eb73febb2bba 192
<> 0:eb73febb2bba 193 static void Init_Video(void) {
<> 0:eb73febb2bba 194 DisplayBase::graphics_error_t error;
<> 0:eb73febb2bba 195
<> 0:eb73febb2bba 196 /* Graphics initialization process */
<> 0:eb73febb2bba 197 if (graphics_init_end == false) {
<> 0:eb73febb2bba 198 /* When not initializing LCD, this processing is needed. */
<> 0:eb73febb2bba 199 error = Display.Graphics_init(NULL);
<> 0:eb73febb2bba 200 if (error != DisplayBase::GRAPHICS_OK) {
<> 0:eb73febb2bba 201 printf("Line %d, error %d\n", __LINE__, error);
<> 0:eb73febb2bba 202 mbed_die();
<> 0:eb73febb2bba 203 }
<> 0:eb73febb2bba 204 graphics_init_end = true;
<> 0:eb73febb2bba 205 }
<> 0:eb73febb2bba 206
<> 0:eb73febb2bba 207 #if VIDEO_INPUT_METHOD == VIDEO_CVBS
<> 0:eb73febb2bba 208 error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_VDEC, NULL);
<> 0:eb73febb2bba 209 if( error != DisplayBase::GRAPHICS_OK ) {
<> 0:eb73febb2bba 210 printf("Line %d, error %d\n", __LINE__, error);
<> 0:eb73febb2bba 211 mbed_die();
<> 0:eb73febb2bba 212 }
<> 0:eb73febb2bba 213 #elif VIDEO_INPUT_METHOD == VIDEO_CMOS_CAMERA
<> 0:eb73febb2bba 214 DisplayBase::video_ext_in_config_t ext_in_config;
<> 0:eb73febb2bba 215 PinName cmos_camera_pin[11] = {
<> 0:eb73febb2bba 216 /* data pin */
<> 0:eb73febb2bba 217 P2_7, P2_6, P2_5, P2_4, P2_3, P2_2, P2_1, P2_0,
<> 0:eb73febb2bba 218 /* control pin */
<> 0:eb73febb2bba 219 P10_0, /* DV0_CLK */
<> 0:eb73febb2bba 220 P1_0, /* DV0_Vsync */
<> 0:eb73febb2bba 221 P1_1 /* DV0_Hsync */
<> 0:eb73febb2bba 222 };
<> 0:eb73febb2bba 223
<> 0:eb73febb2bba 224 /* MT9V111 camera input config */
<> 0:eb73febb2bba 225 ext_in_config.inp_format = DisplayBase::VIDEO_EXTIN_FORMAT_BT601; /* BT601 8bit YCbCr format */
<> 0:eb73febb2bba 226 ext_in_config.inp_pxd_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing data */
<> 0:eb73febb2bba 227 ext_in_config.inp_vs_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing Vsync signals */
<> 0:eb73febb2bba 228 ext_in_config.inp_hs_edge = DisplayBase::EDGE_RISING; /* Clock edge select for capturing Hsync signals */
<> 0:eb73febb2bba 229 ext_in_config.inp_endian_on = DisplayBase::OFF; /* External input bit endian change on/off */
<> 0:eb73febb2bba 230 ext_in_config.inp_swap_on = DisplayBase::OFF; /* External input B/R signal swap on/off */
<> 0:eb73febb2bba 231 ext_in_config.inp_vs_inv = DisplayBase::SIG_POL_NOT_INVERTED; /* External input DV_VSYNC inversion control */
<> 0:eb73febb2bba 232 ext_in_config.inp_hs_inv = DisplayBase::SIG_POL_INVERTED; /* External input DV_HSYNC inversion control */
<> 0:eb73febb2bba 233 ext_in_config.inp_f525_625 = DisplayBase::EXTIN_LINE_525; /* Number of lines for BT.656 external input */
<> 0:eb73febb2bba 234 ext_in_config.inp_h_pos = DisplayBase::EXTIN_H_POS_CRYCBY; /* Y/Cb/Y/Cr data string start timing to Hsync reference */
<> 0:eb73febb2bba 235 ext_in_config.cap_vs_pos = 6; /* Capture start position from Vsync */
<> 0:eb73febb2bba 236 ext_in_config.cap_hs_pos = 150; /* Capture start position form Hsync */
<> 0:eb73febb2bba 237 #if ((LCD_ONOFF) && (LCD_TYPE == 0))
<> 0:eb73febb2bba 238 /* The same screen ratio as the screen ratio of the LCD. */
<> 0:eb73febb2bba 239 ext_in_config.cap_width = 640; /* Capture width */
<> 0:eb73febb2bba 240 ext_in_config.cap_height = 363; /* Capture height Max 468[line]
<> 0:eb73febb2bba 241 Due to CMOS(MT9V111) output signal timing and VDC5 specification */
<> 0:eb73febb2bba 242 #else
<> 0:eb73febb2bba 243 ext_in_config.cap_width = 640; /* Capture width */
<> 0:eb73febb2bba 244 ext_in_config.cap_height = 468; /* Capture height Max 468[line]
<> 0:eb73febb2bba 245 Due to CMOS(MT9V111) output signal timing and VDC5 specification */
<> 0:eb73febb2bba 246 #endif
<> 0:eb73febb2bba 247 error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_EXT, &ext_in_config);
<> 0:eb73febb2bba 248 if( error != DisplayBase::GRAPHICS_OK ) {
<> 0:eb73febb2bba 249 printf("Line %d, error %d\n", __LINE__, error);
<> 0:eb73febb2bba 250 mbed_die();
<> 0:eb73febb2bba 251 }
<> 0:eb73febb2bba 252
<> 0:eb73febb2bba 253 /* Camera input port setting */
<> 0:eb73febb2bba 254 error = Display.Graphics_Dvinput_Port_Init(cmos_camera_pin, 11);
<> 0:eb73febb2bba 255 if( error != DisplayBase::GRAPHICS_OK ) {
<> 0:eb73febb2bba 256 printf("Line %d, error %d\n", __LINE__, error);
<> 0:eb73febb2bba 257 mbed_die();
<> 0:eb73febb2bba 258 }
<> 0:eb73febb2bba 259 #endif
<> 0:eb73febb2bba 260
<> 0:eb73febb2bba 261 /* Interrupt callback function setting (Field end signal for recording function in scaler 0) */
<> 0:eb73febb2bba 262 error = Display.Graphics_Irq_Handler_Set(VIDEO_INT_TYPE, 0, IntCallbackFunc_Vfield);
<> 0:eb73febb2bba 263 if (error != DisplayBase::GRAPHICS_OK) {
<> 0:eb73febb2bba 264 printf("Line %d, error %d\n", __LINE__, error);
<> 0:eb73febb2bba 265 mbed_die();
<> 0:eb73febb2bba 266 }
<> 0:eb73febb2bba 267 }
<> 0:eb73febb2bba 268
<> 0:eb73febb2bba 269 static void Start_Video(uint8_t * p_buf) {
<> 0:eb73febb2bba 270 DisplayBase::graphics_error_t error;
<> 0:eb73febb2bba 271
<> 0:eb73febb2bba 272 /* Video capture setting (progressive form fixed) */
<> 0:eb73febb2bba 273 error = Display.Video_Write_Setting(
<> 0:eb73febb2bba 274 VIDEO_INPUT_CH,
<> 0:eb73febb2bba 275 COL_SYS,
<> 0:eb73febb2bba 276 p_buf,
<> 0:eb73febb2bba 277 FRAME_BUFFER_STRIDE,
<> 0:eb73febb2bba 278 VIDEO_FORMAT,
<> 0:eb73febb2bba 279 WR_RD_WRSWA,
<> 0:eb73febb2bba 280 VIDEO_PIXEL_VW,
<> 0:eb73febb2bba 281 VIDEO_PIXEL_HW
<> 0:eb73febb2bba 282 );
<> 0:eb73febb2bba 283 if (error != DisplayBase::GRAPHICS_OK) {
<> 0:eb73febb2bba 284 printf("Line %d, error %d\n", __LINE__, error);
<> 0:eb73febb2bba 285 mbed_die();
<> 0:eb73febb2bba 286 }
<> 0:eb73febb2bba 287
<> 0:eb73febb2bba 288 /* Video write process start */
<> 0:eb73febb2bba 289 error = Display.Video_Start(VIDEO_INPUT_CH);
<> 0:eb73febb2bba 290 if (error != DisplayBase::GRAPHICS_OK) {
<> 0:eb73febb2bba 291 printf("Line %d, error %d\n", __LINE__, error);
<> 0:eb73febb2bba 292 mbed_die();
<> 0:eb73febb2bba 293 }
<> 0:eb73febb2bba 294
<> 0:eb73febb2bba 295 /* Video write process stop */
<> 0:eb73febb2bba 296 error = Display.Video_Stop(VIDEO_INPUT_CH);
<> 0:eb73febb2bba 297 if (error != DisplayBase::GRAPHICS_OK) {
<> 0:eb73febb2bba 298 printf("Line %d, error %d\n", __LINE__, error);
<> 0:eb73febb2bba 299 mbed_die();
<> 0:eb73febb2bba 300 }
<> 0:eb73febb2bba 301
<> 0:eb73febb2bba 302 /* Video write process start */
<> 0:eb73febb2bba 303 error = Display.Video_Start(VIDEO_INPUT_CH);
<> 0:eb73febb2bba 304 if (error != DisplayBase::GRAPHICS_OK) {
<> 0:eb73febb2bba 305 printf("Line %d, error %d\n", __LINE__, error);
<> 0:eb73febb2bba 306 mbed_die();
<> 0:eb73febb2bba 307 }
<> 0:eb73febb2bba 308 }
<> 0:eb73febb2bba 309
<> 0:eb73febb2bba 310 /****** zxing_init ******/
<> 0:eb73febb2bba 311 void zxing_init(void (*pfunc)(char * addr, int size)) {
<> 0:eb73febb2bba 312
<> 0:eb73febb2bba 313 #if LCD_ONOFF
<> 0:eb73febb2bba 314 /* Initialization of LCD */
<> 0:eb73febb2bba 315 Init_LCD_Display(); /* When using LCD, please call before than Init_Video(). */
<> 0:eb73febb2bba 316 #endif
<> 0:eb73febb2bba 317 /* Initialization of Video */
<> 0:eb73febb2bba 318 Init_Video();
<> 0:eb73febb2bba 319
<> 0:eb73febb2bba 320 /* Initialization memory */
<> 0:eb73febb2bba 321 for (int i = 0; i < FRAME_BUFFER_NUM; i++) {
<> 0:eb73febb2bba 322 memset(FrameBufferTbl[i], 0, (FRAME_BUFFER_STRIDE * VIDEO_PIXEL_VW));
<> 0:eb73febb2bba 323 dcache_clean(FrameBufferTbl[i], (FRAME_BUFFER_STRIDE * VIDEO_PIXEL_VW));
<> 0:eb73febb2bba 324 }
<> 0:eb73febb2bba 325
<> 0:eb73febb2bba 326 /* Start of Video */
<> 0:eb73febb2bba 327 Start_Video(FrameBufferTbl[write_buff_num]);
<> 0:eb73febb2bba 328 /* Wait for first video drawing */
<> 0:eb73febb2bba 329 Wait_Vfield(2);
<> 0:eb73febb2bba 330 #if LCD_ONOFF
<> 0:eb73febb2bba 331 DisplayBase::rect_t rect;
<> 0:eb73febb2bba 332
<> 0:eb73febb2bba 333 /* The layer by which the touch panel location is drawn */
<> 0:eb73febb2bba 334 ascii_font.Erase(0x00000000); /* rrrrGBAR (r:Reserve G:Green B:Blue A:Alpha R:Red */
<> 0:eb73febb2bba 335 dcache_clean(user_frame_buffer_string, sizeof(user_frame_buffer_string));
<> 0:eb73febb2bba 336 rect.vs = 32;
<> 0:eb73febb2bba 337 rect.vw = VIDEO_PIXEL_VW_STR;
<> 0:eb73febb2bba 338 rect.hs = 32;
<> 0:eb73febb2bba 339 rect.hw = VIDEO_PIXEL_HW_STR;
<> 0:eb73febb2bba 340 Display.Graphics_Read_Setting(
<> 0:eb73febb2bba 341 DisplayBase::GRAPHICS_LAYER_1,
<> 0:eb73febb2bba 342 (void *)user_frame_buffer_string,
<> 0:eb73febb2bba 343 FRAME_BUFFER_STRIDE_STR,
<> 0:eb73febb2bba 344 DisplayBase::GRAPHICS_FORMAT_ARGB4444,
<> 0:eb73febb2bba 345 DisplayBase::WR_RD_WRSWA_32_16BIT,
<> 0:eb73febb2bba 346 &rect
<> 0:eb73febb2bba 347 );
<> 0:eb73febb2bba 348 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_1);
<> 0:eb73febb2bba 349 string_draw = false;
<> 0:eb73febb2bba 350 /* Start of LCD */
<> 0:eb73febb2bba 351 Start_LCD_Display(FrameBufferTbl[write_buff_num]);
<> 0:eb73febb2bba 352 /* Backlight on */
<> 0:eb73febb2bba 353 Thread::wait(200);
<> 0:eb73febb2bba 354 lcd_cntrst.write(1.0);
<> 0:eb73febb2bba 355 #endif
<> 0:eb73febb2bba 356 p_callback_func = pfunc;
<> 0:eb73febb2bba 357 decode_timer.reset();
<> 0:eb73febb2bba 358 decode_timer.start();
<> 0:eb73febb2bba 359 }
<> 0:eb73febb2bba 360
<> 0:eb73febb2bba 361 /****** zxing_main ******/
<> 0:eb73febb2bba 362 int zxing_loop() {
<> 0:eb73febb2bba 363 DisplayBase::graphics_error_t error;
<> 0:eb73febb2bba 364 int decode_result = -1;
<> 0:eb73febb2bba 365 vector<Ref<Result> > results;
<> 0:eb73febb2bba 366
<> 0:eb73febb2bba 367 decode_buffer = FrameBufferTbl[write_buff_num];
<> 0:eb73febb2bba 368 write_buff_num++;
<> 0:eb73febb2bba 369 if (write_buff_num >= FRAME_BUFFER_NUM) {
<> 0:eb73febb2bba 370 write_buff_num = 0;
<> 0:eb73febb2bba 371 }
<> 0:eb73febb2bba 372 /* Change video buffer */
<> 0:eb73febb2bba 373 error = Display.Video_Write_Change(VIDEO_INPUT_CH, FrameBufferTbl[write_buff_num], FRAME_BUFFER_STRIDE);
<> 0:eb73febb2bba 374 if (error != DisplayBase::GRAPHICS_OK) {
<> 0:eb73febb2bba 375 printf("Line %d, error %d\n", __LINE__, error);
<> 0:eb73febb2bba 376 mbed_die();
<> 0:eb73febb2bba 377 }
<> 0:eb73febb2bba 378 Wait_Vfield(2);
<> 0:eb73febb2bba 379 #if LCD_ONOFF
<> 0:eb73febb2bba 380 /* Change LCD buffer */
<> 0:eb73febb2bba 381 Display.Graphics_Read_Change(DisplayBase::GRAPHICS_LAYER_0, (void *)FrameBufferTbl[write_buff_num]);
<> 0:eb73febb2bba 382 #endif
<> 0:eb73febb2bba 383 dcache_invalid(decode_buffer, (FRAME_BUFFER_STRIDE * VIDEO_PIXEL_VW));
<> 0:eb73febb2bba 384 /* Decode barcode image */
<> 0:eb73febb2bba 385 if (decode_timer.read_ms() >= decode_wait_time) {
<> 0:eb73febb2bba 386 decode_timer.reset();
<> 0:eb73febb2bba 387 decode_result = ex_decode(decode_buffer, (FRAME_BUFFER_STRIDE * VIDEO_PIXEL_VW), VIDEO_PIXEL_HW, VIDEO_PIXEL_VW, &results);
<> 0:eb73febb2bba 388 if (decode_result == 0) {
<> 0:eb73febb2bba 389 char ** decode_str;
<> 0:eb73febb2bba 390 int size;
<> 0:eb73febb2bba 391
<> 0:eb73febb2bba 392 decode_str = (char **)&(results[0]->getText()->getText());
<> 0:eb73febb2bba 393 size = strlen(*decode_str);
<> 0:eb73febb2bba 394 if (p_callback_func != NULL) {
<> 0:eb73febb2bba 395 p_callback_func(*decode_str, size);
<> 0:eb73febb2bba 396 }
<> 0:eb73febb2bba 397 #if LCD_ONOFF
<> 0:eb73febb2bba 398 /* Drow string */
<> 0:eb73febb2bba 399 ascii_font.Erase(0x00000090); /* rrrrGBAR (r:Reserve G:Green B:Blue A:Alpha R:Red */
<> 0:eb73febb2bba 400 int rest_size = strlen(*decode_str);
<> 0:eb73febb2bba 401 int draw_idx = 0;
<> 0:eb73febb2bba 402 int draw_size;
<> 0:eb73febb2bba 403 int draw_line = 0;
<> 0:eb73febb2bba 404
<> 0:eb73febb2bba 405 while (rest_size > 0) {
<> 0:eb73febb2bba 406 draw_size = ascii_font.DrawStr(*decode_str + draw_idx, 6, 5 + (18 * draw_line), 0x0000ffff, 2);
<> 0:eb73febb2bba 407 if (draw_size <= 0) {
<> 0:eb73febb2bba 408 break;
<> 0:eb73febb2bba 409 }
<> 0:eb73febb2bba 410 rest_size -= draw_size;
<> 0:eb73febb2bba 411 draw_idx += draw_size;
<> 0:eb73febb2bba 412 draw_line++;
<> 0:eb73febb2bba 413 }
<> 0:eb73febb2bba 414
<> 0:eb73febb2bba 415 dcache_clean(user_frame_buffer_string, sizeof(user_frame_buffer_string));
<> 0:eb73febb2bba 416 string_draw = true;
<> 0:eb73febb2bba 417 #endif
<> 0:eb73febb2bba 418 decode_wait_time = 500;
<> 0:eb73febb2bba 419 } else {
<> 0:eb73febb2bba 420 #if LCD_ONOFF
<> 0:eb73febb2bba 421 if (string_draw != false) {
<> 0:eb73febb2bba 422 /* Clear string */
<> 0:eb73febb2bba 423 ascii_font.Erase(0x00000000); /* rrrrGBAR (r:Reserve G:Green B:Blue A:Alpha R:Red */
<> 0:eb73febb2bba 424 dcache_clean(user_frame_buffer_string, sizeof(user_frame_buffer_string));
<> 0:eb73febb2bba 425 string_draw = false;
<> 0:eb73febb2bba 426 }
<> 0:eb73febb2bba 427 #endif
<> 0:eb73febb2bba 428 decode_wait_time = 10;
<> 0:eb73febb2bba 429 }
<> 0:eb73febb2bba 430 }
<> 0:eb73febb2bba 431 display_app.SendRgb888(decode_buffer, VIDEO_PIXEL_HW, VIDEO_PIXEL_VW);
<> 0:eb73febb2bba 432
<> 0:eb73febb2bba 433 return decode_result;
<> 0:eb73febb2bba 434 }